From 3fb17e686957190d4b007ca0fb5abff0f4b7a860 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 25 Apr 2018 20:49:03 +0200 Subject: [PATCH 01/91] First step to use network activity receiver --- .../androidaps/events/EventChargingState.java | 15 +++++++ .../NSClientInternal/NSClientPlugin.java | 15 ++++++- .../receivers/ChargingStateReceiver.java | 40 +++++++++++++++++++ .../receivers/NetworkChangeReceiver.java | 17 +++----- 4 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java create mode 100644 app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java b/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java new file mode 100644 index 0000000000..e0d839322f --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java @@ -0,0 +1,15 @@ +package info.nightscout.androidaps.events; + +public class EventChargingState { + + boolean isCharging = false; + boolean isPlugged = false; + + public EventChargingState() {} + + public EventChargingState(boolean isCharging, boolean isPlugged) { + 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 004c7646f5..4854165799 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 @@ -3,7 +3,10 @@ package info.nightscout.androidaps.plugins.NSClientInternal; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; +import android.net.ConnectivityManager; +import android.net.wifi.WifiManager; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -61,6 +64,7 @@ public class NSClientPlugin extends PluginBase { public String status = ""; public NSClientService nsClientService = null; + NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); private NSClientPlugin() { super(new PluginDescription() @@ -92,7 +96,14 @@ public class NSClientPlugin extends PluginBase { context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); super.onStart(); - EventNetworkChange event = NetworkChangeReceiver.grabNetworkStatus(); + // register NetworkChangeReceiver --> https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html + // Nougat is not providing Connectivity-Action anymore ;-( + context.registerReceiver(networkChangeReceiver, + new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + context.registerReceiver(networkChangeReceiver, + new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); + + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); if (event != null) MainApp.bus().post(event); } @@ -125,7 +136,7 @@ public class NSClientPlugin extends PluginBase { ev.isChanged(R.string.key_ns_wifi_ssids) || ev.isChanged(R.string.key_ns_allowroaming) ) { - EventNetworkChange event = NetworkChangeReceiver.grabNetworkStatus(); + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); if (event != null) MainApp.bus().post(event); } diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java new file mode 100644 index 0000000000..b2d51ff1fb --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java @@ -0,0 +1,40 @@ +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; + + 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); + } + +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java index b3a99b66ff..4e01066bf9 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java @@ -8,7 +8,6 @@ import android.net.NetworkInfo; import android.net.wifi.SupplicantState; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.os.PowerManager; import android.support.annotation.Nullable; import org.slf4j.Logger; @@ -18,27 +17,21 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.events.EventNetworkChange; public class NetworkChangeReceiver extends BroadcastReceiver { + private static Logger log = LoggerFactory.getLogger(NetworkChangeReceiver.class); @Override public void onReceive(final Context context, final Intent intent) { - PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); - if (pm == null) return; - PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "NetworkChangeReceiver"); - wl.acquire(10000); - - EventNetworkChange event = grabNetworkStatus(); + EventNetworkChange event = grabNetworkStatus(context); if (event != null) MainApp.bus().post(event); - - wl.release(); } @Nullable - public static EventNetworkChange grabNetworkStatus() { + public EventNetworkChange grabNetworkStatus(final Context context) { EventNetworkChange event = new EventNetworkChange(); - ConnectivityManager cm = (ConnectivityManager) MainApp.instance().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return null; NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); @@ -54,6 +47,7 @@ public class NetworkChangeReceiver extends BroadcastReceiver { log.debug("NETCHANGE: Wifi connected. SSID: " + event.ssid); } } + if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { event.mobileConnected = true; event.roaming = activeNetwork.isRoaming(); @@ -62,6 +56,7 @@ public class NetworkChangeReceiver extends BroadcastReceiver { } else { log.debug("NETCHANGE: Disconnected."); } + return event; } } \ No newline at end of file From 55ea10e88fac188e9e1cb0583bf678cc3fa325c8 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 25 Apr 2018 22:22:37 +0200 Subject: [PATCH 02/91] Catch NetworkState changes correctly --- .../plugins/NSClientInternal/NSClientPlugin.java | 11 ++++++++++- .../NSClientInternal/services/NSClientService.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) 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 4854165799..660cab2c37 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 @@ -27,6 +27,7 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventAppExit; +import info.nightscout.androidaps.events.EventChargingState; import info.nightscout.androidaps.events.EventNetworkChange; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.PluginBase; @@ -113,6 +114,7 @@ public class NSClientPlugin extends PluginBase { MainApp.bus().unregister(this); Context context = MainApp.instance().getApplicationContext(); context.unbindService(mConnection); + context.unregisterReceiver(networkChangeReceiver); } private ServiceConnection mConnection = new ServiceConnection() { @@ -142,6 +144,11 @@ public class NSClientPlugin extends PluginBase { } } + @Subscribe + public void onStatusEvent(final EventChargingState ev) { + + } + @Subscribe public void onStatusEvent(final EventNetworkChange ev) { boolean wifiOnly = SP.getBoolean(R.string.key_ns_wifionly, false); @@ -163,8 +170,10 @@ public class NSClientPlugin extends PluginBase { @Subscribe public void onStatusEvent(final EventAppExit ignored) { - if (nsClientService != null) + if (nsClientService != null) { MainApp.instance().getApplicationContext().unbindService(mConnection); + MainApp.instance().getApplicationContext().unregisterReceiver(networkChangeReceiver); + } } @Subscribe diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index 445bef32fe..b842f06726 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -33,7 +33,6 @@ import info.nightscout.androidaps.db.DbRequest; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventConfigBuilderChange; import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue; @@ -251,6 +250,7 @@ public class NSClientService extends Service { private Emitter.Listener onDisconnect = new Emitter.Listener() { @Override public void call(Object... args) { + log.debug("disconnect reason: {}", args); MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "disconnect event")); } }; From 099cb6c4e48adcc56d36e6cfcc23e3729549efa1 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Sun, 29 Apr 2018 22:49:43 +0200 Subject: [PATCH 03/91] 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" /> + + From d68f74bb68b8d66c0e42068d1cdef7ec4bea7b28 Mon Sep 17 00:00:00 2001 From: Winfried Kuiper Date: Mon, 30 Apr 2018 23:09:35 +0200 Subject: [PATCH 04/91] Update strings.xml --- app/src/main/res/values-de/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2f51b46c1f..dc28ebaeb7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -552,7 +552,7 @@ Anzahl der vergangenen Stunden, die verwendet werden, um die Sensitivität zu erkennen (Zeit, in der KH resorbiert werden, ist nicht berücksichtigt) Entscheide anhand von dieser Erfahrung, wie hoch max Basal sein sollte, und übernehme den Wert in die Pumpen- und AAPS-Einstellungen Erprobe den Closed Loop Modus mit max IOB = 0 für ein paar Tage, ohne zu viele Unterzuckerungen zu haben - Starte den Closed Loop Modus mit Abschaltung bei niedrigen Werte + Starte den Closed Loop Modus mit Abschaltung bei niedrigen Werten Verwende es ein paar Tage und zumindest eine Nacht ohne Niedrig-Alarme (UZ), bevor du den BZ-Zielbereich senkst Fein-Einstellung des Closed-Loops, Erhöhen von max IOB über 0 und langsames Heruntersetzen des Zielbereichs Eine Woche erfolgreiches Loopen am Tag mit regelmäßiger Kohlenhydrat-Eingabe From 8c3df40fdf013fe982f5e38f84862489ac416fd2 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 12:22:01 +0200 Subject: [PATCH 05/91] Don't create empty future carbs records. Fixes #940. When very few carbs are stretched out (e.g. 10g over 4h), there are gaps, so that 1g is generated only every 30m. Don't create empty records in between. --- .../androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java index 5939ab5aa3..c60d237882 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java @@ -403,7 +403,8 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C long carbTime = time + i * 15 * 60 * 1000; long smallCarbAmount = Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs remainingCarbs -= smallCarbAmount; - createCarb(smallCarbAmount, carbTime, notes); + if (smallCarbAmount > 0) + createCarb(smallCarbAmount, carbTime, notes); } } } From 7fbab357e8e957076054e102a1225b252e17ede3 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 13:25:12 +0200 Subject: [PATCH 06/91] Fix unit tests for added Combo plugin w/o engineering mode. --- app/src/test/java/info/nightscout/MainAppTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/test/java/info/nightscout/MainAppTest.java b/app/src/test/java/info/nightscout/MainAppTest.java index 7aa50158f2..7bb58797be 100644 --- a/app/src/test/java/info/nightscout/MainAppTest.java +++ b/app/src/test/java/info/nightscout/MainAppTest.java @@ -76,7 +76,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsList(PluginType.PUMP).size()); } @@ -87,7 +87,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsVisibleInList(PluginType.PUMP).size()); } @@ -98,7 +98,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsListByInterface(PumpInterface.class).size()); } @@ -109,7 +109,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsVisibleInListByInterface(PumpInterface.class, PluginType.PUMP).size()); } From 3d5fb96d7de588e97f7dc88c34556959144a38b2 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Tue, 1 May 2018 13:29:15 +0200 Subject: [PATCH 07/91] fix zeroTempIOB --- .../plugins/IobCobCalculator/IobCobCalculatorPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index 2081e43929..3552931586 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -325,7 +325,7 @@ public class IobCobCalculatorPlugin extends PluginBase { basalIobWithZeroTemp.plus(calc); } - basalIob.iobWithZeroTemp = basalIobWithZeroTemp; + basalIob.iobWithZeroTemp = IobTotal.combine(bolusIob, basalIobWithZeroTemp).round(); } IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round(); From 4d1515769f7fcc41b2b5a9ad911d4b7e6ab00f87 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 14:59:40 +0200 Subject: [PATCH 08/91] Make persistent notification not peak on every update on Oreo. --- .../Persistentnotification/PersistentNotificationPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 789c9df143..68ff7cec69 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -138,6 +138,7 @@ public class PersistentNotificationPlugin extends PluginBase { NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID); builder.setOngoing(true); + builder.setOnlyAlertOnce(true); builder.setCategory(NotificationCompat.CATEGORY_STATUS); builder.setSmallIcon(R.drawable.ic_notification); Bitmap largeIcon = BitmapFactory.decodeResource(ctx.getResources(), R.mipmap.blueowl); From 60d3cde0d30a7f83d41088ead94e20e8d59e56c9 Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Tue, 1 May 2018 17:29:21 +0200 Subject: [PATCH 09/91] Compat for SR 1.6.0 --- app/libs/sightparser-release.aar | Bin 203059 -> 226194 bytes .../PumpInsight/connector/Connector.java | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/libs/sightparser-release.aar b/app/libs/sightparser-release.aar index 0d656738d24594734d2dc9798c48ce2c8f8d3a1a..302b9e836d77d3846f2e45f0d1cb3693b7b717f4 100644 GIT binary patch delta 212153 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%0AyEOcHcQAYi^I0bplIM4&(~7oEL>xF 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 z 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%0AX88KQ%o8x1OXRgzOaSS=QN$M1a))ky@BRW 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 diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java index a96c98a39a..6a380067e4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java @@ -62,7 +62,7 @@ public class Connector { private int serviceReconnects = 0; private StatusCallback statusCallback = new StatusCallback() { @Override - public synchronized void onStatusChange(Status status) { + public synchronized void onStatusChange(Status status, long statusTime, long waitTime) { if ((status != lastStatus) || (Helpers.msSince(lastStatusTime) > 2000)) { log("Status change: " + status); @@ -94,7 +94,7 @@ public class Connector { serviceConnector.connect(); } else { log("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion); - statusCallback.onStatusChange(Status.INCOMPATIBLE); + statusCallback.onStatusChange(Status.INCOMPATIBLE, 0, 0); compatabilityMessage = gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion(); serviceConnector.disconnectFromService(); @@ -102,7 +102,7 @@ public class Connector { } catch (NullPointerException e) { log("ERROR: null pointer when trying to connect to pump"); } - statusCallback.onStatusChange(safeGetStatus()); + statusCallback.onStatusChange(safeGetStatus(), 0, 0); } @Override From 5ef7506e5fd6282c99943382f91dda101a5823c2 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 19:16:28 +0200 Subject: [PATCH 10/91] Clean up prediction colors. --- .../main/java/info/nightscout/androidaps/db/BgReading.java | 5 ++--- .../java/info/nightscout/androidaps/db/CareportalEvent.java | 5 ----- .../java/info/nightscout/androidaps/db/ExtendedBolus.java | 4 ---- .../java/info/nightscout/androidaps/db/ProfileSwitch.java | 5 ----- .../androidaps/plugins/IobCobCalculator/AutosensData.java | 5 ----- .../graphExtensions/DataPointWithLabelInterface.java | 1 - .../Overview/graphExtensions/PointsWithLabelGraphSeries.java | 1 - .../nightscout/androidaps/plugins/Treatments/Treatment.java | 5 ----- app/src/main/res/values/colors.xml | 2 +- 9 files changed, 3 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java index 20b9040065..17a6d7d8e2 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java +++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java @@ -211,7 +211,7 @@ public class BgReading implements DataPointWithLabelInterface { } int color = MainApp.sResources.getColor(R.color.inrange); if (isPrediction()) - color = MainApp.sResources.getColor(R.color.prediction); + return getPredectionColor(); else if (valueToUnits(units) < lowLine) color = MainApp.sResources.getColor(R.color.low); else if (valueToUnits(units) > highLine) @@ -219,8 +219,7 @@ public class BgReading implements DataPointWithLabelInterface { return color; } - @Override - public int getSecondColor() { + private int getPredectionColor() { if (isIOBPrediction) return MainApp.sResources.getColor(R.color.iob); if (isCOBPrediction) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index b0f69144c5..33fee529bc 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -263,9 +263,4 @@ public class CareportalEvent implements DataPointWithLabelInterface { return Color.GRAY; } - @Override - public int getSecondColor() { - return 0; - } - } diff --git a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java index 418de86c6c..1123cb58df 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java @@ -297,8 +297,4 @@ public class ExtendedBolus implements Interval, DataPointWithLabelInterface { return Color.CYAN; } - @Override - public int getSecondColor() { - return 0; - } } diff --git a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java index 9dca91c595..40c8e50c6d 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java @@ -263,11 +263,6 @@ public class ProfileSwitch implements Interval, DataPointWithLabelInterface { return Color.CYAN; } - @Override - public int getSecondColor() { - return 0; - } - public String toString() { return "ProfileSwitch{" + "date=" + date + diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java index 693a6fad55..79ab63e2ac 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java @@ -164,9 +164,4 @@ public class AutosensData implements DataPointWithLabelInterface { return MainApp.gc(R.color.cob); } - @Override - public int getSecondColor() { - return 0; - } - } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java index 3f6280431c..20d478692a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java @@ -55,5 +55,4 @@ public interface DataPointWithLabelInterface extends DataPointInterface{ PointsWithLabelGraphSeries.Shape getShape(); float getSize(); int getColor(); - int getSecondColor(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java index 8ac3be0ad8..5f39cedafe 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java @@ -211,7 +211,6 @@ public class PointsWithLabelGraphSeries e mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); canvas.drawCircle(endX, endY, scaledPxSize, mPaint); - mPaint.setColor(value.getSecondColor()); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); canvas.drawCircle(endX, endY, scaledPxSize / 3, mPaint); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java index 31d44a3e30..1983c38242 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java @@ -193,11 +193,6 @@ public class Treatment implements DataPointWithLabelInterface { return MainApp.instance().getResources().getColor(android.R.color.holo_red_light); } - @Override - public int getSecondColor() { - return 0; - } - @Override public void setY(double y) { yValue = y; diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e5b645dcc6..58982405c0 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #FFFFCC03 #FFFB8C00 #ffea00 - #ff9500 + #00ffff #FFFFFF #FFFFFF00 #FFFF00FF From ee61a7118114017e41ba65383c2e789ce9feb9ee Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 19:23:12 +0200 Subject: [PATCH 11/91] Sort predictions so they're properly displayed in the graph. GraphView library requires a series to be ordered by the x-value. --- .../androidaps/plugins/Overview/OverviewFragment.java | 3 ++- .../androidaps/plugins/Overview/graphData/GraphData.java | 9 +++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 2536e8bf5c..3f126aba19 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -1359,7 +1359,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // **** BG **** if (predictionsAvailable && SP.getBoolean("showprediction", false)) - graphData.addBgReadings(fromTime, toTime, lowLine, highLine, finalLastRun.constraintsProcessed); + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, + finalLastRun.constraintsProcessed.getPredictions()); else graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 25e7cb4af8..51e406af13 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -12,6 +12,7 @@ import com.jjoe64.graphview.series.LineGraphSeries; import com.jjoe64.graphview.series.Series; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import info.nightscout.androidaps.Constants; @@ -61,7 +62,7 @@ public class GraphData { this.iobCobCalculatorPlugin = iobCobCalculatorPlugin; } - public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, APSResult apsResult) { + public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, List predictions) { double maxBgValue = 0d; bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true); List bgListArray = new ArrayList<>(); @@ -74,9 +75,9 @@ public class GraphData { if (bg.value > maxBgValue) maxBgValue = bg.value; bgListArray.add(bg); } - if (apsResult != null) { - List predArray = apsResult.getPredictions(); - bgListArray.addAll(predArray); + if (predictions != null) { + Collections.sort(predictions, (o1, o2) -> Double.compare(o1.getX(), o2.getX())); + bgListArray.addAll(predictions); } maxBgValue = Profile.fromMgdlToUnits(maxBgValue, units); From 1e80ca22c646782118c646cdb19361630db5d1aa Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 19:23:38 +0200 Subject: [PATCH 12/91] Don't draw invalidated SMBs. --- .../androidaps/plugins/Overview/graphData/GraphData.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 51e406af13..a15fef8882 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -274,6 +274,7 @@ public class GraphData { for (int tx = 0; tx < treatments.size(); tx++) { Treatment t = treatments.get(tx); if (t.getX() < fromTime || t.getX() > endTime) continue; + if (t.isSMB && !t.isValid) continue; t.setY(getNearestBg((long) t.getX())); filteredTreatments.add(t); } From af563474d51a19750547fa77b8d41ced4ce19f14 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 18:18:06 +0200 Subject: [PATCH 13/91] Skip predictions below 40. --- .../androidaps/plugins/Overview/graphData/GraphData.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index a15fef8882..177e7f9642 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -77,7 +77,10 @@ public class GraphData { } if (predictions != null) { Collections.sort(predictions, (o1, o2) -> Double.compare(o1.getX(), o2.getX())); - bgListArray.addAll(predictions); + for (BgReading prediction : predictions) { + if (prediction.value >= 40) + bgListArray.add(prediction); + } } maxBgValue = Profile.fromMgdlToUnits(maxBgValue, units); From a362eeb31b3cc6bf334178303bf9540f0062b206 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 1 May 2018 13:25:12 +0200 Subject: [PATCH 14/91] Fix unit tests for added Combo plugin w/o engineering mode. --- app/src/test/java/info/nightscout/MainAppTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/test/java/info/nightscout/MainAppTest.java b/app/src/test/java/info/nightscout/MainAppTest.java index 7aa50158f2..7bb58797be 100644 --- a/app/src/test/java/info/nightscout/MainAppTest.java +++ b/app/src/test/java/info/nightscout/MainAppTest.java @@ -76,7 +76,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsList(PluginType.PUMP).size()); } @@ -87,7 +87,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsVisibleInList(PluginType.PUMP).size()); } @@ -98,7 +98,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsListByInterface(PumpInterface.class).size()); } @@ -109,7 +109,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsVisibleInListByInterface(PumpInterface.class, PluginType.PUMP).size()); } From 183f2cd6b3e4359e13bd50e8f482b8dbcd8b00e8 Mon Sep 17 00:00:00 2001 From: soko78 <34250545+soko78@users.noreply.github.com> Date: Tue, 1 May 2018 20:30:53 +0200 Subject: [PATCH 15/91] Update strings.xml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit line 177 & 178 changed "temoräres ziel" into "temporäres ziel" --- app/src/main/res/values-de/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index dc28ebaeb7..cd8ee8de76 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -174,8 +174,8 @@ Absolut Bolus fehlgeschlagen TBR abbrechen - Temoräres Ziel - Temoräres Ziel abbrechen + Temporäres Ziel + Temporäres Ziel abbrechen Kommentar Verbunden Verbinden From e91fd008362537882c75f4a27199bb38257b25b3 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 21:46:37 +0200 Subject: [PATCH 16/91] Add Unit-Test, as well as fixtures for SSID handling --- .../androidaps/events/EventNetworkChange.java | 6 +- .../NSClientInternal/NSClientPlugin.java | 138 ++++-------------- .../NsClientReceiverDelegate.java | 132 +++++++++++++++++ .../services/NSClientService.java | 2 +- .../NsClientReceiverDelegateTest.java | 115 +++++++++++++++ 5 files changed, 282 insertions(+), 111 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java create mode 100644 app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java b/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java index ed639d643d..03df71f31b 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java @@ -5,6 +5,10 @@ public class EventNetworkChange extends Event { public boolean mobileConnected = false; public boolean wifiConnected = false; - public String ssid; + public String ssid = ""; public boolean roaming = false; + + public String getSsid() { + return ssid.replace("SSID: ","").replaceAll("\"",""); + } } 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 8a19834ca5..4e65e46a0f 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 @@ -3,11 +3,7 @@ package info.nightscout.androidaps.plugins.NSClientInternal; import android.content.ComponentName; import android.content.Context; import android.content.Intent; -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; @@ -37,8 +33,6 @@ 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,17 +54,13 @@ public class NSClientPlugin extends PluginBase { Spanned textLog = Html.fromHtml(""); 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; - private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); - private ChargingStateReceiver chargingStateReceiver = new ChargingStateReceiver(); + private NsClientReceiverDelegate nsClientReceiverDelegate; private NSClientPlugin() { super(new PluginDescription() @@ -92,8 +82,16 @@ public class NSClientPlugin extends PluginBase { handlerThread.start(); handler = new Handler(handlerThread.getLooper()); } + + nsClientReceiverDelegate = + new NsClientReceiverDelegate(MainApp.instance().getApplicationContext(), MainApp.bus()); } + public boolean isAllowed() { + return nsClientReceiverDelegate.allowed; + } + + @Override protected void onStart() { MainApp.bus().register(this); @@ -102,32 +100,7 @@ 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, - new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); - context.registerReceiver(networkChangeReceiver, - new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); - - 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); - + nsClientReceiverDelegate.registerReceivers(); } @Override @@ -135,10 +108,26 @@ public class NSClientPlugin extends PluginBase { MainApp.bus().unregister(this); Context context = MainApp.instance().getApplicationContext(); context.unbindService(mConnection); - context.unregisterReceiver(networkChangeReceiver); - context.unregisterReceiver(chargingStateReceiver); + + nsClientReceiverDelegate.unregisterReceivers(); } + @Subscribe + public void onStatusEvent(EventPreferenceChange ev) { + nsClientReceiverDelegate.onStatusEvent(ev); + } + + @Subscribe + public void onStatusEvent(final EventChargingState ev) { + nsClientReceiverDelegate.onStatusEvent(ev); + } + + @Subscribe + public void onStatusEvent(final EventNetworkChange ev) { + nsClientReceiverDelegate.onStatusEvent(ev); + } + + private ServiceConnection mConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { @@ -154,81 +143,12 @@ public class NSClientPlugin extends PluginBase { } }; - @Subscribe - public void onStatusEvent(EventPreferenceChange ev) { - if (ev.isChanged(R.string.key_ns_wifionly) || - ev.isChanged(R.string.key_ns_wifi_ssids) || - ev.isChanged(R.string.key_ns_allowroaming) - ) { - 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); - - boolean newAllowedState = true; - - if (!ev.wifiConnected && wifiOnly) newAllowedState = false; - if (ev.wifiConnected && !allowedSSIDs.isEmpty() && !allowedSSIDs.contains(ev.ssid)) - newAllowedState = false; - if (!allowRoaming && ev.roaming) newAllowedState = false; - - return newAllowedState; - } @Subscribe public void onStatusEvent(final EventAppExit ignored) { if (nsClientService != null) { MainApp.instance().getApplicationContext().unbindService(mConnection); - MainApp.instance().getApplicationContext().unregisterReceiver(networkChangeReceiver); + nsClientReceiverDelegate.unregisterReceivers(); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java new file mode 100644 index 0000000000..627c67af34 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java @@ -0,0 +1,132 @@ +package info.nightscout.androidaps.plugins.NSClientInternal; + +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.wifi.WifiManager; + +import com.squareup.otto.Bus; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventChargingState; +import info.nightscout.androidaps.events.EventNetworkChange; +import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.receivers.ChargingStateReceiver; +import info.nightscout.androidaps.receivers.NetworkChangeReceiver; +import info.nightscout.utils.SP; + +class NsClientReceiverDelegate { + + private final Context context; + private final Bus bus; + + private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); + private ChargingStateReceiver chargingStateReceiver = new ChargingStateReceiver(); + + private boolean allowedChargingState = true; + private boolean allowedNetworkState = true; + boolean allowed = true; + + NsClientReceiverDelegate(Context context, Bus bus) { + this.context = context; + this.bus = bus; + } + + 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, + new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + context.registerReceiver(networkChangeReceiver, + new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); + + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(context); + if (event != null) + 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) + bus.post(eventChargingState); + + } + + void unregisterReceivers() { + context.unregisterReceiver(networkChangeReceiver); + context.unregisterReceiver(chargingStateReceiver); + } + + void onStatusEvent(EventPreferenceChange ev) { + if (ev.isChanged(R.string.key_ns_wifionly) || + ev.isChanged(R.string.key_ns_wifi_ssids) || + ev.isChanged(R.string.key_ns_allowroaming) + ) { + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); + if (event != null) + bus.post(event); + } else if (ev.isChanged(R.string.key_ns_chargingonly)) { + EventChargingState event = chargingStateReceiver.grabChargingState(MainApp.instance().getApplicationContext()); + if (event != null) + bus.post(event); + } + } + + void onStatusEvent(final EventChargingState ev) { + boolean newChargingState = calculateStatus(ev); + + if (newChargingState != allowedChargingState) { + allowedChargingState = newChargingState; + processStateChange(); + } + } + + void onStatusEvent(final EventNetworkChange ev) { + boolean newNetworkState = calculateStatus(ev); + + if (newNetworkState != allowedNetworkState) { + allowedNetworkState = newNetworkState; + processStateChange(); + } + } + + void processStateChange() { + boolean newAllowedState = allowedChargingState && allowedNetworkState; + if (newAllowedState != allowed) { + allowed = newAllowedState; + bus.post(new EventPreferenceChange(R.string.key_nsclientinternal_paused)); + } + } + + boolean calculateStatus(final EventChargingState ev) { + boolean chargingOnly = SP.getBoolean(R.string.key_ns_chargingonly, false); + + boolean newAllowedState = true; + + if (!ev.isCharging && chargingOnly) newAllowedState = false; + + return newAllowedState; + } + + 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); + + boolean newAllowedState = true; + + if (!ev.wifiConnected && wifiOnly) newAllowedState = false; + if (ev.wifiConnected && !allowedSSIDs.trim().isEmpty() && !allowedSSIDs.contains(ev.ssid)) + newAllowedState = false; + if (!allowRoaming && ev.roaming) newAllowedState = false; + + return newAllowedState; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index b842f06726..91c5eccb35 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -202,7 +202,7 @@ public class NSClientService extends Service { nsAPIhashCode = Hashing.sha1().hashString(nsAPISecret, Charsets.UTF_8).toString(); MainApp.bus().post(new EventNSClientStatus("Initializing")); - if (!MainApp.getSpecificPlugin(NSClientPlugin.class).allowed) { + if (!MainApp.getSpecificPlugin(NSClientPlugin.class).isAllowed()) { MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "not allowed")); MainApp.bus().post(new EventNSClientStatus("Not allowed")); } else if (MainApp.getSpecificPlugin(NSClientPlugin.class).paused) { diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java new file mode 100644 index 0000000000..cc209c1837 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java @@ -0,0 +1,115 @@ +package info.nightscout.androidaps.plugins.NSClientInternal; + +import android.content.Context; +import com.squareup.otto.Bus; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import info.AAPSMocker; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventChargingState; +import info.nightscout.androidaps.events.EventNetworkChange; +import info.nightscout.utils.SP; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({MainApp.class, SP.class, Context.class}) +public class NsClientReceiverDelegateTest { + + private NsClientReceiverDelegate sut; + + @Before + public void prepare() { + AAPSMocker.mockMainApp(); + AAPSMocker.mockApplicationContext(); + + Bus bus = MainApp.bus(); + Context context = MainApp.instance().getApplicationContext(); + + sut = new NsClientReceiverDelegate(context, bus); + } + + @Test + public void testCalculateStatusChargingState() { + PowerMockito.mockStatic(SP.class); + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(false); + EventChargingState ev = new EventChargingState(true); + assertTrue(sut.calculateStatus(ev)); + ev = new EventChargingState(false); + assertTrue(sut.calculateStatus(ev)); + + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(true); + ev = new EventChargingState(true); + assertTrue(sut.calculateStatus(ev)); + ev = new EventChargingState(false); + assertTrue(!sut.calculateStatus(ev)); + } + + @Test + public void testCalculateStatusNetworkState() { + PowerMockito.mockStatic(SP.class); + // wifiOnly = false + // allowRoaming = false as well + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(false); + when(SP.getString(anyInt(), anyString())).thenReturn(""); + EventNetworkChange ev = new EventNetworkChange(); + ev.ssid = ""; + + ev.mobileConnected = true; + ev.wifiConnected = true; + assertTrue(sut.calculateStatus(ev)); + ev.wifiConnected = false; + assertTrue(sut.calculateStatus(ev)); + + // wifiOnly = true + // allowRoaming = true as well + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(true); + ev.wifiConnected = true; + assertTrue(sut.calculateStatus(ev)); + ev.wifiConnected = false; + assertTrue(!sut.calculateStatus(ev)); + + // wifiOnly = false + // allowRoaming = false as well + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(false); + ev.wifiConnected = false; + ev.roaming = true; + assertTrue(!sut.calculateStatus(ev)); + + // wifiOnly = false + // allowRoaming = true + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(false); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(true); + ev.wifiConnected = false; + ev.roaming = true; + assertTrue(sut.calculateStatus(ev)); + + // wifiOnly = true + // allowRoaming = true + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(true); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(true); + ev.wifiConnected = false; + ev.roaming = true; + assertTrue(!sut.calculateStatus(ev)); + + // wifiOnly = true + // allowRoaming = true + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(true); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(true); + ev.wifiConnected = true; + ev.roaming = true; + assertTrue(sut.calculateStatus(ev)); + } +} From 02e9ce105c21da3910e6a42b764830bf92fab57c Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 22:01:08 +0200 Subject: [PATCH 17/91] Add boolean thingie from Adrian ;-) --- .../androidaps/plugins/NSClientInternal/NSClientPlugin.java | 2 +- .../plugins/NSClientInternal/NsClientReceiverDelegate.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 254a21c340..c43297ccf6 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 @@ -142,7 +142,7 @@ public class NSClientPlugin extends PluginBase { nsClientService = mLocalBinder.getServiceInstance(); } }; - + @Subscribe public void onStatusEvent(final EventAppExit ignored) { if (nsClientService != null) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java index 627c67af34..a9238a83ea 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java @@ -124,7 +124,7 @@ class NsClientReceiverDelegate { if (!ev.wifiConnected && wifiOnly) newAllowedState = false; if (ev.wifiConnected && !allowedSSIDs.trim().isEmpty() && !allowedSSIDs.contains(ev.ssid)) newAllowedState = false; - if (!allowRoaming && ev.roaming) newAllowedState = false; + if (!ev.wifiConnected && !allowRoaming && ev.roaming) newAllowedState = false; return newAllowedState; } From 306d45bb3ef5bcd3a3552b9023ed08e4b27386f4 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 22:15:22 +0200 Subject: [PATCH 18/91] Fix Boolean thingy --- .../NSClientInternal/NsClientReceiverDelegate.java | 14 ++++++++++---- .../NsClientReceiverDelegateTest.java | 8 ++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java index a9238a83ea..04b587ca24 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java @@ -121,10 +121,16 @@ class NsClientReceiverDelegate { boolean newAllowedState = true; - if (!ev.wifiConnected && wifiOnly) newAllowedState = false; - if (ev.wifiConnected && !allowedSSIDs.trim().isEmpty() && !allowedSSIDs.contains(ev.ssid)) - newAllowedState = false; - if (!ev.wifiConnected && !allowRoaming && ev.roaming) newAllowedState = false; + if (ev.wifiConnected) { + if (!allowedSSIDs.trim().isEmpty() && !allowedSSIDs.contains(ev.ssid)) { + newAllowedState = false; + } + } else { + if ((!allowRoaming && ev.roaming) || wifiOnly) { + newAllowedState = false; + } + } + return newAllowedState; } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java index cc209c1837..70e8d2c9b7 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java @@ -111,5 +111,13 @@ public class NsClientReceiverDelegateTest { ev.wifiConnected = true; ev.roaming = true; assertTrue(sut.calculateStatus(ev)); + + // wifiOnly = false + // allowRoaming = false + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(false); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(false); + ev.wifiConnected = true; + ev.roaming = true; + assertTrue(sut.calculateStatus(ev)); } } From 8a627603eaf2a3eb3adea295b6f7b6ab2d52d0e5 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 22:23:24 +0200 Subject: [PATCH 19/91] Revert lib change --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a5ebbe12c8..16e3bfbe71 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ android { defaultConfig { applicationId "info.nightscout.androidaps" - minSdkVersion 23 + minSdkVersion 21 targetSdkVersion 25 multiDexEnabled true versionCode 1500 From de921259672f8077a5d2ba94cb31a582b8198d26 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 22:49:44 +0200 Subject: [PATCH 20/91] Fixes wrong algo --- .../ObjectivesFragment.java | 2 +- .../ObjectivesFragmentTest.java | 17 +---------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index 688c741329..d7b39b3d71 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -204,7 +204,7 @@ public class ObjectivesFragment extends SubscriberFragment { return 1; } else if (objectiveStartedTime > 0 && !enableFakeValue && objectiveAccomplishedTime == 0 - && !(objectiveStartedTime + durationInDays * 24 * 60 * 60 * 1000 >= now && requirementsMet)) { + && !(objectiveStartedTime + durationInDays * 24 * 60 * 60 * 1000 < now && requirementsMet)) { return 2; } else if (objectiveAccomplishedTime == 0) { return 3; diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java index a4119e97e3..ca47477905 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java @@ -35,25 +35,10 @@ public class ObjectivesFragmentTest { objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); // started - // time calculation is false, requirements met is false + // time calculation is true, requirements met is true objectiveStartedTime = 10; durationInDays = 0; requirementsMet = true; - assertEquals(2, fragment.modifyVisibility(currentPosition, prevObjectiveAccomplishedTime, - objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); - - // started - // time calculation is false, requirements met is true - objectiveStartedTime = 10; - durationInDays = 999999; - requirementsMet = true; - assertEquals(2, fragment.modifyVisibility(currentPosition, prevObjectiveAccomplishedTime, - objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); - - // started, after duration, requirements met --> show verify - objectiveStartedTime = Long.MAX_VALUE; - durationInDays = 0; - requirementsMet = true; assertEquals(3, fragment.modifyVisibility(currentPosition, prevObjectiveAccomplishedTime, objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); From a46b0383812928499b93be6a19ffd27ee28f5f19 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 23:34:40 +0200 Subject: [PATCH 21/91] use correct number format --- .../plugins/ConstraintsObjectives/ObjectivesFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index d7b39b3d71..a544460462 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -204,7 +204,7 @@ public class ObjectivesFragment extends SubscriberFragment { return 1; } else if (objectiveStartedTime > 0 && !enableFakeValue && objectiveAccomplishedTime == 0 - && !(objectiveStartedTime + durationInDays * 24 * 60 * 60 * 1000 < now && requirementsMet)) { + && !(objectiveStartedTime + (long)durationInDays * 24 * 60 * 60 * 1000 < now && requirementsMet)) { return 2; } else if (objectiveAccomplishedTime == 0) { return 3; From 2d3d39d1dc3b341cdea0b62dc47b60f065b05125 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Tue, 1 May 2018 23:43:18 +0200 Subject: [PATCH 22/91] Use common helper method for day calculation --- .../plugins/ConstraintsObjectives/ObjectivesFragment.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index a544460462..e4cdab4c80 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -26,6 +26,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.utils.FabricPrivacy; +import info.nightscout.utils.T; public class ObjectivesFragment extends SubscriberFragment { private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class); @@ -204,7 +205,7 @@ public class ObjectivesFragment extends SubscriberFragment { return 1; } else if (objectiveStartedTime > 0 && !enableFakeValue && objectiveAccomplishedTime == 0 - && !(objectiveStartedTime + (long)durationInDays * 24 * 60 * 60 * 1000 < now && requirementsMet)) { + && !(objectiveStartedTime + T.days(durationInDays).msecs() < now && requirementsMet)) { return 2; } else if (objectiveAccomplishedTime == 0) { return 3; From f75329f5dc7e1a1218eec01b25b51884562538ff Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 07:51:04 +0200 Subject: [PATCH 23/91] move COB string representation to CobInfo --- .../plugins/IobCobCalculator/CobInfo.java | 18 ++++++++++++++++++ .../wearintegration/WatchUpdaterService.java | 19 +------------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java index 90b72132bd..f05d443bba 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java @@ -1,7 +1,10 @@ package info.nightscout.androidaps.plugins.IobCobCalculator; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import info.nightscout.utils.DecimalFormatter; + public class CobInfo { /** All COB up to now, including carbs not yet processed by IobCob calculation. */ @Nullable @@ -12,4 +15,19 @@ public class CobInfo { this.displayCob = displayCob; this.futureCarbs = futureCarbs; } + + @NonNull + public static String generateCOBString() { + + String cobStringResult = "--"; + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); + if (cobInfo.displayCob != null) { + cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob); + if (cobInfo.futureCarbs > 0) { + cobStringResult += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; + } + cobStringResult += "g"; + } + return cobStringResult; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 0d809a7bab..e999a9f4b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -42,8 +42,6 @@ import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; -import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; @@ -592,7 +590,7 @@ public class WatchUpdaterService extends WearableListenerService implements iobSum = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); iobDetail = "(" + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; - cobString = generateCOBString(); + cobString = CobInfo.generateCOBString(); currentBasal = generateBasalString(treatmentsInterface); //bgi @@ -715,21 +713,6 @@ public class WatchUpdaterService extends WearableListenerService implements return basalStringResult; } - @NonNull - private String generateCOBString() { - - String cobStringResult = "--"; - CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); - if (cobInfo.displayCob != null) { - cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob); - if (cobInfo.futureCarbs > 0) { - cobStringResult += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; - } - cobStringResult += "g"; - } - return cobStringResult; - } - @Override public void onDestroy() { if (googleApiClient != null && googleApiClient.isConnected()) { From 915dac8ef3fa1bb365a62325c0bde44baa4dd108 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 07:55:55 +0200 Subject: [PATCH 24/91] COB in external status --- .../androidaps/plugins/XDripStatusline/StatuslinePlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index 5ce277e399..0c5cbe5805 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -25,6 +25,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DecimalFormatter; @@ -130,7 +131,7 @@ public class StatuslinePlugin extends PluginBase { IobTotal bolusIob = treatmentsInterface.getLastCalculationTreatments().round(); treatmentsInterface.updateTotalIOBTempBasals(); IobTotal basalIob = treatmentsInterface.getLastCalculationTempBasals().round(); - status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); + status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob)+"U"; if (mPrefs.getBoolean("xdripstatus_detailediob", true)) { @@ -146,6 +147,7 @@ public class StatuslinePlugin extends PluginBase { double bgi = -(bolusIob.activity + basalIob.activity) * 5 * profile.getIsf(); status += " " + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to2Decimal(bgi); + status += " " + CobInfo.generateCOBString(); return status; } From c445c078e11824fdeb6080a37057c0f51abe5fcd Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 07:57:29 +0200 Subject: [PATCH 25/91] add g to default COB as well --- .../nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java index f05d443bba..c7213b9f51 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java @@ -19,7 +19,7 @@ public class CobInfo { @NonNull public static String generateCOBString() { - String cobStringResult = "--"; + String cobStringResult = "--g"; CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); if (cobInfo.displayCob != null) { cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob); From 24bd509ec63e8c192c71f6e5998c34dbfdcd9969 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 08:04:34 +0200 Subject: [PATCH 26/91] COB in ongoing notification --- .../PersistentNotificationPlugin.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 68ff7cec69..332b308ade 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -35,6 +35,7 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DecimalFormatter; @@ -125,11 +126,9 @@ public class PersistentNotificationPlugin extends PluginBase { IobTotal bolusIob = TreatmentsPlugin.getPlugin().getLastCalculationTreatments().round(); IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round(); - String line2 = ctx.getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" - + ctx.getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " - + ctx.getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; - + String line2 = ctx.getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + CobInfo.generateCOBString(); + String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h"; From 2749c1c85354d86b8f1d930cbd199bbeaa614b29 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 11:19:03 +0200 Subject: [PATCH 27/91] refactor cob string --- .../androidaps/plugins/IobCobCalculator/CobInfo.java | 12 +++++------- .../IobCobCalculator/IobCobCalculatorPlugin.java | 3 +++ .../PersistentNotificationPlugin.java | 3 ++- .../Wear/wearintegration/WatchUpdaterService.java | 3 ++- .../plugins/XDripStatusline/StatuslinePlugin.java | 3 ++- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java index c7213b9f51..d8b6d7674a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java @@ -17,14 +17,12 @@ public class CobInfo { } @NonNull - public static String generateCOBString() { - + public String generateCOBString() { String cobStringResult = "--g"; - CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); - if (cobInfo.displayCob != null) { - cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob); - if (cobInfo.futureCarbs > 0) { - cobStringResult += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; + if (displayCob != null) { + cobStringResult = DecimalFormatter.to0Decimal(displayCob); + if (futureCarbs > 0) { + cobStringResult += "(" + DecimalFormatter.to0Decimal(futureCarbs) + ")"; } cobStringResult += "g"; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index 3552931586..ceca24839f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -1,6 +1,7 @@ package info.nightscout.androidaps.plugins.IobCobCalculator; import android.os.SystemClock; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.LongSparseArray; @@ -404,6 +405,8 @@ public class IobCobCalculatorPlugin extends PluginBase { } } + + @NonNull public CobInfo getCobInfo(boolean _synchronized, String reason) { AutosensData autosensData = _synchronized ? getLastAutosensDataSynchronized(reason) : getLastAutosensData(reason); Double displayCob = null; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 332b308ade..7194dae8d7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -36,6 +36,7 @@ import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DecimalFormatter; @@ -127,7 +128,7 @@ public class PersistentNotificationPlugin extends PluginBase { IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round(); - String line2 = ctx.getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + CobInfo.generateCOBString(); + String line2 = ctx.getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString();; String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h"; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index e999a9f4b9..705bae47a7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -38,6 +38,7 @@ import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; @@ -590,7 +591,7 @@ public class WatchUpdaterService extends WearableListenerService implements iobSum = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); iobDetail = "(" + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; - cobString = CobInfo.generateCOBString(); + cobString = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService").generateCOBString(); currentBasal = generateBasalString(treatmentsInterface); //bgi diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index 0c5cbe5805..426acbe6ca 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -26,6 +26,7 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DecimalFormatter; @@ -147,7 +148,7 @@ public class StatuslinePlugin extends PluginBase { double bgi = -(bolusIob.activity + basalIob.activity) * 5 * profile.getIsf(); status += " " + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to2Decimal(bgi); - status += " " + CobInfo.generateCOBString(); + status += " " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "StatuslinePlugin").generateCOBString(); return status; } From 7b6402de098c67626420f753558caaa91e27c392 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:04:21 +0200 Subject: [PATCH 28/91] use gs function in MainApp to get strings --- .../plugins/Actions/ActionsFragment.java | 4 ++-- .../plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 12 ++++++------ .../plugins/OpenAPSMA/OpenAPSMAPlugin.java | 12 ++++++------ .../plugins/OpenAPSSMB/OpenAPSSMBPlugin.java | 12 ++++++------ .../plugins/PumpCombo/ComboPlugin.java | 4 ++-- .../plugins/PumpDanaR/AbstractDanaRPlugin.java | 18 +++++++++--------- .../plugins/PumpInsight/InsightPlugin.java | 4 ++-- .../androidaps/plugins/PumpMDI/MDIPlugin.java | 12 ++++++------ .../plugins/PumpVirtual/VirtualPumpPlugin.java | 12 ++++++------ .../plugins/Wear/ActionStringHandler.java | 16 ++++++++-------- .../wearintegration/WatchUpdaterService.java | 2 +- .../java/info/nightscout/utils/NSUpload.java | 18 +++++++++--------- 12 files changed, 63 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java index cc73571b9d..84086d6117 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java @@ -158,7 +158,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL if (activeExtendedBolus != null) { extendedBolus.setVisibility(View.GONE); extendedBolusCancel.setVisibility(View.VISIBLE); - extendedBolusCancel.setText(MainApp.instance().getString(R.string.cancel) + " " + activeExtendedBolus.toString()); + extendedBolusCancel.setText(MainApp.gs(R.string.cancel) + " " + activeExtendedBolus.toString()); } else { extendedBolus.setVisibility(View.VISIBLE); extendedBolusCancel.setVisibility(View.GONE); @@ -174,7 +174,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL if (activeTemp != null) { tempBasal.setVisibility(View.GONE); tempBasalCancel.setVisibility(View.VISIBLE); - tempBasalCancel.setText(MainApp.instance().getString(R.string.cancel) + " " + activeTemp.toStringShort()); + tempBasalCancel.setText(MainApp.gs(R.string.cancel) + " " + activeTemp.toStringShort()); } else { tempBasal.setVisibility(View.VISIBLE); tempBasalCancel.setVisibility(View.GONE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java index 17e1dd77e9..143456f6fc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java @@ -104,23 +104,23 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (profile == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.noprofileselected)); + log.debug(MainApp.gs(R.string.noprofileselected)); return; } if (!isEnabled(PluginType.APS)) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_disabled)); + log.debug(MainApp.gs(R.string.openapsma_disabled)); return; } if (glucoseStatus == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata)); + log.debug(MainApp.gs(R.string.openapsma_noglucosedata)); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java index 00f1888851..14dac65625 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java @@ -104,23 +104,23 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (profile == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.noprofileselected)); + log.debug(MainApp.gs(R.string.noprofileselected)); return; } if (!isEnabled(PluginType.APS)) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_disabled)); + log.debug(MainApp.gs(R.string.openapsma_disabled)); return; } if (glucoseStatus == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata)); + log.debug(MainApp.gs(R.string.openapsma_noglucosedata)); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java index cd7872ecb1..741adb4dd7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java @@ -107,23 +107,23 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (profile == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.noprofileselected)); + log.debug(MainApp.gs(R.string.noprofileselected)); return; } if (!isEnabled(PluginType.APS)) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_disabled)); + log.debug(MainApp.gs(R.string.openapsma_disabled)); return; } if (glucoseStatus == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata)); + log.debug(MainApp.gs(R.string.openapsma_noglucosedata)); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 68db1658f6..3cf4557e54 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -458,7 +458,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint log.error("deliverTreatment: Invalid input"); return new PumpEnactResult().success(false).enacted(false) .bolusDelivered(0d).carbsDelivered(0d) - .comment(MainApp.instance().getString(R.string.danar_invalidinput)); + .comment(MainApp.gs(R.string.danar_invalidinput)); } else if (detailedBolusInfo.insulin > 0) { // bolus needed, ask pump to deliver it return deliverBolus(detailedBolusInfo); @@ -474,7 +474,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return new PumpEnactResult().success(true).enacted(true) .bolusDelivered(0d).carbsDelivered(detailedBolusInfo.carbs) - .comment(MainApp.instance().getString(R.string.virtualpump_resultok)); + .comment(MainApp.gs(R.string.virtualpump_resultok)); } } finally { MainApp.bus().post(new EventComboPumpUpdateGUI()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java index ea83e6d4d6..f3898bc98f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java @@ -166,7 +166,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte result.isTempCancel = false; result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("setTempBasalPercent: Invalid input"); return result; } @@ -178,7 +178,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte result.enacted = false; result.success = true; result.isTempCancel = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; result.isPercent = true; @@ -191,7 +191,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; @@ -202,7 +202,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.tempbasaldeliveryerror); + result.comment = MainApp.gs(R.string.tempbasaldeliveryerror); log.error("setTempBasalPercent: Failed to set temp basal"); return result; } @@ -219,7 +219,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte if (runningEB != null && Math.abs(runningEB.insulin - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = false; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.extendedBolusRemainingMinutes; result.absolute = pump.extendedBolusAbsoluteRate; result.isPercent = false; @@ -232,7 +232,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte if (connectionOK && pump.isExtendedInProgress && Math.abs(pump.extendedBolusAmount - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.extendedBolusRemainingMinutes; result.absolute = pump.extendedBolusAbsoluteRate; @@ -245,7 +245,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("setExtendedBolus: Failed to extended bolus"); return result; } @@ -261,13 +261,13 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } if (!pump.isExtendedInProgress) { result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelExtendedBolus: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("cancelExtendedBolus: Failed to cancel extended bolus"); return result; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java index c0e53ddaac..54f618158a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java @@ -395,7 +395,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai result.bolusDelivered = detailedBolusInfo.insulin; result.carbsDelivered = detailedBolusInfo.carbs; result.enacted = result.bolusDelivered > 0 || result.carbsDelivered > 0; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.percent = 100; @@ -796,7 +796,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai } private String gs(int id) { - return MainApp.instance().getString(id); + return MainApp.gs(id); } private boolean isPumpRunning() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index 9c19a383ae..fed0c01c64 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -134,7 +134,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { result.success = true; result.bolusDelivered = detailedBolusInfo.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo); return result; } @@ -147,7 +147,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Setting temp basal absolute: " + result); return result; @@ -157,7 +157,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Settings temp basal percent: " + result); return result; @@ -167,7 +167,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Setting extended bolus: " + result); return result; @@ -177,7 +177,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult cancelTempBasal(boolean force) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Cancel temp basal: " + result); return result; @@ -187,7 +187,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult cancelExtendedBolus() { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Canceling extended basal: " + result); return result; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java index 0491ce0f74..9176ea94b5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java @@ -202,7 +202,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.bolusDelivered = detailedBolusInfo.insulin; result.carbsDelivered = detailedBolusInfo.carbs; result.enacted = result.bolusDelivered > 0 || result.carbsDelivered > 0; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); Double delivering = 0d; @@ -246,7 +246,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.isTempCancel = false; result.absolute = absoluteRate; result.duration = durationInMinutes; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal); if (Config.logPumpComm) log.debug("Setting temp basal absolute: " + result); @@ -274,7 +274,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.isPercent = true; result.isTempCancel = false; result.duration = durationInMinutes; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal); if (Config.logPumpComm) log.debug("Settings temp basal percent: " + result); @@ -298,7 +298,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.bolusDelivered = insulin; result.isTempCancel = false; result.duration = durationInMinutes; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus); if (Config.logPumpComm) log.debug("Setting extended bolus: " + result); @@ -312,7 +312,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { PumpEnactResult result = new PumpEnactResult(); result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (TreatmentsPlugin.getPlugin().isTempBasalInProgress()) { result.enacted = true; TemporaryBasal tempStop = new TemporaryBasal().date(System.currentTimeMillis()).source(Source.USER); @@ -337,7 +337,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.success = true; result.enacted = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpComm) log.debug("Canceling extended basal: " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index fdc14f32d4..bbb1d9122c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -95,9 +95,9 @@ public class ActionStringHandler { return; } Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - rMessage += MainApp.instance().getString(R.string.primefill) + ": " + insulinAfterConstraints + "U"; + rMessage += MainApp.gs(R.string.primefill) + ": " + insulinAfterConstraints + "U"; if (insulinAfterConstraints - amount != 0) - rMessage += "\n" + MainApp.instance().getString(R.string.constraintapllied); + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); rAction += "fill " + insulinAfterConstraints; @@ -106,9 +106,9 @@ public class ActionStringHandler { double amount = SafeParse.stringToDouble(act[1]); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - rMessage += MainApp.instance().getString(R.string.primefill) + ": " + insulinAfterConstraints + "U"; + rMessage += MainApp.gs(R.string.primefill) + ": " + insulinAfterConstraints + "U"; if (insulinAfterConstraints - amount != 0) - rMessage += "\n" + MainApp.instance().getString(R.string.constraintapllied); + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); rAction += "fill " + insulinAfterConstraints; @@ -118,11 +118,11 @@ public class ActionStringHandler { int carbs = SafeParse.stringToInt(act[2]); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value(); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbs)).value(); - rMessage += MainApp.instance().getString(R.string.bolus) + ": " + insulinAfterConstraints + "U\n"; - rMessage += MainApp.instance().getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + rMessage += MainApp.gs(R.string.bolus) + ": " + insulinAfterConstraints + "U\n"; + rMessage += MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; if ((insulinAfterConstraints - insulin != 0) || (carbsAfterConstraints - carbs != 0)) { - rMessage += "\n" + MainApp.instance().getString(R.string.constraintapllied); + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); } rAction += "bolus " + insulinAfterConstraints + " " + carbsAfterConstraints; @@ -283,7 +283,7 @@ public class ActionStringHandler { //if pump is not busy: try to fetch data final PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); if (pump.isBusy()) { - rMessage += MainApp.instance().getString(R.string.pumpbusy); + rMessage += MainApp.gs(R.string.pumpbusy); } else { rMessage += "trying to fetch data from pump."; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index e999a9f4b9..d9bfd55f6b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -578,7 +578,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (googleApiClient.isConnected()) { Profile profile = MainApp.getConfigBuilder().getProfile(); - String status = MainApp.instance().getString(R.string.noprofile); + String status = MainApp.gs(R.string.noprofile); String iobSum, iobDetail, cobString, currentBasal, bgiString; iobSum = iobDetail = cobString = currentBasal = bgiString = ""; if (profile != null) { diff --git a/app/src/main/java/info/nightscout/utils/NSUpload.java b/app/src/main/java/info/nightscout/utils/NSUpload.java index 3cd252f19a..bfaedc2708 100644 --- a/app/src/main/java/info/nightscout/utils/NSUpload.java +++ b/app/src/main/java/info/nightscout/utils/NSUpload.java @@ -55,7 +55,7 @@ public class NSUpload { if (temporaryBasal.pumpId != 0) data.put("pumpId", temporaryBasal.pumpId); data.put("created_at", DateUtil.toISOString(temporaryBasal.date)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); if (originalExtendedAmount != null) data.put("originalExtendedAmount", originalExtendedAmount); // for back synchronization Bundle bundle = new Bundle(); @@ -93,7 +93,7 @@ public class NSUpload { if (temporaryBasal.pumpId != 0) data.put("pumpId", temporaryBasal.pumpId); data.put("created_at", DateUtil.toISOString(temporaryBasal.date)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); Bundle bundle = new Bundle(); bundle.putString("action", "dbAdd"); bundle.putString("collection", "treatments"); @@ -115,7 +115,7 @@ public class NSUpload { JSONObject data = new JSONObject(); data.put("eventType", CareportalEvent.TEMPBASAL); data.put("created_at", DateUtil.toISOString(time)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); if (isFakedTempBasal) data.put("isFakedTempBasal", isFakedTempBasal); if (pumpId != 0) @@ -147,7 +147,7 @@ public class NSUpload { if (extendedBolus.pumpId != 0) data.put("pumpId", extendedBolus.pumpId); data.put("created_at", DateUtil.toISOString(extendedBolus.date)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); Bundle bundle = new Bundle(); bundle.putString("action", "dbAdd"); bundle.putString("collection", "treatments"); @@ -173,7 +173,7 @@ public class NSUpload { data.put("enteredinsulin", 0); data.put("relative", 0); data.put("created_at", DateUtil.toISOString(time)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); if (pumpId != 0) data.put("pumpId", pumpId); Bundle bundle = new Bundle(); @@ -301,7 +301,7 @@ public class NSUpload { data.put("percentage", profileSwitch.percentage); } data.put("created_at", DateUtil.toISOString(profileSwitch.date)); - data.put("enteredBy", MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", MainApp.gs(R.string.app_name)); uploadCareportalEntryToNS(data); } catch (JSONException e) { log.error("Unhandled exception", e); @@ -325,7 +325,7 @@ public class NSUpload { data.put("targetTop", Profile.fromMgdlToUnits(tempTarget.high, profile.getUnits())); data.put("created_at", DateUtil.toISOString(tempTarget.date)); data.put("units", profile.getUnits()); - data.put("enteredBy", MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", MainApp.gs(R.string.app_name)); uploadCareportalEntryToNS(data); } catch (JSONException e) { log.error("Unhandled exception", e); @@ -346,7 +346,7 @@ public class NSUpload { data.put("percentage", profileSwitch.percentage); } data.put("created_at", DateUtil.toISOString(profileSwitch.date)); - data.put("enteredBy", MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", MainApp.gs(R.string.app_name)); if (profileSwitch._id != null) { Context context = MainApp.instance().getApplicationContext(); Bundle bundle = new Bundle(); @@ -420,7 +420,7 @@ public class NSUpload { data.put("eventType", "OpenAPS Offline"); data.put("duration", durationInMinutes); data.put("created_at", DateUtil.toISOString(new Date())); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); Bundle bundle = new Bundle(); bundle.putString("action", "dbAdd"); bundle.putString("collection", "treatments"); From 73b41a7162d6eb7eaba57e8b4f9880083b5bdfb8 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:12:08 +0200 Subject: [PATCH 29/91] some more gs --- .../plugins/PumpInsight/history/HistoryIntentAdapter.java | 8 ++++---- .../plugins/PumpInsight/history/HistoryReceiver.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java index 244537af3e..e7784287b7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java @@ -161,7 +161,7 @@ class HistoryIntentAdapter { Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME); String alertType = intent.getStringExtra(HistoryBroadcast.EXTRA_ALERT_TYPE); if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return; - logNote(date, MainApp.instance().getString(getAlertText(alertType))); + logNote(date, MainApp.gs(getAlertText(alertType))); } } @@ -171,13 +171,13 @@ class HistoryIntentAdapter { String newStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_NEW_STATUS); switch (newStatus) { case "STARTED": - logNote(newStatusTime, MainApp.instance().getString(R.string.pump_started)); + logNote(newStatusTime, MainApp.gs(R.string.pump_started)); break; case "STOPPED": - logNote(newStatusTime, MainApp.instance().getString(R.string.pump_stopped)); + logNote(newStatusTime, MainApp.gs(R.string.pump_stopped)); break; case "PAUSED": - logNote(newStatusTime, MainApp.instance().getString(R.string.pump_paused)); + logNote(newStatusTime, MainApp.gs(R.string.pump_paused)); break; } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java index efce8d7a40..ca68a389c8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java @@ -131,7 +131,7 @@ public class HistoryReceiver { @Override public String toString() { - return MainApp.instance().getString(string_id); + return MainApp.gs(string_id); } } From 20263c9fe485f5e757a3eb53d1cb324983a8a568 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:17:57 +0200 Subject: [PATCH 30/91] remove other gs helper methods --- .../plugins/PumpInsight/connector/Connector.java | 2 +- .../plugins/PumpInsight/history/LiveHistory.java | 6 +----- .../plugins/PumpInsight/utils/Helpers.java | 16 ++++++---------- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java index 6a380067e4..b764c62c94 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java @@ -221,7 +221,7 @@ public class Connector { public static String getKeepAliveString() { if (keepAliveActive()) { - return MainApp.instance().getString(R.string.insight_keepalive_format_string, + return MainApp.gs(R.string.insight_keepalive_format_string, stayConnectedTime / 1000, Helpers.hourMinuteSecondString(stayConnectedTill)); } else { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java index ca3848e113..46af6bda98 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java @@ -17,7 +17,7 @@ public class LiveHistory { public static String getStatus() { if (status.equals("")) return status; - return status + " " + Helpers.niceTimeScalar(Helpers.msSince(status_time)) + " " + gs(R.string.ago); + return status + " " + Helpers.niceTimeScalar(Helpers.msSince(status_time)) + " " + MainApp.gs(R.string.ago); } public static long getStatusTime() { @@ -30,8 +30,4 @@ public class LiveHistory { status = mystatus; } } - - private static String gs(int id) { - return MainApp.instance().getString(id); - } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java index a2abda40d7..344bf638b2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java @@ -96,32 +96,28 @@ public class Helpers { } public static String niceTimeScalar(long t) { - String unit = gs(R.string.second); + String unit = MainApp.gs(R.string.second); t = t / 1000; if (t > 59) { - unit = gs(R.string.minute); + unit = MainApp.gs(R.string.minute); t = t / 60; if (t > 59) { - unit = gs(R.string.hour); + unit = MainApp.gs(R.string.hour); t = t / 60; if (t > 24) { - unit = gs(R.string.day); + unit = MainApp.gs(R.string.day); t = t / 24; if (t > 28) { - unit = gs(R.string.week); + unit = MainApp.gs(R.string.week); t = t / 7; } } } } - if (t != 1) unit = unit + gs(R.string.time_plural); + if (t != 1) unit = unit + MainApp.gs(R.string.time_plural); return qs((double) t, 0) + " " + unit; } - private static String gs(int id) { - return MainApp.instance().getString(id); - } - public static String qs(double x, int digits) { if (digits == -1) { From cfaa26d337797be4df3f392a71fd471d7538825f Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:28:58 +0200 Subject: [PATCH 31/91] remove one more gs helper --- .../PumpInsight/connector/Connector.java | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java index b764c62c94..82b6cc3cc8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java @@ -95,7 +95,7 @@ public class Connector { } else { log("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion); statusCallback.onStatusChange(Status.INCOMPATIBLE, 0, 0); - compatabilityMessage = gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion(); + compatabilityMessage = MainApp.gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion(); serviceConnector.disconnectFromService(); } @@ -179,33 +179,29 @@ public class Connector { switch (status) { case EXCHANGING_KEYS: - return gs(R.string.connecting).toUpperCase(); + return MainApp.gs(R.string.connecting).toUpperCase(); case WAITING_FOR_CODE_CONFIRMATION: - return gs(R.string.insight_waiting_for_code).toUpperCase(); + return MainApp.gs(R.string.insight_waiting_for_code).toUpperCase(); case CODE_REJECTED: - return gs(R.string.insight_code_rejected).toUpperCase(); + return MainApp.gs(R.string.insight_code_rejected).toUpperCase(); case APP_BINDING: - return gs(R.string.insight_app_binding).toUpperCase(); + return MainApp.gs(R.string.insight_app_binding).toUpperCase(); case CONNECTING: - return gs(R.string.connecting).toUpperCase(); + return MainApp.gs(R.string.connecting).toUpperCase(); case CONNECTED: - return gs(R.string.connected).toUpperCase(); + return MainApp.gs(R.string.connected).toUpperCase(); case DISCONNECTED: - return gs(R.string.disconnected).toUpperCase(); + return MainApp.gs(R.string.disconnected).toUpperCase(); case NOT_AUTHORIZED: - return gs(R.string.insight_not_authorized).toUpperCase(); + return MainApp.gs(R.string.insight_not_authorized).toUpperCase(); case INCOMPATIBLE: - return gs(R.string.insight_incompatible).toUpperCase(); + return MainApp.gs(R.string.insight_incompatible).toUpperCase(); default: return status.toString(); } } - private static String gs(int id) { - return MainApp.instance().getString(id); - } - private static synchronized void extendKeepAliveIfActive() { if (keepAliveActive()) { if (Helpers.ratelimit("extend-insight-keepalive", 10)) { @@ -384,7 +380,7 @@ public class Connector { public String getLastStatusMessage() { if (!companionAppInstalled) { - return gs(R.string.insight_companion_app_not_installed); + return MainApp.gs(R.string.insight_companion_app_not_installed); } if (!isConnected()) { @@ -398,13 +394,13 @@ public class Connector { // if disconnected but previous state was incompatible return compatabilityMessage; } else { - return gs(R.string.insight_not_connected_to_companion_app); + return MainApp.gs(R.string.insight_not_connected_to_companion_app); } } } if (lastStatus == null) { - return gs(R.string.insight_unknown); + return MainApp.gs(R.string.insight_unknown); } switch (lastStatus) { @@ -414,16 +410,16 @@ public class Connector { } break; case INCOMPATIBLE: - return statusToString(lastStatus) + " " + gs(R.string.insight_needs) + " " + getLocalVersion(); + return statusToString(lastStatus) + " " + MainApp.gs(R.string.insight_needs) + " " + getLocalVersion(); } return statusToString(lastStatus); } public String getNiceLastStatusTime() { if (lastStatusTime < 1) { - return gs(R.string.insight_startup_uppercase); + return MainApp.gs(R.string.insight_startup_uppercase); } else { - return Helpers.niceTimeScalar(Helpers.msSince(lastStatusTime)) + " " + gs(R.string.ago); + return Helpers.niceTimeScalar(Helpers.msSince(lastStatusTime)) + " " + MainApp.gs(R.string.ago); } } @@ -516,7 +512,7 @@ public class Connector { } for (Map.Entry entry : statistics.entrySet()) { if ((long) entry.getValue() > 1000) { - l.add(new StatusItem(gs(R.string.statistics) + " " + Helpers.capitalize(entry.getKey().toString()), + l.add(new StatusItem(MainApp.gs(R.string.statistics) + " " + Helpers.capitalize(entry.getKey().toString()), new Formatter().format("%4s %12s", percentage(getEntryTime(entry), total) + "%", Helpers.niceTimeScalar(getEntryTime(entry))).toString())); From 81ad2779bc881de2e213c5289c69fca3259f32cd Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:32:41 +0200 Subject: [PATCH 32/91] remove direct access to sResources 1 --- .../TreatmentsProfileSwitchFragment.java | 8 +++---- .../TreatmentsTempTargetFragment.java | 8 +++---- .../java/info/nightscout/utils/LogDialog.java | 6 ++--- .../main/java/info/nightscout/utils/SP.java | 24 +++++++++---------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java index 8a6b0456f5..af8846662c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java @@ -131,9 +131,9 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen switch (v.getId()) { case R.id.profileswitch_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(profileSwitch.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(profileSwitch.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = profileSwitch._id; if (NSUpload.isIdValid(_id)) { @@ -144,7 +144,7 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen MainApp.getDbHelper().delete(profileSwitch); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; case R.id.profileswitch_date: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java index 5ce79636b5..0156df16e8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java @@ -140,9 +140,9 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements switch (v.getId()) { case R.id.temptargetrange_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(tempTarget.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(tempTarget.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = tempTarget._id; if (NSUpload.isIdValid(_id)) { @@ -153,7 +153,7 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements MainApp.getDbHelper().delete(tempTarget); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/utils/LogDialog.java b/app/src/main/java/info/nightscout/utils/LogDialog.java index b98582c05f..7e2468774e 100644 --- a/app/src/main/java/info/nightscout/utils/LogDialog.java +++ b/app/src/main/java/info/nightscout/utils/LogDialog.java @@ -25,7 +25,7 @@ public class LogDialog { String logCat = "no logs"; final String processId = Integer.toString(android.os.Process.myPid()); try { - Process process = Runtime.getRuntime().exec("logcat -d " + MainApp.sResources.getString(R.string.app_name) + ":D"); + Process process = Runtime.getRuntime().exec("logcat -d " + MainApp.gs(R.string.app_name) + ":D"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); StringBuilder log = new StringBuilder(); String line; @@ -46,11 +46,11 @@ public class LogDialog { try { AlertDialog alertDialog = new AlertDialog.Builder(context) .setMessage(msg) - .setPositiveButton(MainApp.sResources.getString(R.string.copy_to_clipboard), new DialogInterface.OnClickListener() { + .setPositiveButton(MainApp.gs(R.string.copy_to_clipboard), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(ClipData.newPlainText(null, msg)); - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.copied_to_clipboard)); + ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.copied_to_clipboard)); } }) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/info/nightscout/utils/SP.java b/app/src/main/java/info/nightscout/utils/SP.java index 23a95840a8..eaf84946e6 100644 --- a/app/src/main/java/info/nightscout/utils/SP.java +++ b/app/src/main/java/info/nightscout/utils/SP.java @@ -17,7 +17,7 @@ public class SP { } static public String getString(int resourceID, String defaultValue) { - return sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getString(MainApp.gs(resourceID), defaultValue); } static public String getString(String key, String defaultValue) { @@ -26,7 +26,7 @@ public class SP { static public boolean getBoolean(int resourceID, Boolean defaultValue) { try { - return sharedPreferences.getBoolean(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getBoolean(MainApp.gs(resourceID), defaultValue); } catch (Exception e) { return defaultValue; } @@ -41,7 +41,7 @@ public class SP { } static public Double getDouble(int resourceID, Double defaultValue) { - return SafeParse.stringToDouble(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + return SafeParse.stringToDouble(sharedPreferences.getString(MainApp.gs(resourceID), defaultValue.toString())); } static public Double getDouble(String key, Double defaultValue) { @@ -50,9 +50,9 @@ public class SP { static public int getInt(int resourceID, Integer defaultValue) { try { - return sharedPreferences.getInt(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getInt(MainApp.gs(resourceID), defaultValue); } catch (Exception e) { - return SafeParse.stringToInt(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + return SafeParse.stringToInt(sharedPreferences.getString(MainApp.gs(resourceID), defaultValue.toString())); } } @@ -66,9 +66,9 @@ public class SP { static public long getLong(int resourceID, Long defaultValue) { try { - return sharedPreferences.getLong(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getLong(MainApp.gs(resourceID), defaultValue); } catch (Exception e) { - return SafeParse.stringToLong(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + return SafeParse.stringToLong(sharedPreferences.getString(MainApp.gs(resourceID), defaultValue.toString())); } } @@ -88,7 +88,7 @@ public class SP { static public void putBoolean(int resourceID, boolean value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(MainApp.sResources.getString(resourceID), value); + editor.putBoolean(MainApp.gs(resourceID), value); editor.apply(); } @@ -100,7 +100,7 @@ public class SP { static public void putLong(int resourceID, long value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putLong(MainApp.sResources.getString(resourceID), value); + editor.putLong(MainApp.gs(resourceID), value); editor.apply(); } @@ -112,13 +112,13 @@ public class SP { static public void putInt(int resourceID, int value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(MainApp.sResources.getString(resourceID), value); + editor.putInt(MainApp.gs(resourceID), value); editor.apply(); } static public void putString(int resourceID, String value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(MainApp.sResources.getString(resourceID), value); + editor.putString(MainApp.gs(resourceID), value); editor.apply(); } @@ -130,7 +130,7 @@ public class SP { static public void remove(int resourceID) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.remove(MainApp.sResources.getString(resourceID)); + editor.remove(MainApp.gs(resourceID)); editor.apply(); } From a8382daefd2e6527ee43bc31cf65ee70052e880f Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:36:56 +0200 Subject: [PATCH 33/91] remove direct access to sResources 2 --- .../OpenAPSSMB/OpenAPSSMBFragment.java | 2 +- .../activities/DanaRNSHistorySync.java | 44 +++++++++--------- .../plugins/PumpDanaRS/DanaRSPlugin.java | 10 ++-- .../activities/PairingProgressDialog.java | 4 +- .../DanaRS_Packet_APS_History_Events.java | 2 +- ...naRS_Packet_Bolus_Set_Step_Bolus_Stop.java | 4 +- .../services/DanaRv2ExecutionService.java | 42 ++++++++--------- .../info/nightscout/utils/Translator.java | 46 +++++++++---------- .../nightscout/utils/XdripCalibrations.java | 16 +++---- 9 files changed, 85 insertions(+), 85 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java index 7780fcc9b4..724bfcf86c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java @@ -99,7 +99,7 @@ public class OpenAPSSMBFragment extends SubscriberFragment { currentTempView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getCurrentTempParam()).toString().trim()); try { JSONArray iobArray = new JSONArray(determineBasalAdapterSMBJS.getIobDataParam()); - iobDataView.setText((String.format(MainApp.sResources.getString(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))).trim()); + iobDataView.setText((String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))).trim()); } catch (JSONException e) { log.error("Unhandled exception", e); iobDataView.setText("JSONException see log for details"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java index e7813fac10..d505443c1d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java @@ -57,7 +57,7 @@ public class DanaRNSHistorySync { if (record._id != null) continue; //log.debug(record.bytes); JSONObject nsrec = new JSONObject(); - ev.message = MainApp.sResources.getString(R.string.uploading) + " " + processing + "/" + records + " "; // TODO: translations + ev.message = MainApp.gs(R.string.uploading) + " " + processing + "/" + records + " "; // TODO: translations switch (record.recordCode) { case RecordTypes.RECORD_TYPE_BOLUS: if ((what & SYNC_BOLUS) == 0) break; @@ -68,10 +68,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Meal Bolus"); nsrec.put("insulin", record.recordValue); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_sbolus); + ev.message += MainApp.gs(R.string.danar_sbolus); break; case "E": if (record.recordDuration > 0) { @@ -86,10 +86,10 @@ public class DanaRNSHistorySync { cal.setTimeInMillis(record.recordDate); cal.add(Calendar.MINUTE, -1 * record.recordDuration); nsrec.put("created_at", DateUtil.toISOString(cal.getTime())); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_ebolus); + ev.message += MainApp.gs(R.string.danar_ebolus); } else { log.debug("NOT Syncing extended bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate) + " zero duration"); } @@ -102,10 +102,10 @@ public class DanaRNSHistorySync { nsrec.put("splitNow", 100); nsrec.put("splitExt", 0); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_dsbolus); + ev.message += MainApp.gs(R.string.danar_dsbolus); break; case "DE": log.debug("Syncing dual(E) bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate)); @@ -118,10 +118,10 @@ public class DanaRNSHistorySync { cal.setTimeInMillis(record.recordDate); cal.add(Calendar.MINUTE, -1 * record.recordDuration); nsrec.put("created_at", DateUtil.toISOString(cal.getTime())); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_debolus); + ev.message += MainApp.gs(R.string.danar_debolus); break; default: log.debug("Unknown bolus record"); @@ -135,10 +135,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Note"); nsrec.put("notes", "Error"); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_error); + ev.message += MainApp.gs(R.string.danar_error); break; case RecordTypes.RECORD_TYPE_REFILL: if ((what & SYNC_REFILL) == 0) break; @@ -147,10 +147,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Insulin Change"); nsrec.put("notes", "Refill " + record.recordValue + "U"); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_refill); + ev.message += MainApp.gs(R.string.danar_refill); break; case RecordTypes.RECORD_TYPE_BASALHOUR: if ((what & SYNC_BASALHOURS) == 0) break; @@ -160,10 +160,10 @@ public class DanaRNSHistorySync { nsrec.put("absolute", record.recordValue); nsrec.put("duration", 60); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_basalhour); + ev.message += MainApp.gs(R.string.danar_basalhour); break; case RecordTypes.RECORD_TYPE_TB: //log.debug("Ignoring TB record " + record.bytes + " " + DateUtil.toISOString(record.recordDate)); @@ -176,10 +176,10 @@ public class DanaRNSHistorySync { nsrec.put("glucose", Profile.fromMgdlToUnits(record.recordValue, MainApp.getConfigBuilder().getProfileUnits())); nsrec.put("glucoseType", "Finger"); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_glucose); + ev.message += MainApp.gs(R.string.danar_glucose); break; case RecordTypes.RECORD_TYPE_CARBO: if ((what & SYNC_CARBO) == 0) break; @@ -188,10 +188,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Meal Bolus"); nsrec.put("carbs", record.recordValue); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_carbohydrate); + ev.message += MainApp.gs(R.string.danar_carbohydrate); break; case RecordTypes.RECORD_TYPE_ALARM: if ((what & SYNC_ALARM) == 0) break; @@ -200,10 +200,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Note"); nsrec.put("notes", "Alarm: " + record.recordAlarm); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_alarm); + ev.message += MainApp.gs(R.string.danar_alarm); break; case RecordTypes.RECORD_TYPE_SUSPEND: // TODO: this too case RecordTypes.RECORD_TYPE_DAILY: @@ -216,7 +216,7 @@ public class DanaRNSHistorySync { } MainApp.bus().post(ev); } - ev.message = String.format(MainApp.sResources.getString(R.string.danar_totaluploaded), uploaded); + ev.message = String.format(MainApp.gs(R.string.danar_totaluploaded), uploaded); MainApp.bus().post(ev); } catch (JSONException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index a2ec13d184..1f30ed6c3f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -297,22 +297,22 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); - Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); + Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.gs(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + result.comment = MainApp.gs(R.string.pumpNotInitializedProfileNotSet); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!danaRSService.updateBasalsInPump(profile)) { - Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); + Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.gs(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + result.comment = MainApp.gs(R.string.failedupdatebasalprofile); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); result.success = true; result.enacted = true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java index a663d14245..9f72e1d08f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java @@ -51,14 +51,14 @@ public class PairingProgressDialog extends DialogFragment implements View.OnClic public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.danars_pairingprogressdialog, container, false); - getDialog().setTitle(MainApp.sResources.getString(R.string.pairing)); + getDialog().setTitle(MainApp.gs(R.string.pairing)); statusView = (TextView) view.findViewById(R.id.danars_paringprogress_status); progressBar = (ProgressBar) view.findViewById(R.id.danars_paringprogress_progressbar); button = (Button) view.findViewById(R.id.ok); progressBar.setMax(100); progressBar.setProgress(0); - statusView.setText(MainApp.sResources.getString(R.string.waitingforpairing)); + statusView.setText(MainApp.gs(R.string.waitingforpairing)); button.setVisibility(View.GONE); button.setOnClickListener(this); setCancelable(false); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java index a707c5e0cc..181584df8e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java @@ -200,7 +200,7 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet { if (datetime.getTime() > lastEventTimeLoaded) lastEventTimeLoaded = datetime.getTime(); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.processinghistory) + ": " + status)); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.processinghistory) + ": " + status)); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java index 83e84e28cc..78548ecab3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java @@ -47,10 +47,10 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Stop extends DanaRS_Packet { stopped = true; if (!forced) { t.insulin = amount; - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_delivered); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_delivered); bolusingEvent.percent = 100; } else { - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_stoped); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_stoped); } MainApp.bus().post(bolusingEvent); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 25cac9da1c..b9eb8ae655 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -120,7 +120,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public void connect() { if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.wrongpumppassword), R.raw.error); return; } @@ -161,7 +161,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); MsgStatusBasic statusBasicMsg = new MsgStatusBasic(); MsgStatusTempBasal_v2 tempStatusMsg = new MsgStatusTempBasal_v2(); @@ -175,17 +175,17 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); mSerialIOThread.sendMessage(tempStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); long now = System.currentTimeMillis(); if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRv2Plugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingMeal()); @@ -196,7 +196,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -218,9 +218,9 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { NSUpload.uploadDeviceStatus(); if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -231,11 +231,11 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean tempBasal(int percent, int durationInHours) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(percent, durationInHours)); mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2()); loadEvents(); @@ -246,11 +246,11 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean highTempBasal(int percent) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetAPSTempBasalStart_v2(percent)); mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2()); loadEvents(); @@ -280,7 +280,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2()); loadEvents(); @@ -290,7 +290,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolus(double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); mSerialIOThread.sendMessage(new MsgStatusBolusExtended_v2()); loadEvents(); @@ -300,7 +300,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); mSerialIOThread.sendMessage(new MsgStatusBolusExtended_v2()); loadEvents(); @@ -312,7 +312,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { if (!isConnected()) return false; if (BolusProgressDialog.stopPressed) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.startingbolus))); mBolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); MessageBase start; @@ -371,7 +371,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { long expectedEnd = bolusStart + bolusDurationInMSec + 2000; while (System.currentTimeMillis() < expectedEnd) { long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + bolusingEvent.status = String.format(MainApp.gs(R.string.waitingforestimatedbolusend), waitTime / 1000); MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } @@ -380,10 +380,10 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { @Override public void run() { // load last bolus status - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); mSerialIOThread.sendMessage(new MsgStatus()); bolusingEvent.percent = 100; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.disconnecting))); } }); return !start.failed; @@ -442,7 +442,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean updateBasalsInPump(final Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); MsgSetBasalProfile msgSet = new MsgSetBasalProfile((byte) 0, basal); mSerialIOThread.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/utils/Translator.java b/app/src/main/java/info/nightscout/utils/Translator.java index 75ee881c21..98fdd32779 100644 --- a/app/src/main/java/info/nightscout/utils/Translator.java +++ b/app/src/main/java/info/nightscout/utils/Translator.java @@ -12,51 +12,51 @@ public class Translator { switch (text) { case "BG Check": - return MainApp.sResources.getString(R.string.careportal_bgcheck); + return MainApp.gs(R.string.careportal_bgcheck); case "Snack Bolus": - return MainApp.sResources.getString(R.string.careportal_snackbolus); + return MainApp.gs(R.string.careportal_snackbolus); case "Meal Bolus": - return MainApp.sResources.getString(R.string.careportal_mealbolus); + return MainApp.gs(R.string.careportal_mealbolus); case "Correction Bolus": - return MainApp.sResources.getString(R.string.careportal_correctionbolus); + return MainApp.gs(R.string.careportal_correctionbolus); case "Carb Correction": - return MainApp.sResources.getString(R.string.careportal_carbscorrection); + return MainApp.gs(R.string.careportal_carbscorrection); case "Combo Bolus": - return MainApp.sResources.getString(R.string.careportal_combobolus); + return MainApp.gs(R.string.careportal_combobolus); case "Announcement": - return MainApp.sResources.getString(R.string.careportal_announcement); + return MainApp.gs(R.string.careportal_announcement); case "Note": - return MainApp.sResources.getString(R.string.careportal_note); + return MainApp.gs(R.string.careportal_note); case "Question": - return MainApp.sResources.getString(R.string.careportal_question); + return MainApp.gs(R.string.careportal_question); case "Exercise": - return MainApp.sResources.getString(R.string.careportal_exercise); + return MainApp.gs(R.string.careportal_exercise); case "Site Change": - return MainApp.sResources.getString(R.string.careportal_pumpsitechange); + return MainApp.gs(R.string.careportal_pumpsitechange); case "Sensor Start": - return MainApp.sResources.getString(R.string.careportal_cgmsensorstart); + return MainApp.gs(R.string.careportal_cgmsensorstart); case "Sensor Change": - return MainApp.sResources.getString(R.string.careportal_cgmsensorinsert); + return MainApp.gs(R.string.careportal_cgmsensorinsert); case "Insulin Change": - return MainApp.sResources.getString(R.string.careportal_insulincartridgechange); + return MainApp.gs(R.string.careportal_insulincartridgechange); case "Temp Basal Start": - return MainApp.sResources.getString(R.string.careportal_tempbasalstart); + return MainApp.gs(R.string.careportal_tempbasalstart); case "Temp Basal End": - return MainApp.sResources.getString(R.string.careportal_tempbasalend); + return MainApp.gs(R.string.careportal_tempbasalend); case "Profile Switch": - return MainApp.sResources.getString(R.string.careportal_profileswitch); + return MainApp.gs(R.string.careportal_profileswitch); case "Temporary Target": - return MainApp.sResources.getString(R.string.careportal_temporarytarget); + return MainApp.gs(R.string.careportal_temporarytarget); case "Temporary Target Cancel": - return MainApp.sResources.getString(R.string.careportal_temporarytargetcancel); + return MainApp.gs(R.string.careportal_temporarytargetcancel); case "OpenAPS Offline": - return MainApp.sResources.getString(R.string.careportal_openapsoffline); + return MainApp.gs(R.string.careportal_openapsoffline); case "Finger": - return MainApp.sResources.getString(R.string.glucosetype_finger); + return MainApp.gs(R.string.glucosetype_finger); case "Sensor": - return MainApp.sResources.getString(R.string.glucosetype_sensor); + return MainApp.gs(R.string.glucosetype_sensor); case "Manual": - return MainApp.sResources.getString(R.string.manual); + return MainApp.gs(R.string.manual); } return text; } diff --git a/app/src/main/java/info/nightscout/utils/XdripCalibrations.java b/app/src/main/java/info/nightscout/utils/XdripCalibrations.java index 662b7a0c8f..66ec6bd3df 100644 --- a/app/src/main/java/info/nightscout/utils/XdripCalibrations.java +++ b/app/src/main/java/info/nightscout/utils/XdripCalibrations.java @@ -28,17 +28,17 @@ public class XdripCalibrations { public static void confirmAndSendCalibration(final Double bg, Context parentContext) { if (parentContext != null) { - String confirmMessage = String.format(MainApp.sResources.getString(R.string.send_calibration), bg); + String confirmMessage = String.format(MainApp.gs(R.string.send_calibration), bg); AlertDialog.Builder builder = new AlertDialog.Builder(parentContext); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { sendIntent(bg); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); } } @@ -55,12 +55,12 @@ public class XdripCalibrations { context.sendBroadcast(intent); List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0); if (q.size() < 1) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.xdripnotinstalled)); - log.debug(MainApp.sResources.getString(R.string.xdripnotinstalled)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.xdripnotinstalled)); + log.debug(MainApp.gs(R.string.xdripnotinstalled)); return false; } else { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.calibrationsent)); - log.debug(MainApp.sResources.getString(R.string.calibrationsent)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.calibrationsent)); + log.debug(MainApp.gs(R.string.calibrationsent)); return true; } } From 2af62d8e4e1098c61df5c2388af2108e4fe11d7a Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:42:50 +0200 Subject: [PATCH 34/91] remove direct access to sResources 3 --- .../Insulin/InsulinOrefRapidActingPlugin.java | 4 +- .../androidaps/plugins/Loop/LoopPlugin.java | 18 ++-- .../notifications/NotificationStore.java | 8 +- .../plugins/PumpDanaR/comm/MsgError.java | 10 +-- .../services/DanaRKoreanExecutionService.java | 30 +++---- .../SensitivityAAPSPlugin.java | 6 +- .../SensitivityWeightedAveragePlugin.java | 6 +- .../SmsCommunicatorPlugin.java | 84 +++++++++---------- .../nightscout/utils/LocalAlertUtils.java | 12 +-- 9 files changed, 89 insertions(+), 89 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java index cd7769b55b..a8f9761771 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java @@ -32,12 +32,12 @@ public class InsulinOrefRapidActingPlugin extends InsulinOrefBasePlugin { @Override public String getFriendlyName() { - return MainApp.sResources.getString(R.string.rapid_acting_oref); + return MainApp.gs(R.string.rapid_acting_oref); } @Override public String commentStandardText() { - return MainApp.sResources.getString(R.string.fastactinginsulincomment); + return MainApp.gs(R.string.fastactinginsulincomment); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index 43d00b24af..f6ec0ff7ab 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -258,7 +258,7 @@ public class LoopPlugin extends PluginBase { Constraint loopEnabled = MainApp.getConstraintChecker().isLoopInvokationAllowed(); if (!loopEnabled.value()) { - String message = MainApp.sResources.getString(R.string.loopdisabled) + "\n" + loopEnabled.getReasons(); + String message = MainApp.gs(R.string.loopdisabled) + "\n" + loopEnabled.getReasons(); log.debug(message); MainApp.bus().post(new EventLoopSetLastRunGui(message)); return; @@ -272,8 +272,8 @@ public class LoopPlugin extends PluginBase { Profile profile = MainApp.getConfigBuilder().getProfile(); if (!MainApp.getConfigBuilder().isProfileValid("Loop")) { - log.debug(MainApp.sResources.getString(R.string.noprofileselected)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noprofileselected))); + log.debug(MainApp.gs(R.string.noprofileselected)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.noprofileselected))); return; } @@ -288,7 +288,7 @@ public class LoopPlugin extends PluginBase { // Check if we have any result if (result == null) { - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noapsselected))); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.noapsselected))); return; } @@ -317,14 +317,14 @@ public class LoopPlugin extends PluginBase { NSUpload.uploadDeviceStatus(); if (isSuspended()) { - log.debug(MainApp.sResources.getString(R.string.loopsuspended)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopsuspended))); + log.debug(MainApp.gs(R.string.loopsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.loopsuspended))); return; } if (pump.isSuspended()) { - log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); + log.debug(MainApp.gs(R.string.pumpsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.pumpsuspended))); return; } @@ -376,7 +376,7 @@ public class LoopPlugin extends PluginBase { NotificationCompat.Builder builder = new NotificationCompat.Builder(MainApp.instance().getApplicationContext(), CHANNEL_ID); builder.setSmallIcon(R.drawable.notif_icon) - .setContentTitle(MainApp.sResources.getString(R.string.openloop_newsuggestion)) + .setContentTitle(MainApp.gs(R.string.openloop_newsuggestion)) .setContentText(resultAfterConstraints.toString()) .setAutoCancel(true) .setPriority(Notification.PRIORITY_HIGH) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java index f0bb147982..7504a19a76 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java @@ -60,7 +60,7 @@ public class NotificationStore { } store.add(n); - if (SP.getBoolean(MainApp.sResources.getString(R.string.key_raise_notifications_as_android_notifications), false)) { + if (SP.getBoolean(MainApp.gs(R.string.key_raise_notifications_as_android_notifications), false)) { raiseSystemNotification(n); } else { if (n.soundId != null) { @@ -105,7 +105,7 @@ public class NotificationStore { public void unSnooze() { if (Notification.isAlarmForStaleData()) { - Notification notification = new Notification(Notification.NSALARM, MainApp.sResources.getString(R.string.nsalarm_staledata), Notification.URGENT); + Notification notification = new Notification(Notification.NSALARM, MainApp.gs(R.string.nsalarm_staledata), Notification.URGENT); SP.putLong("snoozedTo", System.currentTimeMillis()); add(notification); log.debug("Snoozed to current time and added back notification!"); @@ -126,11 +126,11 @@ public class NotificationStore { .setDeleteIntent(DismissNotificationService.deleteIntent(n.id)); if (n.level == Notification.URGENT) { notificationBuilder.setVibrate(new long[]{1000, 1000, 1000, 1000}) - .setContentTitle(MainApp.sResources.getString(R.string.urgent_alarm)) + .setContentTitle(MainApp.gs(R.string.urgent_alarm)) .setSound(sound, AudioAttributes.USAGE_ALARM); } else { notificationBuilder.setVibrate(new long[]{0, 100, 50, 100, 50}) - .setContentTitle(MainApp.sResources.getString(R.string.info)) + .setContentTitle(MainApp.gs(R.string.info)) ; } mgr.notify(n.id, notificationBuilder.build()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java index b180d4107b..e42327c3b0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java @@ -25,19 +25,19 @@ public class MsgError extends MessageBase { case 1: case 2: case 3: // Pump error - errorString = MainApp.sResources.getString(R.string.pumperror) + " " + errorCode; + errorString = MainApp.gs(R.string.pumperror) + " " + errorCode; break; case 4: // Shutdown - errorString = MainApp.sResources.getString(R.string.pumpshutdown); + errorString = MainApp.gs(R.string.pumpshutdown); break; case 5: // Occlusion - errorString = MainApp.sResources.getString(R.string.occlusion); + errorString = MainApp.gs(R.string.occlusion); break; case 7: // Low Battery - errorString = MainApp.sResources.getString(R.string.lowbattery); + errorString = MainApp.gs(R.string.lowbattery); break; case 8: // Battery 0% - errorString = MainApp.sResources.getString(R.string.batterydischarged); + errorString = MainApp.gs(R.string.batterydischarged); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java index 106074ca3c..b9cc704aba 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java @@ -105,7 +105,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public void connect() { if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.wrongpumppassword), R.raw.error); return; } @@ -146,7 +146,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); //MsgStatus_k statusMsg = new MsgStatus_k(); MsgStatusBasic_k statusBasicMsg = new MsgStatusBasic_k(); MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(); @@ -162,15 +162,15 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { //mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); mSerialIOThread.sendMessage(tempStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); long now = System.currentTimeMillis(); if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingMeal()); mSerialIOThread.sendMessage(new MsgSettingBasal_k()); @@ -178,7 +178,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingMaxValues()); mSerialIOThread.sendMessage(new MsgSettingGlucose()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -197,9 +197,9 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { NSUpload.uploadDeviceStatus(); if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -209,11 +209,11 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean tempBasal(int percent, int durationInHours) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(percent, durationInHours)); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -222,7 +222,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -231,7 +231,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolus(double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -240,7 +240,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -310,7 +310,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean updateBasalsInPump(final Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); MsgSetSingleBasalProfile msgSet = new MsgSetSingleBasalProfile(basal); mSerialIOThread.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java index 28c4192f99..75b1ea9675 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java @@ -56,9 +56,9 @@ public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInte String age = SP.getString(R.string.key_age, ""); int defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_adult))) defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_teenage))) defaultHours = 4; - if (age.equals(MainApp.sResources.getString(R.string.key_child))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_adult))) defaultHours = 24; + if (age.equals(MainApp.gs(R.string.key_teenage))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_child))) defaultHours = 4; int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours); Profile profile = MainApp.getConfigBuilder().getProfile(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java index 2f59769f55..58f59701d9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java @@ -52,9 +52,9 @@ public class SensitivityWeightedAveragePlugin extends PluginBase implements Sens String age = SP.getString(R.string.key_age, ""); int defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_adult))) defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_teenage))) defaultHours = 4; - if (age.equals(MainApp.sResources.getString(R.string.key_child))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_adult))) defaultHours = 24; + if (age.equals(MainApp.gs(R.string.key_teenage))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_child))) defaultHours = 4; int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours); if (autosensDataTable == null || autosensDataTable.size() < 4) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java index a0192a528c..9de6cc6ad6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java @@ -206,24 +206,24 @@ public class SmsCommunicatorPlugin extends PluginBase { String units = MainApp.getConfigBuilder().getProfileUnits(); if (actualBG != null) { - reply = MainApp.sResources.getString(R.string.sms_actualbg) + " " + actualBG.valueToUnitsToString(units) + ", "; + reply = MainApp.gs(R.string.sms_actualbg) + " " + actualBG.valueToUnitsToString(units) + ", "; } else if (lastBG != null) { Long agoMsec = System.currentTimeMillis() - lastBG.date; int agoMin = (int) (agoMsec / 60d / 1000d); - reply = MainApp.sResources.getString(R.string.sms_lastbg) + " " + lastBG.valueToUnitsToString(units) + " " + String.format(MainApp.sResources.getString(R.string.sms_minago), agoMin) + ", "; + reply = MainApp.gs(R.string.sms_lastbg) + " " + lastBG.valueToUnitsToString(units) + " " + String.format(MainApp.gs(R.string.sms_minago), agoMin) + ", "; } GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); if (glucoseStatus != null) - reply += MainApp.sResources.getString(R.string.sms_delta) + " " + Profile.toUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) + " " + units + ", "; + reply += MainApp.gs(R.string.sms_delta) + " " + Profile.toUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) + " " + units + ", "; TreatmentsPlugin.getPlugin().updateTotalIOBTreatments(); IobTotal bolusIob = TreatmentsPlugin.getPlugin().getLastCalculationTreatments().round(); TreatmentsPlugin.getPlugin().updateTotalIOBTempBasals(); IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round(); - reply += MainApp.sResources.getString(R.string.sms_iob) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" - + MainApp.sResources.getString(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " - + MainApp.sResources.getString(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; + reply += MainApp.gs(R.string.sms_iob) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" + + MainApp.gs(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " + + MainApp.gs(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); receivedSms.processed = true; @@ -241,8 +241,8 @@ public class SmsCommunicatorPlugin extends PluginBase { @Override public void run() { MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_STOP")); - String reply = MainApp.sResources.getString(R.string.smscommunicator_loophasbeendisabled) + " " + - MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_loophasbeendisabled) + " " + + MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } }); @@ -255,7 +255,7 @@ public class SmsCommunicatorPlugin extends PluginBase { loopPlugin = MainApp.getSpecificPlugin(LoopPlugin.class); if (loopPlugin != null && !loopPlugin.isEnabled(PluginType.LOOP)) { loopPlugin.setPluginEnabled(PluginType.LOOP, true); - reply = MainApp.sResources.getString(R.string.smscommunicator_loophasbeenenabled); + reply = MainApp.gs(R.string.smscommunicator_loophasbeenenabled); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_START")); } @@ -267,11 +267,11 @@ public class SmsCommunicatorPlugin extends PluginBase { if (loopPlugin != null) { if (loopPlugin.isEnabled(PluginType.LOOP)) { if (loopPlugin.isSuspended()) - reply = String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend()); + reply = String.format(MainApp.gs(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend()); else - reply = MainApp.sResources.getString(R.string.smscommunicator_loopisenabled); + reply = MainApp.gs(R.string.smscommunicator_loopisenabled); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_loopisdisabled); + reply = MainApp.gs(R.string.smscommunicator_loopisdisabled); } sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } @@ -282,7 +282,7 @@ public class SmsCommunicatorPlugin extends PluginBase { LoopPlugin.getPlugin().suspendTo(0); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_RESUME")); NSUpload.uploadOpenAPSOffline(0); - reply = MainApp.sResources.getString(R.string.smscommunicator_loopresumed); + reply = MainApp.gs(R.string.smscommunicator_loopresumed); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume")); break; @@ -292,18 +292,18 @@ public class SmsCommunicatorPlugin extends PluginBase { duration = Math.max(0, duration); duration = Math.min(180, duration); if (duration == 0) { - reply = MainApp.sResources.getString(R.string.smscommunicator_wrongduration); + reply = MainApp.gs(R.string.smscommunicator_wrongduration); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_suspendreplywithcode), duration, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_suspendreplywithcode), duration, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); suspendWaitingForConfirmation.duration = duration; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotecommandnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotecommandnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } break; @@ -350,7 +350,7 @@ public class SmsCommunicatorPlugin extends PluginBase { sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } } else { - String reply = MainApp.sResources.getString(R.string.readstatusfailed); + String reply = MainApp.gs(R.string.readstatusfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -363,33 +363,33 @@ public class SmsCommunicatorPlugin extends PluginBase { if (splited[1].toUpperCase().equals("CANCEL") || splited[1].toUpperCase().equals("STOP")) { if (remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_basalstopreplywithcode), passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_basalstopreplywithcode), passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } else { tempBasal = SafeParse.stringToDouble(splited[1]); Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { - reply = MainApp.sResources.getString(R.string.noprofile); + reply = MainApp.gs(R.string.noprofile); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { tempBasal = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(tempBasal), profile).value(); if (remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_basalreplywithcode), tempBasal, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_basalreplywithcode), tempBasal, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); tempBasalWaitingForConfirmation.tempBasal = tempBasal; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -398,24 +398,24 @@ public class SmsCommunicatorPlugin extends PluginBase { break; case "BOLUS": if (System.currentTimeMillis() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (ConfigBuilderPlugin.getActivePump().isSuspended()) { - reply = MainApp.sResources.getString(R.string.pumpsuspended); + reply = MainApp.gs(R.string.pumpsuspended); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (splited.length > 1) { amount = SafeParse.stringToDouble(splited[1]); amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); if (amount > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusreplywithcode), amount, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_bolusreplywithcode), amount, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); bolusWaitingForConfirmation.bolusRequested = amount; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bolus")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -425,14 +425,14 @@ public class SmsCommunicatorPlugin extends PluginBase { amount = SafeParse.stringToDouble(splited[1]); if (amount > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_calibrationreplywithcode), amount, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_calibrationreplywithcode), amount, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); calibrationWaitingForConfirmation.calibrationRequested = amount; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Cal")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotecalibrationnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotecalibrationnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -449,13 +449,13 @@ public class SmsCommunicatorPlugin extends PluginBase { public void run() { PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); if (result.success) { - String reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); + String reply = String.format(MainApp.gs(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); if (pump != null) reply += "\n" + pump.shortStatus(true); lastRemoteBolusTime = new Date(); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_bolusfailed); + String reply = MainApp.gs(R.string.smscommunicator_bolusfailed); if (pump != null) reply += "\n" + pump.shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); @@ -471,11 +471,11 @@ public class SmsCommunicatorPlugin extends PluginBase { @Override public void run() { if (result.success) { - String reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); + String reply = String.format(MainApp.gs(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalfailed); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalfailed); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } @@ -488,11 +488,11 @@ public class SmsCommunicatorPlugin extends PluginBase { @Override public void run() { if (result.success) { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcanceled); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcanceled); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } @@ -503,10 +503,10 @@ public class SmsCommunicatorPlugin extends PluginBase { calibrationWaitingForConfirmation.processed = true; boolean result = XdripCalibrations.sendIntent(calibrationWaitingForConfirmation.calibrationRequested); if (result) { - reply = MainApp.sResources.getString(R.string.smscommunicator_calibrationsent); + reply = MainApp.gs(R.string.smscommunicator_calibrationsent); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_calibrationfailed); + reply = MainApp.gs(R.string.smscommunicator_calibrationfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed && @@ -519,18 +519,18 @@ public class SmsCommunicatorPlugin extends PluginBase { LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + suspendWaitingForConfirmation.duration * 60L * 1000); NSUpload.uploadOpenAPSOffline(suspendWaitingForConfirmation.duration * 60); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED")); - String reply = MainApp.sResources.getString(R.string.smscommunicator_loopsuspended) + " " + - MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_loopsuspended) + " " + + MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } }); } else { - sendSMS(new Sms(receivedSms.phoneNumber, MainApp.sResources.getString(R.string.smscommunicator_unknowncommand), new Date())); + sendSMS(new Sms(receivedSms.phoneNumber, MainApp.gs(R.string.smscommunicator_unknowncommand), new Date())); } resetWaitingMessages(); break; @@ -563,10 +563,10 @@ public class SmsCommunicatorPlugin extends PluginBase { smsManager.sendTextMessage(sms.phoneNumber, null, sms.text, null, null); messages.add(sms); } catch (IllegalArgumentException e) { - Notification notification = new Notification(Notification.INVALID_PHONE_NUMBER, MainApp.sResources.getString(R.string.smscommunicator_invalidphonennumber), Notification.NORMAL); + Notification notification = new Notification(Notification.INVALID_PHONE_NUMBER, MainApp.gs(R.string.smscommunicator_invalidphonennumber), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); } catch (java.lang.SecurityException e) { - Notification notification = new Notification(Notification.MISSING_SMS_PERMISSION, MainApp.sResources.getString(R.string.smscommunicator_missingsmspermission), Notification.NORMAL); + Notification notification = new Notification(Notification.MISSING_SMS_PERMISSION, MainApp.gs(R.string.smscommunicator_missingsmspermission), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); } } diff --git a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java index cc1a22355a..5556cae935 100644 --- a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java +++ b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java @@ -26,21 +26,21 @@ public class LocalAlertUtils { private static Logger log = LoggerFactory.getLogger(LocalAlertUtils.class); public static long missedReadingsThreshold() { - return T.mins(SP.getInt(MainApp.sResources.getString(R.string.key_missed_bg_readings_threshold), 30)).msecs(); + return T.mins(SP.getInt(MainApp.gs(R.string.key_missed_bg_readings_threshold), 30)).msecs(); } private static long pumpUnreachableThreshold() { - return T.mins(SP.getInt(MainApp.sResources.getString(R.string.key_pump_unreachable_threshold), 30)).msecs(); + return T.mins(SP.getInt(MainApp.gs(R.string.key_pump_unreachable_threshold), 30)).msecs(); } public static void checkPumpUnreachableAlarm(Date lastConnection, boolean isStatusOutdated) { boolean alarmTimeoutExpired = lastConnection.getTime() + pumpUnreachableThreshold() < System.currentTimeMillis(); boolean nextAlarmOccurrenceReached = SP.getLong("nextPumpDisconnectedAlarm", 0L) < System.currentTimeMillis(); - if (Config.APS && SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_pump_unreachable_alert), true) + if (Config.APS && SP.getBoolean(MainApp.gs(R.string.key_enable_pump_unreachable_alert), true) && isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !LoopPlugin.getPlugin().isDisconnected()) { log.debug("Generating pump unreachable alarm. lastConnection: " + DateUtil.dateAndTimeString(lastConnection) + " isStatusOutdated: " + isStatusOutdated); - Notification n = new Notification(Notification.PUMP_UNREACHABLE, MainApp.sResources.getString(R.string.pump_unreachable), Notification.URGENT); + Notification n = new Notification(Notification.PUMP_UNREACHABLE, MainApp.gs(R.string.pump_unreachable), Notification.URGENT); n.soundId = R.raw.alarm; SP.putLong("nextPumpDisconnectedAlarm", System.currentTimeMillis() + pumpUnreachableThreshold()); MainApp.bus().post(new EventNewNotification(n)); @@ -91,10 +91,10 @@ public class LocalAlertUtils { public static void checkStaleBGAlert() { BgReading bgReading = DatabaseHelper.lastBg(); - if (SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_missed_bg_readings_alert), false) + if (SP.getBoolean(MainApp.gs(R.string.key_enable_missed_bg_readings_alert), false) && bgReading != null && bgReading.date + missedReadingsThreshold() < System.currentTimeMillis() && SP.getLong("nextMissedReadingsAlarm", 0l) < System.currentTimeMillis()) { - Notification n = new Notification(Notification.BG_READINGS_MISSED, MainApp.sResources.getString(R.string.missed_bg_readings), Notification.URGENT); + Notification n = new Notification(Notification.BG_READINGS_MISSED, MainApp.gs(R.string.missed_bg_readings), Notification.URGENT); n.soundId = R.raw.alarm; SP.putLong("nextMissedReadingsAlarm", System.currentTimeMillis() + missedReadingsThreshold()); MainApp.bus().post(new EventNewNotification(n)); From 3979913a6d2f8641b22f15538fd71147526b425f Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:46:38 +0200 Subject: [PATCH 35/91] remove direct access to sResources 4 --- .../events/EventPumpStatusChanged.java | 6 +-- .../androidaps/plugins/Food/FoodFragment.java | 22 +++++----- .../NSClientInternal/NSClientFragment.java | 2 +- .../Overview/Dialogs/WizardDialog.java | 18 ++++----- .../DanaRS_Packet_General_Get_Pump_Check.java | 2 +- ...S_Packet_Notify_Delivery_Rate_Display.java | 2 +- .../plugins/PumpDanaRS/services/BLEComm.java | 8 ++-- .../PumpDanaRS/services/DanaRSService.java | 40 +++++++++---------- .../androidaps/queue/CommandQueue.java | 10 ++--- .../nightscout/utils/ImportExportPrefs.java | 14 +++---- .../java/info/nightscout/utils/NSUpload.java | 2 +- .../info/nightscout/utils/NumberPicker.java | 4 +- .../java/info/nightscout/utils/OKDialog.java | 4 +- .../nightscout/utils/PasswordProtection.java | 4 +- 14 files changed, 69 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java b/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java index 52c3183821..7d810702b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java @@ -46,13 +46,13 @@ public class EventPumpStatusChanged extends Event { public String textStatus() { if (sStatus == CONNECTING) - return String.format(MainApp.sResources.getString(R.string.danar_history_connectingfor), sSecondsElapsed); + return String.format(MainApp.gs(R.string.danar_history_connectingfor), sSecondsElapsed); else if (sStatus == CONNECTED) - return MainApp.sResources.getString(R.string.connected); + return MainApp.gs(R.string.connected); else if (sStatus == PERFORMING) return sPerfomingAction; else if (sStatus == DISCONNECTING) - return MainApp.sResources.getString(R.string.disconnecting); + return MainApp.gs(R.string.disconnecting); else if (sStatus == DISCONNECTED) return ""; return ""; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java index 490146cc14..1acf6ea083 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java @@ -54,7 +54,7 @@ public class FoodFragment extends SubscriberFragment { ArrayList categories; ArrayList subcategories; - final String EMPTY = MainApp.sResources.getString(R.string.none); + final String EMPTY = MainApp.gs(R.string.none); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -158,7 +158,7 @@ public class FoodFragment extends SubscriberFragment { // make it unique categories = new ArrayList<>(catSet); - categories.add(0, MainApp.sResources.getString(R.string.none)); + categories.add(0, MainApp.gs(R.string.none)); ArrayAdapter adapterCategories = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, categories); @@ -180,7 +180,7 @@ public class FoodFragment extends SubscriberFragment { // make it unique subcategories = new ArrayList<>(subCatSet); - subcategories.add(0, MainApp.sResources.getString(R.string.none)); + subcategories.add(0, MainApp.gs(R.string.none)); ArrayAdapter adapterSubcategories = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, subcategories); @@ -242,14 +242,14 @@ public class FoodFragment extends SubscriberFragment { holder.ns.setVisibility(food._id != null ? View.VISIBLE : View.GONE); holder.name.setText(food.name); holder.portion.setText(food.portion + food.units); - holder.carbs.setText(food.carbs + MainApp.sResources.getString(R.string.shortgramm)); - holder.fat.setText(MainApp.sResources.getString(R.string.shortfat) + ": " + food.fat + MainApp.sResources.getString(R.string.shortgramm)); + holder.carbs.setText(food.carbs + MainApp.gs(R.string.shortgramm)); + holder.fat.setText(MainApp.gs(R.string.shortfat) + ": " + food.fat + MainApp.gs(R.string.shortgramm)); if (food.fat == 0) holder.fat.setVisibility(View.INVISIBLE); - holder.protein.setText(MainApp.sResources.getString(R.string.shortprotein) + ": " + food.protein + MainApp.sResources.getString(R.string.shortgramm)); + holder.protein.setText(MainApp.gs(R.string.shortprotein) + ": " + food.protein + MainApp.gs(R.string.shortgramm)); if (food.protein == 0) holder.protein.setVisibility(View.INVISIBLE); - holder.energy.setText(MainApp.sResources.getString(R.string.shortenergy) + ": " + food.energy + MainApp.sResources.getString(R.string.shortkilojoul)); + holder.energy.setText(MainApp.gs(R.string.shortenergy) + ": " + food.energy + MainApp.gs(R.string.shortkilojoul)); if (food.energy == 0) holder.energy.setVisibility(View.INVISIBLE); holder.remove.setTag(food); @@ -291,9 +291,9 @@ public class FoodFragment extends SubscriberFragment { case R.id.food_remove: AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + food.name); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + food.name); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = food._id; if (_id != null && !_id.equals("")) { @@ -302,7 +302,7 @@ public class FoodFragment extends SubscriberFragment { MainApp.getSpecificPlugin(FoodPlugin.class).getService().delete(food); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java index 39e24f8b38..44cd5c43a1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java @@ -165,7 +165,7 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick logScrollview.fullScroll(ScrollView.FOCUS_DOWN); } urlTextView.setText(NSClientPlugin.getPlugin().url()); - Spanned queuetext = Html.fromHtml(MainApp.sResources.getString(R.string.queue) + " " + UploadQueue.size() + ""); + Spanned queuetext = Html.fromHtml(MainApp.gs(R.string.queue) + " " + UploadQueue.size() + ""); queueTextView.setText(queuetext); statusTextView.setText(NSClientPlugin.getPlugin().status); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index e15c34bac8..7d190bdb1a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -287,7 +287,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com @Override public void onNothingSelected(AdapterView parent) { - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.noprofileselected)); + ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.noprofileselected)); okButton.setVisibility(View.GONE); } @@ -317,9 +317,9 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; } @@ -332,7 +332,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com final String finalNotes = notesEdit.getText().toString(); final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(Html.fromHtml(confirmMessage)); builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -356,7 +356,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -382,7 +382,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -412,14 +412,14 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); if (profile == null) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.noprofile)); dismiss(); return; } ArrayList profileList; profileList = profileStore.getProfileList(); - profileList.add(0, MainApp.sResources.getString(R.string.active)); + profileList.add(0, MainApp.gs(R.string.active)); ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, profileList); @@ -458,7 +458,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com return; // not initialized yet String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString(); Profile specificProfile; - if (selectedAlternativeProfile.equals(MainApp.sResources.getString(R.string.active))) + if (selectedAlternativeProfile.equals(MainApp.gs(R.string.active))) specificProfile = MainApp.getConfigBuilder().getProfile(); else specificProfile = profileStore.getSpecificProfile(selectedAlternativeProfile); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java index a9bb7157af..bdc5ab8d9b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java @@ -43,7 +43,7 @@ public class DanaRS_Packet_General_Get_Pump_Check extends DanaRS_Packet { } if (pump.productCode < 2) { - MainApp.bus().post(new EventNewNotification(new Notification(Notification.UNSUPPORTED_FIRMWARE, MainApp.sResources.getString(R.string.unsupportedfirmware), Notification.URGENT))); + MainApp.bus().post(new EventNewNotification(new Notification(Notification.UNSUPPORTED_FIRMWARE, MainApp.gs(R.string.unsupportedfirmware), Notification.URGENT))); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java index 5354836375..34621d07ee 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java @@ -39,7 +39,7 @@ public class DanaRS_Packet_Notify_Delivery_Rate_Display extends DanaRS_Packet { lastReceive = System.currentTimeMillis(); t.insulin = deliveredInsulin; EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), deliveredInsulin); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), deliveredInsulin); bolusingEvent.t = t; bolusingEvent.percent = Math.min((int) (deliveredInsulin / amount * 100), 100); MainApp.bus().post(bolusingEvent); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java index 2901c4b863..b552026279 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java @@ -433,7 +433,7 @@ public class BLEComm { if (inputBuffer.length == 4 && inputBuffer[2] == 'O' && inputBuffer[3] == 'K') { log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (OK)" + " " + DanaRS_Packet.toHexString(inputBuffer)); // Grab pairing key from preferences if exists - String pairingKey = SP.getString(MainApp.sResources.getString(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, null); + String pairingKey = SP.getString(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, null); log.debug("Using stored pairing key: " + pairingKey); if (pairingKey != null) { byte[] encodedPairingKey = DanaRS_Packet.hexToBytes(pairingKey); @@ -448,11 +448,11 @@ public class BLEComm { } else if (inputBuffer.length == 6 && inputBuffer[2] == 'B' && inputBuffer[3] == 'U' && inputBuffer[4] == 'S' && inputBuffer[5] == 'Y') { log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (BUSY)" + " " + DanaRS_Packet.toHexString(inputBuffer)); mSendQueue.clear(); - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.sResources.getString(R.string.pumpbusy))); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.pumpbusy))); } else { log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (ERROR)" + " " + DanaRS_Packet.toHexString(inputBuffer)); mSendQueue.clear(); - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.sResources.getString(R.string.connectionerror))); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.connectionerror))); } break; // 2nd packet, pairing key @@ -480,7 +480,7 @@ public class BLEComm { SendTimeInfo(); byte[] pairingKey = {inputBuffer[2], inputBuffer[3]}; // store pairing key to preferences - SP.putString(MainApp.sResources.getString(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, DanaRS_Packet.bytesToHex(pairingKey)); + SP.putString(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, DanaRS_Packet.bytesToHex(pairingKey)); log.debug("Got pairing key: " + DanaRS_Packet.bytesToHex(pairingKey)); break; // time and user password information. last packet in handshake diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java index 91859c759a..a6afd0aeb0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java @@ -123,19 +123,19 @@ public class DanaRSService extends Service { public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); bleComm.sendMessage(new DanaRS_Packet_General_Initial_Screen_Information()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Extended_Bolus_State()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Step_Bolus_Information()); // last bolus, bolusStep, maxBolus - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); long now = System.currentTimeMillis(); if (danaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRSPlugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); bleComm.sendMessage(new DanaRS_Packet_General_Get_Shipping_Information()); // serial no bleComm.sendMessage(new DanaRS_Packet_General_Get_Pump_Check()); // firmware bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Profile_Number()); @@ -143,7 +143,7 @@ public class DanaRSService extends Service { bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Basal_Rate()); // basal profile, basalStep, maxBasal bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Calculation_Information()); // target bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_CIR_CF_Array()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); bleComm.sendMessage(new DanaRS_Packet_Option_Get_Pump_Time()); long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -165,9 +165,9 @@ public class DanaRSService extends Service { NSUpload.uploadDeviceStatus(); if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -202,7 +202,7 @@ public class DanaRSService extends Service { if (!isConnected()) return false; if (BolusProgressDialog.stopPressed) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.startingbolus))); bolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); DanaRS_Packet_Bolus_Set_Step_Bolus_Start start = new DanaRS_Packet_Bolus_Set_Step_Bolus_Start(insulin, preferencesSpeed); @@ -258,7 +258,7 @@ public class DanaRSService extends Service { long expectedEnd = bolusStart + bolusDurationInMSec + 2000; while (System.currentTimeMillis() < expectedEnd) { long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + bolusingEvent.status = String.format(MainApp.gs(R.string.waitingforestimatedbolusend), waitTime / 1000); MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } @@ -267,10 +267,10 @@ public class DanaRSService extends Service { @Override public void run() { // reread bolus status - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Step_Bolus_Information()); // last bolus bolusingEvent.percent = 100; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.disconnecting))); } }); return !start.failed; @@ -295,11 +295,11 @@ public class DanaRSService extends Service { public boolean tempBasal(Integer percent, int durationInHours) { if (!isConnected()) return false; if (danaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Temporary_Basal(percent, durationInHours)); SystemClock.sleep(200); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); @@ -310,11 +310,11 @@ public class DanaRSService extends Service { public boolean highTempBasal(Integer percent) { if (danaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_APS_Basal_Set_Temporary_Basal(percent)); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); loadEvents(); @@ -343,7 +343,7 @@ public class DanaRSService extends Service { public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal()); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); loadEvents(); @@ -353,7 +353,7 @@ public class DanaRSService extends Service { public boolean extendedBolus(Double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Set_Extended_Bolus(insulin, durationInHalfHours)); SystemClock.sleep(200); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Extended_Bolus_State()); @@ -364,7 +364,7 @@ public class DanaRSService extends Service { public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel()); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Extended_Bolus_State()); loadEvents(); @@ -374,7 +374,7 @@ public class DanaRSService extends Service { public boolean updateBasalsInPump(Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); DanaRS_Packet_Basal_Set_Profile_Basal_Rate msgSet = new DanaRS_Packet_Basal_Set_Profile_Basal_Rate(0, basal); bleComm.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index 93b6f99db0..9085e3f762 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -81,7 +81,7 @@ public class CommandQueue { private QueueThread thread = null; private PumpEnactResult executingNowError() { - return new PumpEnactResult().success(false).enacted(false).comment(MainApp.sResources.getString(R.string.executingrightnow)); + return new PumpEnactResult().success(false).enacted(false).comment(MainApp.gs(R.string.executingrightnow)); } public boolean isRunning(Command.CommandType type) { @@ -314,10 +314,10 @@ public class CommandQueue { } if (!MainApp.isEngineeringModeOrRelease()) { - Notification notification = new Notification(Notification.NOT_ENG_MODE_OR_RELEASE, MainApp.sResources.getString(R.string.not_eng_mode_or_release), Notification.URGENT); + Notification notification = new Notification(Notification.NOT_ENG_MODE_OR_RELEASE, MainApp.gs(R.string.not_eng_mode_or_release), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); if (callback != null) - callback.result(new PumpEnactResult().success(false).comment(MainApp.sResources.getString(R.string.not_eng_mode_or_release))).run(); + callback.result(new PumpEnactResult().success(false).comment(MainApp.gs(R.string.not_eng_mode_or_release))).run(); return false; } @@ -327,10 +327,10 @@ public class CommandQueue { for (Profile.BasalValue basalValue : basalValues) { if (basalValue.value < pump.getPumpDescription().basalMinimumRate) { - Notification notification = new Notification(Notification.BASAL_VALUE_BELOW_MINIMUM, MainApp.sResources.getString(R.string.basalvaluebelowminimum), Notification.URGENT); + Notification notification = new Notification(Notification.BASAL_VALUE_BELOW_MINIMUM, MainApp.gs(R.string.basalvaluebelowminimum), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); if (callback != null) - callback.result(new PumpEnactResult().success(false).comment(MainApp.sResources.getString(R.string.basalvaluebelowminimum))).run(); + callback.result(new PumpEnactResult().success(false).comment(MainApp.gs(R.string.basalvaluebelowminimum))).run(); return false; } } diff --git a/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java b/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java index b8eb49e98e..c2fbbf581e 100644 --- a/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java +++ b/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java @@ -33,7 +33,7 @@ import info.nightscout.androidaps.events.EventAppExit; public class ImportExportPrefs { private static Logger log = LoggerFactory.getLogger(ImportExportPrefs.class); static File path = new File(Environment.getExternalStorageDirectory().toString()); - static final File file = new File(path, MainApp.sResources.getString(R.string.app_name) + "Preferences"); + static final File file = new File(path, MainApp.gs(R.string.app_name) + "Preferences"); private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { @@ -59,7 +59,7 @@ public class ImportExportPrefs { public static void exportSharedPreferences(final Activity c) { new AlertDialog.Builder(c) - .setMessage(MainApp.sResources.getString(R.string.export_to) + " " + file + " ?") + .setMessage(MainApp.gs(R.string.export_to) + " " + file + " ?") .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -73,9 +73,9 @@ public class ImportExportPrefs { } pw.close(); fw.close(); - ToastUtils.showToastInUiThread(c, MainApp.sResources.getString(R.string.exported)); + ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.exported)); } catch (FileNotFoundException e) { - ToastUtils.showToastInUiThread(c, MainApp.sResources.getString(R.string.filenotfound) + " " + file); + ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file); log.error("Unhandled exception", e); } catch (IOException e) { log.error("Unhandled exception", e); @@ -88,7 +88,7 @@ public class ImportExportPrefs { public static void importSharedPreferences(final Activity c) { new AlertDialog.Builder(c) - .setMessage(MainApp.sResources.getString(R.string.import_from) + " " + file + " ?") + .setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?") .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -113,7 +113,7 @@ public class ImportExportPrefs { } reader.close(); editor.commit(); - OKDialog.show(c, MainApp.sResources.getString(R.string.setting_imported), MainApp.sResources.getString(R.string.restartingapp), new Runnable() { + OKDialog.show(c, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), new Runnable() { @Override public void run() { log.debug("Exiting"); @@ -126,7 +126,7 @@ public class ImportExportPrefs { } }); } catch (FileNotFoundException e) { - ToastUtils.showToastInUiThread(c, MainApp.sResources.getString(R.string.filenotfound) + " " + file); + ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file); log.error("Unhandled exception", e); } catch (IOException e) { log.error("Unhandled exception", e); diff --git a/app/src/main/java/info/nightscout/utils/NSUpload.java b/app/src/main/java/info/nightscout/utils/NSUpload.java index bfaedc2708..2e5506f9c6 100644 --- a/app/src/main/java/info/nightscout/utils/NSUpload.java +++ b/app/src/main/java/info/nightscout/utils/NSUpload.java @@ -496,7 +496,7 @@ public class NSUpload { try { data.put("eventType", "Note"); data.put("created_at", DateUtil.toISOString(new Date())); - data.put("notes", MainApp.sResources.getString(R.string.androidaps_start)+" - "+ Build.MANUFACTURER + " "+ Build.MODEL); + data.put("notes", MainApp.gs(R.string.androidaps_start)+" - "+ Build.MANUFACTURER + " "+ Build.MODEL); } catch (JSONException e) { log.error("Unhandled exception", e); } diff --git a/app/src/main/java/info/nightscout/utils/NumberPicker.java b/app/src/main/java/info/nightscout/utils/NumberPicker.java index 64239cbaee..102abedc7d 100644 --- a/app/src/main/java/info/nightscout/utils/NumberPicker.java +++ b/app/src/main/java/info/nightscout/utils/NumberPicker.java @@ -199,7 +199,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener, value += step * multiplier; if (value > maxValue) { value = maxValue; - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.youareonallowedlimit)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit)); stopUpdating(); } updateEditText(); @@ -209,7 +209,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener, value -= step * multiplier; if (value < minValue) { value = minValue; - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.youareonallowedlimit)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit)); stopUpdating(); } updateEditText(); diff --git a/app/src/main/java/info/nightscout/utils/OKDialog.java b/app/src/main/java/info/nightscout/utils/OKDialog.java index 3212e6b1fd..5185049678 100644 --- a/app/src/main/java/info/nightscout/utils/OKDialog.java +++ b/app/src/main/java/info/nightscout/utils/OKDialog.java @@ -25,7 +25,7 @@ public class OKDialog { AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme)); builder.setTitle(title); builder.setMessage(message); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if (runnable != null) { @@ -46,7 +46,7 @@ public class OKDialog { AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme)); builder.setTitle(title); builder.setMessage(message); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if (runnable != null) { diff --git a/app/src/main/java/info/nightscout/utils/PasswordProtection.java b/app/src/main/java/info/nightscout/utils/PasswordProtection.java index 1af10eb2d2..2a15dc7311 100644 --- a/app/src/main/java/info/nightscout/utils/PasswordProtection.java +++ b/app/src/main/java/info/nightscout/utils/PasswordProtection.java @@ -37,7 +37,7 @@ public class PasswordProtection { alertDialogBuilder.setView(promptsView); final TextView label = (TextView) promptsView.findViewById(R.id.passwordprompt_text); - label.setText(MainApp.sResources.getString(stringID)); + label.setText(MainApp.gs(stringID)); final EditText userInput = (EditText) promptsView.findViewById(R.id.passwordprompt_pass); // set dialog message @@ -50,7 +50,7 @@ public class PasswordProtection { if (password.equals(enteredPassword)) { if (ok != null) ok.run(); } else { - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.wrongpassword)); + ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.wrongpassword)); if (fail != null) fail.run(); } } From 0e4e36f2b1d44d5fb264fa9d5557f7d0e83083cb Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:49:24 +0200 Subject: [PATCH 36/91] remove direct access to sResources 5 --- .../java/info/nightscout/androidaps/MainActivity.java | 2 +- .../androidaps/plugins/PumpCombo/ComboFragment.java | 2 +- .../plugins/PumpDanaR/AbstractDanaRPlugin.java | 10 +++++----- .../androidaps/plugins/PumpDanaR/DanaRFragment.java | 4 ++-- .../PumpDanaR/activities/DanaRHistoryActivity.java | 2 +- .../plugins/PumpDanaR/comm/MsgBolusProgress.java | 2 +- .../plugins/PumpDanaR/comm/MsgBolusStop.java | 4 ++-- .../plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index 440024f853..348ae81360 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -413,7 +413,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe final SpannableString messageSpanned = new SpannableString(message); Linkify.addLinks(messageSpanned, Linkify.WEB_URLS); builder.setMessage(messageSpanned); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + builder.setPositiveButton(MainApp.gs(R.string.ok), null); AlertDialog alertDialog = builder.create(); alertDialog.show(); ((TextView)alertDialog.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 14fdd3c219..3e3a9a33fc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -145,7 +145,7 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis // reservoir int reservoirLevel = plugin.getPump().reservoirLevel; if (reservoirLevel != -1) { - reservoirView.setText(reservoirLevel + " " + MainApp.sResources.getString(R.string.insulin_unit_shortname)); + reservoirView.setText(reservoirLevel + " " + MainApp.gs(R.string.insulin_unit_shortname)); } else if (ps.insulinState == PumpState.LOW) { reservoirView.setText(MainApp.gs(R.string.combo_reservoir_low)); } else if (ps.insulinState == PumpState.EMPTY) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java index f3898bc98f..903be558b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java @@ -95,22 +95,22 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); - Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); + Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.gs(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + result.comment = MainApp.gs(R.string.pumpNotInitializedProfileNotSet); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!sExecutionService.updateBasalsInPump(profile)) { - Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); + Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.gs(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + result.comment = MainApp.gs(R.string.failedupdatebasalprofile); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); result.success = true; result.enacted = true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java index 7ef3d6a987..b8afdaf15a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java @@ -206,7 +206,7 @@ public class DanaRFragment extends SubscriberFragment { if (pump.lastConnection != 0) { Long agoMsec = System.currentTimeMillis() - pump.lastConnection; int agoMin = (int) (agoMsec / 60d / 1000d); - lastConnectionView.setText(DateUtil.timeString(pump.lastConnection) + " (" + String.format(MainApp.sResources.getString(R.string.minago), agoMin) + ")"); + lastConnectionView.setText(DateUtil.timeString(pump.lastConnection) + " (" + String.format(MainApp.gs(R.string.minago), agoMin) + ")"); SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d); } if (pump.lastBolusTime.getTime() != 0) { @@ -247,7 +247,7 @@ public class DanaRFragment extends SubscriberFragment { SetWarnColor.setColorInverse(batteryView, pump.batteryRemaining, 51d, 26d); iobView.setText(pump.iob + " U"); if (pump.model != 0 || pump.protocol != 0 || pump.productCode != 0) { - firmwareView.setText(String.format(MainApp.sResources.getString(R.string.danar_model), pump.model, pump.protocol, pump.productCode)); + firmwareView.setText(String.format(MainApp.gs(R.string.danar_model), pump.model, pump.protocol, pump.productCode)); } else { firmwareView.setText("OLD"); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java index 7f90fb190b..7e305b0663 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java @@ -215,7 +215,7 @@ public class DanaRHistoryActivity extends Activity { }); profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.noprofile)); finish(); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java index 79358526fa..cb01a7d901 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java @@ -36,7 +36,7 @@ public class MsgBolusProgress extends MessageBase { Double done = (amount * 100 - progress) / 100d; t.insulin = done; EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), done); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), done); bolusingEvent.t = t; bolusingEvent.percent = Math.min((int) (done / amount * 100), 100); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java index 6718d76194..5c677b813e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java @@ -34,10 +34,10 @@ public class MsgBolusStop extends MessageBase { stopped = true; if (!forced) { t.insulin = amount; - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_delivered); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_delivered); bolusingEvent.percent = 100; } else { - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_stoped); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_stoped); } MainApp.bus().post(bolusingEvent); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java index 83bd9dc77d..4fc9844b0d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java @@ -41,7 +41,7 @@ public class MsgInitConnStatusBolus extends MessageBase { } if (!pump.isExtendedBolusEnabled) { - Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.sResources.getString(R.string.danar_enableextendedbolus), Notification.URGENT); + Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED)); From 545d1d1586a9c322a5634c0c6298befd084635fd Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:50:31 +0200 Subject: [PATCH 37/91] remove direct access to sResources 6 --- .../Overview/Dialogs/BolusProgressDialog.java | 4 +-- .../Dialogs/EditQuickWizardDialog.java | 18 +++++------ .../NotificationRecyclerViewAdapter.java | 2 +- .../ProfileLocal/LocalProfileFragment.java | 18 +++++------ .../PumpDanaR/comm/MsgInitConnStatusTime.java | 2 +- .../PumpDanaR/comm/MsgSetBasalProfile.java | 4 +-- .../comm/MsgSetSingleBasalProfile.java | 4 +-- .../PumpDanaR/comm/MsgSettingMeal.java | 4 +-- .../AbstractDanaRExecutionService.java | 6 ++-- .../services/DanaRExecutionService.java | 32 +++++++++---------- .../comm/MsgInitConnStatusBasic_k.java | 2 +- .../comm/MsgInitConnStatusBolus_k.java | 2 +- .../comm/MsgInitConnStatusTime_k.java | 2 +- 13 files changed, 50 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index 35906187a6..fbd4e0ece7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -53,7 +53,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - getDialog().setTitle(String.format(MainApp.sResources.getString(R.string.overview_bolusprogress_goingtodeliver), amount)); + getDialog().setTitle(String.format(MainApp.gs(R.string.overview_bolusprogress_goingtodeliver), amount)); View view = inflater.inflate(R.layout.overview_bolusprogress_dialog, container, false); stopButton = (Button) view.findViewById(R.id.overview_bolusprogress_stop); statusView = (TextView) view.findViewById(R.id.overview_bolusprogress_status); @@ -61,7 +61,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL progressBar = (ProgressBar) view.findViewById(R.id.overview_bolusprogress_progressbar); stopButton.setOnClickListener(this); progressBar.setMax(100); - statusView.setText(MainApp.sResources.getString(R.string.waitingforpump)); + statusView.setText(MainApp.gs(R.string.waitingforpump)); setCancelable(false); stopPressed = false; return view; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java index 2751b800bc..50de25b656 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java @@ -149,13 +149,13 @@ public class EditQuickWizardDialog extends DialogFragment implements View.OnClic int getSelection(Spinner spinner) { String value = spinner.getSelectedItem().toString(); - if (value.equals(MainApp.sResources.getString(R.string.yes))) + if (value.equals(MainApp.gs(R.string.yes))) return QuickWizardEntry.YES; - if (value.equals(MainApp.sResources.getString(R.string.no))) + if (value.equals(MainApp.gs(R.string.no))) return QuickWizardEntry.NO; - if (value.equals(MainApp.sResources.getString(R.string.positiveonly))) + if (value.equals(MainApp.gs(R.string.positiveonly))) return QuickWizardEntry.POSITIVE_ONLY; - if (value.equals(MainApp.sResources.getString(R.string.negativeonly))) + if (value.equals(MainApp.gs(R.string.negativeonly))) return QuickWizardEntry.NEGATIVE_ONLY; return QuickWizardEntry.NO; } @@ -164,19 +164,19 @@ public class EditQuickWizardDialog extends DialogFragment implements View.OnClic String selection; switch (value) { case QuickWizardEntry.YES: - selection = MainApp.sResources.getString(R.string.yes); + selection = MainApp.gs(R.string.yes); break; case QuickWizardEntry.NO: - selection = MainApp.sResources.getString(R.string.no); + selection = MainApp.gs(R.string.no); break; case QuickWizardEntry.POSITIVE_ONLY: - selection = MainApp.sResources.getString(R.string.positiveonly); + selection = MainApp.gs(R.string.positiveonly); break; case QuickWizardEntry.NEGATIVE_ONLY: - selection = MainApp.sResources.getString(R.string.negativeonly); + selection = MainApp.gs(R.string.negativeonly); break; default: - selection = MainApp.sResources.getString(R.string.no); + selection = MainApp.gs(R.string.no); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java index 6087ae0210..1b1487bbaa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java @@ -94,7 +94,7 @@ public class NotificationRecyclerViewAdapter extends RecyclerView.Adapter { doEdit(); if (basalView != null) { - basalView.updateLabel(MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel()); + basalView.updateLabel(MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel()); } }; @@ -91,10 +91,10 @@ public class LocalProfileFragment extends SubscriberFragment { diaView.setParams(LocalProfilePlugin.getPlugin().dia, 2d, 48d, 0.1d, new DecimalFormat("0.0"), false, textWatch); mgdlView = (RadioButton) layout.findViewById(R.id.localprofile_mgdl); mmolView = (RadioButton) layout.findViewById(R.id.localprofile_mmol); - icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.sResources.getString(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); - isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.sResources.getString(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); - basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); - targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.sResources.getString(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); + icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); + isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); + basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); + targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); profileswitchButton = (Button) layout.findViewById(R.id.localprofile_profileswitch); resetButton = (Button) layout.findViewById(R.id.localprofile_reset); saveButton = (Button) layout.findViewById(R.id.localprofile_save); @@ -144,10 +144,10 @@ public class LocalProfileFragment extends SubscriberFragment { mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl); mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol); diaView.setParams(LocalProfilePlugin.getPlugin().dia, 2d, 48d, 0.1d, new DecimalFormat("0.0"), false, textWatch); - icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.sResources.getString(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); - isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.sResources.getString(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); - basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); - targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.sResources.getString(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); + icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); + isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); + basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); + targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); updateGUI(); }); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java index 642f539f6c..84d9c413bf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java @@ -27,7 +27,7 @@ public class MsgInitConnStatusTime extends MessageBase { @Override public void handleMessage(byte[] bytes) { if (bytes.length - 10 > 7) { - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to Korean DanaR"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java index 01c80bc255..9f945e8b26 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java @@ -33,12 +33,12 @@ public class MsgSetBasalProfile extends MessageBase { if (result != 1) { failed = true; log.debug("Set basal profile result: " + result + " FAILED!!!"); - Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.sResources.getString(R.string.profile_set_failed), Notification.URGENT); + Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.gs(R.string.profile_set_failed), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); } else { if (Config.logDanaMessageDetail) log.debug("Set basal profile result: " + result); - Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(reportOK)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java index 1c79080093..7dd9ca522b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java @@ -32,12 +32,12 @@ public class MsgSetSingleBasalProfile extends MessageBase { if (result != 1) { failed = true; log.debug("Set basal profile result: " + result + " FAILED!!!"); - Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.sResources.getString(R.string.profile_set_failed), Notification.URGENT); + Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.gs(R.string.profile_set_failed), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); } else { if (Config.logDanaMessageDetail) log.debug("Set basal profile result: " + result); - Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(reportOK)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java index 6f87803868..8d94a1784d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java @@ -48,14 +48,14 @@ public class MsgSettingMeal extends MessageBase { } if (pump.basalStep != 0.01d) { - Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.sResources.getString(R.string.danar_setbasalstep001), Notification.URGENT); + Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.gs(R.string.danar_setbasalstep001), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.WRONGBASALSTEP)); } if (pump.isConfigUD) { - Notification notification = new Notification(Notification.UD_MODE_ENABLED, MainApp.sResources.getString(R.string.danar_switchtouhmode), Notification.URGENT); + Notification notification = new Notification(Notification.UD_MODE_ENABLED, MainApp.gs(R.string.danar_switchtouhmode), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.UD_MODE_ENABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java index 5524cf5c5c..b7201c1163 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java @@ -134,7 +134,7 @@ public abstract class AbstractDanaRExecutionService extends Service { } protected void getBTSocketForSelectedPump() { - mDevName = SP.getString(MainApp.sResources.getString(R.string.key_danar_bt_name), ""); + mDevName = SP.getString(MainApp.gs(R.string.key_danar_bt_name), ""); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter != null) { @@ -152,10 +152,10 @@ public abstract class AbstractDanaRExecutionService extends Service { } } } else { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.nobtadapter)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.nobtadapter)); } if (mBTDevice == null) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.devicenotfound)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.devicenotfound)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java index 944931569b..65a5d22d36 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java @@ -97,7 +97,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public void connect() { if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.wrongpumppassword), R.raw.error); return; } @@ -138,7 +138,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); MsgStatusBasic statusBasicMsg = new MsgStatusBasic(); MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(); @@ -154,15 +154,15 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); mSerialIOThread.sendMessage(tempStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); long now = System.currentTimeMillis(); if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRPlugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingMeal()); @@ -173,7 +173,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -192,9 +192,9 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ NSUpload.uploadDeviceStatus(); if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -204,11 +204,11 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean tempBasal(int percent, int durationInHours) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(percent, durationInHours)); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -217,7 +217,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -226,7 +226,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean extendedBolus(double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -235,7 +235,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -310,7 +310,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ while (System.currentTimeMillis() < expectedEnd) { long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + bolusingEvent.status = String.format(MainApp.gs(R.string.waitingforestimatedbolusend), waitTime / 1000); MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } @@ -363,7 +363,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean updateBasalsInPump(final Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); MsgSetBasalProfile msgSet = new MsgSetBasalProfile((byte) 0, basal); mSerialIOThread.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java index 82beecc5e9..fa28e664ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java @@ -39,7 +39,7 @@ public class MsgInitConnStatusBasic_k extends MessageBase { } if (pump.isEasyModeEnabled) { - Notification notification = new Notification(Notification.EASYMODE_ENABLED, MainApp.sResources.getString(R.string.danar_disableeasymode), Notification.URGENT); + Notification notification = new Notification(Notification.EASYMODE_ENABLED, MainApp.gs(R.string.danar_disableeasymode), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EASYMODE_ENABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java index bf105b8db0..552511cf7c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java @@ -44,7 +44,7 @@ public class MsgInitConnStatusBolus_k extends MessageBase { } if (!pump.isExtendedBolusEnabled) { - Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.sResources.getString(R.string.danar_enableextendedbolus), Notification.URGENT); + Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java index 2028411791..7553b0cc37 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java @@ -29,7 +29,7 @@ public class MsgInitConnStatusTime_k extends MessageBase { public void handleMessage(byte[] bytes) { if (bytes.length - 10 < 10) { - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to export DanaR"); From 74d0c717122fb18dd248b2ba8065361278ac79b6 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:51:24 +0200 Subject: [PATCH 38/91] remove direct access to sResources 7 --- .../InsulinOrefUltraRapidActingPlugin.java | 6 +++--- .../androidaps/plugins/Loop/LoopFragment.java | 2 +- .../plugins/NSClientInternal/data/DbLogger.java | 4 ++-- .../services/NSClientService.java | 2 +- .../plugins/OpenAPSAMA/OpenAPSAMAFragment.java | 2 +- .../plugins/OpenAPSSMB/OpenAPSSMBPlugin.java | 4 ++-- .../comm/DanaRS_Packet_Basal_Get_Basal_Rate.java | 2 +- .../DanaRS_Packet_Bolus_Get_Bolus_Option.java | 2 +- .../comm/DanaRS_Packet_Notify_Alarm.java | 16 ++++++++-------- .../DanaRS_Packet_Notify_Delivery_Complete.java | 2 +- .../PumpDanaRv2/comm/MsgCheckValue_v2.java | 4 ++-- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java index 0e20f8dd42..ba5fc99011 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java @@ -32,17 +32,17 @@ public class InsulinOrefUltraRapidActingPlugin extends InsulinOrefBasePlugin { @Override public String getName() { - return MainApp.sResources.getString(R.string.ultrarapid_oref); + return MainApp.gs(R.string.ultrarapid_oref); } @Override public String getFriendlyName() { - return MainApp.sResources.getString(R.string.ultrarapid_oref); + return MainApp.gs(R.string.ultrarapid_oref); } @Override public String commentStandardText() { - return MainApp.sResources.getString(R.string.ultrafastactinginsulincomment); + return MainApp.gs(R.string.ultrafastactinginsulincomment); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java index 5285dc7831..4ad35c0d02 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java @@ -65,7 +65,7 @@ public class LoopFragment extends SubscriberFragment { @OnClick(R.id.loop_run) void onRunClick() { - lastRunView.setText(MainApp.sResources.getString(R.string.executing)); + lastRunView.setText(MainApp.gs(R.string.executing)); new Thread(() -> LoopPlugin.getPlugin().invoke("Loop button", true)).start(); FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run")); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java index 79a66186fb..2723fc0748 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java @@ -22,7 +22,7 @@ public class DbLogger { public static void dbAdd(Intent intent, String data) { List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0); if (q.size() < 1) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.nsclientnotinstalled)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.gs(R.string.nsclientnotinstalled)); log.error("DBADD No receivers"); } else if (Config.logNSUpload) log.debug("DBADD dbAdd " + q.size() + " receivers " + data); @@ -31,7 +31,7 @@ public class DbLogger { public static void dbRemove(Intent intent, String data) { List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0); if (q.size() < 1) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.nsclientnotinstalled)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.gs(R.string.nsclientnotinstalled)); log.error("DBREMOVE No receivers"); } else if (Config.logNSUpload) log.debug("DBREMOVE dbRemove " + q.size() + " receivers " + data); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index 445bef32fe..d50f9e2c9b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -309,7 +309,7 @@ public class NSClientService extends Service { MainApp.bus().post(new EventNSClientNewLog("ERROR", "Write treatment permission not granted !!!!")); } if (!hasWriteAuth) { - Notification noperm = new Notification(Notification.NSCLIENT_NO_WRITE_PERMISSION, MainApp.sResources.getString(R.string.nowritepermission), Notification.URGENT); + Notification noperm = new Notification(Notification.NSCLIENT_NO_WRITE_PERMISSION, MainApp.gs(R.string.nowritepermission), Notification.URGENT); MainApp.bus().post(new EventNewNotification(noperm)); } else { MainApp.bus().post(new EventDismissNotification(Notification.NSCLIENT_NO_WRITE_PERMISSION)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java index 2e6bb277e6..f05b0ac696 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java @@ -107,7 +107,7 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli currentTempView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getCurrentTempParam())); try { JSONArray iobArray = new JSONArray(determineBasalAdapterAMAJS.getIobDataParam()); - iobDataView.setText(String.format(MainApp.sResources.getString(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))); + iobDataView.setText(String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))); } catch (JSONException e) { log.error("Unhandled exception", e); iobDataView.setText("JSONException"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java index 741adb4dd7..49a81ea612 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java @@ -255,9 +255,9 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { if (newvalue < lowLimit || newvalue > highLimit) { newvalue = Math.max(newvalue, lowLimit); newvalue = Math.min(newvalue, highLimit); - String msg = String.format(MainApp.sResources.getString(R.string.valueoutofrange), valueName); + String msg = String.format(MainApp.gs(R.string.valueoutofrange), valueName); msg += ".\n"; - msg += String.format(MainApp.sResources.getString(R.string.valuelimitedto), value, newvalue); + msg += String.format(MainApp.gs(R.string.valuelimitedto), value, newvalue); log.error(msg); NSUpload.uploadError(msg); ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), msg, R.raw.error); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java index 048912a23d..f3fef0d49d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java @@ -53,7 +53,7 @@ public class DanaRS_Packet_Basal_Get_Basal_Rate extends DanaRS_Packet { } if (pump.basalStep != 0.01d) { - Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.sResources.getString(R.string.danar_setbasalstep001), Notification.URGENT); + Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.gs(R.string.danar_setbasalstep001), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.WRONGBASALSTEP)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java index eb4af6b25f..69c2f75ba6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java @@ -102,7 +102,7 @@ public class DanaRS_Packet_Bolus_Get_Bolus_Option extends DanaRS_Packet { int missedBolus04EndMin = byteArrayToInt(getBytes(data, dataIndex, dataSize)); if (!pump.isExtendedBolusEnabled) { - Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.sResources.getString(R.string.danar_enableextendedbolus), Notification.URGENT); + Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java index 88edd13a63..04737f0bdc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java @@ -30,23 +30,23 @@ public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet { switch (alarmCode) { case 0x01: // Battery 0% Alarm - errorString = MainApp.sResources.getString(R.string.batterydischarged); + errorString = MainApp.gs(R.string.batterydischarged); break; case 0x02: // Pump Error - errorString = MainApp.sResources.getString(R.string.pumperror) + " " + alarmCode; + errorString = MainApp.gs(R.string.pumperror) + " " + alarmCode; break; case 0x03: // Occlusion - errorString = MainApp.sResources.getString(R.string.occlusion); + errorString = MainApp.gs(R.string.occlusion); break; case 0x04: // LOW BATTERY - errorString = MainApp.sResources.getString(R.string.lowbattery); + errorString = MainApp.gs(R.string.lowbattery); break; case 0x05: // Shutdown - errorString = MainApp.sResources.getString(R.string.lowbattery); + errorString = MainApp.gs(R.string.lowbattery); break; case 0x06: // Basal Compare @@ -54,20 +54,20 @@ public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet { break; case 0x09: // Empty Reservoir - errorString = MainApp.sResources.getString(R.string.emptyreservoir); + errorString = MainApp.gs(R.string.emptyreservoir); break; // BT case 0x07: case 0xFF: // Blood sugar measurement alert - errorString = MainApp.sResources.getString(R.string.bloodsugarmeasurementalert); + errorString = MainApp.gs(R.string.bloodsugarmeasurementalert); break; case 0x08: case 0xFE: // Remaining insulin level - errorString = MainApp.sResources.getString(R.string.remaininsulinalert); + errorString = MainApp.gs(R.string.remaininsulinalert); break; case 0xFD: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java index fb5793995c..2598c5efc9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java @@ -39,7 +39,7 @@ public class DanaRS_Packet_Notify_Delivery_Complete extends DanaRS_Packet { if (t != null) { t.insulin = deliveredInsulin; EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), deliveredInsulin); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), deliveredInsulin); bolusingEvent.t = t; bolusingEvent.percent = Math.min((int) (deliveredInsulin / amount * 100), 100); done = true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java index 9117ad1c98..0869844a1c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java @@ -39,7 +39,7 @@ public class MsgCheckValue_v2 extends MessageBase { pump.productCode = intFromBuff(bytes, 2, 1); if (pump.model != DanaRPump.EXPORT_MODEL) { pump.lastConnection = 0; - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to Korean DanaR"); @@ -64,7 +64,7 @@ public class MsgCheckValue_v2 extends MessageBase { if (pump.protocol != 2) { pump.lastConnection = 0; - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to non APS DanaR"); From de4643d16ff40fba3e6ecf4b533ea044c0da6190 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:57:28 +0200 Subject: [PATCH 39/91] remove direct access to sResources 8 --- .../androidaps/Services/DataService.java | 6 ++-- .../androidaps/db/CareportalEvent.java | 2 +- .../events/EventPreferenceChange.java | 4 +-- .../plugins/Actions/dialogs/FillDialog.java | 2 +- .../dialogs/NewExtendedBolusDialog.java | 2 +- .../Actions/dialogs/NewTempBasalDialog.java | 2 +- .../Careportal/CareportalFragment.java | 2 +- .../ConfigBuilder/ConfigBuilderPlugin.java | 18 ++++++------ .../ObjectivesFragment.java | 28 +++++++++---------- .../Insulin/InsulinOrefBasePlugin.java | 4 +-- .../Insulin/InsulinOrefFreePeakPlugin.java | 4 +-- .../androidaps/plugins/Loop/APSResult.java | 24 ++++++++-------- 12 files changed, 49 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java index 17dea50108..881f2e3bac 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java @@ -304,7 +304,7 @@ public class DataService extends IntentService { log.debug("Got versions: NSClient: " + ConfigBuilderPlugin.nsClientVersionName + " Nightscout: " + ConfigBuilderPlugin.nightscoutVersionName); try { if (ConfigBuilderPlugin.nsClientVersionCode < MainApp.instance().getPackageManager().getPackageInfo(MainApp.instance().getPackageName(), 0).versionCode) { - Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.sResources.getString(R.string.unsupportedclientver), Notification.URGENT); + Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.OLD_NSCLIENT)); @@ -313,13 +313,13 @@ public class DataService extends IntentService { log.error("Unhandled exception", e); } if (ConfigBuilderPlugin.nightscoutVersionCode < Config.SUPPORTEDNSVERSION) { - Notification notification = new Notification(Notification.OLD_NS, MainApp.sResources.getString(R.string.unsupportednsversion), Notification.NORMAL); + Notification notification = new Notification(Notification.OLD_NS, MainApp.gs(R.string.unsupportednsversion), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.OLD_NS)); } } else { - Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.sResources.getString(R.string.unsupportedclientver), Notification.URGENT); + Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } if (bundles.containsKey("status")) { diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index 33fee529bc..755005cdae 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -95,7 +95,7 @@ public class CareportalEvent implements DataPointWithLabelInterface { if (OverviewFragment.shorttextmode) return diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; else - return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); + return diff.get(TimeUnit.DAYS) + " " + MainApp.gs(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.gs(R.string.hours); } public boolean isOlderThan(double hours) { diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java b/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java index f99cb54568..f23d4e802a 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java @@ -12,11 +12,11 @@ public class EventPreferenceChange extends Event { } public EventPreferenceChange(int resourceID) { - changedKey = MainApp.sResources.getString(resourceID); + changedKey = MainApp.gs(resourceID); } public boolean isChanged(int id) { - return changedKey.equals(MainApp.sResources.getString(id)); + return changedKey.equals(MainApp.gs(id)); } public boolean isChanged(String id) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java index 5e99a6ca17..bb50d614ce 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java @@ -212,7 +212,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 04dd783b04..4f7b5e02cb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -93,7 +93,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index fb00879ae4..eafc024a4a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -155,7 +155,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index 4719ed525c..ac018e3101 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -225,7 +225,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli double pbageUrgent = nsSettings.getExtendedWarnValue("pgage", "urgent", 360); double pbageWarn = nsSettings.getExtendedWarnValue("pgage", "warn", 240); - String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); + String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.gs(R.string.notavailable); if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); if (careportalEvent != null) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java index df5b727749..35130c5209 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java @@ -429,17 +429,17 @@ public class ConfigBuilderPlugin extends PluginBase { request.rate = MainApp.getConstraintChecker().applyBasalConstraints(request.rateConstraint, profile).value(); if (!pump.isInitialized()) { - log.debug("applyAPSRequest: " + MainApp.sResources.getString(R.string.pumpNotInitialized)); + log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpNotInitialized)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); } return; } if (pump.isSuspended()) { - log.debug("applyAPSRequest: " + MainApp.sResources.getString(R.string.pumpsuspended)); + log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpsuspended)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpsuspended)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run(); } return; } @@ -499,17 +499,17 @@ public class ConfigBuilderPlugin extends PluginBase { PumpInterface pump = getActivePump(); if (!pump.isInitialized()) { - log.debug("applySMBRequest: " + MainApp.sResources.getString(R.string.pumpNotInitialized)); + log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpNotInitialized)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); } return; } if (pump.isSuspended()) { - log.debug("applySMBRequest: " + MainApp.sResources.getString(R.string.pumpsuspended)); + log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpsuspended)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpsuspended)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run(); } return; } @@ -538,7 +538,7 @@ public class ConfigBuilderPlugin extends PluginBase { Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.failedupdatebasalprofile)); + i.putExtra("title", MainApp.gs(R.string.failedupdatebasalprofile)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index e4cdab4c80..ccb3474358 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -241,20 +241,20 @@ public class ObjectivesFragment extends SubscriberFragment { }); // Add correct translations to array after app is initialized - ObjectivesPlugin.objectives.get(0).objective = MainApp.sResources.getString(R.string.objectives_0_objective); - ObjectivesPlugin.objectives.get(1).objective = MainApp.sResources.getString(R.string.objectives_1_objective); - ObjectivesPlugin.objectives.get(2).objective = MainApp.sResources.getString(R.string.objectives_2_objective); - ObjectivesPlugin.objectives.get(3).objective = MainApp.sResources.getString(R.string.objectives_3_objective); - ObjectivesPlugin.objectives.get(4).objective = MainApp.sResources.getString(R.string.objectives_4_objective); - ObjectivesPlugin.objectives.get(5).objective = MainApp.sResources.getString(R.string.objectives_5_objective); - ObjectivesPlugin.objectives.get(6).objective = MainApp.sResources.getString(R.string.objectives_6_objective); - ObjectivesPlugin.objectives.get(7).objective = MainApp.sResources.getString(R.string.objectives_7_objective); - ObjectivesPlugin.objectives.get(0).gate = MainApp.sResources.getString(R.string.objectives_0_gate); - ObjectivesPlugin.objectives.get(1).gate = MainApp.sResources.getString(R.string.objectives_1_gate); - ObjectivesPlugin.objectives.get(2).gate = MainApp.sResources.getString(R.string.objectives_2_gate); - ObjectivesPlugin.objectives.get(3).gate = MainApp.sResources.getString(R.string.objectives_3_gate); - ObjectivesPlugin.objectives.get(4).gate = MainApp.sResources.getString(R.string.objectives_4_gate); - ObjectivesPlugin.objectives.get(5).gate = MainApp.sResources.getString(R.string.objectives_5_gate); + ObjectivesPlugin.objectives.get(0).objective = MainApp.gs(R.string.objectives_0_objective); + ObjectivesPlugin.objectives.get(1).objective = MainApp.gs(R.string.objectives_1_objective); + ObjectivesPlugin.objectives.get(2).objective = MainApp.gs(R.string.objectives_2_objective); + ObjectivesPlugin.objectives.get(3).objective = MainApp.gs(R.string.objectives_3_objective); + ObjectivesPlugin.objectives.get(4).objective = MainApp.gs(R.string.objectives_4_objective); + ObjectivesPlugin.objectives.get(5).objective = MainApp.gs(R.string.objectives_5_objective); + ObjectivesPlugin.objectives.get(6).objective = MainApp.gs(R.string.objectives_6_objective); + ObjectivesPlugin.objectives.get(7).objective = MainApp.gs(R.string.objectives_7_objective); + ObjectivesPlugin.objectives.get(0).gate = MainApp.gs(R.string.objectives_0_gate); + ObjectivesPlugin.objectives.get(1).gate = MainApp.gs(R.string.objectives_1_gate); + ObjectivesPlugin.objectives.get(2).gate = MainApp.gs(R.string.objectives_2_gate); + ObjectivesPlugin.objectives.get(3).gate = MainApp.gs(R.string.objectives_3_gate); + ObjectivesPlugin.objectives.get(4).gate = MainApp.gs(R.string.objectives_4_gate); + ObjectivesPlugin.objectives.get(5).gate = MainApp.gs(R.string.objectives_5_gate); updateGUI(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java index 672c5cfeb6..2c46cd7bb6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java @@ -56,7 +56,7 @@ public abstract class InsulinOrefBasePlugin extends PluginBase implements Insuli } public String getNotificationPattern() { - return MainApp.sResources.getString(R.string.dia_too_short); + return MainApp.gs(R.string.dia_too_short); } public double getUserDefinedDia() { @@ -98,7 +98,7 @@ public abstract class InsulinOrefBasePlugin extends PluginBase implements Insuli String comment = commentStandardText(); double userDia = getUserDefinedDia(); if (userDia < MIN_DIA) { - comment += "\n" + String.format(MainApp.sResources.getString(R.string.dia_too_short), userDia, MIN_DIA); + comment += "\n" + String.format(MainApp.gs(R.string.dia_too_short), userDia, MIN_DIA); } return comment; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java index 3a19573d71..a710f742a7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java @@ -33,12 +33,12 @@ public class InsulinOrefFreePeakPlugin extends InsulinOrefBasePlugin { } public String getFriendlyName() { - return MainApp.sResources.getString(R.string.free_peak_oref); + return MainApp.gs(R.string.free_peak_oref); } @Override public String commentStandardText() { - return MainApp.sResources.getString(R.string.insulin_peak_time) + ": " + getPeak(); + return MainApp.gs(R.string.insulin_peak_time) + ": " + getPeak(); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java index 7a9c4deae9..87e55c7dc6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java @@ -52,23 +52,23 @@ public class APSResult { String ret; // rate if (rate == 0 && duration == 0) - ret = MainApp.sResources.getString(R.string.canceltemp) + "\n"; + ret = MainApp.gs(R.string.canceltemp) + "\n"; else if (rate == -1) - ret = MainApp.sResources.getString(R.string.let_temp_basal_run) + "\n"; + ret = MainApp.gs(R.string.let_temp_basal_run) + "\n"; else - ret = MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + + ret = MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%) \n" + - MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min\n"; + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min\n"; // smb if (smb != 0) ret += ("SMB: " + DecimalFormatter.toPumpSupportedBolus(smb) + " U\n"); // reason - ret += MainApp.sResources.getString(R.string.reason) + ": " + reason; + ret += MainApp.gs(R.string.reason) + ": " + reason; return ret; } else - return MainApp.sResources.getString(R.string.nochangerequested); + return MainApp.gs(R.string.nochangerequested); } public Spanned toSpanned() { @@ -77,23 +77,23 @@ public class APSResult { String ret; // rate if (rate == 0 && duration == 0) - ret = MainApp.sResources.getString(R.string.canceltemp) + "
"; + ret = MainApp.gs(R.string.canceltemp) + "
"; else if (rate == -1) - ret = MainApp.sResources.getString(R.string.let_temp_basal_run) + "
"; + ret = MainApp.gs(R.string.let_temp_basal_run) + "
"; else - ret = "" + MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + + ret = "" + MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%)
" + - "" + MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min
"; + "" + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min
"; // smb if (smb != 0) ret += ("" + "SMB" + ": " + DecimalFormatter.toPumpSupportedBolus(smb) + " U
"); // reason - ret += "" + MainApp.sResources.getString(R.string.reason) + ": " + reason.replace("<", "<").replace(">", ">"); + ret += "" + MainApp.gs(R.string.reason) + ": " + reason.replace("<", "<").replace(">", ">"); return Html.fromHtml(ret); } else - return Html.fromHtml(MainApp.sResources.getString(R.string.nochangerequested)); + return Html.fromHtml(MainApp.gs(R.string.nochangerequested)); } public APSResult() { From 166f2843dfebdd05d12cfff87248ae448de81a49 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:58:52 +0200 Subject: [PATCH 40/91] remove direct access to sResources 8 --- .../PumpDanaRv2/comm/MsgHistoryEvents_v2.java | 2 +- .../plugins/PumpInsight/InsightPlugin.java | 14 ++++++------ .../PumpVirtual/VirtualPumpPlugin.java | 6 ++--- .../plugins/Source/BGSourceFragment.java | 8 +++---- .../fragments/TreatmentsBolusFragment.java | 10 ++++----- .../TreatmentsCareportalFragment.java | 8 +++---- .../TreatmentsExtendedBolusesFragment.java | 10 ++++----- .../plugins/Wear/ActionStringHandler.java | 22 +++++++++---------- .../wearintegration/WatchUpdaterService.java | 2 +- 9 files changed, 41 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java index ac31d2df92..05c4087dcb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java @@ -170,6 +170,6 @@ public class MsgHistoryEvents_v2 extends MessageBase { if (datetime.getTime() > lastEventTimeLoaded) lastEventTimeLoaded = datetime.getTime(); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.processinghistory) + ": " + status)); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.processinghistory) + ": " + status)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java index 54f618158a..824a449f38 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java @@ -320,9 +320,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai PumpEnactResult result = new PumpEnactResult(); if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); - Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); + Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.gs(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + result.comment = MainApp.gs(R.string.pumpNotInitializedProfileNotSet); return result; } MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); @@ -339,16 +339,16 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai final Mstatus ms = async.busyWaitForCommandResult(uuid, BUSY_WAIT_TIME); if (ms.success()) { MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); result.success = true; result.enacted = true; result.comment = "OK"; this.profileBlocks = profileBlocks; } else { - Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); + Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.gs(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + result.comment = MainApp.gs(R.string.failedupdatebasalprofile); } return result; } @@ -425,7 +425,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai t.isSMB = detailedBolusInfo.isSMB; final EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); bolusingEvent.t = t; - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), 0F); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), 0F); bolusingEvent.bolusId = bolusId; bolusingEvent.percent = 0; MainApp.bus().post(bolusingEvent); @@ -464,7 +464,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai if (activeBolus == null) break; else { bolusingEvent.percent = (int) (100D / activeBolus.getInitialAmount() * (activeBolus.getInitialAmount() - activeBolus.getLeftoverAmount())); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), activeBolus.getInitialAmount() - activeBolus.getLeftoverAmount()); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), activeBolus.getInitialAmount() - activeBolus.getLeftoverAmount()); MainApp.bus().post(bolusingEvent); } } else break; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java index 9176ea94b5..34d3fee80b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java @@ -171,7 +171,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); PumpEnactResult result = new PumpEnactResult(); result.success = true; - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); return result; } @@ -209,14 +209,14 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { while (delivering < detailedBolusInfo.insulin) { SystemClock.sleep(200); EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), delivering); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), delivering); bolusingEvent.percent = Math.min((int) (delivering / detailedBolusInfo.insulin * 100), 100); MainApp.bus().post(bolusingEvent); delivering += 0.1d; } SystemClock.sleep(200); EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivered), detailedBolusInfo.insulin); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivered), detailedBolusInfo.insulin); bolusingEvent.percent = 100; MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java index 7e959b78d4..3e9a79d459 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java @@ -143,9 +143,9 @@ public class BGSourceFragment extends SubscriberFragment { case R.id.bgsource_remove: AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(profile.getUnits())); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(profile.getUnits())); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { /* final String _id = bgReading._id; if (NSUpload.isIdValid(_id)) { @@ -159,7 +159,7 @@ public class BGSourceFragment extends SubscriberFragment { updateGUI(); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java index ae977d4024..dfb918406e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java @@ -81,7 +81,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. Iob iob = t.iobCalc(System.currentTimeMillis(), profile.getDia()); holder.iob.setText(DecimalFormatter.to2Decimal(iob.iobContrib) + " U"); holder.activity.setText(DecimalFormatter.to3Decimal(iob.activityContrib) + " U"); - holder.mealOrCorrection.setText(t.isSMB ? "SMB" : t.mealBolus ? MainApp.sResources.getString(R.string.mealbolus) : MainApp.sResources.getString(R.string.correctionbous)); + holder.mealOrCorrection.setText(t.isSMB ? "SMB" : t.mealBolus ? MainApp.gs(R.string.mealbolus) : MainApp.gs(R.string.correctionbous)); holder.ph.setVisibility(t.source == Source.PUMP ? View.VISIBLE : View.GONE); holder.ns.setVisibility(NSUpload.isIdValid(t._id) ? View.VISIBLE : View.GONE); holder.invalid.setVisibility(t.isValid ? View.GONE : View.VISIBLE); @@ -142,9 +142,9 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. switch (v.getId()) { case R.id.treatments_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(treatment.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(treatment.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = treatment._id; if (treatment.source == Source.PUMP) { @@ -162,7 +162,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveTreatment")); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java index 7218198b43..0eed8b1163 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java @@ -105,9 +105,9 @@ public class TreatmentsCareportalFragment extends SubscriberFragment implements switch (v.getId()) { case R.id.careportal_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(careportalEvent.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(careportalEvent.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = careportalEvent._id; if (NSUpload.isIdValid(_id)) { @@ -118,7 +118,7 @@ public class TreatmentsCareportalFragment extends SubscriberFragment implements MainApp.getDbHelper().delete(careportalEvent); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java index c8fc539d02..05e18bfdc3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java @@ -67,7 +67,7 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment { holder.ns.setVisibility(NSUpload.isIdValid(extendedBolus._id) ? View.VISIBLE : View.GONE); if (extendedBolus.isEndingEvent()) { holder.date.setText(DateUtil.dateAndTimeString(extendedBolus.date)); - holder.duration.setText(MainApp.sResources.getString(R.string.cancel)); + holder.duration.setText(MainApp.gs(R.string.cancel)); holder.insulin.setText(""); holder.realDuration.setText(""); holder.iob.setText(""); @@ -144,9 +144,9 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment { switch (v.getId()) { case R.id.extendedboluses_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(extendedBolus.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(extendedBolus.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = extendedBolus._id; if (NSUpload.isIdValid(_id)) { @@ -158,7 +158,7 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment { FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveExtendedBolus")); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index bbb1d9122c..aca5100fb6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -513,15 +513,15 @@ public class ActionStringHandler { } if (!result.isChangeRequested()) { - ret += MainApp.sResources.getString(R.string.nochangerequested) + "\n"; + ret += MainApp.gs(R.string.nochangerequested) + "\n"; } else if (result.rate == 0 && result.duration == 0) { - ret += MainApp.sResources.getString(R.string.canceltemp) + "\n"; + ret += MainApp.gs(R.string.canceltemp) + "\n"; } else { - ret += MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(result.rate) + " U/h " + + ret += MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(result.rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(result.rate / ConfigBuilderPlugin.getActivePump().getBaseBasalRate() * 100) + "%)\n" + - MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to0Decimal(result.duration) + " min\n"; + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to0Decimal(result.duration) + " min\n"; } - ret += "\n" + MainApp.sResources.getString(R.string.reason) + ": " + result.reason; + ret += "\n" + MainApp.gs(R.string.reason) + ": " + result.reason; return ret; } @@ -586,18 +586,18 @@ public class ActionStringHandler { //check for validity if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) { - msg += String.format(MainApp.sResources.getString(R.string.valueoutofrange), "Profile-Percentage") + "\n"; + msg += String.format(MainApp.gs(R.string.valueoutofrange), "Profile-Percentage") + "\n"; } if (timeshift < 0 || timeshift > 23) { - msg += String.format(MainApp.sResources.getString(R.string.valueoutofrange), "Profile-Timeshift") + "\n"; + msg += String.format(MainApp.gs(R.string.valueoutofrange), "Profile-Timeshift") + "\n"; } final Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { - msg += MainApp.sResources.getString(R.string.notloadedplugins) + "\n"; + msg += MainApp.gs(R.string.notloadedplugins) + "\n"; } if (!"".equals(msg)) { - msg += MainApp.sResources.getString(R.string.valuesnotstored); + msg += MainApp.gs(R.string.valuesnotstored); String rTitle = "STATUS"; String rAction = "statusmessage"; WearPlugin.getPlugin().requestActionConfirmation(rTitle, msg, rAction); @@ -634,7 +634,7 @@ public class ActionStringHandler { @Override public void run() { if (!result.success) { - sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) + + sendError(MainApp.gs(R.string.treatmentdeliveryerror) + "\n" + result.comment); } @@ -652,7 +652,7 @@ public class ActionStringHandler { @Override public void run() { if (!result.success) { - sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) + + sendError(MainApp.gs(R.string.treatmentdeliveryerror) + "\n" + result.comment); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index d9bfd55f6b..592f89d568 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -661,7 +661,7 @@ public class WatchUpdaterService extends WearableListenerService implements String status = ""; if (profile == null) { - status = MainApp.sResources.getString(R.string.noprofile); + status = MainApp.gs(R.string.noprofile); return status; } From 5aa3a88c7f7b666d3bc90deabe99e64e513e6a51 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 13:59:27 +0200 Subject: [PATCH 41/91] remove direct access to sResources 9 --- .../info/nightscout/androidaps/plugins/Wear/WearPlugin.java | 6 +++--- .../java/info/nightscout/androidaps/queue/QueueThread.java | 4 ++-- .../androidaps/queue/commands/CommandSetProfile.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java index dcda0bc0aa..7282ac0763 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java @@ -158,7 +158,7 @@ public class WearPlugin extends PluginBase { @Subscribe public void onStatusEvent(final EventBolusRequested ev) { - String status = String.format(MainApp.sResources.getString(R.string.bolusrequested), ev.getAmount()); + String status = String.format(MainApp.gs(R.string.bolusrequested), ev.getAmount()); Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_BOLUSPROGRESS); intent.putExtra("progresspercent", 0); intent.putExtra("progressstatus", status); @@ -172,9 +172,9 @@ public class WearPlugin extends PluginBase { String status; if (ev.result.success) { - status = MainApp.sResources.getString(R.string.success); + status = MainApp.gs(R.string.success); } else { - status = MainApp.sResources.getString(R.string.nosuccess); + status = MainApp.gs(R.string.nosuccess); } Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_BOLUSPROGRESS); intent.putExtra("progresspercent", 100); diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java index 8ec61932c8..a5ad59ca0b 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java @@ -55,7 +55,7 @@ public class QueueThread extends Thread { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (pump == null) { log.debug("QUEUE: pump == null"); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.pumpNotInitialized))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.pumpNotInitialized))); SystemClock.sleep(1000); continue; } @@ -63,7 +63,7 @@ public class QueueThread extends Thread { if (!pump.isConnected() && secondsElapsed > Constants.PUMP_MAX_CONNECTION_TIME_IN_SECONDS) { MainApp.bus().post(new EventDismissBolusprogressIfRunning(null)); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.connectiontimedout))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.connectiontimedout))); log.debug("QUEUE: timed out"); pump.stopConnecting(); diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java index 8a8bc41dfa..03764dee0b 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java @@ -47,7 +47,7 @@ public class CommandSetProfile extends Command { if (r.enacted && profileSwitch.source == Source.NIGHTSCOUT) { SmsCommunicatorPlugin smsCommunicatorPlugin = MainApp.getSpecificPlugin(SmsCommunicatorPlugin.class); if (smsCommunicatorPlugin != null && smsCommunicatorPlugin.isEnabled(PluginType.GENERAL)) { - smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.sResources.getString(R.string.profile_set_ok)); + smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.gs(R.string.profile_set_ok)); } } } From 611d761a414b0b8dfb2d0ad452e965f8f0536dc4 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 14:16:40 +0200 Subject: [PATCH 42/91] use MainApp.gs instead of getString from Activity/Dialog --- .../nightscout/androidaps/MainActivity.java | 8 ++++---- .../plugins/Actions/dialogs/FillDialog.java | 4 ++-- .../dialogs/NewExtendedBolusDialog.java | 6 +++--- .../Actions/dialogs/NewTempBasalDialog.java | 10 +++++----- .../Overview/Dialogs/WizardDialog.java | 12 +++++------ .../plugins/Overview/OverviewFragment.java | 16 +++++++-------- .../activities/DanaRHistoryActivity.java | 20 +++++++++---------- .../wearintegration/WatchUpdaterService.java | 6 +++--- 8 files changed, 41 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index 348ae81360..aade605241 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -247,7 +247,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe if (!pm.isIgnoringBatteryOptimizations(packageName)) { log.debug("Requesting ignore battery optimization"); - OKDialog.show(this, getString(R.string.pleaseallowpermission), String.format(getString(R.string.needwhitelisting), getString(R.string.app_name)), new Runnable() { + OKDialog.show(this, MainApp.gs(R.string.pleaseallowpermission), String.format(getString(R.string.needwhitelisting), MainApp.gs(R.string.app_name)), new Runnable() { @Override public void run() { @@ -260,7 +260,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe startActivity(intent); } catch (ActivityNotFoundException e) { - final String msg = getString(R.string.batteryoptimalizationerror); + final String msg = MainApp.gs(R.string.batteryoptimalizationerror); ToastUtils.showToastInUiThread(getApplicationContext(), msg); log.error(msg); } @@ -406,10 +406,10 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe builder.setIcon(R.mipmap.blueowl); String message = "Build: " + BuildConfig.BUILDVERSION + "\n"; message += "Flavor: " + BuildConfig.FLAVOR + BuildConfig.BUILD_TYPE + "\n"; - message += getString(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName; + message += MainApp.gs(R.string.configbuilder_nightscoutversion_label) + " " + ConfigBuilderPlugin.nightscoutVersionName; if (MainApp.engineeringMode) message += "\n" + MainApp.gs(R.string.engineering_mode_enabled); - message += getString(R.string.about_link_urls); + message += MainApp.gs(R.string.about_link_urls); final SpannableString messageSpanned = new SpannableString(message); Linkify.addLinks(messageSpanned, Linkify.WEB_URLS); builder.setMessage(messageSpanned); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java index bb50d614ce..9842019802 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java @@ -179,10 +179,10 @@ public class FillDialog extends DialogFragment implements OnClickListener { } if (pumpSiteChangeCheckbox.isChecked()) - confirmMessage.add("" + "" + getString(R.string.record_pump_site_change) + ""); + confirmMessage.add("" + "" + MainApp.gs(R.string.record_pump_site_change) + ""); if (insulinCartridgeChangeCheckbox.isChecked()) - confirmMessage.add("" + "" + getString(R.string.record_insulin_cartridge_change) + ""); + confirmMessage.add("" + "" + MainApp.gs(R.string.record_insulin_cartridge_change) + ""); final String notes = notesEdit.getText().toString(); if (!notes.isEmpty()) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 4f7b5e02cb..22690bb554 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -68,13 +68,13 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli Double insulin = SafeParse.stringToDouble(editInsulin.getText()); int durationInMinutes = SafeParse.stringToInt(editDuration.getText()); - String confirmMessage = getString(R.string.setextendedbolusquestion); + String confirmMessage = MainApp.gs(R.string.setextendedbolusquestion); Double insulinAfterConstraint = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value(); confirmMessage += " " + insulinAfterConstraint + " U "; - confirmMessage += getString(R.string.duration) + " " + durationInMinutes + "min ?"; + confirmMessage += MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?"; if (insulinAfterConstraint - insulin != 0d) - confirmMessage += "\n" + getString(R.string.constraintapllied); + confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied); insulin = insulinAfterConstraint; final Double finalInsulin = insulin; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index eafc024a4a..9d9a45d8f6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -122,21 +122,21 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi if (profile == null) return; - String confirmMessage = getString(R.string.setbasalquestion); + String confirmMessage = MainApp.gs(R.string.setbasalquestion); if (setAsPercent) { int basalPercentInput = SafeParse.stringToInt(basalPercent.getText()); percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(new Constraint<>(basalPercentInput), profile).value(); confirmMessage += "\n" + percent + "% "; - confirmMessage += "\n" + getString(R.string.duration) + " " + durationInMinutes + "min ?"; + confirmMessage += "\n" + MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?"; if (percent != basalPercentInput) - confirmMessage += "\n" + getString(R.string.constraintapllied); + confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied); } else { Double basalAbsoluteInput = SafeParse.stringToDouble(basalAbsolute.getText()); absolute = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(basalAbsoluteInput), profile).value(); confirmMessage += "\n" + absolute + " U/h "; - confirmMessage += "\n" + getString(R.string.duration) + " " + durationInMinutes + "min ?"; + confirmMessage += "\n" + MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?"; if (absolute - basalAbsoluteInput != 0d) - confirmMessage += "\n" + getString(R.string.constraintapllied); + confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied); } final int finalBasalPercent = percent; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index 7d190bdb1a..bd0bc46fdf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -306,19 +306,19 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com if (profile != null && (calculatedTotalInsulin > 0d || calculatedCarbs > 0d)) { DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00"); - String confirmMessage = getString(R.string.entertreatmentquestion); + String confirmMessage = MainApp.gs(R.string.entertreatmentquestion); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(calculatedTotalInsulin)).value(); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(calculatedCarbs)).value(); - confirmMessage += "
" + getString(R.string.bolus) + ": " + "" + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U" + ""; - confirmMessage += "
" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + confirmMessage += "
" + MainApp.gs(R.string.bolus) + ": " + "" + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U" + ""; + confirmMessage += "
" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); + builder.setMessage(getString(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; @@ -472,13 +472,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com c_correction = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(c_correction)).value(); if (c_correction - corrAfterConstraint != 0) { // c_correction != corrAfterConstraint doesn't work editCorr.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.bolusconstraintapplied)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.bolusconstraintapplied)); return; } Integer carbsAfterConstraint = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(c_carbs)).value(); if (c_carbs - carbsAfterConstraint != 0) { editCarbs.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.carbsconstraintapplied)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.carbsconstraintapplied)); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 3f126aba19..f8c78ad1cd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -742,18 +742,18 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } if (wizard.calculatedTotalInsulin > 0d && quickWizardEntry.carbs() > 0d) { DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00"); - String confirmMessage = getString(R.string.entertreatmentquestion); + String confirmMessage = MainApp.gs(R.string.entertreatmentquestion); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(wizard.calculatedTotalInsulin)).value(); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(quickWizardEntry.carbs())).value(); - confirmMessage += "\n" + getString(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; - confirmMessage += "\n" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + confirmMessage += "\n" + MainApp.gs(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; + confirmMessage += "\n" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; if (!insulinAfterConstraints.equals(wizard.calculatedTotalInsulin) || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); + builder.setMessage(getString(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; @@ -1269,14 +1269,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, iobView.setText(iobtext); iobView.setOnClickListener(v -> { String iobtext1 = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U\n" - + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U\n" - + getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U\n"; + + MainApp.gs(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U\n" + + MainApp.gs(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U\n"; OKDialog.show(getActivity(), MainApp.gs(R.string.iob), iobtext1, null); }); } else if (MainApp.sResources.getBoolean(R.bool.isTablet)) { String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" - + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " - + getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; + + MainApp.gs(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " + + MainApp.gs(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; iobView.setText(iobtext); } else { String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java index 7e305b0663..97c5569b4b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java @@ -122,20 +122,20 @@ public class DanaRHistoryActivity extends Activity { // Types ArrayList typeList = new ArrayList<>(); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ALARM, getString(R.string.danar_history_alarm))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BASALHOUR, getString(R.string.danar_history_basalhours))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BOLUS, getString(R.string.danar_history_bolus))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_CARBO, getString(R.string.danar_history_carbohydrates))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_DAILY, getString(R.string.danar_history_dailyinsulin))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, getString(R.string.danar_history_glucose))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ALARM, MainApp.gs(R.string.danar_history_alarm))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BASALHOUR, MainApp.gs(R.string.danar_history_basalhours))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BOLUS, MainApp.gs(R.string.danar_history_bolus))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_CARBO, MainApp.gs(R.string.danar_history_carbohydrates))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_DAILY, MainApp.gs(R.string.danar_history_dailyinsulin))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, MainApp.gs(R.string.danar_history_glucose))); if (!isKorean && !isRS) { - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ERROR, getString(R.string.danar_history_errors))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ERROR, MainApp.gs(R.string.danar_history_errors))); } if (isRS) - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_PRIME, getString(R.string.danar_history_prime))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_PRIME, MainApp.gs(R.string.danar_history_prime))); if (!isKorean) { - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, getString(R.string.danar_history_refill))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, getString(R.string.danar_history_syspend))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, MainApp.gs(R.string.danar_history_refill))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, MainApp.gs(R.string.danar_history_syspend))); } ArrayAdapter spinnerAdapter = new ArrayAdapter<>(this, R.layout.spinner_centered, typeList); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index fbb7c4e82e..db26cdec65 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -213,7 +213,7 @@ public class WatchUpdaterService extends WearableListenerService implements final DataMap dataMap = dataMapSingleBG(lastBG, glucoseStatus); if (dataMap == null) { - ToastUtils.showToastInUiThread(this, getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(this, MainApp.gs(R.string.noprofile)); return; } @@ -330,7 +330,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (!graph_bgs.isEmpty()) { DataMap entries = dataMapSingleBG(last_bg, glucoseStatus); if (entries == null) { - ToastUtils.showToastInUiThread(this, getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(this, MainApp.gs(R.string.noprofile)); return; } final ArrayList dataMaps = new ArrayList<>(graph_bgs.size()); @@ -669,7 +669,7 @@ public class WatchUpdaterService extends WearableListenerService implements LoopPlugin activeloop = LoopPlugin.getPlugin(); if (!activeloop.isEnabled(PluginType.LOOP)) { - status += getString(R.string.disabledloop) + "\n"; + status += MainApp.gs(R.string.disabledloop) + "\n"; lastLoopStatus = false; } else { lastLoopStatus = true; From 3f3959f785c880732a0aee82f261cd9dd14c21a4 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 14:21:53 +0200 Subject: [PATCH 43/91] use MainApp.gs instead of getString from Activity/Dialog 2 --- .../nightscout/androidaps/MainActivity.java | 4 +-- .../androidaps/TDDStatsActivity.java | 26 +++++++++---------- .../plugins/Actions/dialogs/FillDialog.java | 4 +-- .../dialogs/NewExtendedBolusDialog.java | 6 ++--- .../Actions/dialogs/NewTempBasalDialog.java | 6 ++--- .../NSClientInternal/NSClientFragment.java | 4 +-- .../Overview/Dialogs/WizardDialog.java | 14 +++++----- .../plugins/Overview/OverviewFragment.java | 6 ++--- 8 files changed, 35 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainActivity.java b/app/src/main/java/info/nightscout/androidaps/MainActivity.java index aade605241..9a80c61904 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/MainActivity.java @@ -247,7 +247,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe if (!pm.isIgnoringBatteryOptimizations(packageName)) { log.debug("Requesting ignore battery optimization"); - OKDialog.show(this, MainApp.gs(R.string.pleaseallowpermission), String.format(getString(R.string.needwhitelisting), MainApp.gs(R.string.app_name)), new Runnable() { + OKDialog.show(this, MainApp.gs(R.string.pleaseallowpermission), String.format(MainApp.gs(R.string.needwhitelisting), MainApp.gs(R.string.app_name)), new Runnable() { @Override public void run() { @@ -399,7 +399,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe break; case R.id.nav_about: AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext()); - builder.setTitle(getString(R.string.app_name) + " " + BuildConfig.VERSION); + builder.setTitle(MainApp.gs(R.string.app_name) + " " + BuildConfig.VERSION); if (Config.NSCLIENT || Config.G5UPLOADER) builder.setIcon(R.mipmap.yellowowl); else diff --git a/app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java b/app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java index 369b2f42b5..7bc3ee31c5 100644 --- a/app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/TDDStatsActivity.java @@ -141,27 +141,27 @@ public class TDDStatsActivity extends Activity { TableLayout.LayoutParams.WRAP_CONTENT)); TextView label_date = new TextView(this); - label_date.setText(getString(R.string.danar_stats_date)); + label_date.setText(MainApp.gs(R.string.danar_stats_date)); label_date.setTextColor(Color.WHITE); tr_head.addView(label_date); TextView label_basalrate = new TextView(this); - label_basalrate.setText(getString(R.string.danar_stats_basalrate)); + label_basalrate.setText(MainApp.gs(R.string.danar_stats_basalrate)); label_basalrate.setTextColor(Color.WHITE); tr_head.addView(label_basalrate); TextView label_bolus = new TextView(this); - label_bolus.setText(getString(R.string.danar_stats_bolus)); + label_bolus.setText(MainApp.gs(R.string.danar_stats_bolus)); label_bolus.setTextColor(Color.WHITE); tr_head.addView(label_bolus); TextView label_tdd = new TextView(this); - label_tdd.setText(getString(R.string.danar_stats_tdd)); + label_tdd.setText(MainApp.gs(R.string.danar_stats_tdd)); label_tdd.setTextColor(Color.WHITE); tr_head.addView(label_tdd); TextView label_ratio = new TextView(this); - label_ratio.setText(getString(R.string.danar_stats_ratio)); + label_ratio.setText(MainApp.gs(R.string.danar_stats_ratio)); label_ratio.setTextColor(Color.WHITE); tr_head.addView(label_ratio); @@ -179,17 +179,17 @@ public class TDDStatsActivity extends Activity { TableLayout.LayoutParams.WRAP_CONTENT)); TextView label_cum_amount_days = new TextView(this); - label_cum_amount_days.setText(getString(R.string.danar_stats_amount_days)); + label_cum_amount_days.setText(MainApp.gs(R.string.danar_stats_amount_days)); label_cum_amount_days.setTextColor(Color.WHITE); ctr_head.addView(label_cum_amount_days); TextView label_cum_tdd = new TextView(this); - label_cum_tdd.setText(getString(R.string.danar_stats_tdd)); + label_cum_tdd.setText(MainApp.gs(R.string.danar_stats_tdd)); label_cum_tdd.setTextColor(Color.WHITE); ctr_head.addView(label_cum_tdd); TextView label_cum_ratio = new TextView(this); - label_cum_ratio.setText(getString(R.string.danar_stats_ratio)); + label_cum_ratio.setText(MainApp.gs(R.string.danar_stats_ratio)); label_cum_ratio.setTextColor(Color.WHITE); ctr_head.addView(label_cum_ratio); @@ -207,17 +207,17 @@ public class TDDStatsActivity extends Activity { TableLayout.LayoutParams.WRAP_CONTENT)); TextView label_exp_weight = new TextView(this); - label_exp_weight.setText(getString(R.string.danar_stats_weight)); + label_exp_weight.setText(MainApp.gs(R.string.danar_stats_weight)); label_exp_weight.setTextColor(Color.WHITE); etr_head.addView(label_exp_weight); TextView label_exp_tdd = new TextView(this); - label_exp_tdd.setText(getString(R.string.danar_stats_tdd)); + label_exp_tdd.setText(MainApp.gs(R.string.danar_stats_tdd)); label_exp_tdd.setTextColor(Color.WHITE); etr_head.addView(label_exp_tdd); TextView label_exp_ratio = new TextView(this); - label_exp_ratio.setText(getString(R.string.danar_stats_ratio)); + label_exp_ratio.setText(MainApp.gs(R.string.danar_stats_ratio)); label_exp_ratio.setTextColor(Color.WHITE); etr_head.addView(label_exp_ratio); @@ -235,7 +235,7 @@ public class TDDStatsActivity extends Activity { reloadButton.setVisibility(View.GONE); statusView.setVisibility(View.VISIBLE); statsMessage.setVisibility(View.VISIBLE); - statsMessage.setText(getString(R.string.danar_stats_warning_Message)); + statsMessage.setText(MainApp.gs(R.string.danar_stats_warning_Message)); } }); ConfigBuilderPlugin.getCommandQueue().loadTDDs( new Callback() { @@ -441,7 +441,7 @@ public class TDDStatsActivity extends Activity { if (isOldData(historyList) && ConfigBuilderPlugin.getActivePump().getPumpDescription().needsManualTDDLoad) { statsMessage.setVisibility(View.VISIBLE); - statsMessage.setText(getString(R.string.danar_stats_olddata_Message)); + statsMessage.setText(MainApp.gs(R.string.danar_stats_olddata_Message)); } else { tl.setBackgroundColor(Color.TRANSPARENT); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java index 9842019802..828c7dbcc9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java @@ -197,7 +197,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { builder.setTitle(MainApp.gs(R.string.confirmation)); if (insulinAfterConstraints > 0 || pumpSiteChangeCheckbox.isChecked() || insulinCartridgeChangeCheckbox.isChecked()) { builder.setMessage(Html.fromHtml(Joiner.on("
").join(confirmMessage))); - builder.setPositiveButton(getString(R.string.primefill), (dialog, id) -> { + builder.setPositiveButton(MainApp.gs(R.string.primefill), (dialog, id) -> { if (finalInsulinAfterConstraints > 0) { DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); detailedBolusInfo.insulin = finalInsulinAfterConstraints; @@ -228,7 +228,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { } else { builder.setMessage(MainApp.gs(R.string.no_action_selected)); } - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); } catch (RuntimeException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 22690bb554..3b986d9f4b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -39,7 +39,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - getDialog().setTitle(getString(R.string.overview_extendedbolus_button)); + getDialog().setTitle(MainApp.gs(R.string.overview_extendedbolus_button)); View view = inflater.inflate(R.layout.overview_newextendedbolus_dialog, container, false); @@ -84,7 +84,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(context.getString(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ConfigBuilderPlugin.getCommandQueue().extendedBolus(finalInsulin, finalDurationInMinutes, new Callback() { @Override @@ -102,7 +102,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli FabricPrivacy.getInstance().logCustom(new CustomEvent("ExtendedBolus")); } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index 9d9a45d8f6..15a45a32c6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -52,7 +52,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - getDialog().setTitle(getString(R.string.overview_tempbasal_button)); + getDialog().setTitle(MainApp.gs(R.string.overview_tempbasal_button)); View view = inflater.inflate(R.layout.overview_newtempbasal_dialog, container, false); @@ -146,7 +146,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(this.getContext().getString(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Callback callback = new Callback() { @Override @@ -169,7 +169,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi FabricPrivacy.getInstance().logCustom(new CustomEvent("TempBasal")); } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java index 44cd5c43a1..b1cad222e8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java @@ -112,14 +112,14 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick builder.setTitle(this.getContext().getString(R.string.confirmation)); builder.setMessage("Clear queue? All data in queue will be lost!"); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { UploadQueue.clearQueue(); updateGUI(); FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientClearQueue")); } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; case R.id.nsclientinternal_showqueue: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index bd0bc46fdf..718b1c6bfa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -270,13 +270,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com } private void saveCheckedStates() { - SP.putBoolean(getString(R.string.key_wizard_include_cob), cobCheckbox.isChecked()); - SP.putBoolean(getString(R.string.key_wizard_include_trend_bg), bgtrendCheckbox.isChecked()); + SP.putBoolean(MainApp.gs(R.string.key_wizard_include_cob), cobCheckbox.isChecked()); + SP.putBoolean(MainApp.gs(R.string.key_wizard_include_trend_bg), bgtrendCheckbox.isChecked()); } private void loadCheckedStates() { - bgtrendCheckbox.setChecked(SP.getBoolean(getString(R.string.key_wizard_include_trend_bg), false)); - cobCheckbox.setChecked(SP.getBoolean(getString(R.string.key_wizard_include_cob), false)); + bgtrendCheckbox.setChecked(SP.getBoolean(MainApp.gs(R.string.key_wizard_include_trend_bg), false)); + cobCheckbox.setChecked(SP.getBoolean(MainApp.gs(R.string.key_wizard_include_cob), false)); } @Override @@ -318,7 +318,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); + builder.setMessage(MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; @@ -334,7 +334,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com final AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(Html.fromHtml(confirmMessage)); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { synchronized (builder) { if (accepted) { @@ -396,7 +396,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com } } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index f8c78ad1cd..89b667e8dd 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -753,7 +753,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (!insulinAfterConstraints.equals(wizard.calculatedTotalInsulin) || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); + builder.setMessage(MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; @@ -766,7 +766,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, accepted = false; builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), (dialog, id) -> { + builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> { synchronized (builder) { if (accepted) { log.debug("guarding: already accepted"); @@ -822,7 +822,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); } } From d289c5c7d7658f48112d1fb5a42f35cea9989817 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 14:27:23 +0200 Subject: [PATCH 44/91] use MainApp.gs instead of context --- .../Actions/dialogs/NewExtendedBolusDialog.java | 3 ++- .../plugins/Actions/dialogs/NewTempBasalDialog.java | 2 +- .../plugins/NSClientInternal/NSClientFragment.java | 2 +- .../androidaps/plugins/Overview/OverviewFragment.java | 10 +++++----- .../PersistentNotificationPlugin.java | 6 +++--- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 3b986d9f4b..45b6460392 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -12,6 +12,7 @@ import android.view.ViewGroup; import com.crashlytics.android.answers.CustomEvent; +import org.mozilla.javascript.tools.jsc.Main; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,7 +83,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli final Context context = getContext(); AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(context.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index 15a45a32c6..7a03887cf6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -144,7 +144,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi final int finalDurationInMinutes = durationInMinutes; AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java index b1cad222e8..3bff1c9be3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java @@ -110,7 +110,7 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick final Context context = getContext(); AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(this.getContext().getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage("Clear queue? All data in queue will be lost!"); builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 89b667e8dd..3d0970f8f4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -678,9 +678,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun; if (finalLastRun != null && finalLastRun.lastAPSRun != null && finalLastRun.constraintsProcessed.isChangeRequested()) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(getContext().getString(R.string.confirmation)); - builder.setMessage(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); - builder.setPositiveButton(getContext().getString(R.string.ok), (dialog, id) -> { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); + builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> { hideTempRecommendation(); clearNotification(); MainApp.getConfigBuilder().applyTBRRequest(finalLastRun.constraintsProcessed, profile, new Callback() { @@ -702,7 +702,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, }); FabricPrivacy.getInstance().logCustom(new CustomEvent("AcceptTemp")); }); - builder.setNegativeButton(getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); } } @@ -1091,7 +1091,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (showAcceptButton && pump.isInitialized() && !pump.isSuspended() && LoopPlugin.getPlugin().isEnabled(PluginType.LOOP)) { acceptTempLayout.setVisibility(View.VISIBLE); - acceptTempButton.setText(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); + acceptTempButton.setText(MainApp.gs(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); } else { acceptTempLayout.setVisibility(View.GONE); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 7194dae8d7..202e33d330 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -94,7 +94,7 @@ public class PersistentNotificationPlugin extends PluginBase { return; } - String line1 = ctx.getString(R.string.noprofile); + String line1 = MainApp.gs(R.string.noprofile); if (MainApp.getConfigBuilder().getActiveProfileInterface() == null || !MainApp.getConfigBuilder().isProfileValid("Notificiation")) return; @@ -111,7 +111,7 @@ public class PersistentNotificationPlugin extends PluginBase { + " avgΔ" + deltastring(glucoseStatus.avgdelta, glucoseStatus.avgdelta * Constants.MGDL_TO_MMOLL, units); } else { line1 += " " + - ctx.getString(R.string.old_data) + + MainApp.gs(R.string.old_data) + " "; } } @@ -128,7 +128,7 @@ public class PersistentNotificationPlugin extends PluginBase { IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round(); - String line2 = ctx.getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString();; + String line2 = MainApp.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString();; String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h"; From 926ee535d54321f6b02278eea41656f222a69304 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 14:28:16 +0200 Subject: [PATCH 45/91] use MainApp.gs instead of context 2 --- .../plugins/ConstraintsObjectives/ObjectivesFragment.java | 2 +- .../Treatments/fragments/TreatmentsBolusFragment.java | 8 ++++---- .../fragments/TreatmentsCareportalFragment.java | 8 ++++---- .../fragments/TreatmentsProfileSwitchFragment.java | 8 ++++---- .../fragments/TreatmentsTempTargetFragment.java | 8 ++++---- .../plugins/XDripStatusline/StatuslinePlugin.java | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index ccb3474358..1424013440 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -59,7 +59,7 @@ public class ObjectivesFragment extends SubscriberFragment { holder.position.setText(String.valueOf(position + 1)); holder.objective.setText(o.objective); holder.gate.setText(o.gate); - holder.duration.setText(context.getString(R.string.objectives_minimalduration) + " " + o.durationInDays + " " + context.getString(R.string.days)); + holder.duration.setText(MainApp.gs(R.string.objectives_minimalduration) + " " + o.durationInDays + " " + MainApp.gs(R.string.days)); holder.progress.setText(requirementsMet.comment); holder.started.setText(o.started.toLocaleString()); holder.accomplished.setText(o.accomplished.toLocaleString()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java index dfb918406e..57ad6833a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java @@ -204,16 +204,16 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. switch (view.getId()) { case R.id.treatments_reshreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + "?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { TreatmentsPlugin.getPlugin().getService().resetTreatments(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java index 0eed8b1163..97c3a05274 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java @@ -157,16 +157,16 @@ public class TreatmentsCareportalFragment extends SubscriberFragment implements switch (view.getId()) { case R.id.careportal_refreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + " ?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + " ?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetCareportalEvents(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java index af8846662c..307f9c8ee6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java @@ -190,16 +190,16 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen switch (view.getId()) { case R.id.profileswitch_refreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + "?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetProfileSwitch(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java index 0156df16e8..df67349839 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java @@ -192,16 +192,16 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements switch (view.getId()) { case R.id.temptargetrange_refreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + " ?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + " ?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetTempTargets(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index 426acbe6ca..03c6c48a1a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -113,7 +113,7 @@ public class StatuslinePlugin extends PluginBase { LoopPlugin loopPlugin = LoopPlugin.getPlugin(); if (!loopPlugin.isEnabled(PluginType.LOOP)) { - status += ctx.getString(R.string.disabledloop) + "\n"; + status += MainApp.gs(R.string.disabledloop) + "\n"; lastLoopStatus = false; } else if (loopPlugin.isEnabled(PluginType.LOOP)) { lastLoopStatus = true; From 32323d673bb1bb40a793bde24f1ced6e2138b509 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 15:01:49 +0200 Subject: [PATCH 46/91] Brighter green for "treatment active" for better readability. --- app/src/main/res/values/colors.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 58982405c0..a5e65e2eda 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -52,7 +52,7 @@ #ca77dd #de7550 - #1b5e20 + #25912e #47c8ff #FFDD7792 From c51635dba47de91c571c2d50c57a24c7cad86856 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 00:51:59 +0200 Subject: [PATCH 47/91] Watch: colored preds. --- .../nightscout/androidaps/db/BgReading.java | 4 +- .../wearintegration/WatchUpdaterService.java | 6 ++- .../androidaps/data/BgWatchData.java | 12 ++++-- .../androidaps/watchfaces/BIGChart.java | 7 +++- .../androidaps/watchfaces/BaseWatchFace.java | 7 +++- .../androidaps/watchfaces/BgGraphBuilder.java | 42 ++++++++++--------- .../watchfaces/CircleWatchface.java | 6 ++- 7 files changed, 52 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java index 17a6d7d8e2..ef0277d170 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java +++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.db; +import android.content.res.Resources; + import com.j256.ormlite.field.DatabaseField; import com.j256.ormlite.table.DatabaseTable; @@ -219,7 +221,7 @@ public class BgReading implements DataPointWithLabelInterface { return color; } - private int getPredectionColor() { + public int getPredectionColor() { if (isIOBPrediction) return MainApp.sResources.getColor(R.color.iob); if (isCOBPrediction) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index db26cdec65..696b8b0b57 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -477,7 +477,8 @@ public class WatchUpdaterService extends WearableListenerService implements if (!predArray.isEmpty()) { for (BgReading bg : predArray) { - predictions.add(predictionMap(bg.date, bg.value)); + if (bg.value < 40) continue; + predictions.add(predictionMap(bg.date, bg.value, bg.getPredectionColor())); } } } @@ -520,10 +521,11 @@ public class WatchUpdaterService extends WearableListenerService implements return dm; } - private DataMap predictionMap(long timestamp, double sgv) { + private DataMap predictionMap(long timestamp, double sgv, int color) { DataMap dm = new DataMap(); dm.putLong("timestamp", timestamp); dm.putDouble("sgv", sgv); + dm.putInt("color", color); return dm; } diff --git a/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java b/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java index 8f20d77282..4f258ee074 100644 --- a/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java +++ b/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.data; +import java.util.Objects; + /** * Created by emmablack on 1/7/15. */ @@ -8,12 +10,14 @@ public class BgWatchData implements Comparable{ public double high; public double low; public long timestamp; + public int color; - public BgWatchData(double aSgv, double aHigh, double aLow, long aTimestamp) { + public BgWatchData(double aSgv, double aHigh, double aLow, long aTimestamp, int aColor) { this.sgv = aSgv; this.high = aHigh; this.low = aLow; this.timestamp = aTimestamp; + this.color = aColor; } public BgWatchData(){ @@ -25,12 +29,14 @@ public class BgWatchData implements Comparable{ if(! (that instanceof BgWatchData)){ return false; } + if (this.color != ((BgWatchData) that).color) + return false; return this.timestamp == ((BgWatchData) that).timestamp; } @Override - public int hashCode(){ - return (int) (timestamp%Integer.MAX_VALUE); + public int hashCode() { + return Objects.hash(timestamp, color); } @Override diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java index ce8c931078..b61bdc866b 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java @@ -428,6 +428,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre BgWatchData bwd = new BgWatchData(); bwd.timestamp = prediction.getLong("timestamp"); bwd.sgv = prediction.getDouble("sgv"); + bwd.color = prediction.getInt("color"); predictionList.add(bwd); } } @@ -649,13 +650,15 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre double high = entry.getDouble("high"); double low = entry.getDouble("low"); long timestamp = entry.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = entry.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } } else { double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); long timestamp = dataMap.getLong("timestamp"); + int color = dataMap.getInt("color", 0); final int size = bgDataList.size(); if (size > 0) { @@ -663,7 +666,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre return; // Ignore duplicates. } - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } for (int i = 0; i < bgDataList.size(); i++) { diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java index 3c980a713f..47ea3dbf08 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java @@ -604,13 +604,15 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen double high = entry.getDouble("high"); double low = entry.getDouble("low"); long timestamp = entry.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = entry.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } } else { double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); long timestamp = dataMap.getLong("timestamp"); + int color = dataMap.getInt("color", 0); final int size = bgDataList.size(); if (size > 0) { @@ -618,7 +620,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen return; // Ignore duplicates. } - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } for (int i = 0; i < bgDataList.size(); i++) { @@ -689,6 +691,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen BgWatchData bwd = new BgWatchData(); bwd.timestamp = prediction.getLong("timestamp"); bwd.sgv = prediction.getDouble("sgv"); + bwd.color = prediction.getInt("color"); predictionList.add(bwd); } } diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java index 7d50d7ff4c..4a401489d9 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java @@ -10,7 +10,9 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.TimeZone; import info.nightscout.androidaps.data.BasalWatchData; @@ -173,13 +175,12 @@ public class BgGraphBuilder { } } + addPredictionLines(lines); lines.add(basalLine((float) minChart, factor, highlight)); lines.add(bolusLine((float) minChart)); lines.add(bolusInvalidLine((float) minChart)); lines.add(carbsLine((float) minChart)); lines.add(smbLine((float) minChart)); - lines.add(predictionLine()); - return lines; } @@ -275,29 +276,30 @@ public class BgGraphBuilder { } - private Line predictionLine() { - - List pointValues = new ArrayList(); - + private void addPredictionLines(List lines) { + Map> values = new HashMap<>(); long endTime = getPredictionEndTime(); - for (BgWatchData bwd: predictionsList) { - if(bwd.timestamp <= endTime) { - pointValues.add(new PointValue(fuzz(bwd.timestamp), (float) bwd.sgv)); + for (BgWatchData bwd : predictionsList) { + if (bwd.timestamp <= endTime) { + double value = bwd.sgv < 300 ? bwd.sgv : 300; + if (!values.containsKey(bwd.color)) { + values.put(bwd.color, new ArrayList<>()); + } + values.get(bwd.color).add(new PointValue(fuzz(bwd.timestamp), (float) value)); } } - Line line = new Line(pointValues); - line.setColor(Color.MAGENTA); - line.setHasLines(false); - int size = pointSize/2; - size = (size>0)?size:1; - line.setPointRadius(size); - line.setHasPoints(true); - return line; + for (Map.Entry> entry : values.entrySet()) { + Line line = new Line(entry.getValue()); + line.setColor(entry.getKey()); + line.setHasLines(false); + int size = pointSize / 2; + size = (size > 0) ? size : 1; + line.setPointRadius(size); + line.setHasPoints(true); + lines.add(line); + } } - - - public Line highValuesLine() { Line highValuesLine = new Line(highValues); highValuesLine.setColor(highColor); diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java index 3c479f3f86..4b6922fb90 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java @@ -573,7 +573,8 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); long timestamp = dataMap.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = dataMap.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } else if (!sharedPrefs.getBoolean("animation", false)) { // don't load history at once if animations are set (less resource consumption) Log.d("addToWatchSet", "entries.size(): " + entries.size()); @@ -583,7 +584,8 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh double high = entry.getDouble("high"); double low = entry.getDouble("low"); long timestamp = entry.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = entry.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } } else From fb61f3cde212e5acaa1f382e73ce915d961a727b Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 16:39:28 +0200 Subject: [PATCH 48/91] Update strings.xml --- app/src/main/res/values-sv/strings.xml | 681 ++++++++++++++++--------- 1 file changed, 442 insertions(+), 239 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 47bd827e0a..83c7d2f86d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -4,56 +4,59 @@ Glimp MM640g Absolut - Åtgärd - ACT + Åtgärder + Act Aktivitet Vuxen Avancerade inställningar - Starta om telefonen eller AndroidAPS from systeminställningar + Starta om telefonen eller AndroidAPS från systeminställningar, annars kommer Android APS inte kunna logga fel (viktigt att kunna spåra och verifiera att algoritmerna fungerar korrekt)! Använd alltid kort medel delta istället för enkel delta Användbart när ofiltrerade källor som xDrip ger brusvärden AndroidAPS startar - Snart daglig max av insulin + Maximal daglig dos snart nådd APS Mode + Medeldelta Basal - Basal E/tim - Basal steg - Basal understiger min.nivå. Ingen profil satt - Pump Batteri Urladdat + Basal E/tim: + Basalsteg + Basal saknas i profil. Använder standardvärde. + BR + Basal understiger miniminivå. Profilen sattes inte. + Basalprofil: + Pumpbatteri urladdat Bolus - Bolus Steg - Bolus spärr aktiverad - Bolus %.2fU korrekt tillförd - Ger %.2fU - Kommer att ge %.2fU + Bolussteg + Bolusspärr aktiverad + Bolus %.2f enheter korrekt tillförd + Ger %.2f enheter + Kommer att tillföra %.2f enheter Knapp 1 Knapp 2 Knapp 3 Kalibrering skickad till xDrip - Avbryt Temp Basal + Avbryt tempbasal Kolhydrater - Kohydrat spärr aktiverad + Kohydratsspärr aktiverad Careportal Meddelande BG Kontroll - Kanyl ålder - Kolhydrat korrektion - CGM Sensor Insättning - CGM Sensor Start - Combo Bolus - Korrektion Bolus + Kanylålder + Kolhydratskorrektion + Byte CGM-sensor + CGM-sensor start + Kombinationsbolus + Korrektionsbolus Träning - Insulin Ålder - Insulin Reservoir Byte - Måltids Bolus + Insulinålder + Byte insulinreservoar + Måltidsbolus Absolut Kolhydrater - KH tid + KH-tid Duration Infört av Tid för händelse - Händelse typ - Glukos sort + Händelsetyp Insulin Mätare Notering @@ -63,197 +66,215 @@ Sensor Delad Notering - OpenAPS Offline - Pump Batteri Ålder - Profil Byte - Pump Kanyl Byte + OpenAPS offline + Pumpbatteri ålder + Byt profil + Byte pumpkanyl Fråga CP - Snack Bolus - Temp Basal Slut - Temp Basal Start - Temp Mål BG - Temp Mål BG Slut + Mellanmålsbolus + Tempbasal slut + Tempasal Start + Temp mål + Temp mål avbrutet Ändra inmatning Barn - Ta bort kö - Rensa inmatningar + Cirkadisk Profil Procent + CPP + Töm kö + Töm logg Closed Loop COB Kommentar Konfigurationsverktyg APS BG Källa - Begränsningar + Begränsningar Generell Insulin Loop - Nightscout version: + Nightscoutversion: Profil Pump - KONF - Åtgärd - Bekräftelse - Sammankopplad - Sammankopplar - Sammankoppling till pump förlorad - Begränsning aktiverad - Begränsning Överträdelse - Kopierad till Clipboard - Kopiera till Clipboard + Konf + Tempbasaler + Behandlingar + Bekräfta + Ansluten + Ansluter + Anslutningsfel pump + Begränsning nådd + Begränsning nådd + Kopierat till Urklipp + Kopiera till Urklipp Korr CZ - Alarm + alarm basal tim - Bluetooth Status + Bluetoothstatus DanaR Bluetooth Pump kolhydrat - Enheter/Dag - Avaktivera EasyUI mode in pump - Aktivera förlängd bolus i pump + Enheter per dag + Avaktivera EasyUI mode in pumpen + Aktivera förlängd bolus i pumpen Fel - Glukos - Historia + glukos + Historik Larm - Basal Timmar + Basaltimmar Bolusar Kolhydrater - Sammankopplar för %d s + Ansluter (%d s) Daglig insulinmängd Fel Glukos - Påfyllnad + Påfyllning Stoppa - Ladda om - Fel på inlagd data + Hämta + Fel på inmatad data Pump IOB - Sista bolus - Lösenord Pump - DanaR pump inställningar - Påfyllnad + Senaste bolus + Lösenord pump + DanaR pumpinställningar + Påfyllning Kumulativ TDD Datum Exponentiellt viktad TDD - Gammal Data Vg tryck \"Ladda om\" + Gammal data. V.g. tryck \"Hämta\" Kvot Använd förlängd bolus med >200% - Värde ej korrekt angivet + Misslyckades med inställning Se profil Se förlängd bolus som % DanaR Korea - DanaR profil inställningar - DIA (h) + DanaR profilinställningar + DIA [tim] Insulinets verkningstid (DIA) DanaR - DANA + Dana dagar - Deutsch - Ge nu + Tyska + Synkronisera nu Delta - Vald enhet ej funnen + DEV + Vald enhet kan inte nås DIA - Loop Frånkopplad - Frånkoppla pump i 1 h + Loop frånkopplad + Koppla ifrån pump i 1 h Stäng av loop Frånkopplad - Frånkopplar - Frånkoppla pump i 2 h - Frånkoppla pump i 15 min - Frånkoppla pump i 30 min - Frånkoppla pump i 3 h + Kopplar ifrån + Koppla ifrån pump i 10 h + Koppla ifrån pump i 2 h + Koppla ifrån pump i 30 min + Koppla ifrån pump i 3 h TA BORT + Ignorera profilbyten + Alla profilbyten ignoreras och aktiv profil används alltid + Visa inte detta igen Duration Äta snart + Ändra grundbasal: English + Startad Starta loop Aktivera superbolus i kalkylatorn - Aktivera superbolus funktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN + Aktiverar superbolusfunktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN! Aktiverad Licensavtal för Slutanvändare JAG FÖRSTÅR OCH GODKÄNNER - Ange ny behandling + Ange ny behandling: Denna kolumn får ej vara tom - Endast siffror får användas - Endast siffror är tillåtna inom %1$s - %2$s - Ej giltigt telefonnummer + Endast siffror tillåtna. + Endast siffror mellan %1$s - %2$s är tillåtna. + Ogiltigt telefonnummer Spanska Utför Exportera inställningar till Inställningar exporterade - FörlängdBolus + Förlängd bolus Lyckades ej uppdatera basalprofil Snabbverkande Insulin Novorapid, Novolog, Humalog, Apidra - Data ej funnen - Fyll/Förfyll standard insulin mängd - Vg försäkra dig om att mängd motsvarar det som är specificerat för just ditt infusionsset - Hämtar pump status + Hittade inte filen + Standardvärden för prime/fyll. + Försäkra dig om att mängden motsvarar det som är specificerat för just ditt infusionsset. + Hämtar pumpstatus Glukos Finger Sensor HÖG markering timmar + tim sedan Importera inställningar från - Startar… - Ogiltig profil !!! + Startar... + Ogiltig profil! IOB Italienska Koreanska Språk - Lokal Profil + Lokal profil LP Loop APS - Efter avklarade begränsningar - LOOP + Efter begränsningar + Inställning i pump + Loop LOOP STOPPAD PGA BEGRÄNSNINGAR - Superbolus (%d m - Loop avstängd + Loop meny + Superbolus (%d min) + Loop pausad LÅG markering - Svagt Batteri - Manual + Svagt batteri + Manuell Avbryt Måltid - Fattas + Saknas Om - Exit + Backup + Avsluta Exportera inställningar Importera inställningar Inställningar Uppdatera behandlingar från NS - Återställ Databaser - Visa log + Återställ databaser + Visa logg + Testa alarm Nightscout INGEN APS VALD - Ingen Bluetooth adapter funnen + Ingen Bluetooth-adapter funnen Ingen ändring behövs - Ingen profil laddad ännu från NS + Ingen profil laddad från Nightscout ännu Ingen profil vald INGEN PROFIL VALD misslyckat - vg kontrollera telefonen Ej tillgängligt - NSCLIENT har inga skrivrättigheter. Fel API secret? + NS Client har inga skrivrättigheter. Fel API secret? Alarm inställningar - Medge lokal sändning till andra appar (ex xDrip) - Aktivera lokal Broadcasts - Markera app start till NS - Ingen uppladdning till NS - Ingen data sänds till NS. AAPS kommunicerar med NS men inga ändringar görs i NS + Slå på sändning av data till alla appar i telefonen (ex xDrip). + Aktivera lokala broadcasts. + Markera app start till Nightscout + Ingen uppladdning till Nightscout + Ingen data sänds till Nightscout. AAPS ansluter till Nightscout men inga ändringar görs i Nightscout. Använd alltid absoluta värden i basal - Endast uppladdning till NS (avaktiverad sync) - Endast uppladdning till NS. Fungerar ej med SGV om inte lokal källa som xDrip används. Inte effektiv med Profiler om NS-Profiler används + Endast uppladdning till Nightscout (ingen synkronisering) + Endast uppladdning till Nightscout. Kommer inte få BG-data om inte lokal källa som xDrip används. Kommer heller inte att kunna hämta basalprofiler från Nightscout. Hög Låg Gammal data - Ange NS API sectet (min 12 tecken) + NSClient + Ange enhetens namn + Enhetens namn + Ange NS API secret (min 12 tecken) NS API secret NSClient är inte installerad. Data förlorad! Nightscout URL - Enter Nightscout URL + Ange Nightscout URL URL: NSClient NSCI NS API secret + Aktiv profil Basal DIA IC @@ -261,8 +282,8 @@ Målvärde Enheter OAPS - Mål/Syfte - Kontrollera att BG syns i NS, och att pump insulin data laddas upp + Mål + Kontrollera att BG syns i Nightscout, och att insulindata från pumpen laddas upp Ställa in utseende och övervakning, för att sedan kunna analysera basaler och kvoter Du har nått din tillåtna gräns xds @@ -274,44 +295,49 @@ Fel lösenord Visa BGI Visa BGI i statusfält - WEAR - Wear inställningar + Wear + Inställningar för Wear Visa detaljerad IOB Visa IOB med bolus och basal på klocka Wear Väntar på resultat + Väntar på pump. Klicka för att uppdatera. Väntar på pump - Virtuell - Ladda upp till NS + Virtuell pump + Synlig + Ladda upp status till Nightscout Temp basal - VPUMP - Virtuell pump inställningar + SQL-fel + vPump + Inställningar för Virtuell pump OK - Reservoir - Sista kontakt - Programversion + Reservoar + Senast ansluten + Firmwareversion Förlängd bolus Batteri - Grund basal hastighet - Virtuell Pump - Uppladdning - Uppdaterar basal hastigheter - Version av NS som inte stöds + Profilens basalhastighet + Virtuell pump + Laddar upp + Uppdaterar basalhastigheter + Upp + Version av Nightscout som inte stöds Version av NSClient som inte stöds Lås upp inställningar Enheter: Säkerhet vid behandling Max tillåtna KH (g) Max tillåten bolus [E] - E + E + TOTAL Korr COB KH Bolus IOB - 15min trend + 15 min trend BG Basal IOB - TREAT + Beh Insulin KH Total IOB: @@ -321,226 +347,403 @@ KH: Aktivitet: Behandlingar - Bolus ej tillförd - TempMål + Fel vid bolusleverans + TT + Temp mål + TB Dur: Kvot: Ins: Total IOB: IOB: - Tempbasal ej tillförd + Fel vid justering av tempbasal Tempbasal Tonåring - Mål gränser: - Stäng av loop i 3 h - Stäng av loop i 2 h - Stäng av loop i 1 h - Stäng av loop i 10 h + Mål saknas i profil. Använder standardvärde. + Målområde: + Pausa loop i 3 h + Pausa loop i 2 h + Pausa loop i 1 h + Pausa loop i 10 h Superbolus Lyckad - Stoppar temp basal - Stoppar förlängd bolus + Avbryter tempbasal + Avbryter förlängd bolus Status: Fel duration: Okänt kommando eller fel svar - Temp basal %.2fU/h for %d min startad - Fel vid Temp basal start - Gick ej att avbryta temp basal - Temp basal avbruten - För att avbryta loop i %d minuter svara med kod %s + Tempbasal %.2f enheter/tim i %d min startad + Fel vid start av tempbasal + Misslyckades avbryta tempbasal + Tempbasal avbruten + För att pausa loop i %d minuter, svara med kod %s SMS - Tillåt fjärrkommandon via SMS - Fjärrkommandon tillåts ej - Kalibrering från andra källor godkänns ej + Tillåt fjärrstyrning via SMS + Kalibrering från andra källor inte tillåtna Fjärrbolus är inte tillåtet Fjärrkommandon för att ändra basaler tillåts ej - Ej godkänd för SMS - Loop avstängd - Loop åter startad + Saknar rättighet att skicka SMS + Loop pausad + Loop återupptagen Loop är aktiverad Loop är avstängd Loop är aktiverat Loop är avstängd - Icke giltigt telefonnummer för SMS - Kalibrering skickad. xDrip måste tillåta att ta emot kalibrering i inställningarna - För att skicka kalibrering %.2f svar med kod %s + Ogiltigt telefonnummer för SMS + Kalibrering skickad. xDrip måste tillåta att ta emot kalibrering i inställningarna. + För att skicka kalibrering %.2f, svara med kod %s xDrip tar inte emot kalibreringar - För att ge bolus %.2fU svar med kod %s - Bolus ej given - Bolus %.2fU tillförd - För att stoppa temp basal svara med kod %s - För att starta basal %.2fU/h svara med kod %s + För att ge bolus %.2f enheter, svara med kod %s + Bolus avbruten + Bolus %.2f enheter tillförd + För att stoppa tempbasal, svara med kod %s + För att starta basal %.2f enheter/tim, svara med kod %s +XXXXXXXXXX;+YYYYYYYYYY Tillåtna telefonnummer - SMS Tjänst + SMS-tjänst Senaste BG: Enkel profil Visa kö Lösenord för inställningar - Ställ in förlängd bolus - inställningar importerade + Ställer in förlängd bolus + Inställningar importerade Ställ in ny förlängd bolus: - Acceptera ny temp basal: + Acceptera ny tempbasal: Skicka kalibrering %.1f till xDrip? + SKICKA Spara Säkerhet Återuppta Resultat - Gå ur applikationen för att starta inställning + Avslutar appen för att inställningarna ska läsas in. Omstart Vill du verkligen återställa databasen? - Återsänd all Data + Uppdatera Ta bort sparad data: Ladda om profil - Uppdatera händelser från NS + Uppdatera händelser från Nightscout Orsak + RAT Hastighet - Kalkylator inställningar + Kalkylatorinställningar Kalkylator Kö: - Pump stoppad + Pump pausad. Klicka för ladda om status. + Pump pausad Pump avstängd Pumpfel Pump upptagen - Pump inte igångsatt, ingen profil vald - Pump inte startad + Pump inte initierad, ingen profil vald. + Pump inte initierad Pump - NSPROFIL - NS Profil - ProfilByte - Basal profil i pump uppdaterad - Ny basal profil misslyckades + NSProfil + NS profil + Profilbyte + Basalprofilen uppdaterad i pumpen + Misslyckades sätta basalprofilen Profil Prime/Fyll - Gränsvärden för Visualisering + Gränsvärden för visualisering Högt och lågt värde för graf i översikten och i smartwatch - Vg ge tillåtelse Procent + Procentfaktor med vilken basalprofilen kommer att bli multiplicerad. Pausad Vg ange personens ålder för inställningar av gränser Personens ålder - TempBasal - Hemma + Tempbasal + Hem Ta bort - Editera - % (100% = current) - Stoppa Förlängd Bolus - Förlängd Bolus + Ändra + % (100% = profilens värde) + Stoppa förlängd bolus + Förlängd bolus Lägg till Giltig: KH: - Knapp text: + Knapptext: Kalibrering Kalibrering Kalkylator STOPP NEDTRYCKT Stoppad Stopp - Kommer tillföra %.2fU + Kommer tillföra %.2f enheter Tillförd - Bolus + Bolus Översikt Andra - Ny behandlingsrekommendation tillgänglig + Ny rekommendation tillgänglig Open Loop - Värde %s är utanför gränserna - %.2f begränsad till %.2f + Värde %s är utanför gränserna + %.2f begränsad till %.2f Kör nu - Fråga + Beräknat behov Profil - Ingen glukos data tillänglig - Måltids data + Ingen pump tillgänglig + Ingen profil tillänglig + Ingen glukosdata tillänglig + Måltidsdata Maximal basal IOB som OpenAPS kan ge [E] Detta värde kallas Max IOB i OpenAPS. Det är ställt till noll från start. Efter flera dagar till veckor, beroende på hur du känner, kan du välja att justera denna. - Max E/h som Temp Basal kan ställas in på + Max E/h som tempbasal kan sättas till Detta värde kallas max basal inom OpenAPS - Senaste körning + Körde senast Senast startad IOB data Ange värden - Status Glukos + Glukosstatus Plug in är avaktiverad Nuvarande temp - Autosens data + Autosensdata OpenAPS MA - Använd AMA autosens funktioner - Inställt värde: 3.0 Detta är grundinställning för KH.absorption per 5 min. 3 mg/dl/5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat" - Inställt värde: 3 Detta är en grundsten i OpenAPS säkerhetsaspekt. Detta begränsar din basal till att vara 3x din största basalhastighet. Du behöver ofta inte ändra detta värde, Läs på och förstå skilnaden på 3x nuvarande och 3x daglig max som säkerhetsinställningar. + Använd AMA autosens + Standardvärde: 3.0 mg/dl/5 min. Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat. + Standardvärde: 3. Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 3x din största basalhastighet. Du behöver oftast inte ändra detta värde. Läs på och förstå skillnaden mellan 3x nuvarande och 3x daglig max som säkerhetsinställningar. Viktigt! Normalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden. - Inställt värde: 4 Detta är andra delen i grunden för säkerhet i OpenAPS, dvs kring 3x och 4 x daglig och nuvarnde basaler. Detta värde innebär att din nuvarande basal, oberoende av din max basalhastighet, kan aldrig bli högre än 4x nuvarande basal. Detta för att undvika att man farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. - Inställt värde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2). - Antal timmar för beräkning av känslighet (KH absorptionstid är exkluderad) - Intervall för autosens (h) - Inställt värde: 0.7 Detta är den andra delen av autosens säkerhetsaspekt, den sätter en gräns på hur lågt autosens kan justera basaler, och hur högt den kan justera ISF och BG mål - Inställt värde: 1.2 Detta är inställt värde för hur mycket autosens kan multiplicera uppåt (snart även autotune) dvs max 20%, med 1.2 kan alltså autosens öka dina basaler med max 20%, denna gräns gäller alltså hur högt autosens kan justera dina basaler men även hur lågt den kan justera ISF och hur lågt den kan sätta BG mål. - Inställt värde: sant Detta för att tillåta autosens justera BG målvärden, tillsammans med ISF och basaler + Standardvärde: 2. Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2). + Antal timmar för beräkning av känslighet (Absorptionstid för KH är exkluderad). + Intervall för autosens [tim] + Standardvärde: 1.2. Med standarvärdet 1.2 kan autosens justera upp dina basaler, kvoter etc med upp till 20% för att kompensera för t ex tillfällig insulinresistens. + Standardvärde: sant Detta för att tillåta autosens justera BG målvärden, ISF och basaler. OpenAPS AMA - OAPS OpenAPS Öppna inställningar på Wear - Pågående rapportering + Konstant notis i telefonen GAMMAL DATA OK Ocklusion - M/S - Pump status tillgänglig i NS - Mål/syfte + Mål + Pumpstatus tillgängligt i Nightscout + Mål: Minimal duration Manuell aktivering Spärr: Godkänn Starta - BG är tillängligt i NS - Aktiverar extra funktioner som kan användas dagitd, såsom avancerad måltids assist - Justerar basaler och ration om det behövs, aktivera sedan auto-sens - 1 veckas framgångsrik dagtids looping där alla måltider lagts in + BG är tillängligt i Nightscout + Aktiverar extra funktioner som kan användas dagtid, såsom avancerad måltids assistans + Justerar basaler och kvoter om det behövs. Aktivera sedan auto-sens. + 1 veckas lyckad looping dagtid, där alla måltider lagts in. Finjustering av closed loop, gradvis ökande IOB och minskande önskat BG målvärde - Kör några dagar, och åtminstone en natt utan larm för lågt BG, innan du sänker BG målvärde + Kör några dagar och åtminstone en natt utan larm för lågt BG, innan du sänker målvärdet för BG. Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger - Förstå din open loop, och hur den föreslår temp basaler - Utifrån vad du nu lärt dig, besluta vilken max basal du vil ha, ställ in det både i inställningar i APS och i den pump. + Förstå din open loop och hur den föreslår tempbasaler + Utifrån vad du nu lärt dig, besluta vilken max basal du vil ha. Ställ in det både i inställningarna i APS och i din pump. Starta med open loop - Starta Open loop och använd det några dagar, försök att ge många föreslagna temp basaler + Starta med open loop och använd det några dagar. Försök att ge många föreslagna temp basaler. Tid i timmar när alla KH väntas vara absorberade Måltids max absorptions tid (h) - Absorptions inställningar + Absorptionsinställningar Bulgariska PUMP - Batteribyte Pump - Sensor ålder - SAGE - Värden sparas inte - Möjligen felvärde om man använder bolus för att priming/fyllning! + Byte pumpbatteri + Sensorålder + måste vara aktiverad för att kunna skicka värden till pumpen. + Värden sparades inte! + Kan visa fel om man använder bolus för priming/fyllning! + Ändra grund-IC: + Ändra grund-ISF: Grekiska MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + ISF saknas i profilen. Använder standardvärde. Lås skärm Lås mmol/l - %dmin sedan + %d min sedan mg/dl OK MDI NSClient Autoscroll - Basal typ + http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html + Basaltyp SENS Genom att slå på Autosens funktionen, kom ihåg att skriva in alla KH. Annars kommer programmet göra fel i beräkningar av känslighet (ISF)!! Sensitivity AAPS Sensitivity Oref0 Sensitivity WeightedAverage - Ställa in temp basal + Ställer in tempbasal SP BG: Basal: Bolus: Delta: IOB: - %dmin sedan - Gammal data tröskelvärde - Bråttom gammal data tröskelvärde - Bråttom hög - Bråttom låg - Bråttom gammal data + %d min sedan + Tröskelvärde för \"Gammal data\" [min] + Tröskelvärde för \"Väldigt gammal data\" [min] + Akut hög + Akut låg + Väldigt gammal data AndroidAPS + TT + Basal [%] + BG-källa + Holländska + Rumänska + Ryska + Svenska + Laddade upp totalt %d värden + Aktiverar ytterligare funktioner för användning dagtid, t ex SMB. + Otillåtet fjärrkommando + Tid (i timmar) som profilen kommer att förskjutas. + Ändra inställningen från E/d till E/tim i pumpen + Kort medeldelta + Långt medeldelta + Antal dagar + Vikt + Total grundbasal + Förkorta namnen på flikarna + Deltainställningar + Modell: %02X Protokoll: %02X Kod: %02X + "Standardvärde: 4. Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 4x din nuvarande basal, oberoende av din max basalhastighet. Detta för att undvika att man av misstag gör farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. " + Standardvärde: 0.7. Med standardvärdet 0.7 kan autosens justera ner dina basaler, kvoter etc med upp till 30% för att kompensera för t ex tillfällig hög insulinkänslighet. + "Det kommer att användas för att ange \"Inmatat av: \". " + Enheten verkar inte stöda vitlistning av appar för batteriförbrukning + Tillåt + %s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt + Pausad (%d min) + Snabbverkande insulin (förlängd) + KH-kvot (IC) saknas i profilen. Använder standardvärde. + För närvarande satt till %f + Enhet + Uppladdare + Känslighetsmätning + Alla profiler laddades inte! + Notiser från Översikten + Sänd notiser från Översikten som bekräftelsemeddelanden på Wear. + Basal [E/tim] + Peaktid för IOB-kurvan + Peaktid [min] + Snabbverkande (Rapid-Acting) Oref + Ultrasnabbverkade (Ultra-Rapid) Oref + %s tim DIA är för kort. Använder %s istället! + Aktivera profil + Datum + OGILTIG + Väntar på parkoppling med pump + Parkoppling OK + Parkoppling tog för lång tid + PARKOPPLAR + Ingen enhet funnen ännu + Tom reservoar + Varning om blodsockermätning + "Återstående mängd insulin " + Vald pump + Parkoppla ny pump + Bolushastighet + Sätt basalsteg till 0.01 enheter per timme + Serienummer + Procent + Tidsförskjutning + Standardvärde för Temp-mål + Äta snart, duration + Äta snart, mål + Aktivitet, duration + Aktivitet, mål + Hämtar status för förlängd bolus + Hämtar status för bolus + Hämtar status för tempbasal + Hämtar pumpinställningar + Hämtar tid och datum i pumpen + återanvänd + Kontroller från klockan + Sätt tempmål och ange behandlingar från klockan. + Anslutningen tog för lång tid + Mat + g + kJ + En + Pr + Fett + Väntar på att bolus ska slutföras. %d sek återstår. + Behandlar + Påbörjar bolus + Kommandot kör just nu + Pumpdrivrutin justerad + Pumpen kan inte nås + BG-värden saknas + Använd systemnotiser för larm och information + Lokala larm + Varna om BG-data saknas + Varna om pumpen inte går att nå + Pumpen ses som ej nåbar efter [min] + Akut larm + Bluetooth-övervakare + Startar om bluetooth på telefonen om anslutning till pumpen misslyckas. Detta hjälper på en del telefoner där bluetooth ibland hänger sig. + Lada upp BG-data till Nightscout + Uppladdningsinställningar för G5 + Visa detaljerad delta + Visa delta med en extra decimal + Osupportad firmware i pumpen + Skicka BG-data till xDrip+ + Välj 640g/Eversense data som datakälla i xDrip+ + Basalvärdet ersatt med det lägsta tillåtna + Använd BG + Använd bolus-IOB + Använd basal-IOB + Använd BG-trend + Använd superbolus + Ja + Nej + Endast positiva + Endast negativa + Använd COB + Använd tempmål + Loop påslagen + APS vald + NSClient har skrivrättigheter + Closed loop påslagen + Max IOB är korrekt angivet + BG tillgängligt från vald källa + Basalerna är inte satta på hel timme: %s + Ogiltig profil: %s + Programmerar bolus i pump + Uppdatera + Läge + Aktivitet + Ingen anslutning på %d min + %d%% (%d min återstår) + Initierar + Frånkopplad + Pausad pga fel + Pausad av användaren + Körs + Avbryter tempbasal + Sätter tempbasal (%d%% / %d min) + Ger bolus (%.1f enheter) + Uppdaterar + Aldrig + Önskad åtgärd stöds inte av pumpen + Osäker användning: Förlängd- eller kombibolus är aktiv. Loop mode är satt till att bromsa vid lågt BG i 6 timmar. Endast normala bolusar tillåtna i loopläge. + Osäker användning: Pumpen använder en annan basalprofil än den första. Loop avstängd. Välj den första profilen på pumpen och uppdatera. + En bolus med samma mängd efterfrågades inom den senaste minuten. För att förhindra att råka ge dubbla bolusar av misstag och ev programfel är detta inte tillåtet. + Nu + Läser historik från pumpen + Larm + Sätter basalprofil + Låg nivå i insulinreservoaren + Pumpbatteriet är svagt + Pumpen visar felet: E%d: %s + För att läsa pumpens historik, tryck och håll in ALERTS-knappen. VARNING: detta kan aktivera en bugg som orsakar att pumpen vägrar ansluta och kräver att en knapp trycks in på pumpen för att återgå. Det bör därför undvikas. + "För att läsa pumpens historik, tryck och håll in TDDS-knappen. VARNING: detta kan aktivera en bugg som orsakar att pumpen vägrar ansluta och kräver att en knapp trycks in på pumpen för att återgå. Det bör därför undvikas. " + Minimum: %3.1f enheter + Genomsnitt: %3.1f enheter + Maximum: %3.1f enheter + Låg + Tom + Normal + Pumpens klocka behöver ställas om + Historik + Varning + "Detta kommer att läsa pumpens fulla historik och status. Allt i Mitt Data och basalprogrammen. Bolusar och tempbasaler kommer att läggas till under Behandlingar om de inte redan finns där. Detta kan orsaka att vissa saker läggs in dubbelt eftersom pumpens klocka inte är så exakt. Detta bör inte göras medan loopen är ogång, utan bara när behov uppstår. Om du ändå vill göra detta, tryck och håll in den här knappen igen. VARNING: detta kan aktivera en bugg som orsakar att pumpen vägrar ansluta och kräver att en knapp trycks in på pumpen för att återgå. Det bör därför undvikas. " + Är du helt säker på att du vill läsa all pumphistorik och är medveten om konsekvenserna? + Varningen om avbruten tempbasal bekräftad + Bolus avbruten. Det verkar som om ingen bolus gavs. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt. + Endast %.2f enheter %.2f gavs pga ett fel. Vänligen verifiera på pumpen och vidta nödvändiga åtgärder. + Leverans av bolus och verifiering av historiken misslyckades. Vänligen kontrollera på pumpen och lägg till bolusen manuellt under Careportal om den gått fram. + Återansluter efter att ha tappat kontakten + Inte tillräckligt med insulin i reservoaren för att ge bolus + Förlängd bolus misslyckad From f52451085cd05ce03ccbf3b9beabb05e268788af Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 16:41:56 +0200 Subject: [PATCH 49/91] remove translation of language names --- app/src/main/res/values-sv/strings.xml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 83c7d2f86d..f0c4079e6f 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -108,7 +108,6 @@ Kopierat till Urklipp Kopiera till Urklipp Korr - CZ alarm basal tim Bluetoothstatus @@ -153,7 +152,6 @@ DanaR Dana dagar - Tyska Synkronisera nu Delta DEV @@ -175,7 +173,6 @@ Duration Äta snart Ändra grundbasal: - English Startad Starta loop Aktivera superbolus i kalkylatorn @@ -188,7 +185,6 @@ Endast siffror tillåtna. Endast siffror mellan %1$s - %2$s är tillåtna. Ogiltigt telefonnummer - Spanska Utför Exportera inställningar till Inställningar exporterade @@ -210,8 +206,6 @@ Startar... Ogiltig profil! IOB - Italienska - Koreanska Språk Lokal profil LP @@ -535,7 +529,6 @@ Tid i timmar när alla KH väntas vara absorberade Måltids max absorptions tid (h) Absorptionsinställningar - Bulgariska PUMP Byte pumpbatteri Sensorålder @@ -544,7 +537,6 @@ Kan visa fel om man använder bolus för priming/fyllning! Ändra grund-IC: Ändra grund-ISF: - Grekiska MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ISF saknas i profilen. Använder standardvärde. Lås skärm @@ -580,10 +572,6 @@ TT Basal [%] BG-källa - Holländska - Rumänska - Ryska - Svenska Laddade upp totalt %d värden Aktiverar ytterligare funktioner för användning dagtid, t ex SMB. Otillåtet fjärrkommando From 42164489c88672187e049c78f67c05c74f6f3de5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 2 May 2018 17:05:20 +0200 Subject: [PATCH 50/91] cs translations --- app/src/main/res/values-bg/strings.xml | 1 - app/src/main/res/values-cs/strings.xml | 101 +++++++++++++++++- app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 1 - app/src/main/res/values/insight_alerts.xml | 4 +- app/src/main/res/values/strings.xml | 7 +- .../main/res/xml/pref_nsclientinternal.xml | 3 +- 13 files changed, 106 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 9bda35856c..3929d73dfc 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -578,7 +578,6 @@ Потвърждаване, че КЗ е достъпна в Найтскаут и данните за помпата се качват там Раздели IOB от болус и от базал на часовника Покажи подробен IOB - AndroidAPS Активирай профила АКТИВНОСТ И ОБРАТНА ВРЪЗКА ХРАНА И БОЛУС diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index acd0a5df3a..d4b1a0f9dc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -193,7 +193,7 @@ Provedeno Licenční ujednání ROZUMÍM A POTVRZUJI - hodin zpět + před %.1fh Nenalezen bluetooth adaptér Procent Obnovit profil @@ -484,7 +484,7 @@ Vzdálený příkaz není povolen K pozastavení smyčky na %d minut odpověz SMS s kódem %s Chybná doba trvání - Logovat spuštění aplikace do NS + Zaznamenávat spuštění aplikace do NS Ukončuji aplikaci, aby se nastavení projevilo. Inzulín Rychlý inzulín @@ -814,7 +814,7 @@ Podkategorie Kategorie Bolus bude pouze zaznamenán - Automaticky doplňovat chybějící glykémie z NS + Automaticky doplňovat chybějící glykémie z NS Hypoglykémie Citlivost Odchylky @@ -841,4 +841,99 @@ Přepnutí profilu chybí. Proveďte přepnutí profilu nebo ho aktivujte na záložce lokálního profilu Počet bolusů Počet dočasných bazálů + Varování W31: Nízký stav zásobníku + Varování W32: Nízký stav baterie + Varování W33: Chybný datum/čas + Varování W34: Konec záruky + Varování W36: Ukončení dočasného bazálu + Varování W38: Bolus přerušen + Údržba M20: Není vložený zásobník + Údržba M21: Zásobník prázdný + Údržba M22: Prázdná baterie + Údržba M23: Automatické vypnutí + Údržba M24: Okluze + Údržba M26: Výměna zásobníku nekompletní + Údržba M27: Stažení dat selhalo + Údržba M28: Vypršení pozastavení + Údržba M29: Nenastaven typ baterie + Údržba M30: Nenastaven typ zásobníku + Chyba E6: Mechanická chyba + Chyba E7: Chyba elektroniky + Chyba E10: Chyba převíjení + Chyba E13: Chyba jazyka + MM640g + %.2f U/h + Pumpa nedostupná. Bolus nebyl podán + Bolus zastaven + Zastavování bolusu + Pumpa zastavena + Pumpa spuštěna + Pumpa pozastavena + Maximální počet minut bazálu, ke kterým se limituje SMB + Úprava cílové glykémie pomocí Autosens + Trvání dočasného cíle při hypoglykémii + Cílová glykémie při hypoglykémii + m + h + Výukový cíl %d nespuštěn + Novorapid, Novolog, Humalog + Výukový cíl %d nedokončen + Pumpa nepodporuje dočasné bazály + Z pumpy nepřečten žádný platný bazál + Uzavřená smyčka zakázána v nastavení + Autosens zakázán v nastavení + SMB zakázáno v nastavení + Max bazál omezen na %.2f U/h: %s + limit pumpy + pořadována kladná hodnota + maximální násobek bazálu + mazimální násobek nejvyššího bazálu + Odeslán bolus během posledních 3 minut, SMB přeskočeno + Bazál nastaven správně + Bazál omezen na %d%%: %s + Bolus omezen na %.1f U: %s + Max IOB omezeno na %.1f U: %s + Sacharidy omezeny na %d g: %s + IOB omezeno na %.1f U: %s + maximální hodnota v nastavení + pevný limit + nebezpečné použití + Načtení stavu selhalo + Zaznamenat výmenu setu + Zaznamenat výmenu inzulínu + \"SMB vždy\" a \"po jídle\" zakázáno protože zdroj glykémie nepodporuje rozšířené filtrování + SBM není povoleno v otevřené smyčce + Jídlo + reset + Čekání na synchronizaci času (%d s) + Odpojeno (%d m) + Automatické vkládání péče + Automaticky vloží výměnu inzulínu, setu, baterie a alarmů pumpy do NS + Maximální celkové IOB, které OpenAPS nemůže překročit [U] + Tato hodnota je v kontextu OpenAPS nazývána Max IOB. OpenAPS nikdy nepřidá inzulín, pokud je současné IOB větší než tato hodnota + Maximální doba absorbce sacharidů [h] + Doba, po které jsou všechny sacharidy považovány za strávené. Zbylé budou oříznuty + Čas + Zobrazovat kolonku poznámky v dialozích ošetření + Požadováno: %.2fU Doručeno: %.2fU Chyba: %d + První přídavek izulínu + Druhý přídavek inzulínu + Třetí přídavek inzulínu + První přídavek sacharidů + Druhý přídavek sacharidů + Třetí přídavek sacharidů + CGM + Používat pouze WiFi + WiFi SSID + Pouze při nabíjení + Nastavení připojení + Povolené SSID (oddělené středníkem) + Povolit připojení pro roamingu + Max hodnota autosens + Min hodnota autosens + Dělitel \"bolus snooze\" + Max násobitel denního nejvyššiho bazálu + Max násobitel současného bazálu + --- + Doplňování glykémíí z NS diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index cd8ee8de76..b078523a63 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -331,7 +331,6 @@ Aktivität Erwachsener Erweiterte Einstellungen - AndroidAPS BAS Basal-Schritt Wert der Basalrate unter Minimum. Profil nicht gesetzt! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6cb7a1a252..7c23e3513d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,6 +1,5 @@ - AndroidAPS Ασφάλεια Θεραπειών Μέγιστο Επιτρεπτό bolus[U] Μέγιστο Επιτρεπτό υδατ.[g] diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1fc2769177..1e76a1262e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -358,7 +358,6 @@ Número de teléfono inválido Esperando bomba Italian - AndroidAPS hollandes Griego Ruso diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cedf15bd5e..1db4265171 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,6 +1,5 @@ - AndroidAPS Traitements de sécurité Bolus max. autorisé [U] Glucides max. autorisés [g] diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3c738259b3..5d572ed93a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -457,6 +457,5 @@ Profilo NS Profilo Basale aggiornato nel Micro Impostazione Profilo Basale fallito - AndroidAPS diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 55d0d9ba64..dd14859672 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -677,7 +677,6 @@ COB berekening ]]> ]]> - AndroidAPS BG beschikbaar op gekozen bron Enkel positief Enkel negatief diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d04b486b95..9a57c5f366 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -521,7 +521,6 @@ состояние xdrip (часы) xds разрешенный предел достигнут - AndroidAPS Ожидаемое время усваивания всех углеводов пищи в часах Максимальное время усваимости пищи Настройки усваиваемости diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 47bd827e0a..0612835229 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -542,5 +542,4 @@ Bråttom hög Bråttom låg Bråttom gammal data - AndroidAPS diff --git a/app/src/main/res/values/insight_alerts.xml b/app/src/main/res/values/insight_alerts.xml index d78c448898..606868528e 100644 --- a/app/src/main/res/values/insight_alerts.xml +++ b/app/src/main/res/values/insight_alerts.xml @@ -4,8 +4,8 @@ Warning W32: Battery low Warning W33: Invalid time/date Warning W34: End of warranty - Warning W36: TBR cancelled - Warning W38: Bolus canelled + Warning W36: TBR canceled + Warning W38: Bolus canceled Warning W39: Loantime warning Maintenance M20: Cartridge not inserted diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0aadcf5c96..84acd8205c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -926,7 +926,7 @@ Category Subcategory Bolus will be recorded only - Autobackfill missig BGs from NS + Autobackfill missig BGs from NS ns_autobackfill SMB set by pump Sensitivity @@ -982,7 +982,7 @@ Limiting IOB to %.1f U because of %s max value in preferences hard limit - treatmentssafety_maxcarbs + treatmentssafety_maxcarbs unsafe usage openapsama_useautosens Read status failed @@ -1006,7 +1006,7 @@ Meal max absorption time [h] Time at which any meal is considered absorbed. Remaining carbs will be cut off. Time - show_notes_entry_dialogs + show_notes_entry_dialogs Show notes field in treatment dialogs openapsama_min_5m_carbimpact Asked: %.2fU Delivered: %.2fU Error code: %d @@ -1034,4 +1034,5 @@ Max daily safety multiplier Current basal safety multiplier n/a + Autobackfill BG diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml index 746235b048..2241463e1a 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -117,7 +117,8 @@ + android:title="@string/ns_autobackfill_title" + android:summary="@string/ns_autobackfill_summary" /> Date: Wed, 2 May 2018 17:43:17 +0200 Subject: [PATCH 51/91] Update strings.xml --- app/src/main/res/values-es/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1e76a1262e..c737dfa5aa 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -473,9 +473,9 @@ Adulto Por favor elige edad del paciente para emplear limites de seguridad Glimp - Aparato parece no soportar optimisacion de bateria whitelisting! + Aparato parece no soportar optimizacion de bateria whitelisting! Por favor permita Permission - %s necesita optimisacion de bateria whitelisting para funcionar bien + %s necesita optimizacion de bateria whitelisting para funcionar bien Loop desactivado desactivado (%d m) Superbolus (%d m) @@ -517,8 +517,8 @@ xds Mostrar BGI agregar BGI a status line - No upload to NS - Todos los datos mandados a NS son borrados. AAPS esta conectado to NS pero no hay cambios en NS + datos no mandados a NS + Todos los datos mandados a NS son borrados. AAPS esta conectado a NS pero no hay cambios en NS Nivel base Nivel bolo Bolo prolongado @@ -563,7 +563,7 @@ UPLD BAS EXT - Pantalle proteccion + Pantalla proteccion Cierre Al activar autosens recuerda editar todos carbohidratos comidos. Si no, sensividad será calculada incorrectamente !!! Sensitivity WeightedAverage @@ -576,7 +576,7 @@ ACTIVITY Y FEEDBACK CARBS Y BOLUS CGM Y OPENAPS - PUMP + BOMBA Valor base [U/h] Duracion [min] IOB Curve Peak Time @@ -592,13 +592,13 @@ Coneccion OK Coneccion fuera de tiempo CONECTANDO - aparato no enconrado + aparato no encontrado Deposito vacio Alerta de control de BG Insulina restante en deposito DanaRS Dana - Bomba sleccionada + Bomba seleccionada Conectar bomba nueva Velocidad bolo Poner paso base a 0.01 U/h @@ -614,7 +614,7 @@ recibiendo estado de bolo prolongado recibiendo estado bolo recibiendo estado bolo temporal - recibiendo ah´justes bomba + recibiendo ajustes bomba recibiendo hora bomba usar otra vez Control desde reloj @@ -628,9 +628,9 @@ Pr Grasa ]]> - Esperande terminar bolo. Faltan %d seg. + Esperando terminar bolo. Faltan %d seg. Processando - "Iniciando emisioin bolo " + "Iniciando emision bolo " Orden se esta efectuando en este momento control de la bomba corigido bomba no alcanzable @@ -702,7 +702,7 @@ Se necesita actualizar reloj de la bomba Alerta TBR cancelada, advertencia acceptada - Emision del bolo fallado. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automaticamente. + Emision del bolo fallada. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automaticamente. "Solo %.2f U del bolo mandado de %.2f U ha sido emitido por causa de un error. Por favorn controla la bomba para confirmar y toma acciones apropiadas. " "Fallo de emitir bolo y de controlar historical de la bomba.Por favor controla manualmente y crea un record en Careportal si el bolo ha sido emitido. " Reestablecido coneccion fallada. From 4cc952900dca5aa6e7cb7bcdea91b78c520f08fc Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 2 May 2018 18:39:37 +0200 Subject: [PATCH 52/91] show progress reason from iobcobthread --- app/src/main/java/info/nightscout/androidaps/MainApp.java | 4 ++++ .../androidaps/plugins/IobCobCalculator/IobCobThread.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 5456da1805..9e8f3f9c7f 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -371,6 +371,10 @@ public class MainApp extends Application { return engineeringMode || !devBranch; } + public static boolean isDev() { + return devBranch; + } + public String getLogDirectory() { LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); return lc.getProperty("EXT_FILES_DIR"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java index c37730b227..9818ed17e4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java @@ -98,7 +98,8 @@ public class IobCobThread extends Thread { AutosensData previous = autosensDataTable.get(prevDataTime); // start from oldest to be able sub cob for (int i = bucketed_data.size() - 4; i >= 0; i--) { - MainApp.bus().post(new EventIobCalculationProgress(i + "/" + bucketed_data.size())); + String progress = i + (MainApp.isDev() ? " (" + from + ")" : ""); + MainApp.bus().post(new EventIobCalculationProgress(progress)); if (iobCobCalculatorPlugin.stopCalculationTrigger) { iobCobCalculatorPlugin.stopCalculationTrigger = false; From 8419f8d0e997aeb52322e1a2c43d4d6faab74830 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 2 May 2018 18:49:40 +0200 Subject: [PATCH 53/91] update socket.io to 1.0.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 16e3bfbe71..b885c36dcd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -209,7 +209,7 @@ dependencies { implementation("com.google.android:flexbox:0.3.0") { exclude group: "com.android.support" } - implementation("io.socket:socket.io-client:0.8.3") { + implementation("io.socket:socket.io-client:1.0.0") { // excluding org.json which is provided by Android exclude group: "org.json", module: "json" } From f1736f048e8c82fb354bd34cff54bdef2f5d1f3e Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 20:20:13 +0200 Subject: [PATCH 54/91] Update strings.xml --- app/src/main/res/values-sv/strings.xml | 295 ++++++++++++++++++++----- 1 file changed, 234 insertions(+), 61 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f0c4079e6f..9d9539ec20 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -2,7 +2,7 @@ Avbryt Glimp - MM640g + Minimed 640g Absolut Åtgärder Act @@ -10,14 +10,14 @@ Vuxen Avancerade inställningar Starta om telefonen eller AndroidAPS från systeminställningar, annars kommer Android APS inte kunna logga fel (viktigt att kunna spåra och verifiera att algoritmerna fungerar korrekt)! - Använd alltid kort medel delta istället för enkel delta + Använd alltid kort medeldelta istället för enkel delta Användbart när ofiltrerade källor som xDrip ger brusvärden AndroidAPS startar Maximal daglig dos snart nådd - APS Mode + APS-läge Medeldelta Basal - Basal E/tim: + Basal: Basalsteg Basal saknas i profil. Använder standardvärde. BR @@ -34,14 +34,13 @@ Knapp 2 Knapp 3 Kalibrering skickad till xDrip - Avbryt tempbasal + Avbryt temp basal Kolhydrater - Kohydratsspärr aktiverad + Kolhydratsspärr aktiverad Careportal Meddelande - BG Kontroll + BG-kontroll Kanylålder - Kolhydratskorrektion Byte CGM-sensor CGM-sensor start Kombinationsbolus @@ -51,7 +50,7 @@ Byte insulinreservoar Måltidsbolus Absolut - Kolhydrater + KH KH-tid Duration Infört av @@ -73,8 +72,8 @@ Fråga CP Mellanmålsbolus - Tempbasal slut - Tempasal Start + Temp basal slut + Temp basal start Temp mål Temp mål avbrutet Ändra inmatning @@ -108,7 +107,7 @@ Kopierat till Urklipp Kopiera till Urklipp Korr - alarm + larm basal tim Bluetoothstatus DanaR Bluetooth Pump @@ -116,7 +115,7 @@ Enheter per dag Avaktivera EasyUI mode in pumpen Aktivera förlängd bolus i pumpen - Fel + fel glukos Historik Larm @@ -135,16 +134,16 @@ Senaste bolus Lösenord pump DanaR pumpinställningar - Påfyllning + påfyllning Kumulativ TDD Datum Exponentiellt viktad TDD - Gammal data. V.g. tryck \"Hämta\" + Gammal data. Tryck på Hämta. Kvot - Använd förlängd bolus med >200% + Använd förlängd bolus för att ange >200% Misslyckades med inställning - Se profil - Se förlängd bolus som % + Visa profil + Visa förlängd bolus som % DanaR Korea DanaR profilinställningar DIA [tim] @@ -156,7 +155,7 @@ Delta DEV Vald enhet kan inte nås - DIA + DIA: Loop frånkopplad Koppla ifrån pump i 1 h Stäng av loop @@ -178,7 +177,7 @@ Aktivera superbolus i kalkylatorn Aktiverar superbolusfunktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN! Aktiverad - Licensavtal för Slutanvändare + Licensavtal för slutanvändare JAG FÖRSTÅR OCH GODKÄNNER Ange ny behandling: Denna kolumn får ej vara tom @@ -189,8 +188,8 @@ Exportera inställningar till Inställningar exporterade Förlängd bolus - Lyckades ej uppdatera basalprofil - Snabbverkande Insulin + Lyckades inte uppdatera basalprofilen + Snabbverkande Insulin (gammal beräkningsmodell) Novorapid, Novolog, Humalog, Apidra Hittade inte filen Standardvärden för prime/fyll. @@ -199,9 +198,9 @@ Glukos Finger Sensor - HÖG markering + HÖG-markering timmar - tim sedan + %.1f tim sedan Importera inställningar från Startar... Ogiltig profil! @@ -218,7 +217,7 @@ Loop meny Superbolus (%d min) Loop pausad - LÅG markering + LÅG-markering Svagt batteri Manuell Avbryt @@ -231,7 +230,7 @@ Importera inställningar Inställningar Uppdatera behandlingar från NS - Återställ databaser + Återställ databaserna Visa logg Testa alarm Nightscout @@ -246,12 +245,12 @@ NS Client har inga skrivrättigheter. Fel API secret? Alarm inställningar Slå på sändning av data till alla appar i telefonen (ex xDrip). - Aktivera lokala broadcasts. + Aktivera lokala broadcasts Markera app start till Nightscout Ingen uppladdning till Nightscout Ingen data sänds till Nightscout. AAPS ansluter till Nightscout men inga ändringar görs i Nightscout. Använd alltid absoluta värden i basal - Endast uppladdning till Nightscout (ingen synkronisering) + Endast uppladdning till Nightscout Endast uppladdning till Nightscout. Kommer inte få BG-data om inte lokal källa som xDrip används. Kommer heller inte att kunna hämta basalprofiler från Nightscout. Hög Låg @@ -277,8 +276,8 @@ Enheter OAPS Mål - Kontrollera att BG syns i Nightscout, och att insulindata från pumpen laddas upp - Ställa in utseende och övervakning, för att sedan kunna analysera basaler och kvoter + Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp + Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter Du har nått din tillåtna gräns xds xDrip Status (klocka) @@ -320,7 +319,7 @@ Lås upp inställningar Enheter: Säkerhet vid behandling - Max tillåtna KH (g) + Max tillåtna KH [g] Max tillåten bolus [E] E TOTAL @@ -351,7 +350,7 @@ Total IOB: IOB: Fel vid justering av tempbasal - Tempbasal + Temp basal Tonåring Mål saknas i profil. Använder standardvärde. Målområde: @@ -361,15 +360,15 @@ Pausa loop i 10 h Superbolus Lyckad - Avbryter tempbasal + Avbryter temp basal Avbryter förlängd bolus Status: Fel duration: Okänt kommando eller fel svar Tempbasal %.2f enheter/tim i %d min startad - Fel vid start av tempbasal - Misslyckades avbryta tempbasal - Tempbasal avbruten + Fel vid start av temp basal + Misslyckades med att avbryta temp basal + Temp basal avbruten För att pausa loop i %d minuter, svara med kod %s SMS Tillåt fjärrstyrning via SMS @@ -390,10 +389,10 @@ För att ge bolus %.2f enheter, svara med kod %s Bolus avbruten Bolus %.2f enheter tillförd - För att stoppa tempbasal, svara med kod %s + För att stoppa temp basal, svara med kod %s För att starta basal %.2f enheter/tim, svara med kod %s +XXXXXXXXXX;+YYYYYYYYYY - Tillåtna telefonnummer + Godkända telefonnummer SMS-tjänst Senaste BG: Enkel profil @@ -411,8 +410,8 @@ Resultat Avslutar appen för att inställningarna ska läsas in. Omstart - Vill du verkligen återställa databasen? - Uppdatera + Vill du verkligen återställa databaserna? + Uppdatera all data Ta bort sparad data: Ladda om profil Uppdatera händelser från Nightscout @@ -434,17 +433,17 @@ NS profil Profilbyte Basalprofilen uppdaterad i pumpen - Misslyckades sätta basalprofilen + Lyckades inte sätta basalprofilen Profil Prime/Fyll Gränsvärden för visualisering - Högt och lågt värde för graf i översikten och i smartwatch + Högt och lågt värde för grafen i Översikt och i smartwatch Procent Procentfaktor med vilken basalprofilen kommer att bli multiplicerad. Pausad Vg ange personens ålder för inställningar av gränser Personens ålder - Tempbasal + Temp basal Hem Ta bort Ändra @@ -479,9 +478,9 @@ Måltidsdata Maximal basal IOB som OpenAPS kan ge [E] Detta värde kallas Max IOB i OpenAPS. Det är ställt till noll från start. Efter flera dagar till veckor, beroende på hur du känner, kan du välja att justera denna. - Max E/h som tempbasal kan sättas till + Max enheter per timme som temp basal kan sättas till Detta värde kallas max basal inom OpenAPS - Körde senast + Senast körd Senast startad IOB data Ange värden @@ -491,18 +490,18 @@ Autosensdata OpenAPS MA Använd AMA autosens - Standardvärde: 3.0 mg/dl/5 min. Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat. - Standardvärde: 3. Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 3x din största basalhastighet. Du behöver oftast inte ändra detta värde. Läs på och förstå skillnaden mellan 3x nuvarande och 3x daglig max som säkerhetsinställningar. + Standardvärde: 3.0 mg/dl/5 min Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat. + Standardvärde: 3 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 3x din största basalhastighet. Du behöver oftast inte ändra detta värde. Läs på och förstå skillnaden mellan 3x nuvarande och 3x daglig max som säkerhetsinställningar. Viktigt! Normalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden. - Standardvärde: 2. Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2). + Standardvärde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2). Antal timmar för beräkning av känslighet (Absorptionstid för KH är exkluderad). Intervall för autosens [tim] - Standardvärde: 1.2. Med standarvärdet 1.2 kan autosens justera upp dina basaler, kvoter etc med upp till 20% för att kompensera för t ex tillfällig insulinresistens. - Standardvärde: sant Detta för att tillåta autosens justera BG målvärden, ISF och basaler. + Standardvärde: 1.2 Med standarvärdet 1.2 kan autosens justera upp dina basaler, kvoter etc med upp till 20% för att kompensera för t ex tillfällig insulinresistens. + Standardvärde: sant Detta för att tillåta autosens justera BG målvärden, ISF och basaler. OpenAPS AMA OpenAPS Öppna inställningar på Wear - Konstant notis i telefonen + Konstant infonotis i telefonen GAMMAL DATA OK Ocklusion @@ -515,19 +514,19 @@ Godkänn Starta BG är tillängligt i Nightscout - Aktiverar extra funktioner som kan användas dagtid, såsom avancerad måltids assistans - Justerar basaler och kvoter om det behövs. Aktivera sedan auto-sens. + Aktiverar extra funktioner som kan användas dagtid, såsom avancerad måltidsassistans, AMA + Justerar basaler och kvoter om det behövs. Aktivera sedan autosens. 1 veckas lyckad looping dagtid, där alla måltider lagts in. Finjustering av closed loop, gradvis ökande IOB och minskande önskat BG målvärde - Kör några dagar och åtminstone en natt utan larm för lågt BG, innan du sänker målvärdet för BG. + Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG. Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger - Förstå din open loop och hur den föreslår tempbasaler + Förstå din open loop och hur den föreslår temp basaler Utifrån vad du nu lärt dig, besluta vilken max basal du vil ha. Ställ in det både i inställningarna i APS och i din pump. Starta med open loop Starta med open loop och använd det några dagar. Försök att ge många föreslagna temp basaler. Tid i timmar när alla KH väntas vara absorberade - Måltids max absorptions tid (h) + Max absorptions tid för en måltid [tim] Absorptionsinställningar PUMP Byte pumpbatteri @@ -555,7 +554,7 @@ Sensitivity AAPS Sensitivity Oref0 Sensitivity WeightedAverage - Ställer in tempbasal + Ställer in temp basal SP BG: Basal: @@ -572,6 +571,7 @@ TT Basal [%] BG-källa + Svenska Laddade upp totalt %d värden Aktiverar ytterligare funktioner för användning dagtid, t ex SMB. Otillåtet fjärrkommando @@ -585,8 +585,8 @@ Förkorta namnen på flikarna Deltainställningar Modell: %02X Protokoll: %02X Kod: %02X - "Standardvärde: 4. Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 4x din nuvarande basal, oberoende av din max basalhastighet. Detta för att undvika att man av misstag gör farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. " - Standardvärde: 0.7. Med standardvärdet 0.7 kan autosens justera ner dina basaler, kvoter etc med upp till 30% för att kompensera för t ex tillfällig hög insulinkänslighet. + "Standardvärde: 4 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 4x din nuvarande basal, oberoende av din max basalhastighet. Detta för att undvika att man av misstag gör farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. " + Standardvärde: 0.7 Med standardvärdet 0.7 kan autosens justera ner dina basaler, kvoter etc med upp till 30% för att kompensera för t ex tillfällig hög insulinkänslighet. "Det kommer att användas för att ange \"Inmatat av: \". " Enheten verkar inte stöda vitlistning av appar för batteriförbrukning Tillåt @@ -604,8 +604,8 @@ Basal [E/tim] Peaktid för IOB-kurvan Peaktid [min] - Snabbverkande (Rapid-Acting) Oref - Ultrasnabbverkade (Ultra-Rapid) Oref + Rapid-Acting Oref (ny beräkningsmodell) + Ultra-Rapid Oref (ny beräkningsmodell) %s tim DIA är för kort. Använder %s istället! Aktivera profil Datum @@ -734,4 +734,177 @@ Återansluter efter att ha tappat kontakten Inte tillräckligt med insulin i reservoaren för att ge bolus Förlängd bolus misslyckad + KH-korrektion + E + Begränsningar + Temp basal satt i pump + Behandling + Bolus avbruten + Avbryter bolus + %.2f begränsat till %.2f + Värdet %s är utanför hård begränsning + Pumpen kunde inte nås. Bolus ej levererad. + Ändrad + PUMP STOPPAD + Status uppdaterad + sedan + med + Aktiv temp basal + min kvar + Loggbok + Senast utförda åtgärd + återstår över + total med + direkt med + Håll alltid ansluten + Stoppa temp basal på riktigt (skapar pumplarm) istället för att sätta till 90% i en minut + REDO + SYNKRONISERAR + UPPTAGEN + SYNKRONISERAD + STARTAR + behöver + Inte ansluten till hjälp-app! + Hjälp-app verkar inte vara installerad! + Inkompatibel hjälp-app. Vi behöver version + Okänd + Inväntar kodverifiering + Kod ej godkänd + Ej godkänd + Inkompatibel + sek + min + tim + dag + vecka + %ds går ut %s + Statistik + Anslut på förhand + Anslut automatiskt när AAPS är öppet, innan något pumpkommando är skickat, för att snabba upp kommunikationen + Rekommenderas inte, då det drar mycket batteri + Använd alltid SMB + Använd alltid SMB oberoende av bolus. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5. + Använd SMB efter kolhydrater + Använd SMB i 6 timmar efter kolhydrater, även med 0 COB. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5. + Använd SMB med kolhydrater (COB) + Använd SMB medan du har kolhydrater aktiva (COB) + Använd SMB när Temp mål är satt + Använd SMB när temp mål är satt, t ex Äta snart eller Träning + Använd SMB även när ett högt temp mål är satt + Använd SMB även när ett högt temp mål är satt (över 5,5 mmol) + Låt temp basalen gå + Tysta + Kolhydrater + Knappar + Insulin + Skicka kalibrering till xDrip+ eller öppna kalibreringsrutan i G5-appen + Öppnar xDrip+. Tillbaka-knappen återgår till AAPS + "Mängd kolhydrater att lägga till när man trycker på knappen " + Mängd insulin att lägga till när man trycker på knappen + Kunde inte starta CGM-appen. Kontrollera att den är installerad. + Historikläsare + Notis vid SMB + Visa SMB på klockan som en standardbolus. + Skapa notiser vid fel + Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar) + Visa BG-prognos på klockan. + Prognos + Dataval + Uppladdning till Fabric + Tillåt automatisk rapportering av appkrascher och användningsinformation till utvecklarna via fabric.io-tjänsten. + Vänligen uppdatera din G5-app till en supportad version + Starta Tränings-TT + Starta Äta snart-TT + Ge ingen bolus, logga bara + Kategori + Underkategori + Bolusen sparas bara i loggboken + Hämta saknade BG från NS + SMB satt i pump + Känslighet + Avvikelser + Aktiva KH + Aktivt insulin + Basaler + Ingen åtgärd vald. Inget ändras. + Starta Hypo-TT + Du kör nu dev-versionen. Closed Loop inte tillåtet. + Engineering Mode aktiverat + Engineering Mode inte aktiverat och appen körs inte som release + %.2f E/h + Läser basalprofil + Pumphistoriken ändrad efter att boluskalkylen gjordes. Bolusen har inte levererats. Vänligen gör en ny kalkyl vid behov. Om samma mängd insulin krävs, vänligen vänta två minuter eftersom appen begränsar likadana bolusar av säkerhetsskäl. + Bolusen levererad, men det gick inte att lägga till den i loggen. Detta kan hända om två små bolusar ges inom två minuter. Vänligen kontrollera pumpens historik och Careportal och lägg till om det saknas. Se till att inte lägga till två bolusar med samma mängd och samma tid. + Avböjer hög tempbasal eftersom kalkylen inte innefattade nyligen ändrad historik + Uppdaterar pumpsstatus + Basalen på pumpen är ändrad och kommer att uppdateras inom kort + Basalen ändrad i pumpen, men det gick inte att läsa till vad + Letar efter förändringar i historiken + Flera bolusar med samma mängd insulin importerades just. Endast en kan läggas till i Careportal. Vänligen kontrollera pumpen och gör ändringar i Careportal manuellt vid behov. Observera att man bara kan ha en bolus per klockslag. + Den senaste bolusen är äldre än 24 timmar eller i framtiden. Vänligen konttrollera tid och datum i pumpen. + Tid/datum för bolusen verkar fel. IOB är troligen missvisande. Vänligen kontrollera tid och datum i pumpen. + Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil. + Antal bolus + Antal temp basal + Mål %d inte startat + Mål %d inte nått + Pumpen är inte kapabel till temp basal + Ingen giltig data om temp basaler fanns i pumpen + Closed Loop inaktiverat i Inställningar + Autosens inaktiverat i Inställningar + SMB inaktiverat i Inställningar + Begränsar max basal till %.2f E/h pga %s + pumpbegränsning + det måste vara ett positivt värde + multiplikator för max basal + multiplikator för daglig max basal + En bolus gavs för mindre än 3 min sedan. Hoppar över SMB + Basal justerad korrekt + Begränsar max procent hastighet till %d%% pga %s + Begränsar bolus till %.1f enheter pga %s + Begränsar max IOB till %.1f pga %s + Begränsar kolhydrater till %d g pga %s + Begränsar IOB till %.1f pga %s + maxvärde i Inställningar + hård begränsning + osäker användning + Statuskontroll misslyckad + Logga byte av kanyl + Logga byte a insulinreservoar + SMB Alltid På och SMB Efter Kolhydrater är inaktiverat pga att den aktiva BG-källan inte stöder avancerad filtrering + SMB inte tillåtet i Open Loop + Mat + Återställ + Väntar på tidssynkronisering (%d sek) + Frånkopplad (%d min) + Automatisk loggning i Careportal + Ladda upp insulin-, kanyl- och batteribyten samt pumplarm till Nightscout + Max IOB som OpenAPS inte kan överstiga [E] + Det här värdet kallas Max IOB av OpenAPS. Om denna mängd insulin on board (IOB) nås, kan inte OpenAPS lägga till mer. + Pump stoppad + Pump startad + Pump pausad + Max absorptionstid för kolhydrater [tim] + Efter denna tid anses alla kolhydrater vara absorberade. Om det fortfarande finns COB, kommer dessa att tas bort ur beräkningen. + Tid + Visa noteringsrutan i behandlingsdialogerna + Angivet: %.2f enheter. Levererat: %.2f enheter. Felkod: %d + Första snabbknabben för insulin + Andra snabbknabben för insulin + Tredje snabbknabben för insulin + Första snabbknabben för kolhydrater + Andra snabbknabben för kolhydrater + Tredje snabbknabben för kolhydrater + Använd endast WiFi + Anslutningsinställningar + Tillåtna SSID (separerade med semikolon) + Tillåt anslutning vid Roaming + Multiplikator för max daglig basal (max_daily) + Multiplikator för nuvarande basal (max_current) + - + Free-Peak Oref (ny beräkningsmodell) + Hypo + Hypo längd [min] + Mål vid Hypo + Insulinresistent vuxen From eb594c18673228eff8fee6e8127b9bb303d2333c Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 21:09:04 +0200 Subject: [PATCH 55/91] show bg missing not no profile --- .../Persistentnotification/PersistentNotificationPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 202e33d330..ed57652d1f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -94,7 +94,7 @@ public class PersistentNotificationPlugin extends PluginBase { return; } - String line1 = MainApp.gs(R.string.noprofile); + String line1 = ""; if (MainApp.getConfigBuilder().getActiveProfileInterface() == null || !MainApp.getConfigBuilder().isProfileValid("Notificiation")) return; @@ -114,6 +114,8 @@ public class PersistentNotificationPlugin extends PluginBase { MainApp.gs(R.string.old_data) + " "; } + } else { + line1 = MainApp.gs(R.string.missed_bg_readings); } TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis()); From 22e90743aabfd181035776b84e42e99e64729555 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 21:24:06 +0200 Subject: [PATCH 56/91] Fix #939. --- .../Overview/Dialogs/BolusProgressDialog.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index fbd4e0ece7..192746f54b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -70,16 +70,25 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public void onResume() { super.onResume(); - if (getDialog() != null) - getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - MainApp.bus().register(this); - running = true; - if (bolusEnded) dismiss(); + if (bolusEnded) { + dismiss(); + } else { + if (getDialog() != null) + getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + MainApp.bus().register(this); + running = true; + } } @Override public void dismiss() { - super.dismiss(); + try { + super.dismiss(); + } catch (IllegalStateException e) { + // dialog not running yet. onResume will try again. Set bolusEnded to make extra + // sure onResume will catch this + bolusEnded = true; + } if (helperActivity != null) { helperActivity.finish(); } From 3b19db14fd5af1d7ac1ace2502dd28594bce1a0c Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 21:25:04 +0200 Subject: [PATCH 57/91] Clean up. --- .../Overview/Dialogs/BolusProgressDialog.java | 69 +++++++------------ 1 file changed, 25 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index 192746f54b..a47cc8800e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -42,7 +42,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL } public void setInsulin(double amount) { - this.amount = amount; + BolusProgressDialog.amount = amount; bolusEnded = false; } @@ -55,10 +55,10 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL Bundle savedInstanceState) { getDialog().setTitle(String.format(MainApp.gs(R.string.overview_bolusprogress_goingtodeliver), amount)); View view = inflater.inflate(R.layout.overview_bolusprogress_dialog, container, false); - stopButton = (Button) view.findViewById(R.id.overview_bolusprogress_stop); - statusView = (TextView) view.findViewById(R.id.overview_bolusprogress_status); - stopPressedView = (TextView) view.findViewById(R.id.overview_bolusprogress_stoppressed); - progressBar = (ProgressBar) view.findViewById(R.id.overview_bolusprogress_progressbar); + stopButton = view.findViewById(R.id.overview_bolusprogress_stop); + statusView = view.findViewById(R.id.overview_bolusprogress_status); + stopPressedView = view.findViewById(R.id.overview_bolusprogress_stoppressed); + progressBar = view.findViewById(R.id.overview_bolusprogress_progressbar); stopButton.setOnClickListener(this); progressBar.setMax(100); statusView.setText(MainApp.gs(R.string.waitingforpump)); @@ -118,16 +118,13 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL public void onStatusEvent(final EventOverviewBolusProgress ev) { Activity activity = getActivity(); if (activity != null) { - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - log.debug("Status: " + ev.status + " Percent: " + ev.percent); - statusView.setText(ev.status); - progressBar.setProgress(ev.percent); - if (ev.percent == 100) { - stopButton.setVisibility(View.INVISIBLE); - scheduleDismiss(); - } + activity.runOnUiThread(() -> { + log.debug("Status: " + ev.status + " Percent: " + ev.percent); + statusView.setText(ev.status); + progressBar.setProgress(ev.percent); + if (ev.percent == 100) { + stopButton.setVisibility(View.INVISIBLE); + scheduleDismiss(); } }); } @@ -142,41 +139,25 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Subscribe public void onStatusEvent(final EventPumpStatusChanged c) { - Activity activity = getActivity(); if (activity != null) { - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - statusView.setText(c.textStatus()); - } - } - ); + activity.runOnUiThread(() -> statusView.setText(c.textStatus())); } - } private void scheduleDismiss() { - Thread t = new Thread(new Runnable() { - @Override - public void run() { - SystemClock.sleep(5000); - BolusProgressDialog.bolusEnded = true; - Activity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - try { - dismiss(); - } catch (Exception e) { - log.error("Unhandled exception", e); - } - } - }); - } + Thread t = new Thread(() -> { + SystemClock.sleep(5000); + BolusProgressDialog.bolusEnded = true; + Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + try { + dismiss(); + } catch (Exception e) { + log.error("Unhandled exception", e); + } + }); } }); t.start(); From a3421316acdeb582582aaa3383754dd7b228e3a3 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 2 May 2018 21:38:45 +0200 Subject: [PATCH 58/91] Allow ProfileSwitch before pump is connected. https://github.com/MilosKozak/AndroidAPS/issues/969 --- .../plugins/ProfileLocal/LocalProfileFragment.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java index e6ed71f3d3..6c22a2e9ce 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java @@ -199,22 +199,14 @@ public class LocalProfileFragment extends SubscriberFragment { if (isValid) { invalidProfile.setVisibility(View.GONE); //show invalid profile - if (isEdited || !ConfigBuilderPlugin.getActivePump().isInitialized() || ConfigBuilderPlugin.getActivePump().isSuspended()) { + if (isEdited) { //edited profile -> save first - //pump not initialized -> don't update profile yet profileswitchButton.setVisibility(View.GONE); - } else { - profileswitchButton.setVisibility(View.VISIBLE); - } - - if(isEdited){ saveButton.setVisibility(View.VISIBLE); } else { + profileswitchButton.setVisibility(View.VISIBLE); saveButton.setVisibility(View.GONE); - } - - } else { invalidProfile.setVisibility(View.VISIBLE); profileswitchButton.setVisibility(View.GONE); From e2f28e0ae43ce23c13495c07abb1de43ecf1f2d4 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 2 May 2018 22:20:27 +0200 Subject: [PATCH 59/91] fix rounding on bolus delivery --- .../plugins/ConfigBuilder/DetailedBolusInfoStorage.java | 6 +++--- .../androidaps/plugins/PumpDanaR/DanaRPlugin.java | 2 +- .../plugins/PumpDanaRKorean/DanaRKoreanPlugin.java | 2 +- .../androidaps/plugins/PumpDanaRS/DanaRSPlugin.java | 2 +- .../comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java | 5 +++-- .../androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java | 2 +- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java index abe3c75c73..7a4e99b584 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java @@ -19,13 +19,13 @@ public class DetailedBolusInfoStorage { private static Logger log = LoggerFactory.getLogger(DetailedBolusInfoStorage.class); private static List store = new ArrayList<>(); - public static void add(DetailedBolusInfo detailedBolusInfo) { + public static synchronized void add(DetailedBolusInfo detailedBolusInfo) { log.debug("Stored bolus info: " + detailedBolusInfo); store.add(detailedBolusInfo); } @Nullable - public static DetailedBolusInfo findDetailedBolusInfo(long bolustime) { + public static synchronized DetailedBolusInfo findDetailedBolusInfo(long bolustime) { DetailedBolusInfo found = null; for (int i = 0; i < store.size(); i++) { long infoTime = store.get(i).date; @@ -38,7 +38,7 @@ public class DetailedBolusInfoStorage { return found; } - public static void remove(long bolustime) { + public static synchronized void remove(long bolustime) { for (int i = 0; i < store.size(); i++) { long infoTime = store.get(i).date; if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index 7a91437f17..279a93340f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -159,7 +159,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, detailedBolusInfo.carbTime, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; if (!result.success) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index 03d60ad605..092febec61 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -160,7 +160,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, detailedBolusInfo.carbTime, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; if (!result.success) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index 1f30ed6c3f..1cbb256c1e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -386,7 +386,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (detailedBolusInfo.insulin > 0 || carbs > 0) connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, DateUtil.now() + carbTime * 60 * 1000, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; if (!result.success) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java index f90dd77b74..44e5d308dc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java @@ -53,9 +53,10 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet { public void handleMessage(byte[] data) { errorCode = intFromBuff(data, 0, 1); if (Config.logDanaMessageDetail) { - if (errorCode == 0) + if (errorCode == 0) { log.debug("Result OK"); - else { + failed = false; + } else { failed = true; log.error("Result Error: " + errorCode); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index 0ea6f192e4..7c13707949 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -174,7 +174,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { if (detailedBolusInfo.insulin > 0 || carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) carbs, DateUtil.now() + carbTime * 60 * 1000, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; if (!result.success) From 28430cc757fd8d777200885897983f8434f5454c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 2 May 2018 22:35:51 +0200 Subject: [PATCH 60/91] fix cob calculation --- .../plugins/IobCobCalculator/IobCobCalculatorPlugin.java | 2 ++ .../androidaps/plugins/Treatments/TreatmentsPlugin.java | 2 ++ .../plugins/Wear/wearintegration/WatchUpdaterService.java | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index ceca24839f..89d66fd891 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -417,6 +417,7 @@ public class IobCobCalculatorPlugin extends PluginBase { if (autosensData != null) { displayCob = autosensData.cob; for (Treatment treatment : treatments) { + if (!treatment.isValid) continue; if (IobCobCalculatorPlugin.roundUpTime(treatment.date) > IobCobCalculatorPlugin.roundUpTime(autosensData.time) && treatment.date <= now && treatment.carbs > 0) { displayCob += treatment.carbs; @@ -424,6 +425,7 @@ public class IobCobCalculatorPlugin extends PluginBase { } } for (Treatment treatment : treatments) { + if (!treatment.isValid) continue; if (treatment.date > now && treatment.carbs > 0) { futureCarbs += treatment.carbs; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java index 55129cdc7b..8ae2e6d7b1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java @@ -284,6 +284,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface long last = 0; synchronized (treatments) { for (Treatment t : treatments) { + if (!t.isValid) + continue; if (t.date > last && t.insulin > 0 && t.isValid && t.date <= now) last = t.date; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 696b8b0b57..6a242c7c7a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -465,7 +465,7 @@ public class WatchUpdaterService extends WearableListenerService implements List treatments = TreatmentsPlugin.getPlugin().getTreatmentsFromHistory(); for (Treatment treatment : treatments) { - if (treatment.date > startTimeWindow) { + if (treatment.isValid && treatment.date > startTimeWindow) { boluses.add(treatmentMap(treatment.date, treatment.insulin, treatment.carbs, treatment.isSMB, treatment.isValid)); } From 79458a1c736040c34d6ea83a25cc056b9dddf999 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 22:36:52 +0200 Subject: [PATCH 61/91] Ignore harmless errors (un)subscribing to the message bus. --- .../info/nightscout/androidaps/MainApp.java | 17 ++++++++++++++++- .../Overview/Dialogs/BolusProgressDialog.java | 4 ++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 9e8f3f9c7f..45aff91654 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -245,12 +245,27 @@ public class MainApp extends Application { } } - public void stopKeepAliveService() { if (keepAliveReceiver != null) KeepAliveReceiver.cancelAlarm(this); } + public static void subscribe(Object subscriber) { + try { + bus().register(subscriber); + } catch (IllegalArgumentException e) { + // already registered + } + } + + public static void unsubscribe(Object subscriber) { + try { + bus().unregister(subscriber); + } catch (IllegalArgumentException e) { + // already unregistered + } + } + public static Bus bus() { return sBus; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index a47cc8800e..2ca8e6961a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -75,7 +75,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL } else { if (getDialog() != null) getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - MainApp.bus().register(this); + MainApp.subscribe(this); running = true; } } @@ -97,7 +97,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public void onPause() { super.onPause(); - MainApp.bus().unregister(this); + MainApp.unsubscribe(this); running = false; } From 599c87f7942493e1eed4310a7f8f38bb95144a18 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 22:34:55 +0200 Subject: [PATCH 62/91] Combo: better error message when initialization fails. --- .../androidaps/plugins/PumpCombo/ComboFragment.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 3e3a9a33fc..455f1f7015 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -120,12 +120,18 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis // activity String activity = plugin.getPump().activity; - if (StringUtils.isNotEmpty(activity)) { + if (activity != null) { + activityView.setTextColor(Color.WHITE); activityView.setTextSize(14); activityView.setText(activity); - } else { + } else if (plugin.isInitialized()){ + activityView.setTextColor(Color.WHITE); activityView.setTextSize(20); activityView.setText("{fa-bed}"); + } else { + activityView.setTextColor(Color.RED); + activityView.setTextSize(14); + activityView.setText(MainApp.gs(R.string.pump_unreachable)); } if (plugin.isInitialized()) { From 396268d9c83cebf18b65aa955bbc499b8d4f1616 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Wed, 2 May 2018 22:49:31 +0200 Subject: [PATCH 63/91] Send invalid boluses (prime boluses) to watch. --- .../plugins/Wear/wearintegration/WatchUpdaterService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 6a242c7c7a..696b8b0b57 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -465,7 +465,7 @@ public class WatchUpdaterService extends WearableListenerService implements List treatments = TreatmentsPlugin.getPlugin().getTreatmentsFromHistory(); for (Treatment treatment : treatments) { - if (treatment.isValid && treatment.date > startTimeWindow) { + if (treatment.date > startTimeWindow) { boluses.add(treatmentMap(treatment.date, treatment.insulin, treatment.carbs, treatment.isSMB, treatment.isValid)); } From e5ed63a46fb862f201090888c76466fc978001ca Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 3 May 2018 00:13:49 +0200 Subject: [PATCH 64/91] fix name on future profile switches --- .../Dialogs/NewNSTreatmentDialog.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java index 56aa0158cf..46c1e3666d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java @@ -715,14 +715,26 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick FabricPrivacy.getInstance().logCustom(new CustomEvent("TempTarget")); } } else { - NSUpload.uploadCareportalEntryToNS(data); + if (JsonHelper.safeGetString(data, "eventType").equals(CareportalEvent.PROFILESWITCH)) { + ProfileSwitch profileSwitch = prepareProfileSwitch( + profileStore, + JsonHelper.safeGetString(data, "profile"), + JsonHelper.safeGetInt(data, "duration"), + JsonHelper.safeGetInt(data, "percentage"), + JsonHelper.safeGetInt(data, "timeshift"), + eventTime.getTime() + ); + NSUpload.uploadProfileSwitch(profileSwitch); + } else { + NSUpload.uploadCareportalEntryToNS(data); + } FabricPrivacy.getInstance().logCustom(new CustomEvent("NSTreatment")); } } - public static void doProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift) { + public static ProfileSwitch prepareProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift, long date) { ProfileSwitch profileSwitch = new ProfileSwitch(); - profileSwitch.date = System.currentTimeMillis(); + profileSwitch.date = date; profileSwitch.source = Source.USER; profileSwitch.profileName = profileName; profileSwitch.profileJson = profileStore.getSpecificProfile(profileName).getData().toString(); @@ -731,6 +743,11 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick profileSwitch.isCPP = percentage != 100 || timeshift != 0; profileSwitch.timeshift = timeshift; profileSwitch.percentage = percentage; + return profileSwitch; + } + + public static void doProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift) { + ProfileSwitch profileSwitch = prepareProfileSwitch(profileStore, profileName, duration, percentage, timeshift, System.currentTimeMillis()); TreatmentsPlugin.getPlugin().addToHistoryProfileSwitch(profileSwitch); FabricPrivacy.getInstance().logCustom(new CustomEvent("ProfileSwitch")); } From 012593a48014cd11ed624a20f14c4e2e2888f6b5 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 12:18:48 +0200 Subject: [PATCH 65/91] Update NotificationStore.java --- .../Overview/notifications/NotificationStore.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java index 7504a19a76..8f537c1d74 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java @@ -37,6 +37,7 @@ public class NotificationStore { private static Logger log = LoggerFactory.getLogger(NotificationStore.class); public List store = new ArrayList(); public long snoozedUntil = 0L; + private boolean usesChannels; public NotificationStore() { createNotificationChannel(); @@ -62,6 +63,12 @@ public class NotificationStore { if (SP.getBoolean(MainApp.gs(R.string.key_raise_notifications_as_android_notifications), false)) { raiseSystemNotification(n); + if (usesChannels && n.soundId != null) { + Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class); + alarm.putExtra("soundid", n.soundId); + MainApp.instance().startService(alarm); + } + } else { if (n.soundId != null) { Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class); @@ -138,7 +145,7 @@ public class NotificationStore { private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - + usesChannels = true; NotificationManager mNotificationManager = (NotificationManager) MainApp.instance().getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); @SuppressLint("WrongConstant") NotificationChannel channel = new NotificationChannel(CHANNEL_ID, From 24dd4e1710b42e3a0fd1d56288a07bd927994c53 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 15:58:17 +0200 Subject: [PATCH 66/91] wearwizard cob --- .../androidaps/plugins/Wear/ActionStringHandler.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index aca5100fb6..715dc1163c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -31,6 +31,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; @@ -191,6 +192,7 @@ public class ActionStringHandler { boolean useBG = Boolean.parseBoolean(act[2]); boolean useBolusIOB = Boolean.parseBoolean(act[3]); boolean useBasalIOB = Boolean.parseBoolean(act[4]); + boolean useCOB = true; int percentage = Integer.parseInt(act[5]); Profile profile = MainApp.getConfigBuilder().getProfile(); @@ -205,9 +207,12 @@ public class ActionStringHandler { return; } + double cob = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard wear").displayCob; + DecimalFormat format = new DecimalFormat("0.00"); + DecimalFormat formatInt = new DecimalFormat("0"); BolusWizard bolusWizard = new BolusWizard(); - bolusWizard.doCalc(profile, null, carbsAfterConstraints, 0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, false); + bolusWizard.doCalc(profile, null, carbsAfterConstraints, useCOB?cob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, false); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value(); if (insulinAfterConstraints - bolusWizard.calculatedTotalInsulin != 0) { @@ -232,6 +237,8 @@ public class ActionStringHandler { rMessage += "\n_____________"; rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.ic) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.sens) + "): "; rMessage += "\nFrom Carbs: " + format.format(bolusWizard.insulinFromCarbs) + "U"; + if (useCOB) + rMessage += "\nFrom" + formatInt.format(cob) + "g COB : " + format.format(bolusWizard.insulinFromCOB) + "U"; if (useBG) rMessage += "\nFrom BG: " + format.format(bolusWizard.insulinFromBG) + "U"; if (useBolusIOB) rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U"; From ec106726a7473a15e207b551875d1283279b7d9c Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 16:05:04 +0200 Subject: [PATCH 67/91] wearwizard trend --- .../androidaps/plugins/Wear/ActionStringHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 715dc1163c..f95027a87c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -193,6 +193,7 @@ public class ActionStringHandler { boolean useBolusIOB = Boolean.parseBoolean(act[3]); boolean useBasalIOB = Boolean.parseBoolean(act[4]); boolean useCOB = true; + boolean useTrend = true; int percentage = Integer.parseInt(act[5]); Profile profile = MainApp.getConfigBuilder().getProfile(); @@ -212,7 +213,7 @@ public class ActionStringHandler { DecimalFormat format = new DecimalFormat("0.00"); DecimalFormat formatInt = new DecimalFormat("0"); BolusWizard bolusWizard = new BolusWizard(); - bolusWizard.doCalc(profile, null, carbsAfterConstraints, useCOB?cob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, false); + bolusWizard.doCalc(profile, null, carbsAfterConstraints, useCOB?cob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, useTrend); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value(); if (insulinAfterConstraints - bolusWizard.calculatedTotalInsulin != 0) { @@ -244,6 +245,8 @@ public class ActionStringHandler { rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U"; if (useBasalIOB) rMessage += "\nBasal IOB: " + format.format(bolusWizard.insulingFromBasalsIOB) + "U"; + if (useTrend) + rMessage += "\nFrom 15' trend: " + format.format(bolusWizard.insulinFromTrend) + "U"; if (percentage != 100) { rMessage += "\nPercentage: " + format.format(bolusWizard.totalBeforePercentageAdjustment) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.calculatedTotalInsulin) + "U"; } From bdfce784c0514b85dbf0a8ce8ce1a8e936b9d7b2 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 16:08:48 +0200 Subject: [PATCH 68/91] wearwizard ensure watch apk is up to date --- .../androidaps/plugins/Wear/ActionStringHandler.java | 3 +++ .../androidaps/interaction/actions/WizardActivity.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index f95027a87c..8935a28f87 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -180,6 +180,9 @@ public class ActionStringHandler { } } else if ("wizard".equals(act[0])) { + sendError("Update APP on Watch!"); + return; + } else if ("wizard2".equals(act[0])) { ////////////////////////////////////////////// WIZARD Integer carbsBeforeConstraints = SafeParse.stringToInt(act[1]); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbsBeforeConstraints)).value(); diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java index 7701b17d25..682a669cd8 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java @@ -184,7 +184,7 @@ public class WizardActivity extends ViewSelectorActivity { if (editPercentage != null) percentage = SafeParse.stringToInt(editPercentage.editText.getText().toString()); - String actionstring = "wizard " + SafeParse.stringToInt(editCarbs.editText.getText().toString()) + String actionstring = "wizard2 " + SafeParse.stringToInt(editCarbs.editText.getText().toString()) + " " + useBG + " " + includeBolusIOB + " " + includeBasalIOB From c394c045c92155457f8499a4585968dcb8ba60a1 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 16:31:55 +0200 Subject: [PATCH 69/91] wearwizard reduced watch settings --- .../plugins/Wear/ActionStringHandler.java | 8 +- .../interaction/actions/WizardActivity.java | 82 +------------------ 2 files changed, 6 insertions(+), 84 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 8935a28f87..9f46e9e25c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -192,12 +192,12 @@ public class ActionStringHandler { return; } - boolean useBG = Boolean.parseBoolean(act[2]); - boolean useBolusIOB = Boolean.parseBoolean(act[3]); - boolean useBasalIOB = Boolean.parseBoolean(act[4]); + boolean useBG = true; + boolean useBolusIOB = true; + boolean useBasalIOB = true; boolean useCOB = true; boolean useTrend = true; - int percentage = Integer.parseInt(act[5]); + int percentage = Integer.parseInt(act[2]); Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java index 682a669cd8..5c16063bb2 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java @@ -32,9 +32,6 @@ public class WizardActivity extends ViewSelectorActivity { PlusMinusEditText editCarbs; PlusMinusEditText editPercentage; - boolean useBG; - boolean includeBolusIOB; - boolean includeBasalIOB; boolean hasPercentage; @@ -63,7 +60,7 @@ public class WizardActivity extends ViewSelectorActivity { private class MyGridViewPagerAdapter extends GridPagerAdapter { @Override public int getColumnCount(int arg0) { - return hasPercentage?6:5; + return hasPercentage?3:2; } @Override @@ -86,79 +83,7 @@ public class WizardActivity extends ViewSelectorActivity { setLabelToPlusMinusView(view, "carbs"); container.addView(view); return view; - } else if(col == 1){ - final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_toggle_item, container, false); - final TextView textView = (TextView) view.findViewById(R.id.label); - textView.setText("include BG?"); - - final ImageView togglebutton = (ImageView) view.findViewById(R.id.togglebutton); - if(useBG){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - togglebutton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - useBG = !useBG; - if(useBG){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - } - }); - container.addView(view); - return view; - } else if(col == 2){ - final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_toggle_item, container, false); - final TextView textView = (TextView) view.findViewById(R.id.label); - textView.setText("Bolus IOB?"); - - final ImageView togglebutton = (ImageView) view.findViewById(R.id.togglebutton); - if(includeBolusIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - togglebutton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - includeBolusIOB = !includeBolusIOB; - if(includeBolusIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - } - }); - container.addView(view); - return view; - } else if(col == 3){ - final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_toggle_item, container, false); - final TextView textView = (TextView) view.findViewById(R.id.label); - textView.setText("Basal IOB?"); - - final ImageView togglebutton = (ImageView) view.findViewById(R.id.togglebutton); - if(includeBasalIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - togglebutton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - includeBasalIOB = !includeBasalIOB; - if(includeBasalIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - } - }); - container.addView(view); - return view; - } else if(col == 4 && hasPercentage){ + } else if(col == 1 && hasPercentage){ final View view = getInflatedPlusMinusView(container); if (editPercentage == null) { editPercentage = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, 100d, 50d, 150d, 1d, new DecimalFormat("0"), false); @@ -185,9 +110,6 @@ public class WizardActivity extends ViewSelectorActivity { if (editPercentage != null) percentage = SafeParse.stringToInt(editPercentage.editText.getText().toString()); String actionstring = "wizard2 " + SafeParse.stringToInt(editCarbs.editText.getText().toString()) - + " " + useBG - + " " + includeBolusIOB - + " " + includeBasalIOB + " " + percentage; ListenerService.initiateAction(WizardActivity.this, actionstring); finish(); From fe0f2e3ce68ebdc257938c611bc5c95cb519c7a8 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 17:15:36 +0200 Subject: [PATCH 70/91] wearwizard settings on phone --- .../plugins/Wear/ActionStringHandler.java | 10 +++--- app/src/main/res/values/strings.xml | 7 ++++ app/src/main/res/xml/pref_wear.xml | 36 +++++++++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 9f46e9e25c..5c0af35135 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -192,11 +192,11 @@ public class ActionStringHandler { return; } - boolean useBG = true; - boolean useBolusIOB = true; - boolean useBasalIOB = true; - boolean useCOB = true; - boolean useTrend = true; + boolean useBG = SP.getBoolean(R.string.key_wearwizard_bg, true); + boolean useBolusIOB = SP.getBoolean(R.string.key_wearwizard_bolusiob, true); + boolean useBasalIOB = SP.getBoolean(R.string.key_wearwizard_basaliob, true); + boolean useCOB = SP.getBoolean(R.string.key_wearwizard_cob, true); + boolean useTrend = SP.getBoolean(R.string.key_wearwizard_trend, false); int percentage = Integer.parseInt(act[2]); Profile profile = MainApp.getConfigBuilder().getProfile(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 84acd8205c..24b72693dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1035,4 +1035,11 @@ Current basal safety multiplier n/a Autobackfill BG + Wizard settings + wearwizard_bg + wearwizard_trend + wearwizard_cob + wearwizard_bolusiob + wearwizard_basaliob + Calculations included in the Wizard result: diff --git a/app/src/main/res/xml/pref_wear.xml b/app/src/main/res/xml/pref_wear.xml index 0dce661482..a8f2255d05 100644 --- a/app/src/main/res/xml/pref_wear.xml +++ b/app/src/main/res/xml/pref_wear.xml @@ -13,6 +13,42 @@ android:summary="@string/wearcontrol_summary" android:title="@string/wearcontrol_title" /> + + + + + + + + + + + + Date: Thu, 3 May 2018 17:22:00 +0200 Subject: [PATCH 71/91] wearwizard fix NPE when CobInfo not available --- .../androidaps/plugins/Wear/ActionStringHandler.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 5c0af35135..c6e3aed81a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -31,6 +31,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; @@ -211,7 +212,14 @@ public class ActionStringHandler { return; } - double cob = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard wear").displayCob; + double cob = 0; + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard wear"); + if (cobInfo == null && useCOB) { + sendError("Unknown COB! BG reading missing or recent app restart?"); + return; + } else { + cob = cobInfo.displayCob; + } DecimalFormat format = new DecimalFormat("0.00"); DecimalFormat formatInt = new DecimalFormat("0"); From 62a38ed537e0495ffe47f14ddcb6a83ee3049451 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 17:23:38 +0200 Subject: [PATCH 72/91] wearwizard fix NPE when CobInfo not available - missing part --- .../androidaps/plugins/Wear/ActionStringHandler.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index c6e3aed81a..d64ee24a30 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -212,19 +212,16 @@ public class ActionStringHandler { return; } - double cob = 0; CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard wear"); - if (cobInfo == null && useCOB) { + if (useCOB && (cobInfo == null || cobInfo.displayCob == null)) { sendError("Unknown COB! BG reading missing or recent app restart?"); return; - } else { - cob = cobInfo.displayCob; } DecimalFormat format = new DecimalFormat("0.00"); DecimalFormat formatInt = new DecimalFormat("0"); BolusWizard bolusWizard = new BolusWizard(); - bolusWizard.doCalc(profile, null, carbsAfterConstraints, useCOB?cob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, useTrend); + bolusWizard.doCalc(profile, null, carbsAfterConstraints, useCOB?cobInfo.displayCob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, useTrend); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value(); if (insulinAfterConstraints - bolusWizard.calculatedTotalInsulin != 0) { @@ -250,7 +247,7 @@ public class ActionStringHandler { rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.ic) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.sens) + "): "; rMessage += "\nFrom Carbs: " + format.format(bolusWizard.insulinFromCarbs) + "U"; if (useCOB) - rMessage += "\nFrom" + formatInt.format(cob) + "g COB : " + format.format(bolusWizard.insulinFromCOB) + "U"; + rMessage += "\nFrom" + formatInt.format(cobInfo.displayCob) + "g COB : " + format.format(bolusWizard.insulinFromCOB) + "U"; if (useBG) rMessage += "\nFrom BG: " + format.format(bolusWizard.insulinFromBG) + "U"; if (useBolusIOB) rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U"; From 917fcb595397446c5f99f8da11f83493c1e5a0c2 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 17:28:36 +0200 Subject: [PATCH 73/91] wearwizard reorder menu --- .../androidaps/interaction/menus/MainMenuActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java index 34dce7dd11..da627f93ab 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java @@ -46,8 +46,8 @@ public class MainMenuActivity extends MenuListActivity { Vector menuitems = new Vector(); menuitems.add("TempT"); - menuitems.add("Bolus"); if(showWizard) menuitems.add("Wizard"); + menuitems.add("Bolus"); menuitems.add("Settings"); menuitems.add("Status"); if (showPrimeFill) menuitems.add("Prime/Fill"); From 43dc7d184612793338b645df8c17d4d9b5a92ba4 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 17:42:21 +0200 Subject: [PATCH 74/91] wear cathegorize preferences --- app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/pref_wear.xml | 59 ++++++++++++++++------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 24b72693dc..f26e89a8e9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1035,11 +1035,13 @@ Current basal safety multiplier n/a Autobackfill BG - Wizard settings + Wizard Settings wearwizard_bg wearwizard_trend wearwizard_cob wearwizard_bolusiob wearwizard_basaliob Calculations included in the Wizard result: + Display Settings + General Settings diff --git a/app/src/main/res/xml/pref_wear.xml b/app/src/main/res/xml/pref_wear.xml index a8f2255d05..46cbfd7e22 100644 --- a/app/src/main/res/xml/pref_wear.xml +++ b/app/src/main/res/xml/pref_wear.xml @@ -49,35 +49,42 @@ android:defaultValue="true" android:dependency="wearcontrol"/> - - + + - + - - - + + + + + + From 39e9448c67828783959cae72af5562f7a186246a Mon Sep 17 00:00:00 2001 From: McHoffi Date: Thu, 3 May 2018 21:20:54 +0200 Subject: [PATCH 75/91] Typo fix --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f26e89a8e9..e9482171b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -710,7 +710,7 @@ Getting extended bolus status Getting bolus status Getting temporary basal status - Gettings pump settings + Getting pump settings Getting pump time reuse Controls from Watch From 71db7b60c99c95d4f6bc852d3f4a99f57853eb7a Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 20:48:50 +0200 Subject: [PATCH 76/91] ecarb first activity --- .../interaction/actions/ECarbActivity.java | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java new file mode 100644 index 0000000000..5871059de4 --- /dev/null +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java @@ -0,0 +1,134 @@ +package info.nightscout.androidaps.interaction.actions; + + +import android.content.res.Resources; +import android.os.Bundle; +import android.support.wearable.view.DotsPageIndicator; +import android.support.wearable.view.GridPagerAdapter; +import android.support.wearable.view.GridViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import java.text.DecimalFormat; + +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.ListenerService; +import info.nightscout.androidaps.interaction.utils.PlusMinusEditText; +import info.nightscout.androidaps.interaction.utils.SafeParse; + +/** + * Created by adrian on 04/08/18. + */ + + +public class ECarbActivity extends ViewSelectorActivity { + + PlusMinusEditText editCarbs; + PlusMinusEditText editStartTime; + PlusMinusEditText editDuration; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.grid_layout); + final Resources res = getResources(); + final GridViewPager pager = (GridViewPager) findViewById(R.id.pager); + + pager.setAdapter(new MyGridViewPagerAdapter()); + DotsPageIndicator dotsPageIndicator = (DotsPageIndicator) findViewById(R.id.page_indicator); + dotsPageIndicator.setPager(pager); + } + + + @Override + protected void onPause() { + super.onPause(); + finish(); + } + + + private class MyGridViewPagerAdapter extends GridPagerAdapter { + @Override + public int getColumnCount(int arg0) { + return 4; + } + + @Override + public int getRowCount() { + return 1; + } + + @Override + public Object instantiateItem(ViewGroup container, int row, int col) { + + if(col == 0){ + final View view = getInflatedPlusMinusView(container); + double def = 0; + if (editCarbs != null){ + def = SafeParse.stringToDouble(editCarbs.editText.getText().toString()); + } + editCarbs = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0d, 150d, 1d, new DecimalFormat("0"), true); + setLabelToPlusMinusView(view, "carbs"); + container.addView(view); + return view; + } else if(col == 1){ + final View view = getInflatedPlusMinusView(container); + double def = 0; + if (editStartTime != null){ + def = SafeParse.stringToDouble(editStartTime.editText.getText().toString()); + } + editStartTime = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0d, 300d, 10d, new DecimalFormat("0"), true); + setLabelToPlusMinusView(view, "start [min]"); + container.addView(view); + return view; + } else if(col == 2){ + final View view = getInflatedPlusMinusView(container); + double def = 0; + if (editDuration != null){ + def = SafeParse.stringToDouble(editDuration.editText.getText().toString()); + } + editDuration = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0d, 8d, 1d, new DecimalFormat("0"), false); + setLabelToPlusMinusView(view, "duration [h]"); + container.addView(view); + return view; + } else { + + final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_send_item, container, false); + final ImageView confirmbutton = (ImageView) view.findViewById(R.id.confirmbutton); + confirmbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + //check if it can happen that the fagment is never created that hold data? + // (you have to swipe past them anyways - but still) + + String actionstring = "ecarbs " +SafeParse.stringToInt(editCarbs.editText.getText().toString()) + + " " + SafeParse.stringToInt(editStartTime.editText.getText().toString()) + + " " + SafeParse.stringToInt(editDuration.editText.getText().toString()); + ListenerService.initiateAction(ECarbActivity.this, actionstring); + finish(); + } + }); + container.addView(view); + return view; + } + } + + @Override + public void destroyItem(ViewGroup container, int row, int col, Object view) { + // Handle this to get the data before the view is destroyed? + // Object should still be kept by this, just setup for reinit? + container.removeView((View)view); + } + + @Override + public boolean isViewFromObject(View view, Object object) { + return view==object; + } + + + } +} \ No newline at end of file From 76277d11ad5363dfc499a7a8a0b6b9c0bc68ac71 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 20:49:40 +0200 Subject: [PATCH 77/91] ecarb hang in activity --- .../androidaps/interaction/menus/MainMenuActivity.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java index da627f93ab..fb8bb61e20 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java @@ -7,10 +7,10 @@ import android.preference.PreferenceManager; import java.util.Vector; -import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.data.ListenerService; import info.nightscout.androidaps.interaction.AAPSPreferences; import info.nightscout.androidaps.interaction.actions.BolusActivity; +import info.nightscout.androidaps.interaction.actions.ECarbActivity; import info.nightscout.androidaps.interaction.actions.TempTargetActivity; import info.nightscout.androidaps.interaction.utils.MenuListActivity; import info.nightscout.androidaps.interaction.actions.WizardActivity; @@ -47,6 +47,7 @@ public class MainMenuActivity extends MenuListActivity { Vector menuitems = new Vector(); menuitems.add("TempT"); if(showWizard) menuitems.add("Wizard"); + menuitems.add("eCarb"); menuitems.add("Bolus"); menuitems.add("Settings"); menuitems.add("Status"); @@ -86,6 +87,10 @@ public class MainMenuActivity extends MenuListActivity { intent = new Intent(this, FillMenuActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); this.startActivity(intent); - } + } else if ("eCarb".equals(action)) { + intent = new Intent(this, ECarbActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); + } } } From f2168ff36bb98ba820543de835e3df46a918a013 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 20:50:35 +0200 Subject: [PATCH 78/91] ecarb hang in activity again --- wear/src/main/AndroidManifest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 32cf7a5d1d..01423985d0 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -208,6 +208,10 @@ android:name=".interaction.actions.FillActivity" android:label="Fill"> + + From c69a541b756822a3dbec6ff7b004098961c3df9b Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 20:58:49 +0200 Subject: [PATCH 79/91] ecarb ash first response --- .../plugins/Wear/ActionStringHandler.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index d64ee24a30..bc58f9e3f9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -326,6 +326,23 @@ public class ActionStringHandler { } } + } else if ("ecarbs".equals(act[0])) { + ////////////////////////////////////////////// ECARBS + int carbs = SafeParse.stringToInt(act[1]); + int starttime = SafeParse.stringToInt(act[2]); + int duration = SafeParse.stringToInt(act[3]); + long starttimestamp = System.currentTimeMillis() + starttime*60*1000; + Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbs)).value(); + rMessage += MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + rMessage += "\n" + MainApp.gs(R.string.time) + ": " + DateUtil.timeString(starttimestamp); + rMessage += "\n" + MainApp.gs(R.string.duration) + ": " + duration + "h"; + + + if ( (carbsAfterConstraints - carbs != 0)) { + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); + } + rAction += "ecarbs " + carbsAfterConstraints + " " + starttimestamp + " " + duration; + } else return; From b05b300fafbacc952095f310cd5812a299972fc4 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 21:39:57 +0200 Subject: [PATCH 80/91] ecarb duration format --- .../androidaps/interaction/actions/ECarbActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java index 5871059de4..a598a39c2c 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/ECarbActivity.java @@ -80,7 +80,7 @@ public class ECarbActivity extends ViewSelectorActivity { if (editStartTime != null){ def = SafeParse.stringToDouble(editStartTime.editText.getText().toString()); } - editStartTime = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0d, 300d, 10d, new DecimalFormat("0"), true); + editStartTime = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, def, 0d, 300d, 15d, new DecimalFormat("0"), false); setLabelToPlusMinusView(view, "start [min]"); container.addView(view); return view; From 61f07da1a22adf0b9f8210b953ff935e73cf056f Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 21:53:46 +0200 Subject: [PATCH 81/91] ecarb doECarb --- .../plugins/Wear/ActionStringHandler.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index bc58f9e3f9..53998e0f90 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -1,7 +1,9 @@ package info.nightscout.androidaps.plugins.Wear; +import android.content.Intent; import android.os.HandlerThread; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import java.text.DateFormat; import java.text.DecimalFormat; @@ -19,6 +21,7 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.Source; @@ -35,6 +38,7 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -52,6 +56,8 @@ import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; import info.nightscout.utils.ToastUtils; +import static info.nightscout.utils.DateUtil.now; + /** * Created by adrian on 09/02/17. */ @@ -608,12 +614,64 @@ public class ActionStringHandler { int timeshift = SafeParse.stringToInt(act[1]); int percentage = SafeParse.stringToInt(act[2]); setCPP(timeshift, percentage); + } else if ("ecarbs".equals(act[0])) { + int carbs = SafeParse.stringToInt(act[1]); + long starttime = SafeParse.stringToLong(act[2]); + int duration = SafeParse.stringToInt(act[3]); + + doECarbs(carbs, starttime, duration); } else if ("dismissoverviewnotification".equals(act[0])) { MainApp.bus().post(new EventDismissNotification(SafeParse.stringToInt(act[1]))); } lastBolusWizard = null; } + private static void doECarbs(int carbs, long time, int duration) { + if (carbs > 0) { + if (duration == 0) { + createCarb(carbs, time, "watch"); + } else { + long remainingCarbs = carbs; + int ticks = (duration * 4); //duration guaranteed to be integer greater zero + for (int i = 0; i < ticks; i++){ + long carbTime = time + i * 15 * 60 * 1000; + long smallCarbAmount = Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs + remainingCarbs -= smallCarbAmount; + if (smallCarbAmount > 0) + createCarb(smallCarbAmount, carbTime, "watch eCarbs"); + } + } + } + } + + private static void createCarb(long carbs, long time, @Nullable String notes) { + DetailedBolusInfo carbInfo = new DetailedBolusInfo(); + carbInfo.date = time; + carbInfo.eventType = CareportalEvent.CARBCORRECTION; + carbInfo.carbs = carbs; + carbInfo.context = MainApp.instance(); + carbInfo.source = Source.USER; + carbInfo.notes = notes; + if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) { + ConfigBuilderPlugin.getCommandQueue().bolus(carbInfo, new Callback() { + @Override + public void run() { + if (!result.success) { + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); + } + } + }); + } else { + TreatmentsPlugin.getPlugin().addToHistoryTreatment(carbInfo); + } + } + + private static void setCPP(int timeshift, int percentage) { String msg = ""; From fb75346bcd62464251cb6c3c36fef713a4685577 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 21:55:54 +0200 Subject: [PATCH 82/91] ecarb make settings consistent --- app/src/main/res/xml/pref_wear.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/xml/pref_wear.xml b/app/src/main/res/xml/pref_wear.xml index 46cbfd7e22..2c3c9f3435 100644 --- a/app/src/main/res/xml/pref_wear.xml +++ b/app/src/main/res/xml/pref_wear.xml @@ -54,7 +54,7 @@ android:key="wearplugin" android:title="@string/wear_display_settings"> From 8d6997f51973bd8195069f85dfe7f5a93f1ee482 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 21:58:21 +0200 Subject: [PATCH 83/91] ecarb ignore 0 carbs --- .../androidaps/plugins/Wear/ActionStringHandler.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 53998e0f90..c147fef6b0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -347,6 +347,10 @@ public class ActionStringHandler { if ( (carbsAfterConstraints - carbs != 0)) { rMessage += "\n" + MainApp.gs(R.string.constraintapllied); } + if(carbsAfterConstraints <= 0){ + sendError("Carbs = 0! No action taken!"); + return; + } rAction += "ecarbs " + carbsAfterConstraints + " " + starttimestamp + " " + duration; } else return; From 52411f7afe6687775731fc8575ffc7fa9f31f9d4 Mon Sep 17 00:00:00 2001 From: Radoslav Radev Date: Thu, 3 May 2018 23:34:50 +0300 Subject: [PATCH 84/91] half of the Bulgarian translation --- app/src/main/res/values-bg/strings.xml | 73 ++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 3929d73dfc..81a1589e47 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -682,4 +682,77 @@ Няма достатъчно инсулин в резервоара Празен Обнови + И + един + вддв + шжо + Добавяне на допълнителни функции за използване през деня, като SMB + Пълнене + Избран APS + Няма базални стойности за някои часове: %s + Предупреждение W31: Ниско ниво в резервоара + Предупреждение W32: Слаба батерия + Предупреждение W33: Невалидно време/дата + Предупреждение W34: Край на гаранцията + Предупреждение W36: Временният базал е прекъснат + Предупреждение W38: Болусът е прекъснат + Временният базал е зададен от помпата + Румънски + Френски + Китайски + Болусът е спрян + Спиране на болус + Хипоглекимия + Настройка на целевата КЗ чрез аутосенс + Възрастни с по-голяма инсулинова резистентност + OpenAPS SMB + SMB + Разреши UAM + Разреши SMB + Използвай супер микро болуси вместо временен базал за по бързо действие + Детекция на необявено хранене (UAM) + Продължителност на вр. цел при хипоглекимия + Временна цел при хипоглекимия + мин. + ч. + Максимални минути за ограничаване на базала от SMB + Програмиране на помпа за болус + Състояние + Активност + Няма връзка от %d мин. + %d%% (%d мин. остават) + Инициализация + Прекратен поради грешка + Прекратен от потребителя + Изпълнява + Отказва временен базал + Задава временен базал (%d%% / %d min) + Болус (%.1f U) + Обновява + Исканата операция не се поддържа от помпата + Опасно използване: удължени или многовълнови болуси са активни. Помпата е изключена за само 6 часа. Само нормални болуси се поддържат. + Опасно използване: помпата използва различни базални нива от първоначалния профил. Loop е спрян. Изберете първоначалния профил и обновете. + Болуси с едно и също количество бяха поискани в последните две минути. За да се предотврати дублиране вече доставен болус, операцията е забранена. + Сега + Ниско ниво на резервоар на помпа + Батерията на помпата е слаба + Помпата отчита грешка E%d: %s + Необходимо е сверяване на часа в помпата + Отказването на временният базал беше потвърдено + Помпата е недостъпна. Не беше доставен болус. + Болусът беше неуспешен. За да сте сигурни, моля, проверете помпата, за да избегнете повторение на вече доставен болус. За да се избегнат бъгове болусите не се повтарят автоматично. + Само %.2f U от искания болус от %.2f U е доставен поради грешка. Моля, проверете помпата, за да потвърдите това и да предприемете съответните действия. + Insight + Insight помпа + Статус + Променено + ПОМПАТА Е СПРЯНА + Статуса е актуализиран + преди + с + Активен временен базал + мин. остават + История + Последно извършено действие + мин. From c34cc73b1e9e333e7456ed94aef6377cce412f18 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 3 May 2018 23:08:16 +0200 Subject: [PATCH 85/91] fix wear wizard --- .../nightscout/androidaps/plugins/Wear/ActionStringHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index c147fef6b0..fe6c655aa4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -605,7 +605,7 @@ public class ActionStringHandler { high *= Constants.MMOLL_TO_MGDL; } generateTempTarget(duration, low, high); - } else if ("wizard".equals(act[0])) { + } else if ("wizard2".equals(act[0])) { //use last calculation as confirmed string matches doBolus(lastBolusWizard.calculatedTotalInsulin, lastBolusWizard.carbs); From 010a2f3fd836834533e32a2ad8b1021b93a3ba0b Mon Sep 17 00:00:00 2001 From: swissalpine Date: Fri, 4 May 2018 10:04:45 +0200 Subject: [PATCH 86/91] Make deviation bars transparent --- .../androidaps/plugins/Overview/graphData/GraphData.java | 6 +++--- app/src/main/res/values/colors.xml | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 177e7f9642..837a24d8aa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -437,9 +437,9 @@ public class GraphData { AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time); if (autosensData != null) { int color = Color.BLACK; // "=" - if (autosensData.pastSensitivity.equals("C")) color = Color.GRAY; - if (autosensData.pastSensitivity.equals("+")) color = Color.GREEN; - if (autosensData.pastSensitivity.equals("-")) color = Color.RED; + if (autosensData.pastSensitivity.equals("C")) color = MainApp.gc(R.color.deviationgrey); + if (autosensData.pastSensitivity.equals("+")) color = MainApp.gc(R.color.deviationgreen); + if (autosensData.pastSensitivity.equals("-")) color = MainApp.gc(R.color.deviationred); devArray.add(new DeviationDataPoint(time, autosensData.deviation, color, devScale)); maxDevValueFound = Math.max(maxDevValueFound, Math.abs(autosensData.deviation)); } diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a5e65e2eda..02d39fe91c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -64,4 +64,8 @@ #ff827c #009705 + #FF666666 + #7200FF00 + #72FF0000 + From 5c8e99b191502e56b81c0ddad92cd258f5b03aaf Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Fri, 4 May 2018 12:23:51 +0200 Subject: [PATCH 87/91] dismiss bolus progress dialog when Queue is empty --- .../Overview/Dialogs/BolusProgressDialog.java | 3 +++ .../nightscout/androidaps/queue/CommandQueue.java | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index 2ca8e6961a..8ef6ec2fc6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -70,6 +70,9 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public void onResume() { super.onResume(); + if(!ConfigBuilderPlugin.getCommandQueue().bolusInQueue()) { + bolusEnded = true; + } if (bolusEnded) { dismiss(); } else { diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index 9085e3f762..b42cc47f13 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -162,8 +162,18 @@ public class CommandQueue { tempCommandQueue.readStatus(reason, callback); } + public synchronized boolean bolusInQueue(){ + if(isRunning(Command.CommandType.BOLUS)) return true; + for (int i = 0; i < queue.size(); i++) { + if (queue.get(i).commandType == Command.CommandType.BOLUS) { + return true; + } + } + return false; + } + // returns true if command is queued - public boolean bolus(DetailedBolusInfo detailedBolusInfo, Callback callback) { + public synchronized boolean bolus(DetailedBolusInfo detailedBolusInfo, Callback callback) { Command.CommandType type = detailedBolusInfo.isSMB ? Command.CommandType.SMB_BOLUS : Command.CommandType.BOLUS; if(type.equals(Command.CommandType.BOLUS) && detailedBolusInfo.carbs > 0 && detailedBolusInfo.insulin == 0){ From 7312bf061adf5cb975f30703a24143a19f57f0e4 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Fri, 4 May 2018 12:30:28 +0200 Subject: [PATCH 88/91] Update colors.xml --- app/src/main/res/values/colors.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 02d39fe91c..954184de6a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -64,8 +64,9 @@ #ff827c #009705 - #FF666666 + #c8666666 #7200FF00 #72FF0000 + #72000000 From 10b67a0c11e3160dc70533e8007e048fe38f3b3c Mon Sep 17 00:00:00 2001 From: swissalpine Date: Fri, 4 May 2018 12:31:11 +0200 Subject: [PATCH 89/91] Update GraphData.java --- .../androidaps/plugins/Overview/graphData/GraphData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 837a24d8aa..8023e86ac0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -436,7 +436,7 @@ public class GraphData { for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) { AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time); if (autosensData != null) { - int color = Color.BLACK; // "=" + int color = MainApp.gc(R.color.deviationblack); // "=" if (autosensData.pastSensitivity.equals("C")) color = MainApp.gc(R.color.deviationgrey); if (autosensData.pastSensitivity.equals("+")) color = MainApp.gc(R.color.deviationgreen); if (autosensData.pastSensitivity.equals("-")) color = MainApp.gc(R.color.deviationred); From 43cc3c4908089e9dcad62823cc75cdfc4027ab48 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Fri, 4 May 2018 14:18:55 +0200 Subject: [PATCH 90/91] Extract CarbsGenerator class. --- .../Overview/Dialogs/NewCarbsDialog.java | 96 ++++++------------- .../plugins/Treatments/CarbsGenerator.java | 56 +++++++++++ .../plugins/Wear/ActionStringHandler.java | 41 +------- 3 files changed, 90 insertions(+), 103 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java index c60d237882..d591c880b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java @@ -40,6 +40,7 @@ import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Treatments.CarbsGenerator; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DateUtil; @@ -364,48 +365,40 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C } accepted = true; - if (startActivityTTCheckbox.isChecked()) { - TempTarget tempTarget = new TempTarget() - .date(System.currentTimeMillis()) - .duration(finalActivityTTDuration) - .reason(MainApp.gs(R.string.activity)) - .source(Source.USER) - .low(Profile.toMgdl(finalActivityTT, currentProfile.getUnits())) - .high(Profile.toMgdl(finalActivityTT, currentProfile.getUnits())); - TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); - } else if (startEatingSoonTTCheckbox.isChecked()) { - TempTarget tempTarget = new TempTarget() - .date(System.currentTimeMillis()) - .duration(finalEatingSoonTTDuration) - .reason(MainApp.gs(R.string.eatingsoon)) - .source(Source.USER) - .low(Profile.toMgdl(finalEatigSoonTT, currentProfile.getUnits())) - .high(Profile.toMgdl(finalEatigSoonTT, currentProfile.getUnits())); - TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); - } else if (startHypoTTCheckbox.isChecked()) { - TempTarget tempTarget = new TempTarget() - .date(System.currentTimeMillis()) - .duration(finalHypoTTDuration) - .reason(MainApp.gs(R.string.hypo)) - .source(Source.USER) - .low(Profile.toMgdl(finalHypoTT, currentProfile.getUnits())) - .high(Profile.toMgdl(finalHypoTT, currentProfile.getUnits())); - TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); - } + if (startActivityTTCheckbox.isChecked()) { + TempTarget tempTarget = new TempTarget() + .date(System.currentTimeMillis()) + .duration(finalActivityTTDuration) + .reason(MainApp.gs(R.string.activity)) + .source(Source.USER) + .low(Profile.toMgdl(finalActivityTT, currentProfile.getUnits())) + .high(Profile.toMgdl(finalActivityTT, currentProfile.getUnits())); + TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); + } else if (startEatingSoonTTCheckbox.isChecked()) { + TempTarget tempTarget = new TempTarget() + .date(System.currentTimeMillis()) + .duration(finalEatingSoonTTDuration) + .reason(MainApp.gs(R.string.eatingsoon)) + .source(Source.USER) + .low(Profile.toMgdl(finalEatigSoonTT, currentProfile.getUnits())) + .high(Profile.toMgdl(finalEatigSoonTT, currentProfile.getUnits())); + TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); + } else if (startHypoTTCheckbox.isChecked()) { + TempTarget tempTarget = new TempTarget() + .date(System.currentTimeMillis()) + .duration(finalHypoTTDuration) + .reason(MainApp.gs(R.string.hypo)) + .source(Source.USER) + .low(Profile.toMgdl(finalHypoTT, currentProfile.getUnits())) + .high(Profile.toMgdl(finalHypoTT, currentProfile.getUnits())); + TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget); + } if (carbsAfterConstraints > 0) { if (duration == 0) { - createCarb(carbsAfterConstraints, time, notes); + CarbsGenerator.createCarb(carbsAfterConstraints, time, notes); } else { - long remainingCarbs = carbsAfterConstraints; - int ticks = (duration * 4); //duration guaranteed to be integer greater zero - for (int i = 0; i < ticks; i++){ - long carbTime = time + i * 15 * 60 * 1000; - long smallCarbAmount = Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs - remainingCarbs -= smallCarbAmount; - if (smallCarbAmount > 0) - createCarb(smallCarbAmount, carbTime, notes); - } + CarbsGenerator.generateCarbs(carbsAfterConstraints, time, duration, notes); } } } @@ -420,31 +413,4 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C log.error("Unhandled exception", e); } } - - private void createCarb(long carbs, long time, @Nullable String notes) { - DetailedBolusInfo carbInfo = new DetailedBolusInfo(); - carbInfo.date = time; - carbInfo.eventType = CareportalEvent.CARBCORRECTION; - carbInfo.carbs = carbs; - carbInfo.context = getContext(); - carbInfo.source = Source.USER; - carbInfo.notes = notes; - if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) { - ConfigBuilderPlugin.getCommandQueue().bolus(carbInfo, new Callback() { - @Override - public void run() { - if (!result.success) { - Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); - i.putExtra("soundid", R.raw.boluserror); - i.putExtra("status", result.comment); - i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - MainApp.instance().startActivity(i); - } - } - }); - } else { - TreatmentsPlugin.getPlugin().addToHistoryTreatment(carbInfo); - } - } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java new file mode 100644 index 0000000000..d270187eca --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java @@ -0,0 +1,56 @@ +package info.nightscout.androidaps.plugins.Treatments; + +import android.content.Intent; +import android.support.annotation.Nullable; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.db.CareportalEvent; +import info.nightscout.androidaps.db.Source; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; +import info.nightscout.androidaps.queue.Callback; + +import static info.nightscout.utils.DateUtil.now; + +public class CarbsGenerator { + public static void generateCarbs(int amount, long startTime, int duration, @Nullable String notes) { + long remainingCarbs = amount; + int ticks = (duration * 4); //duration guaranteed to be integer greater zero + for (int i = 0; i < ticks; i++){ + long carbTime = startTime + i * 15 * 60 * 1000; + int smallCarbAmount = (int) Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs + remainingCarbs -= smallCarbAmount; + if (smallCarbAmount > 0) + createCarb(smallCarbAmount, carbTime, notes); + } + } + + public static void createCarb(int carbs, long time, @Nullable String notes) { + DetailedBolusInfo carbInfo = new DetailedBolusInfo(); + carbInfo.date = time; + carbInfo.eventType = CareportalEvent.CARBCORRECTION; + carbInfo.carbs = carbs; + carbInfo.context = MainApp.instance(); + carbInfo.source = Source.USER; + carbInfo.notes = notes; + if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) { + ConfigBuilderPlugin.getCommandQueue().bolus(carbInfo, new Callback() { + @Override + public void run() { + if (!result.success) { + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); + } + } + }); + } else { + TreatmentsPlugin.getPlugin().addToHistoryTreatment(carbInfo); + } + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index fe6c655aa4..35b8fe72c2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -46,6 +46,7 @@ import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; import info.nightscout.androidaps.plugins.PumpDanaRS.DanaRSPlugin; import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin; import info.nightscout.androidaps.plugins.PumpInsight.InsightPlugin; +import info.nightscout.androidaps.plugins.Treatments.CarbsGenerator; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.BolusWizard; @@ -633,49 +634,13 @@ public class ActionStringHandler { private static void doECarbs(int carbs, long time, int duration) { if (carbs > 0) { if (duration == 0) { - createCarb(carbs, time, "watch"); + CarbsGenerator.createCarb(carbs, time, "watch"); } else { - long remainingCarbs = carbs; - int ticks = (duration * 4); //duration guaranteed to be integer greater zero - for (int i = 0; i < ticks; i++){ - long carbTime = time + i * 15 * 60 * 1000; - long smallCarbAmount = Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs - remainingCarbs -= smallCarbAmount; - if (smallCarbAmount > 0) - createCarb(smallCarbAmount, carbTime, "watch eCarbs"); - } + CarbsGenerator.generateCarbs(carbs, time, duration, "watch eCarbs"); } } } - private static void createCarb(long carbs, long time, @Nullable String notes) { - DetailedBolusInfo carbInfo = new DetailedBolusInfo(); - carbInfo.date = time; - carbInfo.eventType = CareportalEvent.CARBCORRECTION; - carbInfo.carbs = carbs; - carbInfo.context = MainApp.instance(); - carbInfo.source = Source.USER; - carbInfo.notes = notes; - if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) { - ConfigBuilderPlugin.getCommandQueue().bolus(carbInfo, new Callback() { - @Override - public void run() { - if (!result.success) { - Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); - i.putExtra("soundid", R.raw.boluserror); - i.putExtra("status", result.comment); - i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - MainApp.instance().startActivity(i); - } - } - }); - } else { - TreatmentsPlugin.getPlugin().addToHistoryTreatment(carbInfo); - } - } - - private static void setCPP(int timeshift, int percentage) { String msg = ""; From 35a6bbb6a7be8613e5ca6b389ce6b87c48859db8 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Fri, 4 May 2018 14:22:43 +0200 Subject: [PATCH 91/91] Set CareportalEvent.MEALBOLUS for eCarbs. --- .../plugins/Overview/Dialogs/NewCarbsDialog.java | 7 +------ .../androidaps/plugins/Treatments/CarbsGenerator.java | 6 +++--- .../androidaps/plugins/Wear/ActionStringHandler.java | 7 +------ 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java index d591c880b9..2ebab6caab 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java @@ -1,9 +1,7 @@ package info.nightscout.androidaps.plugins.Overview.Dialogs; -import android.content.Intent; import android.os.Bundle; import android.os.HandlerThread; -import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.text.Editable; @@ -33,16 +31,13 @@ import java.util.List; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Treatments.CarbsGenerator; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; -import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.DefaultValueHelper; @@ -396,7 +391,7 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C if (carbsAfterConstraints > 0) { if (duration == 0) { - CarbsGenerator.createCarb(carbsAfterConstraints, time, notes); + CarbsGenerator.createCarb(carbsAfterConstraints, time, CareportalEvent.CARBCORRECTION, notes); } else { CarbsGenerator.generateCarbs(carbsAfterConstraints, time, duration, notes); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java index d270187eca..99168a2776 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/CarbsGenerator.java @@ -23,14 +23,14 @@ public class CarbsGenerator { int smallCarbAmount = (int) Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs remainingCarbs -= smallCarbAmount; if (smallCarbAmount > 0) - createCarb(smallCarbAmount, carbTime, notes); + createCarb(smallCarbAmount, carbTime, CareportalEvent.MEALBOLUS, notes); } } - public static void createCarb(int carbs, long time, @Nullable String notes) { + public static void createCarb(int carbs, long time, String eventType, @Nullable String notes) { DetailedBolusInfo carbInfo = new DetailedBolusInfo(); carbInfo.date = time; - carbInfo.eventType = CareportalEvent.CARBCORRECTION; + carbInfo.eventType = eventType; carbInfo.carbs = carbs; carbInfo.context = MainApp.instance(); carbInfo.source = Source.USER; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index 35b8fe72c2..5ec2723fa4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -1,9 +1,7 @@ package info.nightscout.androidaps.plugins.Wear; -import android.content.Intent; import android.os.HandlerThread; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import java.text.DateFormat; import java.text.DecimalFormat; @@ -38,7 +36,6 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; -import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -57,8 +54,6 @@ import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; import info.nightscout.utils.ToastUtils; -import static info.nightscout.utils.DateUtil.now; - /** * Created by adrian on 09/02/17. */ @@ -634,7 +629,7 @@ public class ActionStringHandler { private static void doECarbs(int carbs, long time, int duration) { if (carbs > 0) { if (duration == 0) { - CarbsGenerator.createCarb(carbs, time, "watch"); + CarbsGenerator.createCarb(carbs, time, CareportalEvent.CARBCORRECTION, "watch"); } else { CarbsGenerator.generateCarbs(carbs, time, duration, "watch eCarbs"); }