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" />
+
+