From 099cb6c4e48adcc56d36e6cfcc23e3729549efa1 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Sun, 29 Apr 2018 22:49:43 +0200 Subject: [PATCH] add battery charging state --- app/build.gradle | 2 +- .../androidaps/events/EventChargingState.java | 6 +- .../NSClientInternal/NSClientPlugin.java | 72 ++++++++++++++++--- .../receivers/ChargingStateReceiver.java | 32 ++++----- app/src/main/res/values/strings.xml | 2 + .../main/res/xml/pref_nsclientinternal.xml | 5 ++ 6 files changed, 86 insertions(+), 33 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 16e3bfbe71..a5ebbe12c8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ android { defaultConfig { applicationId "info.nightscout.androidaps" - minSdkVersion 21 + minSdkVersion 23 targetSdkVersion 25 multiDexEnabled true versionCode 1500 diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java b/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java index e0d839322f..bcd9061133 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java @@ -2,14 +2,12 @@ package info.nightscout.androidaps.events; public class EventChargingState { - boolean isCharging = false; - boolean isPlugged = false; + public boolean isCharging = false; public EventChargingState() {} - public EventChargingState(boolean isCharging, boolean isPlugged) { + public EventChargingState(boolean isCharging) { this.isCharging = isCharging; - this.isPlugged = isPlugged; } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java index 660cab2c37..8a19834ca5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java @@ -7,6 +7,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; +import android.os.BatteryManager; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -21,7 +22,6 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; -import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; 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.EventNSClientUpdateGUI; import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService; +import info.nightscout.androidaps.receivers.ChargingStateReceiver; import info.nightscout.androidaps.receivers.NetworkChangeReceiver; import info.nightscout.utils.SP; import info.nightscout.utils.ToastUtils; @@ -60,12 +61,16 @@ public class NSClientPlugin extends PluginBase { public boolean paused = false; public boolean allowed = true; + public boolean allowedChargingsState = true; + public boolean allowedNetworkState = true; boolean autoscroll = true; public String status = ""; public NSClientService nsClientService = null; - NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); + + private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); + private ChargingStateReceiver chargingStateReceiver = new ChargingStateReceiver(); private NSClientPlugin() { super(new PluginDescription() @@ -97,6 +102,12 @@ public class NSClientPlugin extends PluginBase { context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); super.onStart(); + registerReceivers(); + + } + + protected void registerReceivers() { + Context context = MainApp.instance().getApplicationContext(); // register NetworkChangeReceiver --> https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html // Nougat is not providing Connectivity-Action anymore ;-( context.registerReceiver(networkChangeReceiver, @@ -104,9 +115,19 @@ public class NSClientPlugin extends PluginBase { context.registerReceiver(networkChangeReceiver, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); - EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(context); if (event != null) 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 @@ -115,6 +136,7 @@ public class NSClientPlugin extends PluginBase { Context context = MainApp.instance().getApplicationContext(); context.unbindService(mConnection); context.unregisterReceiver(networkChangeReceiver); + context.unregisterReceiver(chargingStateReceiver); } private ServiceConnection mConnection = new ServiceConnection() { @@ -141,16 +163,53 @@ public class NSClientPlugin extends PluginBase { EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); if (event != null) 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 public void onStatusEvent(final EventChargingState ev) { - + boolean newChargingState = calculateStatus(ev); + + if (newChargingState != allowedChargingsState) { + allowedChargingsState = newChargingState; + processStateChange(); + } } @Subscribe 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); String allowedSSIDs = SP.getString(R.string.key_ns_wifi_ssids, ""); boolean allowRoaming = SP.getBoolean(R.string.key_ns_allowroaming, true); @@ -162,10 +221,7 @@ public class NSClientPlugin extends PluginBase { newAllowedState = false; if (!allowRoaming && ev.roaming) newAllowedState = false; - if (newAllowedState != allowed) { - allowed = newAllowedState; - MainApp.bus().post(new EventPreferenceChange(R.string.key_nsclientinternal_paused)); - } + return newAllowedState; } @Subscribe diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java index b2d51ff1fb..3dbec90b4f 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java @@ -3,38 +3,30 @@ package info.nightscout.androidaps.receivers; import android.content.BroadcastReceiver; import android.content.Context; 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.PowerManager; -import android.support.annotation.Nullable; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.events.EventChargingState; -import info.nightscout.androidaps.events.EventNetworkChange; public class ChargingStateReceiver extends BroadcastReceiver { - private static Logger log = LoggerFactory.getLogger(ChargingStateReceiver.class); @Override public void onReceive(Context context, Intent intent) { - int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); - boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || - status == BatteryManager.BATTERY_STATUS_FULL; + EventChargingState event = grabChargingState(context); - 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) 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; + } + } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 551d5b8e6a..b159f3f95f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1019,8 +1019,10 @@ ns_wifionly ns_wifi_ssids ns_allowroaming + ns_chargingonly Use WiFi connection only WiFi SSID + Only if charging Connection settings Allowed SSIDs (semicolon separated) Allow connection in roaming diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml index 0567885a2c..ac1471cff1 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -103,6 +103,11 @@ android:key="@string/key_ns_allowroaming" android:title="@string/ns_allowroaming" /> + +