add battery charging state

This commit is contained in:
Markus M. May 2018-04-29 22:49:43 +02:00
parent 55ea10e88f
commit 099cb6c4e4
6 changed files with 86 additions and 33 deletions

View file

@ -59,7 +59,7 @@ android {
defaultConfig { defaultConfig {
applicationId "info.nightscout.androidaps" applicationId "info.nightscout.androidaps"
minSdkVersion 21 minSdkVersion 23
targetSdkVersion 25 targetSdkVersion 25
multiDexEnabled true multiDexEnabled true
versionCode 1500 versionCode 1500

View file

@ -2,14 +2,12 @@ package info.nightscout.androidaps.events;
public class EventChargingState { public class EventChargingState {
boolean isCharging = false; public boolean isCharging = false;
boolean isPlugged = false;
public EventChargingState() {} public EventChargingState() {}
public EventChargingState(boolean isCharging, boolean isPlugged) { public EventChargingState(boolean isCharging) {
this.isCharging = isCharging; this.isCharging = isCharging;
this.isPlugged = isPlugged;
} }
} }

View file

@ -7,6 +7,7 @@ import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
import android.os.IBinder; import android.os.IBinder;
@ -21,7 +22,6 @@ import org.slf4j.LoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import info.nightscout.androidaps.BuildConfig;
import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Config;
import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
@ -37,6 +37,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientN
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus; import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI; import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI;
import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService; import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService;
import info.nightscout.androidaps.receivers.ChargingStateReceiver;
import info.nightscout.androidaps.receivers.NetworkChangeReceiver; import info.nightscout.androidaps.receivers.NetworkChangeReceiver;
import info.nightscout.utils.SP; import info.nightscout.utils.SP;
import info.nightscout.utils.ToastUtils; import info.nightscout.utils.ToastUtils;
@ -60,12 +61,16 @@ public class NSClientPlugin extends PluginBase {
public boolean paused = false; public boolean paused = false;
public boolean allowed = true; public boolean allowed = true;
public boolean allowedChargingsState = true;
public boolean allowedNetworkState = true;
boolean autoscroll = true; boolean autoscroll = true;
public String status = ""; public String status = "";
public NSClientService nsClientService = null; public NSClientService nsClientService = null;
NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();
private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();
private ChargingStateReceiver chargingStateReceiver = new ChargingStateReceiver();
private NSClientPlugin() { private NSClientPlugin() {
super(new PluginDescription() super(new PluginDescription()
@ -97,6 +102,12 @@ public class NSClientPlugin extends PluginBase {
context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
super.onStart(); super.onStart();
registerReceivers();
}
protected void registerReceivers() {
Context context = MainApp.instance().getApplicationContext();
// register NetworkChangeReceiver --> https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html // register NetworkChangeReceiver --> https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html
// Nougat is not providing Connectivity-Action anymore ;-( // Nougat is not providing Connectivity-Action anymore ;-(
context.registerReceiver(networkChangeReceiver, context.registerReceiver(networkChangeReceiver,
@ -104,9 +115,19 @@ public class NSClientPlugin extends PluginBase {
context.registerReceiver(networkChangeReceiver, context.registerReceiver(networkChangeReceiver,
new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION));
EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(context);
if (event != null) if (event != null)
MainApp.bus().post(event); MainApp.bus().post(event);
context.registerReceiver(chargingStateReceiver,
new IntentFilter(Intent.ACTION_POWER_CONNECTED));
context.registerReceiver(chargingStateReceiver,
new IntentFilter(Intent.ACTION_POWER_DISCONNECTED));
EventChargingState eventChargingState = chargingStateReceiver.grabChargingState(context);
if (eventChargingState != null)
MainApp.bus().post(eventChargingState);
} }
@Override @Override
@ -115,6 +136,7 @@ public class NSClientPlugin extends PluginBase {
Context context = MainApp.instance().getApplicationContext(); Context context = MainApp.instance().getApplicationContext();
context.unbindService(mConnection); context.unbindService(mConnection);
context.unregisterReceiver(networkChangeReceiver); context.unregisterReceiver(networkChangeReceiver);
context.unregisterReceiver(chargingStateReceiver);
} }
private ServiceConnection mConnection = new ServiceConnection() { private ServiceConnection mConnection = new ServiceConnection() {
@ -141,16 +163,53 @@ public class NSClientPlugin extends PluginBase {
EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext());
if (event != null) if (event != null)
MainApp.bus().post(event); MainApp.bus().post(event);
} else if (ev.isChanged(R.string.key_ns_chargingonly)) {
EventChargingState event = chargingStateReceiver.grabChargingState(MainApp.instance().getApplicationContext());
if (event != null)
MainApp.bus().post(event);
} }
} }
@Subscribe @Subscribe
public void onStatusEvent(final EventChargingState ev) { public void onStatusEvent(final EventChargingState ev) {
boolean newChargingState = calculateStatus(ev);
if (newChargingState != allowedChargingsState) {
allowedChargingsState = newChargingState;
processStateChange();
}
} }
@Subscribe @Subscribe
public void onStatusEvent(final EventNetworkChange ev) { public void onStatusEvent(final EventNetworkChange ev) {
boolean newNetworkState = calculateStatus(ev);
if (newNetworkState != allowedNetworkState) {
allowedNetworkState = newNetworkState;
processStateChange();
}
}
private void processStateChange() {
boolean newAllowedState = allowedChargingsState && allowedNetworkState;
if (newAllowedState != allowed) {
allowed = newAllowedState;
MainApp.bus().post(new EventPreferenceChange(R.string.key_nsclientinternal_paused));
}
}
private boolean calculateStatus(final EventChargingState ev) {
boolean chargingOnly = SP.getBoolean(R.string.ns_chargingonly, false);
boolean newAllowedState = true;
if (!ev.isCharging && chargingOnly) newAllowedState = false;
return newAllowedState;
}
private boolean calculateStatus(final EventNetworkChange ev) {
boolean wifiOnly = SP.getBoolean(R.string.key_ns_wifionly, false); boolean wifiOnly = SP.getBoolean(R.string.key_ns_wifionly, false);
String allowedSSIDs = SP.getString(R.string.key_ns_wifi_ssids, ""); String allowedSSIDs = SP.getString(R.string.key_ns_wifi_ssids, "");
boolean allowRoaming = SP.getBoolean(R.string.key_ns_allowroaming, true); boolean allowRoaming = SP.getBoolean(R.string.key_ns_allowroaming, true);
@ -162,10 +221,7 @@ public class NSClientPlugin extends PluginBase {
newAllowedState = false; newAllowedState = false;
if (!allowRoaming && ev.roaming) newAllowedState = false; if (!allowRoaming && ev.roaming) newAllowedState = false;
if (newAllowedState != allowed) { return newAllowedState;
allowed = newAllowedState;
MainApp.bus().post(new EventPreferenceChange(R.string.key_nsclientinternal_paused));
}
} }
@Subscribe @Subscribe

View file

@ -3,38 +3,30 @@ package info.nightscout.androidaps.receivers;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.BatteryManager; import android.os.BatteryManager;
import android.os.PowerManager;
import android.support.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.events.EventChargingState; import info.nightscout.androidaps.events.EventChargingState;
import info.nightscout.androidaps.events.EventNetworkChange;
public class ChargingStateReceiver extends BroadcastReceiver { public class ChargingStateReceiver extends BroadcastReceiver {
private static Logger log = LoggerFactory.getLogger(ChargingStateReceiver.class);
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); EventChargingState event = grabChargingState(context);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
status == BatteryManager.BATTERY_STATUS_FULL;
int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB;
boolean acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC;
EventChargingState event = new EventChargingState(isCharging, usbCharge || acCharge);
if (event != null) if (event != null)
MainApp.bus().post(event); MainApp.bus().post(event);
} }
public EventChargingState grabChargingState(Context context) {
BatteryManager bm = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
int status = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING
|| status == BatteryManager.BATTERY_STATUS_FULL;
EventChargingState event = new EventChargingState(isCharging);
return event;
}
} }

View file

@ -1019,8 +1019,10 @@
<string name="key_ns_wifionly" translatable="false">ns_wifionly</string> <string name="key_ns_wifionly" translatable="false">ns_wifionly</string>
<string name="key_ns_wifi_ssids" translatable="false">ns_wifi_ssids</string> <string name="key_ns_wifi_ssids" translatable="false">ns_wifi_ssids</string>
<string name="key_ns_allowroaming" translatable="false">ns_allowroaming</string> <string name="key_ns_allowroaming" translatable="false">ns_allowroaming</string>
<string name="key_ns_chargingonly" translatable="false">ns_chargingonly</string>
<string name="ns_wifionly">Use WiFi connection only</string> <string name="ns_wifionly">Use WiFi connection only</string>
<string name="ns_wifi_ssids">WiFi SSID</string> <string name="ns_wifi_ssids">WiFi SSID</string>
<string name="ns_chargingonly">Only if charging</string>
<string name="connectionsettings_title">Connection settings</string> <string name="connectionsettings_title">Connection settings</string>
<string name="ns_wifi_allowedssids">Allowed SSIDs (semicolon separated)</string> <string name="ns_wifi_allowedssids">Allowed SSIDs (semicolon separated)</string>
<string name="ns_allowroaming">Allow connection in roaming</string> <string name="ns_allowroaming">Allow connection in roaming</string>

View file

@ -103,6 +103,11 @@
android:key="@string/key_ns_allowroaming" android:key="@string/key_ns_allowroaming"
android:title="@string/ns_allowroaming" /> android:title="@string/ns_allowroaming" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_ns_chargingonly"
android:title="@string/ns_chargingonly" />
</PreferenceScreen> </PreferenceScreen>
<PreferenceScreen android:title="@string/advancedsettings_title"> <PreferenceScreen android:title="@string/advancedsettings_title">