From b42304d836f8ad5ca57b1dbeb344f1c5fd271e3e Mon Sep 17 00:00:00 2001 From: Tim Gunn <2896311+Tornado-Tim@users.noreply.github.com> Date: Mon, 27 Apr 2020 20:09:46 +1200 Subject: [PATCH 01/17] Add skip Neutral Temps preference --- .../plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java | 2 +- app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/xml/pref_openapssmb.xml | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java index 4d3a0db704..796eb9ef4e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java @@ -265,7 +265,7 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("exercise_mode", SMBDefaults.exercise_mode); mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target); mProfile.put("maxCOB", SMBDefaults.maxCOB); - mProfile.put("skip_neutral_temps", SMBDefaults.skip_neutral_temps); + mProfile.put("skip_neutral_temps", sp.getBoolean(R.string.key_skip_neutral_temps,SMBDefaults.skip_neutral_temps)); // min_5m_carbimpact is not used within SMB determinebasal //if (mealData.usedMinCarbsImpact > 0) { // mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b0f6821b69..3560471abf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -956,6 +956,9 @@ enableSMB_with_temptarget enableSMB_after_carbs enableSMB_with_high_temptarget + skip_neutral_temps + Skip neutral temp basals + If enabled, sets basal to neutral before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. Enable SMB always Enable SMB always independently to boluses. Possible only with BG source with nice filtering of data like G5 Enable SMB after carbs diff --git a/app/src/main/res/xml/pref_openapssmb.xml b/app/src/main/res/xml/pref_openapssmb.xml index 859a75a82b..09c6ff1221 100644 --- a/app/src/main/res/xml/pref_openapssmb.xml +++ b/app/src/main/res/xml/pref_openapssmb.xml @@ -73,6 +73,12 @@ android:summary="@string/enablesmbaftercarbs_summary" android:title="@string/enablesmbaftercarbs" /> + + Date: Mon, 27 Apr 2020 20:33:41 +1200 Subject: [PATCH 02/17] clarify definition --- 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 3560471abf..c4c96fb42a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -958,7 +958,7 @@ enableSMB_with_high_temptarget skip_neutral_temps Skip neutral temp basals - If enabled, sets basal to neutral before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. + If enabled, it skips setting basal to neutral before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. Enable SMB always Enable SMB always independently to boluses. Possible only with BG source with nice filtering of data like G5 Enable SMB after carbs From 017b6187b5ec92d5e46e4d5ff6153040bf6f029f Mon Sep 17 00:00:00 2001 From: Tim Gunn <2896311+Tornado-Tim@users.noreply.github.com> Date: Sun, 3 May 2020 23:09:48 +1200 Subject: [PATCH 03/17] Patch determine basal --- app/src/main/assets/OpenAPSSMB/determine-basal.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/OpenAPSSMB/determine-basal.js b/app/src/main/assets/OpenAPSSMB/determine-basal.js index 00a9c1d0a2..18181d25de 100644 --- a/app/src/main/assets/OpenAPSSMB/determine-basal.js +++ b/app/src/main/assets/OpenAPSSMB/determine-basal.js @@ -897,7 +897,8 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ // if not in LGS mode, cancel temps before the top of the hour to reduce beeping/vibration // console.error(profile.skip_neutral_temps, rT.deliverAt.getMinutes()); - if ( profile.skip_neutral_temps && rT.deliverAt.getMinutes() >= 55 ) { + //patch determine basal so skip_neutral_temps works as expected + if ( !profile.skip_neutral_temps && rT.deliverAt.getMinutes() >= 55 ) { rT.reason += "; Canceling temp at " + rT.deliverAt.getMinutes() + "m past the hour. "; return tempBasalFunctions.setTempBasal(0, 0, profile, rT, currenttemp); } From 39d011a4ccdf099286772c1b9b9864efdd88f4f3 Mon Sep 17 00:00:00 2001 From: Tim Gunn <2896311+Tornado-Tim@users.noreply.github.com> Date: Sun, 3 May 2020 23:10:46 +1200 Subject: [PATCH 04/17] Move to Medtronic driver --- app/src/main/res/xml/pref_medtronic.xml | 6 ++++++ app/src/main/res/xml/pref_openapssmb.xml | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/xml/pref_medtronic.xml b/app/src/main/res/xml/pref_medtronic.xml index fd9a84ab64..c5f4562e1d 100644 --- a/app/src/main/res/xml/pref_medtronic.xml +++ b/app/src/main/res/xml/pref_medtronic.xml @@ -98,6 +98,12 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_openapssmb.xml b/app/src/main/res/xml/pref_openapssmb.xml index 09c6ff1221..859a75a82b 100644 --- a/app/src/main/res/xml/pref_openapssmb.xml +++ b/app/src/main/res/xml/pref_openapssmb.xml @@ -73,12 +73,6 @@ android:summary="@string/enablesmbaftercarbs_summary" android:title="@string/enablesmbaftercarbs" /> - - Date: Sun, 3 May 2020 23:11:29 +1200 Subject: [PATCH 05/17] Use different defaults if using Medtronic Pump --- .../aps/openAPSSMB/DetermineBasalAdapterSMBJS.java | 12 ++++++++++-- .../plugins/aps/openAPSSMB/SMBDefaults.java | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java index 796eb9ef4e..16949fcb4c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java @@ -26,10 +26,12 @@ import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.LTag; import info.nightscout.androidaps.plugins.aps.loop.ScriptReader; import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback; +import info.nightscout.androidaps.plugins.common.ManufacturerType; import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker; import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus; @@ -237,7 +239,9 @@ public class DetermineBasalAdapterSMBJS { ) throws JSONException { String units = profile.getUnits(); - Double pumpbolusstep = activePluginProvider.getActivePump().getPumpDescription().bolusStep; + PumpInterface pump = activePluginProvider.getActivePump(); + ManufacturerType manufacturer = pump.manufacturer(); + Double pumpbolusstep = pump.getPumpDescription().bolusStep; mProfile = new JSONObject(); mProfile.put("max_iob", maxIob); @@ -265,7 +269,11 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("exercise_mode", SMBDefaults.exercise_mode); mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target); mProfile.put("maxCOB", SMBDefaults.maxCOB); - mProfile.put("skip_neutral_temps", sp.getBoolean(R.string.key_skip_neutral_temps,SMBDefaults.skip_neutral_temps)); + if (!manufacturer.name().equals("Medtronic")) { + mProfile.put("skip_neutral_temps",SMBDefaults.skip_neutral_temps); + } else { + mProfile.put("skip_neutral_temps", sp.getBoolean(R.string.key_skip_neutral_temps, SMBDefaults.skip_neutral_temps_medtronic)); + } // min_5m_carbimpact is not used within SMB determinebasal //if (mealData.usedMinCarbsImpact > 0) { // mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java index 5f2216b5ae..42eacdbce6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java @@ -38,6 +38,7 @@ public class SMBDefaults { // Essentially, this just limits AMA/SMB as a safety cap against excessive COB entry) public final static int maxCOB = 120; public final static boolean skip_neutral_temps = true; // ***** default false in oref1 ***** if true, don't set neutral temps + public final static boolean skip_neutral_temps_medtronic = false;//if using a medtronic pump default to false so the pump doesnt beep on the hour // unsuspend_if_no_temp:false // if true, pump will un-suspend after a zero temp finishes // bolussnooze_dia_divisor:2 // bolus snooze decays after 1/2 of DIA public final static double min_5m_carbimpact = 8d; // mg/dL per 5m (8 mg/dL/5m corresponds to 24g/hr at a CSF of 4 mg/dL/g (x/5*60/4)) From 441e5fdf3e40bbe8c36c69dfbed262693206cf6b Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 11 May 2020 14:50:35 +0200 Subject: [PATCH 06/17] extend pump interface for neutral temps --- .../androidaps/interfaces/PumpInterface.java | 4 ++++ .../aps/openAPSSMB/DetermineBasalAdapterSMBJS.java | 13 +++---------- .../plugins/aps/openAPSSMB/SMBDefaults.java | 3 +-- .../plugins/pump/medtronic/MedtronicPumpPlugin.java | 4 ++++ app/src/main/res/values/strings.xml | 6 +++--- app/src/main/res/xml/pref_medtronic.xml | 8 ++++---- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index d85a383752..3ad7ed6ab8 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -122,4 +122,8 @@ public interface PumpInterface { default boolean isUnreachableAlertTimeoutExceeded(long alertTimeoutMilliseconds) { return false; } + + default boolean setNeutralTempAtFullHour() { + return false; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java index 16949fcb4c..f37f85d26b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java @@ -26,18 +26,16 @@ import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.interfaces.ActivePluginProvider; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.aps.loop.ScriptReader; import info.nightscout.androidaps.plugins.aps.logger.LoggerCallback; -import info.nightscout.androidaps.plugins.common.ManufacturerType; +import info.nightscout.androidaps.plugins.aps.loop.ScriptReader; import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker; import info.nightscout.androidaps.plugins.configBuilder.ProfileFunction; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin; -import info.nightscout.androidaps.interfaces.ActivePluginProvider; - import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.utils.SafeParse; import info.nightscout.androidaps.utils.resources.ResourceHelper; @@ -240,7 +238,6 @@ public class DetermineBasalAdapterSMBJS { String units = profile.getUnits(); PumpInterface pump = activePluginProvider.getActivePump(); - ManufacturerType manufacturer = pump.manufacturer(); Double pumpbolusstep = pump.getPumpDescription().bolusStep; mProfile = new JSONObject(); @@ -269,11 +266,7 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("exercise_mode", SMBDefaults.exercise_mode); mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target); mProfile.put("maxCOB", SMBDefaults.maxCOB); - if (!manufacturer.name().equals("Medtronic")) { - mProfile.put("skip_neutral_temps",SMBDefaults.skip_neutral_temps); - } else { - mProfile.put("skip_neutral_temps", sp.getBoolean(R.string.key_skip_neutral_temps, SMBDefaults.skip_neutral_temps_medtronic)); - } + mProfile.put("skip_neutral_temps", !pump.setNeutralTempAtFullHour()); // min_5m_carbimpact is not used within SMB determinebasal //if (mealData.usedMinCarbsImpact > 0) { // mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java index 42eacdbce6..83ef09f89a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/SMBDefaults.java @@ -37,8 +37,7 @@ public class SMBDefaults { // (If someone enters more carbs or stacks more; OpenAPS will just truncate dosing based on 120. // Essentially, this just limits AMA/SMB as a safety cap against excessive COB entry) public final static int maxCOB = 120; - public final static boolean skip_neutral_temps = true; // ***** default false in oref1 ***** if true, don't set neutral temps - public final static boolean skip_neutral_temps_medtronic = false;//if using a medtronic pump default to false so the pump doesnt beep on the hour + //public final static boolean skip_neutral_temps = true; // ***** default false in oref1 ***** if true, don't set neutral temps // unsuspend_if_no_temp:false // if true, pump will un-suspend after a zero temp finishes // bolussnooze_dia_divisor:2 // bolus snooze decays after 1/2 of DIA public final static double min_5m_carbimpact = 8d; // mg/dL per 5m (8 mg/dL/5m corresponds to 24g/hr at a CSF of 4 mg/dL/g (x/5*60/4)) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java index 4bb5609f33..8f997b9b58 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/MedtronicPumpPlugin.java @@ -1558,6 +1558,10 @@ public class MedtronicPumpPlugin extends PumpPluginAbstract implements PumpInter this.hasTimeDateOrTimeZoneChanged = true; } + @Override public boolean setNeutralTempAtFullHour() { + return sp.getBoolean(R.string.key_set_neutral_temps, true); + } + private void setEnableCustomAction(MedtronicCustomActionType customAction, boolean isEnabled) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1561f13835..8f84bd2b87 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -958,9 +958,9 @@ enableSMB_with_temptarget enableSMB_after_carbs enableSMB_with_high_temptarget - skip_neutral_temps - Skip neutral temp basals - If enabled, it skips setting basal to neutral before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. + set_neutral_temps + Set neutral temp basals + If enabled, it sets basal to neutral before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. Enable SMB always Enable SMB always independently to boluses. Possible only with BG source with nice filtering of data like G5 Enable SMB after carbs diff --git a/app/src/main/res/xml/pref_medtronic.xml b/app/src/main/res/xml/pref_medtronic.xml index c5f4562e1d..342250d046 100644 --- a/app/src/main/res/xml/pref_medtronic.xml +++ b/app/src/main/res/xml/pref_medtronic.xml @@ -99,10 +99,10 @@ + android:defaultValue="true" + android:key="@string/key_set_neutral_temps" + android:summary="@string/set_neutral_temps_summary" + android:title="@string/set_neutral_temps_title" /> From b49d9d13af75d08ca5fba84ef0a643d0af530d1b Mon Sep 17 00:00:00 2001 From: Tim Gunn <2896311+Tornado-Tim@users.noreply.github.com> Date: Wed, 13 May 2020 10:36:16 +1200 Subject: [PATCH 07/17] revert counter logic --- app/src/main/assets/OpenAPSSMB/determine-basal.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/assets/OpenAPSSMB/determine-basal.js b/app/src/main/assets/OpenAPSSMB/determine-basal.js index 18181d25de..00a9c1d0a2 100644 --- a/app/src/main/assets/OpenAPSSMB/determine-basal.js +++ b/app/src/main/assets/OpenAPSSMB/determine-basal.js @@ -897,8 +897,7 @@ var determine_basal = function determine_basal(glucose_status, currenttemp, iob_ // if not in LGS mode, cancel temps before the top of the hour to reduce beeping/vibration // console.error(profile.skip_neutral_temps, rT.deliverAt.getMinutes()); - //patch determine basal so skip_neutral_temps works as expected - if ( !profile.skip_neutral_temps && rT.deliverAt.getMinutes() >= 55 ) { + if ( profile.skip_neutral_temps && rT.deliverAt.getMinutes() >= 55 ) { rT.reason += "; Canceling temp at " + rT.deliverAt.getMinutes() + "m past the hour. "; return tempBasalFunctions.setTempBasal(0, 0, profile, rT, currenttemp); } From bcfd5e014998e07c905acc169c703c9fe29d594e Mon Sep 17 00:00:00 2001 From: Tim Gunn <2896311+Tornado-Tim@users.noreply.github.com> Date: Wed, 13 May 2020 11:36:32 +1200 Subject: [PATCH 08/17] revert counter logic --- .../plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java index 1032f81287..fa92994920 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java @@ -266,7 +266,7 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("exercise_mode", SMBDefaults.exercise_mode); mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target); mProfile.put("maxCOB", SMBDefaults.maxCOB); - mProfile.put("skip_neutral_temps", !pump.setNeutralTempAtFullHour()); + mProfile.put("skip_neutral_temps", pump.setNeutralTempAtFullHour()); // min_5m_carbimpact is not used within SMB determinebasal //if (mealData.usedMinCarbsImpact > 0) { // mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); From a4c5ecb9996d60f4e467917afd5f6934f4cfa766 Mon Sep 17 00:00:00 2001 From: Tim Gunn <2896311+Tornado-Tim@users.noreply.github.com> Date: Mon, 25 May 2020 22:04:53 +1200 Subject: [PATCH 09/17] Update message --- 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 a2fd3d82be..c0b38da8cc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -738,7 +738,7 @@ enableSMB_with_high_temptarget set_neutral_temps Set neutral temp basals - If enabled, it sets basal to neutral before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. + If enabled, it will cancel a temporary basal before the end of each hour. This method can help stop some pumps beeping/vibrating on the hour. Enable SMB always Enable SMB always independently to boluses. Possible only with BG source with nice filtering of data like G5 Enable SMB after carbs From f7793a77f9359b653a36c91d9c131c8dd2e6e17f Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Mon, 25 May 2020 22:32:00 +0100 Subject: [PATCH 10/17] - there are some fields hidden between implementatuon of MedtronicCommunicationManager and RileyLinkCommunicationManager (it becomes visible only if there is error in packets, which at the moment only happens with MySentry packets, which we don;t support. --- .../pump/medtronic/comm/MedtronicCommunicationManager.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java index a8405ea00d..3737dd0226 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java @@ -61,14 +61,11 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil; */ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager { - @Inject AAPSLogger aapsLogger; @Inject MedtronicPumpStatus medtronicPumpStatus; @Inject MedtronicPumpPlugin medtronicPumpPlugin; @Inject MedtronicConverter medtronicConverter; @Inject MedtronicUtil medtronicUtil; @Inject MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder; - @Inject RileyLinkServiceData rileyLinkServiceData; - @Inject ServiceTaskExecutor serviceTaskExecutor; private final int MAX_COMMAND_TRIES = 3; private final int DEFAULT_TIMEOUT = 2000; From 3bbbeed07d05a4b57eb4cfb588499d2238e626de Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Mon, 25 May 2020 22:40:55 +0100 Subject: [PATCH 11/17] - There are few fields hidden between implementations MedtronicCommunicationManager and RileyLinkCommunicationManager. If there is error in packet (if MySentry is configugured on Pump), there is NPE when trying to write to log. --- .../pump/medtronic/comm/MedtronicCommunicationManager.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java index a8405ea00d..3737dd0226 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/medtronic/comm/MedtronicCommunicationManager.java @@ -61,14 +61,11 @@ import info.nightscout.androidaps.plugins.pump.medtronic.util.MedtronicUtil; */ public class MedtronicCommunicationManager extends RileyLinkCommunicationManager { - @Inject AAPSLogger aapsLogger; @Inject MedtronicPumpStatus medtronicPumpStatus; @Inject MedtronicPumpPlugin medtronicPumpPlugin; @Inject MedtronicConverter medtronicConverter; @Inject MedtronicUtil medtronicUtil; @Inject MedtronicPumpHistoryDecoder medtronicPumpHistoryDecoder; - @Inject RileyLinkServiceData rileyLinkServiceData; - @Inject ServiceTaskExecutor serviceTaskExecutor; private final int MAX_COMMAND_TRIES = 3; private final int DEFAULT_TIMEOUT = 2000; From c5aa12c5badb36d809e0e0c8c73228b49c7f65d2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 26 May 2020 19:58:50 +0200 Subject: [PATCH 12/17] double SMB fix --- .../automation/triggers/TriggerBolusAgo.kt | 2 +- .../plugins/treatments/TreatmentService.java | 25 ++++++++++++ .../plugins/treatments/TreatmentsPlugin.java | 40 ++++++++----------- .../triggers/TriggerBolusAgoTest.kt | 4 +- ...Packet_Bolus_Get_Step_Bolus_Information.kt | 6 ++- ...aRS_Packet_General_Get_More_Information.kt | 4 +- 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgo.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgo.kt index db57bb159a..4b7a56771a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgo.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgo.kt @@ -35,7 +35,7 @@ class TriggerBolusAgo(injector: HasAndroidInjector) : Trigger(injector) { } override fun shouldRun(): Boolean { - val lastBolusTime = treatmentsPlugin.getLastBolusTime(false) + val lastBolusTime = treatmentsPlugin.getLastBolusTime(true) if (lastBolusTime == 0L) return if (comparator.value == Comparator.Compare.IS_NOT_AVAILABLE) { aapsLogger.debug(LTag.AUTOMATION, "Ready for execution: " + friendlyDescription()) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentService.java b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentService.java index 60bd9b9b8c..18d997178e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/treatments/TreatmentService.java @@ -45,6 +45,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper; import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventNewHistoryData; import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicPumpPlugin; import info.nightscout.androidaps.plugins.pump.medtronic.data.MedtronicHistoryData; +import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.FabricPrivacy; import info.nightscout.androidaps.utils.JsonHelper; import io.reactivex.disposables.CompositeDisposable; @@ -588,6 +589,30 @@ public class TreatmentService extends OrmLiteBaseService { } } + /** + * Returns the newest record with insulin > 0 + */ + @Nullable + public Treatment getLastBolus(boolean excludeSMB) { + try { + QueryBuilder queryBuilder = getDao().queryBuilder(); + Where where = queryBuilder.where(); + where.gt("insulin", 0); + where.and().le("date", DateUtil.now()); + where.and().eq("isValid", true); + if (excludeSMB) where.and().eq("isSMB", false); + queryBuilder.orderBy("date", false); + queryBuilder.limit(1L); + + List result = getDao().query(queryBuilder.prepare()); + if (result.isEmpty()) + return null; + return result.get(0); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + public void deleteNS(JSONObject json) { String _id = JsonHelper.safeGetString(json, "_id"); if (_id != null && !_id.isEmpty()) 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 0af7ac8d33..8d723cea71 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 @@ -335,33 +335,27 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface @Override public long getLastBolusTime() { - long now = System.currentTimeMillis(); - long last = 0; - synchronized (treatments) { - for (Treatment t : treatments) { - if (!t.isValid) - continue; - if (t.date > last && t.insulin > 0 && t.date <= now) - last = t.date; - } + Treatment last = getService().getLastBolus(false); + if (last == null) { + getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: NOTHING FOUND"); + return 0; + } + else { + getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: " + dateUtil.dateAndTimeString(last.date)); + return last.date; } - getAapsLogger().debug(LTag.DATATREATMENTS, "Last bolus time: " + dateUtil.dateAndTimeString(last)); - return last; } - public long getLastBolusTime(boolean isSMB) { - long now = System.currentTimeMillis(); - long last = 0; - synchronized (treatments) { - for (Treatment t : treatments) { - if (!t.isValid) - continue; - if (t.date > last && t.insulin > 0 && t.date <= now && isSMB == t.isSMB) - last = t.date; - } + public long getLastBolusTime(boolean excludeSMB) { + Treatment last = getService().getLastBolus(excludeSMB); + if (last == null) { + getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: NOTHING FOUND"); + return 0; + } + else { + getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: " + dateUtil.dateAndTimeString(last.date)); + return last.date; } - getAapsLogger().debug(LTag.DATATREATMENTS, "Last manual bolus time: " + dateUtil.dateAndTimeString(last)); - return last; } @Override diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgoTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgoTest.kt index fbc4cd8a8b..a1400ae55f 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgoTest.kt +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerBolusAgoTest.kt @@ -30,7 +30,7 @@ class TriggerBolusAgoTest : TriggerTestBase() { @Test fun shouldRunTest() { - `when`(treatmentsPlugin.getLastBolusTime(false)).thenReturn(now) // Set last bolus time to now + `when`(treatmentsPlugin.getLastBolusTime(true)).thenReturn(now) // Set last bolus time to now `when`(DateUtil.now()).thenReturn(now + 10 * 60 * 1000) // set current time to now + 10 min var t = TriggerBolusAgo(injector).setValue(110).comparator(Comparator.Compare.IS_EQUAL) Assert.assertEquals(110, t.minutesAgo.value) @@ -53,7 +53,7 @@ class TriggerBolusAgoTest : TriggerTestBase() { Assert.assertTrue(t.shouldRun()) t = TriggerBolusAgo(injector).setValue(390).comparator(Comparator.Compare.IS_EQUAL_OR_LESSER) Assert.assertTrue(t.shouldRun()) - PowerMockito.`when`(treatmentsPlugin.getLastBolusTime(false)).thenReturn(0L) // Set last bolus time to 0 + PowerMockito.`when`(treatmentsPlugin.getLastBolusTime(true)).thenReturn(0L) // Set last bolus time to 0 t = TriggerBolusAgo(injector).comparator(Comparator.Compare.IS_NOT_AVAILABLE) Assert.assertTrue(t.shouldRun()) } diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.kt index d6d7801acc..7cc2d3aa65 100644 --- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.kt +++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_Bolus_Get_Step_Bolus_Information.kt @@ -1,10 +1,11 @@ package info.nightscout.androidaps.danars.comm import dagger.android.HasAndroidInjector -import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.dana.DanaPump import info.nightscout.androidaps.danars.encryption.BleEncryption +import info.nightscout.androidaps.logging.LTag import org.joda.time.DateTime +import org.joda.time.DateTimeZone import javax.inject.Inject class DanaRS_Packet_Bolus_Get_Step_Bolus_Information( @@ -24,7 +25,8 @@ class DanaRS_Packet_Bolus_Get_Step_Bolus_Information( danaPump.initialBolusAmount = intFromBuff(data, 2, 2) / 100.0 val hours = intFromBuff(data, 4, 1) val minutes = intFromBuff(data, 5, 1) - danaPump.lastBolusTime = DateTime.now().withHourOfDay(hours).withMinuteOfHour(minutes).millis + if (danaPump.usingUTC) danaPump.lastBolusTime = DateTime.now().withZone(DateTimeZone.UTC).withHourOfDay(hours).withMinuteOfHour(minutes).millis + else danaPump.lastBolusTime = DateTime.now().withHourOfDay(hours).withMinuteOfHour(minutes).millis danaPump.lastBolusAmount = intFromBuff(data, 6, 2) / 100.0 danaPump.maxBolus = intFromBuff(data, 8, 2) / 100.0 danaPump.bolusStep = intFromBuff(data, 10, 1) / 100.0 diff --git a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Get_More_Information.kt b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Get_More_Information.kt index 4f9d15410e..0d110deb71 100644 --- a/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Get_More_Information.kt +++ b/danars/src/main/java/info/nightscout/androidaps/danars/comm/DanaRS_Packet_General_Get_More_Information.kt @@ -5,6 +5,7 @@ import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.dana.DanaPump import info.nightscout.androidaps.danars.encryption.BleEncryption import org.joda.time.DateTime +import org.joda.time.DateTimeZone import javax.inject.Inject class DanaRS_Packet_General_Get_More_Information( @@ -30,7 +31,8 @@ class DanaRS_Packet_General_Get_More_Information( // val remainRate = intFromBuff(data, 7, 2) / 100.0 val hours = intFromBuff(data, 9, 1) val minutes = intFromBuff(data, 10, 1) - danaPump.lastBolusTime = DateTime.now().withHourOfDay(hours).withMinuteOfHour(minutes).millis + if (danaPump.usingUTC) danaPump.lastBolusTime = DateTime.now().withZone(DateTimeZone.UTC).withHourOfDay(hours).withMinuteOfHour(minutes).millis + else danaPump.lastBolusTime = DateTime.now().withHourOfDay(hours).withMinuteOfHour(minutes).millis danaPump.lastBolusAmount = intFromBuff(data, 11, 2) / 100.0 // On DanaRS DailyUnits can't be more than 160 if (danaPump.dailyTotalUnits > 160) failed = true From 6f7932f1c7b9d8e26857bb48aa75a9d92e7f37b2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 26 May 2020 20:29:59 +0200 Subject: [PATCH 13/17] New Crowdin translations (#2671) * New translations strings.xml (German) * New translations strings.xml (German) * New translations strings.xml (German) * New translations strings.xml (German) * New translations strings.xml (Portuguese, Brazilian) * New translations strings.xml (Swedish) * New translations strings.xml (Slovak) * New translations strings.xml (Russian) * New translations strings.xml (Portuguese) * New translations strings.xml (French) * New translations strings.xml (Italian) * New translations strings.xml (German) * New translations strings.xml (Russian) * New translations strings.xml (Czech) * New translations strings.xml (Czech) * New translations strings.xml (German) * New translations strings.xml (German) * New translations strings.xml (Italian) * New translations strings.xml (Italian) * New translations strings.xml (Czech) --- app/src/main/res/values-cs-rCZ/strings.xml | 43 ++++++++++++++ app/src/main/res/values-de-rDE/strings.xml | 69 +++++++++++----------- app/src/main/res/values-fr-rFR/strings.xml | 1 - app/src/main/res/values-it-rIT/strings.xml | 3 + app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ru-rRU/strings.xml | 7 ++- app/src/main/res/values-sk-rSK/strings.xml | 1 - app/src/main/res/values-sv-rSE/strings.xml | 1 - 9 files changed, 88 insertions(+), 39 deletions(-) diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 691837ca7e..aa081ca187 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -264,6 +264,9 @@ Pro zadání %1$dg na %2$s odpovězte pomocí SMS s kódem %3$s Pro spuštění bazálu %1$d%% na %2$d min odpovězte SMS s kódem %3$s K pozastavení smyčky na %1$d minut odpověz SMS s kódem %2$s + Chcete-li obnovit smyčku, odpovězte SMS s kódem %1$s + Chcete-li povolit smyčku, odpovězte SMS s kódem %1$s + Chcete-li zakázat smyčku, odpovězte SMS s kódem %1$s Dočasný bazál %1$.2fU/h na %2$d minut spuštěn Prodloužený bolus %1$.2fU na %2$d min úspěšně spuštěn Sacharidy %1$dg byly úspěšně zadány @@ -468,6 +471,8 @@ Proveďte přepnutí profilu Stáří baterie v pumpě Nastavení alarmů + Vytvořit oznámení z alarmů NS + Vytvořit oznámení z NS upozornění Mezní hodnota pro zastaralá data [min] Urgentní mezní hodnota pro zastaralá data [min] Interval pro detekci senzitivity [h] @@ -845,6 +850,10 @@ Zaznamenat výstrahy Povolit emulaci dočasných bazálů Používat prodloužené bolusy na obejití limitu dočasných bazálů 250%% + Zakázat vibrace při ručním podání bolusu + Pro bolus a prodloužený bolus (dostupné pouze s Insight firmware 3.x) + Zakázat vibrace při automatickém podání bolusu + Pro SMB a Dočasný bazál s emulací TBR (k dispozici pouze s Insight firmware 3.x) Limit pro odpojení [s] Sériové číslo Verze softwaru @@ -1341,9 +1350,43 @@ %1$.1f U %1$.1f U, Sach=%2$.1f g Rychlost: %1$.1f U, doba trvání: %2$d min + Pokud stisknete OK, stav Podu bude vynuceně resetován a již nebudete moci komunikovat s Podem. Udělejte to pouze v případě, že s Podem již nelze komunikovat. Pokud stále můžete komunikovat s Podem, použijte volbu Deaktivovat Pod. + Historie Podu není v daném okamžiku k dispozici. + Naplňte Pod + \nNaplňte nový Pod dostatkem inzulínu na 3 dny.\n\nSledujte dvě pípnutí z Podu během procesu plnění. Tyto ukazují, že minimální množství 85U bylo naplněno. Ujistěte se, že stříkačka je zcela vyprázdněná a to i po vyslechnutí dvou pípnutí.\n\nPo naplnění Podu, prosím, stiskněte Další.\n\nPoznámka: prozatím nesundavejte kryt jehly. + Plnění + Snažím se spárovat s novým Podem a naplnit ho.\n\nJakmile budou zaškrtnuty všechny položky, můžete stisknout Další.\n\nPoznámka: ponechte prosím Pod velmi blízko RileyLinku. + Nasaďte Pod + \nPřipravte infuzní místo. Odstraňte krytku jehly a náplasti a nalepte Pod.\n\nPokud se kanyla odlepí, stiskněte Zrušit a zahoďte Pod.\n\nStiskněte Další pro vložení kanyly a spuštění bazálů. + Vkládání kanyly + Snažím se nastavit počáteční základní bazální plán a vložit kanylu.\n\nPři zaškrtnutí všech položek můžete stisknout tlačítko Další. + Pod Info + \nPod je nyní aktivní.\n\nVáš bazál byl naprogramován a kanyla byla vložena.\n\nOvěřte, prosím, že kanyla byla vložena správně a případně vyměňte Pod. Deaktivovat Pod + \nStiskněte Další pro deaktivaci Podu.\n\nPoznámka: Zastavíte veškerý výdej inzulínu a deaktivujete Pod. + Deaktivace Podu + Deaktivace Podu.\n\nKdyž jsou zaškrtnuty všechny položky, můžete stisknout Další.\n\nPoznámka: Pokud deaktivace nepřetržitě selhává, prosím stiskněte Zrušit a použijte možnost Resetovat Pod pro resetování stavu Podu. + Pod deaktivován.\n\nOdstraňte Pod z těla a znehodnoťte jej. + Párování Podu + Plnění Podu + Plnění kanyly Nastavit bazální profil + Zrušit podávání Deaktivovat Pod + Integrace pumpy pro Omnipod Dash. + Upomínka dokončení párování + Upomínka dokončení nastavení + Životnost Podu brzy skončí + Pod brzy vyprší + Blíží se vypnutí + Nízký stav zásobníku + Neznámá výstraha + Nastavení bazálního profilu se možná nezdařilo. Výdej může být pozastaven! Obnovte prosím stav Podu. + Nastavení dočasného bazálu mohlo být neúspěšné. Pokud je dočasný bazál již spuštěn, mohl by být zrušen! Aktualizujte prosím stav Podu. + Nastavení času se možná nezdařilo. Výdej může být pozastaven! Obnovte prosím stav Podu. + Nelze ověřit, zda byl bolus úspěšný. Ověřte prosím, zda Váš Pod dodává bolus nebo ho zrušte. + Statistika RL + Pulse Log diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index e084f0475b..380b19dc9e 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -18,7 +18,7 @@ Einige Schaltflächen, um auf häufig verwendete Funktionen zugreifen zu können. Dient zum Konfigurieren der aktiven Plugins Das Programm kennenlernen - Zeigt die Essens-Vorlagen aus Nightscout an + Zeigt die Essensvorlagen aus Nightscout an Insulinprofil für Humalog und NovoRapid / NovoLog Insulinprofil für Fiasp Erlaubt dir, das Wirkmaximum der Insulinaktivität zu definieren, und sollte nur von erfahrenen Anwendern genutzt werden @@ -27,26 +27,26 @@ Stand des Algorithmus in 2016 Stand des Algorithmus in 2017 Der aktuellste Algorithmus für erfahrene Nutzer - Zeigt den aktuellen Status deines Loops und Knöpfe für die geläufigsten Aktionen an + Zeigt den aktuellen Status deines Loops und Schaltflächen für die geläufigsten Aktionen an Zeigt eine fortlaufende Benachrichtigung mit einer kurzen Übersicht darüber, was dein Loop derzeit tut Definiere ein Profil, was auch offline verfügbar ist. Stellt das Profil zur Verfügung, das in Nightscout definiert ist Definiere ein Profil mit nur einem Zeitblock. Pumpen-Integration für Accu-Chek Combo Pumpen; erfordert, dass ruffy installiert ist - Pumpen-Integration für Personen, die täglich mehrere Injektionen für ihre Diabetestherapie vornehmen - Pumpen-Integration für Pumpen, die noch nicht über einen Treiber verfügen (Open Loop) + Pumpenintegration für Personen, die täglich mehrere Injektionen für ihre Diabetestherapie vornehmen + Pumpenintegration für Pumpen, die noch nicht über einen Treiber verfügen (Open Loop) Die Sensitivität wird genauso wie bei Oref0 berechnet, aber Du kannst dafür ein Zeitfenster bestimmen. Die minimale Kohlenhydrat-Absorptionsrate wird aus der maximalen Absorptionsdauer aus den Einstellungen abgeleitet. Die Sensitivität wird aus den Daten der letzten 8 Stunden berechnet und Kohlenhydrate (falls nicht bereits absorbiert) werden nach der in den Einstellungen angegebenen Zeit als absorbiert betrachtet. Das Plugin bezieht Zeiträume, in denen UAM annimmt, dass Kohlenhydrate aktiv waren, nicht mit in die Berechnung ein. Die Sensitivität wird aus den Abweichungen errechnet. Dabei werden neuere Abweichungen stärker gewichtet als ältere. Die minimale Kohlenhydrat-Aufnahme wird aus der in den Präferenzen angegebenen maximalen Kohlenhydrat-Resorptionszeit abgeleitet. Dieser Algorithmus reagiert am schnellsten auf Änderungen der Empfindlichkeit. - Empfange BZ-Werte von der gepatchten Eversense App. - Empfange Blutzucker-Werte von Glimp. - Empfange Blutzucker-Werte vom 600SeriesAndroidUploader. - Lade Blutzucker-Daten von Nightscout - Empfange Blutzucker-Werte von xDrip. + Empfange BZ-Werte von der gepatchten Eversense-App. + Empfange Blutzuckerwerte von Glimp. + Empfange Blutzuckerwerte vom 600SeriesAndroidUploader. + Lade Blutzuckerdaten von Nightscout + Empfange Blutzuckerwerte von xDrip. Speichert alle eingegebenen Behandlungen Überwache und steuere AndroidAPS mit Deiner WearOS-Smartwatch. Zeige Loop-Informationen auf Deinem xDrip+-Watchface. - Steuere AndroiAPS fern mittels SMS-Anweisungen. + AndroidAPS mit SMS-Befehlen fernsteuern. Insulin: Kohlenhydrate: IOB: @@ -72,7 +72,7 @@ Aktuelle TBR IOB-Daten Profil - Mahlzeiten-Daten + Mahlzeitendaten Ergebnis Ergebnis: %1$s %2$s Keine BZ-Werte verfügbar @@ -94,7 +94,7 @@ Profil Welches Profil soll AndroidAPS nutzen? APS - Welcher APS-Algorithmus soll Therapie-Anpassungen vornehmen? + Welcher APS-Algorithmus soll Therapieanpassungen vornehmen? Allgemein Dies sind einige generelle Plugins, die Du vielleicht hilfreich findest. Welche Beschränkungen werden angewendet? @@ -117,7 +117,7 @@ Akzeptiere neue TBR: Bolus Rechner - Beschränkungen angewendet! + Beschränkung angewendet! Bestätigung Bolus Bolus: @@ -135,7 +135,7 @@ Deaktiviere Loop Aktiviere Loop Neue Empfehlung verfügbar - Nicht unterstütze Nightscout-Version + Nicht unterstützte Nightscout-Version LOOP DEAKTIVIERT DURCH BESCHRÄNKUNGEN Basal-IOB Bolus-Beschränkung angewendet @@ -151,10 +151,10 @@ Prozent Absolut Notiz - Ereignis-Zeit + Ereigniszeit Profil Eingegeben durch - Glukose-Art + Glukoseart Bisher noch kein Profil von Nightscout geladen TBR Verzögerter Bolus @@ -167,10 +167,10 @@ Datei nicht gefunden Einstellungen exportieren Einstellungen importieren - Max IE/h, die als TBR gesetzt werden können + Max. IE/h, die als TBR gesetzt werden können Dieser Wert wird \"max basal\" in OpenAPS genannt. Maximales Basal-IOB, das OpenAPS abgeben darf [IE] - Maximale Menge von nicht Bolus-IOB, die OpenAPs abgeben kann. + Maximale Menge von Nicht-Bolus-IOB, die OpenAPS abgeben kann. Du wirst nach dem Master-Passwort gefragt. Mit diesem werden die exportierten Einstellungen verschlüsselt. Du wirst nach dem Master-Passwort gefragt. Mit diesem werden die importierten Einstellungen entschlüsselt. Export abgebrochen! Einstellungen wurden NICHT exportiert! @@ -201,7 +201,7 @@ Neues verschlüsseltes Format Neues Debugformat (unverschlüsselt) Unbekanntes Export-Format - Einstellungen-Datei wurde manipuliert. + Konfigurationsdatei wurde manipuliert. Einstellungsdatei ist sicher. Nicht sicheres, unverschlüsseltes Einstellungsformat verwenden Fehler im JSON-Format, fehlendes erforderliches Feld (Format, Inhalt, Metadaten oder Sicherheit) @@ -218,23 +218,23 @@ vor weniger als einer Stunde exportiert in Verzeichnis: %1$s Endbenutzervereinbarung - DAS PROGRAMM DARF NICHT FÜR MEDIZINISCHE ENTSCHEIDUNGEN BENUTZT WERDEN. ES GIBT IN DIESEM PROJEKT KEINE GEWÄHRLEISTUNG ODER GARANTIERTE UNTERSTÜTZUNG IN IRGENDEINER ART. WENN DU DICH ENTSCHEIDEST, ES ZU NUTZEN, HÄNGT DIE QUALITÄT UND LEISTUNGSFÄHIGKEIT DIESES PROJEKTES VON DIR SELBST AB. ES WIRD \"WIE BESEHEN\" ZUR VERFÜGUNG GESTELLT. SOLLTE SICH DAS PROGRAMM ALS FEHLERHAFT ERWEISEN, ÜBERNEHMEN SIE ALLE NOTWENDIGEN KRANKHEITSKOSTEN, SERVICELEISTUNGEN, REPARATUREN ODER KORREKTUREN. + DAS PROGRAMM DARF NICHT FÜR MEDIZINISCHE ENTSCHEIDUNGEN BENUTZT WERDEN. ES GIBT IN DIESEM PROJEKT KEINE GEWÄHRLEISTUNG ODER GARANTIERTE UNTERSTÜTZUNG IN IRGENDEINER ART. WENN DU DICH ENTSCHEIDEST, ES ZU NUTZEN, HÄNGT DIE QUALITÄT UND LEISTUNGSFÄHIGKEIT DIESES PROJEKTES VON DIR SELBST AB. ES WIRD \"WIE BESEHEN\" ZUR VERFÜGUNG GESTELLT. SOLLTE SICH DAS PROGRAMM ALS FEHLERHAFT ERWEISEN, ÜBERNIMMST DU ALLE NOTWENDIGEN KRANKHEITSKOSTEN, SERVICELEISTUNGEN, REPARATUREN ODER KORREKTUREN. Ich verstehe und stimme zu. Speichern Profil neuladen SMS-Kommunikator Erlaubte Telefonnummern +XXXXXXXXXX;+YYYYYYYYYY - Um einen Bolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s. + Um einen Bolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s. Um einen Mahlzeitenbolus von %1$.2f IE abzugeben, antworte mit dem Code %2$s. - Um ein Temp Target von %1$s zu setzen, antworte mit dem Code %2$s + Um ein temporäres Ziel von %1$s zu setzen, antworte mit dem Code %2$s Um das temporäre Ziel zu stoppen, antworte mit dem Code %1$s - Um den SMS Remote Service zu deaktivieren, antworte mit dem Code %1$s.\n\nBeachte, dass Du diesen nur am AAPS Master Smartphone wieder aktivieren kannst. - SMS Remote Service gestoppt. Verwende das AAPS Master, um ihn wieder zu aktivieren. + Um die SMS-Fernsteuerung zu deaktivieren, antworte mit dem Code %1$s\n\nBeachte, dass Du diesen nur am AAPS-Master-Smartphone wieder aktivieren kannst. + SMS-Fernsteuerung gestoppt. Verwende das AAPS-Master-Smartphone, um sie wieder zu aktivieren. Um die Kalibrierung %1$.2f zu senden, antworte mit dem Code %2$s. Bolus fehlgeschlagen - Minimale Dauer in Minuten, die nach einem Remote Bolus verstrichen sein muss, bevor ein neuer abgegeben werden kann. - Anzahl Minuten, die mindestens zwischen zwei Bolusgaben liegen müssen. + Minimale Dauer in Minuten, die nach einem Remote-Bolus verstrichen sein muss, bevor ein neuer abgegeben werden kann. + Anzahl der Minuten, die mindestens zwischen zwei Remote-Bolusabgaben liegen müssen. Aus Sicherheitsgründen musst Du mindestens zwei Telefonnummern eintragen, um diese Voreinstellung zu ändern. Bolus %1$.2fIE erfolgreich abgegeben Werde %1$.2fIE abgeben @@ -243,7 +243,7 @@ Ziel %1$s für %2$d Minuten Ziel %1$s für %2$d Minuten erfolgreich gesetzt. Temporäres Ziel wurde erfolgreich abgebrochen - Erlaube externe Befehle per SMS + Erlaube Fernsteuerung per SMS DanaR Profil-Einstellungen DIA [h] Dauer der Insulinwirkung @@ -264,6 +264,9 @@ Um %1$dg Kohlenhydrate um %2$s einzugeben, antworte mit dem Code %3$s Um die Basalrate von %1$d%% für %2$d Minuten zu setzen, antworte mit dem Code %3$s Um das Loopen für %1$d Minuten zu pausieren, antworte mit dem Code %2$s. + Um den Loop fortzusetzen, antworte mit dem Code %1$s + Um den Loop zu aktivieren, antworte mit dem Code %1$s + Um den Loop zu deaktivieren, antworte mit dem Code %1$s TBR mit %1$.2f IE/h für %2$d min wurde erfolgreich gestartet. Der erweiterte Bolus %1$.2f IE/h für %2$d Minuten wurde erfolgreich gestartet %1$dg Kohlenhydrate erfolgreich erfasst. @@ -276,7 +279,7 @@ TBR abgebrochen Die Abgabe des erweiterten Bolus wurde abgebrochen. Das Abbrechen der TBR ist fehlgeschlagen. - Der Abbruch des erweiterten Bolus ist fehlgeschlagen + Der Abbruch des erweiterten Bolus ist fehlgeschlagen. Unbekannter Befehl oder falsche Antwort QuickWizard QuickWizard-Einstellungen @@ -352,7 +355,7 @@ Profil Standardwert: 3\nDies ist eine wichtige Sicherheitseinstellung. Sie begrenzt das maximale Basal-IOB auf die dreifache Menge (im Standardfall) deiner größten Basalrate. In der Regel solltest Du diesen Wert nicht ändern. Aber Du solltest wissen, was \"3x max daily, 4x current\" als Sicherheitseinstellung bedeutet. Standardwert: 4\nDies ist die andere wichtige Sicherheitseinstellung, die zweite Hälfte von \"3x max daily, 4x current\". Diese Grenze beschränkt das Basal-IOB auf die (im Standardfall) vierfache Menge der aktuellen Basalrate. Dies ist wichtig, um Nutzer davor zu bewahren, zuviel Basal-Insulin zu verabreichen. Nochmals, der Standardwert ist 4x. Die meisten Nutzer werden niemals diese Einstellung verändern, sondern andere Einstellungen anpassen, um sich nicht dieser Sicherheitsgrenze zu nähern. - Standardwert: 1.2\nDies ist eine Sicherheitsgrenze für Autosens (und bald auch Autotune), die besagt, wie hoch Autosens Basalraten anpassen darf und wie niedrig der ISF (Insulin-Sensitivitäts-Faktor) und der BZ-Zielwert eingestellt werden können. 1.2 ist dabei der Multiplikationsfaktor und erlaubt eine Anpassung um 20%%. + Standardwert: 1.2\nDies ist eine Sicherheitsgrenze für Autosens (und bald auch Autotune), die besagt, wie stark Autosens Basalraten erhöhen darf und wie niedrig der ISF (Insulin-Sensitivitäts-Faktor) und der BZ-Zielwert eingestellt werden können. 1.2 ist dabei der Multiplikationsfaktor und erlaubt eine Anpassung um 20%%. Standardwert: 0.7\nDies ist die andere Sicherheitsgrenze für autosens. Sie beschränkt, wie weit Basalraten abgesenkt und wie sehr ISF und BZ-Zielwerte erhöht werden können. Autosens passt Zielwerte ebenfalls an Vorgabe: erlaubt.\nErlaubt Autosens den Ziel-BZ-Bereich in Verbindung mit ISF und Basal anzupassen. @@ -401,7 +404,7 @@ Insulinresistenter Erwachsener Bitte wähle das Patientenalter, um die Sicherheits-Limits festzulegen Name des Patienten - Gib den Namen des Patienten oder einen Spitznamen für die Unterscheidung zwischen mehreren Setups an. + Bitte gib den Namen des Patienten oder einen Spitznamen an, um mehrere Setups unterscheiden zu können. Nutzer Glimp %1$s benötigt eine deaktivierte Akku-Leistungsoptimierung, um korrekt arbeiten zu können. @@ -502,7 +505,7 @@ Abbrechen Es sind nicht alle Profile geladen! Werte nicht gespeichert! - Aktiviere die Datenübertragung zu anderen Apps (z.B. xDrip). Nicht aktivieren falls Du mehr als eine Instanz von AAPS oder NSClient installiert hast! + Aktiviere die Datenübertragung zu anderen Apps (z.B. xDrip). Nicht aktivieren, falls Du mehr als eine Instanz von AAPS oder NSClient installiert hast! Aktiviere lokale Broadcasts AKTIVITÄT & FEEDBACK CARBS & BOLUS @@ -557,10 +560,10 @@ BZ Upload Einstellungen Zeige detailliertes Delta Delta wird mit Dezimalstelle angezeigt. - Wie häufig SMBs angegeben werden (in Min.) + Wie häufig SMBs abgegeben werden (in Min.) SMB max. Minuten SMB Basal-Limit in Minuten - UAM SMB max minutes + UAM SMB max. Minuten SMB Basal-Limit in Minuten für UAM Schwellenwert für KH-Empfehlung Sende BZ-Werte zu xDrip+ diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 74f3b85a88..cf85eb4cbc 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -1374,7 +1374,6 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S Intégration de la pompe Omnipod Dash. Rappel fin d\'appairage Rappel fin de configuration - Le Pod expire bientôt Le Pod expire bientôt Arrêt imminent Réservoir bas diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 6204534b5b..7b83a52d8b 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -264,6 +264,9 @@ Per inserire %1$dg a %2$s rispondi col codice %3$s Per avviare la basale %1$d%% per %2$d min rispondi col codice %3$s Per sospendere il loop per %1$d minuti rispondi col codice %2$s + Per riprendere il loop rispondi col codice %1$s + Per abilitare il loop rispondi col codice %1$s + Per disabilitare il loop rispondi col codice %1$s Basale temporanea %1$.2fU/h per %2$d min avviata con successo Bolo esteso %1$.2fU/h per %2$d min avviato con successo CHO %1$dg inseriti con successo diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 9dabcc46a9..2d3d87cb2b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1369,7 +1369,6 @@ Integração da Bomba para Omnipod Dash. Lembrete Concluir Emparelhamento Lembrete Terminar Configuração - Pod vai expirar em breve Pod vai expirar em breve Encerramento iminente Reservatório baixo diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 6d7acb563b..9cc2bd4367 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -1369,7 +1369,6 @@ Integração da Bomba para Omnipod Dash. Lembrete Concluir Emparelhamento Lembrete Terminar Configuração - Pod vai expirar em breve Pod vai expirar em breve Encerramento iminente Reservatório baixo diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index e25728c0ba..9fd0272030 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -264,6 +264,9 @@ Чтобы ввести %1$d г в %2$s ответьте кодом %3$s Для начала подачи базала %1$d%% на %2$d мин. ответьте кодом %3$s для приостановки цикла на %1$d мин ответьте кодом %2$s + Чтобы возобновить цикл ответьте кодом %1$s + Чтобы включить цикл ответьте кодом %1$s + Чтобы отключить цикл ответьте кодом %1$s врем базал %1$.2fU/h на %2$d мин начат успешно Пролонгированный болюс %1$.2fед. на %2$d мин. начат успешно Углеводы %1$d г введены успешно @@ -468,6 +471,8 @@ Переключить профиль Батарея помпы работает опции оповещения + Создать уведомления из оповещений NS + Создать уведомления из оповещений NS Порог оповещения об устаревших данных [min] (мин) Порог тревоги об устаревших данных [min] (мин) Интервал для autosens [h] (ч) @@ -1375,7 +1380,7 @@ Context | Edit Context Интеграция с помпой Omnompod Dash. Напоминание о завершении сопряжения Напоминание о завершении настройки - Срок Pod\'a истекает в ближайшее время + Срок работы Pod\'a истекает Срок Pod\'a истекает в ближайшее время Остановка неизбежна В резервуаре мало инсулина diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index f696bd3f2c..e2e47f5a97 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -1369,7 +1369,6 @@ Integrácia pumpy pre Omnipod Dash. Pripomienka ukončenia párovania Pripomienka ukončenia nastavenia - Pod čoskoro expiruje Pod čoskoro expiruje Vypnutie je bezprostredné Nízka hladina zásobníka diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index f49188b9ff..5e43c9f113 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -1370,7 +1370,6 @@ Eversense-appen. Pumpintegration för Omnipod Dash. Påminnelse att slutföra parkoppling Påminnelse att slutföra installation - Pod kommer att gå ut inom kort Pod kommer att gå ut inom kort Pod kommer snart att stängas av Låg reservoar From 3354bb7da400c4c4a226182e7b85516bd27f7c5f Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 27 May 2020 22:57:12 +0200 Subject: [PATCH 14/17] OKDialogs ok button guard --- .../androidaps/utils/alertDialogs/OKDialog.kt | 138 ++++++++++++------ .../utils/alertDialogs/WarningDialog.kt | 36 +++-- 2 files changed, 112 insertions(+), 62 deletions(-) diff --git a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt index 2d45d2910d..c0fc646258 100644 --- a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt +++ b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/OKDialog.kt @@ -12,6 +12,7 @@ import info.nightscout.androidaps.utils.extensions.runOnUiThread object OKDialog { @SuppressLint("InflateParams") fun show(context: Context, title: String, message: String, runnable: Runnable? = null) { + var okClicked = false var notEmptytitle = title if (notEmptytitle.isEmpty()) notEmptytitle = context.getString(R.string.message) @@ -19,18 +20,21 @@ object OKDialog { .setCustomTitle(AlertDialogHelper.buildCustomTitle(context, notEmptytitle)) .setMessage(message) .setPositiveButton(context.getString(R.string.ok)) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - runOnUiThread(runnable) + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + runOnUiThread(runnable) + } } .show() .setCanceledOnTouchOutside(false) } @SuppressLint("InflateParams") - @JvmStatic - @JvmOverloads fun show(activity: Activity, title: String, message: Spanned, runnable: Runnable? = null) { + var okClicked = false var notEmptytitle = title if (notEmptytitle.isEmpty()) notEmptytitle = activity.getString(R.string.message) @@ -38,9 +42,13 @@ object OKDialog { .setCustomTitle(AlertDialogHelper.buildCustomTitle(activity, notEmptytitle)) .setMessage(message) .setPositiveButton(activity.getString(R.string.ok)) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - runnable?.let { activity.runOnUiThread(it) } + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + runnable?.let { activity.runOnUiThread(it) } + } } .show() .setCanceledOnTouchOutside(false) @@ -57,71 +65,89 @@ object OKDialog { } @SuppressLint("InflateParams") - @JvmStatic - @JvmOverloads fun showConfirmation(activity: Activity, title: String, message: Spanned, ok: Runnable?, cancel: Runnable? = null) { + var okClicked = false AlertDialogHelper.Builder(activity) .setMessage(message) .setCustomTitle(AlertDialogHelper.buildCustomTitle(activity, title)) .setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - ok?.let { activity.runOnUiThread(it) } + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + ok?.let { activity.runOnUiThread(it) } + } } .setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - cancel?.let { activity.runOnUiThread(it) } + if (okClicked) return@setNegativeButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + cancel?.let { activity.runOnUiThread(it) } + } } - .setNegativeButton(android.R.string.cancel, null) .show() .setCanceledOnTouchOutside(false) } @SuppressLint("InflateParams") - @JvmStatic fun showConfirmation(activity: Activity, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) { + var okClicked = false AlertDialogHelper.Builder(activity) .setMessage(message) .setCustomTitle(AlertDialogHelper.buildCustomTitle(activity, title)) .setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - ok?.let { activity.runOnUiThread(it) } + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + ok?.let { activity.runOnUiThread(it) } + } } .setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - cancel?.let { activity.runOnUiThread(it) } + if (okClicked) return@setNegativeButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + cancel?.let { activity.runOnUiThread(it) } + } } .show() .setCanceledOnTouchOutside(false) } - @JvmStatic - @JvmOverloads fun showConfirmation(context: Context, message: Spanned, ok: Runnable?, cancel: Runnable? = null) { showConfirmation(context, context.getString(R.string.confirmation), message, ok, cancel) } @SuppressLint("InflateParams") - @JvmStatic - @JvmOverloads fun showConfirmation(context: Context, title: String, message: Spanned, ok: Runnable?, cancel: Runnable? = null) { + var okClicked = false AlertDialogHelper.Builder(context) .setMessage(message) .setCustomTitle(AlertDialogHelper.buildCustomTitle(context, title)) .setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - runOnUiThread(ok) + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + runOnUiThread(ok) + } } .setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - runOnUiThread(cancel) + if (okClicked) return@setNegativeButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + runOnUiThread(cancel) + } } - .setNegativeButton(android.R.string.cancel, null) .show() .setCanceledOnTouchOutside(false) } @@ -136,18 +162,27 @@ object OKDialog { @JvmStatic @JvmOverloads fun showConfirmation(context: Context, title: String, message: String, ok: Runnable?, cancel: Runnable? = null) { + var okClicked = false AlertDialogHelper.Builder(context) .setMessage(message) .setCustomTitle(AlertDialogHelper.buildCustomTitle(context, title)) .setPositiveButton(android.R.string.ok) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - runOnUiThread(ok) + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + runOnUiThread(ok) + } } .setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - runOnUiThread(cancel) + if (okClicked) return@setNegativeButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + runOnUiThread(cancel) + } } .show() .setCanceledOnTouchOutside(false) @@ -157,18 +192,27 @@ object OKDialog { @JvmStatic @JvmOverloads fun showConfirmation(context: Context, title: String, message: String, ok: DialogInterface.OnClickListener?, cancel: DialogInterface.OnClickListener? = null) { + var okClicked = false AlertDialogHelper.Builder(context) .setMessage(message) .setCustomTitle(AlertDialogHelper.buildCustomTitle(context, title)) .setPositiveButton(android.R.string.ok) { dialog: DialogInterface, which: Int -> - dialog.dismiss() - SystemClock.sleep(100) - ok?.onClick(dialog, which) + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + ok?.onClick(dialog, which) + } } .setNegativeButton(android.R.string.cancel) { dialog: DialogInterface, which: Int -> - dialog.dismiss() - SystemClock.sleep(100) - cancel?.onClick(dialog, which) + if (okClicked) return@setNegativeButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + cancel?.onClick(dialog, which) + } } .show() .setCanceledOnTouchOutside(false) diff --git a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/WarningDialog.kt b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/WarningDialog.kt index 847287d57a..2894f1b8d4 100644 --- a/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/WarningDialog.kt +++ b/core/src/main/java/info/nightscout/androidaps/utils/alertDialogs/WarningDialog.kt @@ -13,31 +13,37 @@ import info.nightscout.androidaps.utils.extensions.runOnUiThread object WarningDialog { @SuppressLint("InflateParams") - @JvmStatic - @JvmOverloads fun showWarning(context: Context, title: String, message: String, @StringRes positiveButton: Int = -1, ok: (() -> Unit)? = null, cancel: (() -> Unit)? = null) { - + var okClicked = false val builder = AlertDialogHelper.Builder(context, R.style.AppThemeWarningDialog) .setMessage(message) .setCustomTitle(AlertDialogHelper.buildCustomTitle(context, title, R.drawable.ic_header_warning, R.style.AppThemeWarningDialog)) .setNegativeButton(R.string.dismiss) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - if (cancel != null) { - runOnUiThread(Runnable { - cancel() - }) + if (okClicked) return@setNegativeButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + if (cancel != null) { + runOnUiThread(Runnable { + cancel() + }) + } } } if (positiveButton != -1) { builder.setPositiveButton(positiveButton) { dialog: DialogInterface, _: Int -> - dialog.dismiss() - SystemClock.sleep(100) - if (ok != null) { - runOnUiThread(Runnable { - ok() - }) + if (okClicked) return@setPositiveButton + else { + okClicked = true + dialog.dismiss() + SystemClock.sleep(100) + if (ok != null) { + runOnUiThread(Runnable { + ok() + }) + } } } } From 1a94d3d55e12594460d9cc777379431bb85520d9 Mon Sep 17 00:00:00 2001 From: Philoul Date: Thu, 28 May 2020 16:26:57 +0200 Subject: [PATCH 15/17] Add Strings for secondary graph title for translation --- .../plugins/general/overview/OverviewMenus.kt | 22 +++++++++---------- app/src/main/res/values/strings.xml | 6 +++++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt index 1cc60f0400..02e66e4ae8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt @@ -61,16 +61,16 @@ class OverviewMenus @Inject constructor( private val config: Config ) { - enum class CharType(@StringRes val nameId: Int, @ColorRes val colorId: Int, val primary: Boolean, val secondary: Boolean) { - PRE(R.string.overview_show_predictions, R.color.prediction, primary = true, secondary = false), - BAS(R.string.overview_show_basals, R.color.basal, primary = true, secondary = false), - IOB(R.string.overview_show_iob, R.color.iob, primary = false, secondary = true), - COB(R.string.overview_show_cob, R.color.cob, primary = false, secondary = true), - DEV(R.string.overview_show_deviations, R.color.deviations, primary = false, secondary = true), - SEN(R.string.overview_show_sensitivity, R.color.ratio, primary = false, secondary = true), - ACT(R.string.overview_show_activity, R.color.activity, primary = true, secondary = true), - ABS(R.string.overview_show_absinsulin, R.color.iob, primary = false, secondary = true), - DEVSLOPE(R.string.overview_show_deviationslope, R.color.devslopepos, primary = false, secondary = true) + enum class CharType(@StringRes val nameId: Int, @ColorRes val colorId: Int, val primary: Boolean, val secondary: Boolean, @StringRes val shortnameId: Int) { + PRE(R.string.overview_show_predictions, R.color.prediction, primary = true, secondary = false, shortnameId = R.string.prediction_shortname), + BAS(R.string.overview_show_basals, R.color.basal, primary = true, secondary = false,shortnameId = R.string.basal_shortname), + IOB(R.string.overview_show_iob, R.color.iob, primary = false, secondary = true,shortnameId = R.string.iob), + COB(R.string.overview_show_cob, R.color.cob, primary = false, secondary = true,shortnameId = R.string.cob), + DEV(R.string.overview_show_deviations, R.color.deviations, primary = false, secondary = true,shortnameId = R.string.deviation_shortname), + SEN(R.string.overview_show_sensitivity, R.color.ratio, primary = false, secondary = true,shortnameId = R.string.sensitivity_shortname), + ACT(R.string.overview_show_activity, R.color.activity, primary = true, secondary = true,shortnameId = R.string.activity_shortname), + ABS(R.string.overview_show_absinsulin, R.color.iob, primary = false, secondary = true,shortnameId = R.string.abs_insulin_shortname), + DEVSLOPE(R.string.overview_show_deviationslope, R.color.devslopepos, primary = false, secondary = true,shortnameId = R.string.devslope_shortname) } companion object { @@ -80,7 +80,7 @@ class OverviewMenus @Inject constructor( fun enabledTypes(graph: Int): String { val r = StringBuilder() for (type in CharType.values()) if (setting[graph][type.ordinal]) { - r.append(type.name) + r.append(resourceHelper.gs(type.shortnameId)) r.append(" ") } return r.toString() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4a4595fab4..7c3923fd9f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -527,8 +527,14 @@ Threshold warning battery level [%] statuslights_bat_critical Threshold critical battery level [%] + PRED IOB COB + BAS + DEV + ACT + ABS + DEVSLOPE About Missing SMS permission Missing phone state permission From bef8b38b76d27eb0d600d6f2f6e96f294f9ab5a2 Mon Sep 17 00:00:00 2001 From: Philoul Date: Thu, 28 May 2020 18:06:32 +0200 Subject: [PATCH 16/17] Fix Missing COB in history browser But more calculation and slower :( --- .../iob/iobCobCalculator/IobCobCalculatorPlugin.java | 4 ++-- .../iob/iobCobCalculator/IobCobOref1Thread.java | 10 ++++++---- .../plugins/iob/iobCobCalculator/IobCobThread.java | 8 +++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java index 01e8aa2ce2..2f49cd9971 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobCalculatorPlugin.java @@ -814,9 +814,9 @@ public class IobCobCalculatorPlugin extends PluginBase implements IobCobCalculat getAapsLogger().debug(LTag.AUTOSENS, "Starting calculation thread: " + from + " to " + dateUtil.dateAndTimeString(end)); if (thread == null || thread.getState() == Thread.State.TERMINATED) { if (sensitivityOref1Plugin.isEnabled()) - thread = new IobCobOref1Thread(injector, this, from, end, bgDataReload, limitDataToOldestAvailable, cause); + thread = new IobCobOref1Thread(injector, this, treatmentsPlugin, from, end, bgDataReload, limitDataToOldestAvailable, cause); else - thread = new IobCobThread(injector, this, from, end, bgDataReload, limitDataToOldestAvailable, cause); + thread = new IobCobThread(injector, this, treatmentsPlugin, from, end, bgDataReload, limitDataToOldestAvailable, cause); thread.start(); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobOref1Thread.java b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobOref1Thread.java index ef891ff62c..ec8f711c99 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobOref1Thread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobOref1Thread.java @@ -35,6 +35,7 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCa import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.DecimalFormatter; import info.nightscout.androidaps.utils.FabricPrivacy; @@ -61,7 +62,6 @@ public class IobCobOref1Thread extends Thread { @Inject ResourceHelper resourceHelper; @Inject ProfileFunction profileFunction; @Inject Context context; - @Inject ActivePluginProvider activePluginProvider; @Inject SensitivityAAPSPlugin sensitivityAAPSPlugin; @Inject SensitivityWeightedAveragePlugin sensitivityWeightedAveragePlugin; @Inject BuildHelper buildHelper; @@ -71,6 +71,7 @@ public class IobCobOref1Thread extends Thread { private final HasAndroidInjector injector; private final IobCobCalculatorPlugin iobCobCalculatorPlugin; // cannot be injected : HistoryBrowser uses different instance + private final TreatmentsPlugin treatmentsPlugin; // cannot be injected : HistoryBrowser uses different instance private boolean bgDataReload; private boolean limitDataToOldestAvailable; private String from; @@ -78,11 +79,12 @@ public class IobCobOref1Thread extends Thread { private PowerManager.WakeLock mWakeLock; - IobCobOref1Thread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) { + IobCobOref1Thread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, TreatmentsPlugin treatmentsPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) { super(); injector.androidInjector().inject(this); this.injector = injector; this.iobCobCalculatorPlugin = iobCobCalculatorPlugin; + this.treatmentsPlugin = treatmentsPlugin; this.bgDataReload = bgDataReload; this.limitDataToOldestAvailable = limitDataToOldestAvailable; @@ -240,7 +242,7 @@ public class IobCobOref1Thread extends Thread { } } - List recentCarbTreatments = activePluginProvider.getActiveTreatments().getCarbTreatments5MinBackFromHistory(bgTime); + List recentCarbTreatments = treatmentsPlugin.getCarbTreatments5MinBackFromHistory(bgTime); for (Treatment recentCarbTreatment : recentCarbTreatments) { autosensData.carbsFromBolus += recentCarbTreatment.carbs; boolean isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled(); @@ -363,7 +365,7 @@ public class IobCobOref1Thread extends Thread { // add an extra negative deviation if a high temptarget is running and exercise mode is set // TODO AS-FIX if (false && sp.getBoolean(R.string.key_high_temptarget_raises_sensitivity, SMBDefaults.high_temptarget_raises_sensitivity)) { - TempTarget tempTarget = activePluginProvider.getActiveTreatments().getTempTargetFromHistory(bgTime); + TempTarget tempTarget = treatmentsPlugin.getTempTargetFromHistory(bgTime); if (tempTarget != null && tempTarget.target() >= 100) { autosensData.extraDeviation.add(-(tempTarget.target() - 100) / 20); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobThread.java index d5af67e3b8..f78438772f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/iob/iobCobCalculator/IobCobThread.java @@ -33,6 +33,7 @@ import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventIobCa import info.nightscout.androidaps.plugins.sensitivity.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.sensitivity.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.DecimalFormatter; import info.nightscout.androidaps.utils.FabricPrivacy; @@ -58,7 +59,6 @@ public class IobCobThread extends Thread { @Inject ResourceHelper resourceHelper; @Inject ProfileFunction profileFunction; @Inject Context context; - @Inject ActivePluginProvider activePluginProvider; @Inject SensitivityAAPSPlugin sensitivityAAPSPlugin; @Inject SensitivityWeightedAveragePlugin sensitivityWeightedAveragePlugin; @Inject BuildHelper buildHelper; @@ -68,6 +68,7 @@ public class IobCobThread extends Thread { private final HasAndroidInjector injector; private final IobCobCalculatorPlugin iobCobCalculatorPlugin; // cannot be injected : HistoryBrowser uses different instance + private final TreatmentsPlugin treatmentsPlugin; // cannot be injected : HistoryBrowser uses different instance private boolean bgDataReload; private boolean limitDataToOldestAvailable; private String from; @@ -75,11 +76,12 @@ public class IobCobThread extends Thread { private PowerManager.WakeLock mWakeLock; - @Inject IobCobThread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) { + @Inject IobCobThread(HasAndroidInjector injector, IobCobCalculatorPlugin iobCobCalculatorPlugin, TreatmentsPlugin treatmentsPlugin, String from, long end, boolean bgDataReload, boolean limitDataToOldestAvailable, Event cause) { super(); injector.androidInjector().inject(this); this.injector = injector; this.iobCobCalculatorPlugin = iobCobCalculatorPlugin; + this.treatmentsPlugin = treatmentsPlugin; this.bgDataReload = bgDataReload; this.limitDataToOldestAvailable = limitDataToOldestAvailable; @@ -237,7 +239,7 @@ public class IobCobThread extends Thread { } } - List recentCarbTreatments = activePluginProvider.getActiveTreatments().getCarbTreatments5MinBackFromHistory(bgTime); + List recentCarbTreatments = treatmentsPlugin.getCarbTreatments5MinBackFromHistory(bgTime); for (Treatment recentCarbTreatment : recentCarbTreatments) { autosensData.carbsFromBolus += recentCarbTreatment.carbs; boolean isAAPSOrWeighted = sensitivityAAPSPlugin.isEnabled() || sensitivityWeightedAveragePlugin.isEnabled(); From df0e46f47b3a39831dbb4a4e27c9c25c8ec2d2c0 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 28 May 2020 22:00:16 +0200 Subject: [PATCH 17/17] remove duplicated files --- .../androidaps/plugins/source/RandomBgPlugin.kt | 4 ++-- .../res/drawable-mdpi/icon_actions_refill.png | Bin 1161 -> 0 bytes .../res/drawable-mdpi/icon_danar_useropt.png | Bin 974 -> 0 bytes .../main/res/drawable-mdpi/icon_home_profile.png | Bin 1026 -> 0 bytes .../res/drawable-xxxhdpi/icon_local_save.png | Bin 2249 -> 0 bytes 5 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 core/src/main/res/drawable-mdpi/icon_actions_refill.png delete mode 100644 core/src/main/res/drawable-mdpi/icon_danar_useropt.png delete mode 100644 core/src/main/res/drawable-mdpi/icon_home_profile.png delete mode 100644 core/src/main/res/drawable-xxxhdpi/icon_local_save.png diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/RandomBgPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/RandomBgPlugin.kt index bb008b383b..763d5a7fb4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/RandomBgPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/RandomBgPlugin.kt @@ -55,7 +55,7 @@ class RandomBgPlugin @Inject constructor( } override fun advancedFilteringSupported(): Boolean { - return false + return true } override fun onStart() { @@ -69,7 +69,7 @@ class RandomBgPlugin @Inject constructor( } override fun specialEnableCondition(): Boolean { - return isRunningTest() || virtualPumpPlugin.isEnabled(PluginType.PUMP) && buildHelper.isEngineeringMode() + return true //isRunningTest() || virtualPumpPlugin.isEnabled(PluginType.PUMP) && buildHelper.isEngineeringMode() } override fun handleNewData(intent: Intent) { diff --git a/core/src/main/res/drawable-mdpi/icon_actions_refill.png b/core/src/main/res/drawable-mdpi/icon_actions_refill.png deleted file mode 100644 index 737cca8b004081172db6dae3f0021d3c2e9cc89f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2o;fFnVW(M3hAM`dB6B=jtV<?;Zqle1Gx6p~WYGxKbf-tXS8q>!0ns}yePYv5bpoSKp8QB{;0T;&&% zT$P<{nWAKG$7NGt1vDTxwIorYA~z?m*s8)-32d$vkPQ;nS5g2gDap1~as*kZ5aAo3 z;GAESs$i;TrkiYNY@uLosb^?vX<=ldqhMrUXr^yqsc&eaYhY+)U}!BPbD zzk=sFD+UIppPnv`AsLNtZ}@hEhe{m(c)lm~l~+~Z=}S3*J-arPco|RNaLE!4+|0pg zo@&Ojc8zORkfSd5EDaYSULUS4tx7^JVZu+ir#)1@^o_{~Dc;08Hr9mr0w5EEcF3Qk0wA#NS+h%=fg5*2j@8N|a@sIyR z95e2JcjnW}wl&+2r)ll_sPruM`Cj>p&ABhU&%ZlTwx?ac$o`I(qV`9_XG?yw?K_d+-1=>?q4LuDCsNyzIxlH0OR76H|CFg- zZjQwKqdeLjfQ{0d4dd*aK)>KdQQnCTd_s1;)SGt)kA_Jc9n)1%CG%ZkTiJ{7U zwWt-&E_3TjPI0r$UDW#fqhqJ@Ql~cazj_zfTNi5UrCl-QjXuhMQ*qnjn^U+X@0HFI z;6C_u=2ss<=?$z&$zO{W+8+(fPEfMZ`S-|VBS($d;=bKSDyn$?tK9Z({U^fxQ+Mg+ zBRg)W9mzQ!C&=Muy>Mr2&ayhe?(=N(4u!YwTd*g4uHQ?ZKic2!?5$v5eW{f1KKI4i zB&Jx6ZHJhZ`jbujM1B?a1}TakJ(ix){p~@qjecMAy91LK-}tXmHhq3a-c=LfQitn( wzmGN^y7Og?KgW-Q3Eh2O?-*lY>F?1G{)IVxH;U(Wvw}(xPgg&ebxsLQ08v@%WB>pF diff --git a/core/src/main/res/drawable-mdpi/icon_danar_useropt.png b/core/src/main/res/drawable-mdpi/icon_danar_useropt.png deleted file mode 100644 index 1fadcd446be0340737c1c7997a79fae7789e4589..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmV;<12O!GP)zn|30>}yC8`SJ9d6D!4r6<5y zSn@991R*D=dxGE_z|y;L0;;Ee6FnwlGal^LLjEK#m>I_J^ZVY<7(N^h2f7q|yci|} znI2;x(^m{+`if6o+ZC1ZgosA?xXHZqwX1t|S~R0F4vFYN3>8E)>xxikGJ{7RwBa!k zt-88rmoYPHIDR&qVC zKG$rqgWM93&b9UP%u5@~(UlB8xf_e6dw$a5^VBd;6~w=0Ub-=iSHe|hb-Lf8-U#pUVa~*Omnlkmidy0_Z6tdciDJ8LqT#p!2HESA`v2~4-a3v$XvNg=B zr<=>cinR)B;T_#`RVl>mIIxt;{AB<3=)>m*$YnR0TWYK*dFsN2`psszqmY%_m&1GE{=>mmq1}H*HgF zVN1q%^QeqxHQ(9717FZg&Y=Ig2C{0uqGJ3AR%FnE%neiTQYgnoRL1PF7gY8gJh6sc zUU;6{8F;LAKa~J%?6l5isPHQ~?wSMnq|tBPqFAazs^;(D;Sr3xMJ!4~RZ9M;w>_)kl+La@~@R`~Ja#Nn* zLhO_voIHa9w}MpIJ0WBkAiX|CWn6&t7MBlM1xN~eA+ZEw>VY_+^&^0IHxLQ~CEkwA z;-R#11aKvj8;-z?dzOo;KOiRKXCvl(kTUJVxJL1{M%yP%mR*3Xwnkz&G6-G`an&80 z8^e`MovvA0OEimxw$?XDZ(l*GaqOIP1kkH8AH1%$Q{xyiQkNpK$NDRo)dc1)EsyiN z=DL@F;v~8>eDz%&`mZkmZGgV*mtiT_5v%s3DY|^uT&4NWe$wcS3^cDdr-kXAL0jnj wPYoCIW7EIJ@B?jMF_7si1~Prc<&YtwKfx`30dj}THUIzs07*qoM6N<$f^F!>M*si- diff --git a/core/src/main/res/drawable-mdpi/icon_home_profile.png b/core/src/main/res/drawable-mdpi/icon_home_profile.png deleted file mode 100644 index f689df10c6be8d709ccdbf9a221a424d39f094a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1026 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2o;fFnVW(M3hAM`dB6B=jtV<?;Zqle1Gx6p~WYGxKbf-tXS8q>!0ns}yePYv5bpoSKp8QB{;0T;&&% zT$P<{nWAKG$7NGt1vDTxwIorYA~z?m*s8)-32d$vkPQ;nS5g2gDap1~as*kZ5aAo3 z;GAESs$i;TrkiYNY@uLosb^?vX<=ldqhMrUXr^yqsc&eaYhY+)U}!BPbD zzk=sFD+UIpB2O2`kc`H+GyJ_p6Ge{A-|3<1@=#0jKg+hYOY$eAOwoH4yn~0!{44J& zS8nmGZ-jRkP2l1-*E{01m`Tvtz|k?LGqb)<_nD9EvWwR5_uj4My(cd-3Wk&I#`%x)pBF`-}FETD?ZPT$a=i5Dz%iulB`5ikY&F$jfu4)N7 zAG}&=Wq8p1qn4iHs=T|tIC|>e{a9@N-RaVvC92)2p4yY@yv|l;sUEORXl|aVWpOz; zG|Q}Ew?lL65;wQi9gII%zKBS?+_*EVr|s3M)XdsxCD(XsFV26uQ6~}Gmm81bYI*3&~DEJzXV0~6qN%f zJl1`aEzp{szf6!(_P`opW66Y+OIOcEt)Er?&1>$yZ7ROI&)YL)?Y))xI@I{9)Wl1F z6&^b~+;uOn*%v36`_(MqSKZW)cIM?FmsG9mlryiN)!p%US1-%t=;w2HN^iS=>~`br z1G{ENZ{JvU`sMkn|Mp#sF5Jv-p?JSx@&Vn1-oKHX=Lm;QHoV}ae0}Z&+k~wSKl)tf zg|0riT9@y4^Y=l+Bz@L1#;rX{=PM6I7DDOezSqi9i?XT0?;?xNj|>eD7~WaW8Q z?EEwQe|D+IE}fS%mRz57ZPgab+@IEy;#MZ`Xa3MX0!sy%b&PWJQ=g?)M6iIeuBWS? J%Q~loCIAqCoaO)k diff --git a/core/src/main/res/drawable-xxxhdpi/icon_local_save.png b/core/src/main/res/drawable-xxxhdpi/icon_local_save.png deleted file mode 100644 index f2ecc45ac029723637b70dfd5093978a97a8c84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2249 zcmb_e`#;l*8=sTDnM-X-e!ZR_p4W4Ub8$YTAd8fRKp+YZ zM7*oS3nXZh`H#fn(pw%%9MqQx20$Q&hyR9DP{>s$2t+2-0dIFaIOFT6o$JWK9S!2Z z_8-sgdsj}hO*%J14^n0FyCMoHQk77*E>AapI_C?&c6)WuTYCDuN8 zH1PCS>F)b;0sNGEt9L|1%%{%DNeX1X{6X;Ln*(s@LoLMvcEHU@B4jfQB8!$n;D6I& zNV~xP?Sz=ULngc+J;XN3cROzI+LHT76wH~;ZAnu*9aafU6Z(30p`vX2rF(`i{<2-& zJL|XX#VJZ(Lr3{mk56V9os%0VgFzinIE5o{DFFp!bJwMUVYro{S8fZlx+bt9 ztU-d#f&qBQ)od|B_`H69u%$)ZXf72?>kLrklFFHnE_}Xxt;y4v8BjQy`~CTh+g>EM zB#qm0!r7SACXVG@vc3WZ+P#EO=Yy1f`>n0`e!*@d36=?t!Uf;=(CBzTiEK(!=1O08!<)ckDE)$7(s3ohRSzaez(kB8SdI`1 z35nLv5Od4~bU(bS4Zj$VcYRjYS{!JgJK)%XWFguG9J=l@Lx5zZc1*AluPJO#_R_N` z_cWp`^}CdlDmT8?5W_<7C9-2Z-sj^US#8(+GZlOB^l%*|o>%t7Y?ZdLT!_i?Vdzsx zpXn)X{Ng40TI$L&&mOo)R0&x9D5&!9>-`!#EquG%;}C`9r&5*0@@YC%)7({C_IQ2F zhUBzPu;H9$TGK$!stz6WYDCy{>An&AaM!32&d=ok?6nIb@nB=uV75f3y0Lx*E^x!T z-}t#J)#gDexfgq+KStSt_7oPE#6m4KRl1oiz8lMP<{Ku+9j-nI{Blsgw>4J2#aDQb zYd%BAlP|WpNCsruU_R}I`HTe`93!f-DApTnmw) zxxoaX4C*H9=o}+GQ_I3m&Rqs^U$4EMW?|lSag#x-w&U#6F3#N;qUAIywR;AK^?VU5 ziEk4vk$Q-PnPt(=QZ0@lI_}SNdTjG`s<7M+V1>wf8+{ziw_FbUlsf`*h}6KXQhkqS zVmnk=z-LtIaVE%TG~dj1QQ?Lh01m1}HFElt&{$J{Jtk<4Qlw}{O9*ZBr&kTxBUsvE z0x`to_rFux$r=i<_JWMGI~s6@?hyI+U2m;j4-S zD~N&SD|?At>*oWd6~wI)o_xZoPTjBR&6jS0F(x^)uwW?td;W}S^0JO+{$MD8HQux1 z$aKUd!UuKD8ioNc_zv)aAd>9#oY;>hp#MqniDsvxm|4K8R#E%BI>{+q$Hz#qZDlyi z^@WmHkB|}n^MhFY`qdkcqc&4FbgY`~WwJ*LJ^hYFcM4`+8rR#22sXk_|4Kb_P}vNz zaoN0hJxLR3GnF__xl1$fPbhN^)qjNMi_}WkWOYH-IOS~J57*zI7GHj2W8-{&y+F|W zet6zaQ4`F`tpvICkbo&gfq&&nyE=_K?=tZeRcYG-A zaw%1P1eoy9->vv?n