From 7ef5b4fb28f1804be7fde74bdcd3b36001dcae36 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Mon, 16 Apr 2018 20:31:37 +0200 Subject: [PATCH 001/152] More realistic colored IAGE warnings Normaly Insulin should be stable at least 4-5 days. So I think a warning after two days and a red alarm after three is two early. I changed the default values to 72 hours for the yellow and 86 hours for the red warning. --- .../androidaps/plugins/Careportal/CareportalFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 8a8a730bb3..5335ee05e5 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 @@ -216,8 +216,8 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli CareportalEvent careportalEvent; NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); - double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 72); - double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 48); + double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 86); + double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 72); double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 72); double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 48); double sageUrgent = nsSettings.getExtendedWarnValue("sage", "urgent", 166); From ca5001e3a477b3762d0bc7f63457265da0820582 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Tue, 17 Apr 2018 14:42:41 +0200 Subject: [PATCH 002/152] Update CareportalFragment.java --- .../androidaps/plugins/Careportal/CareportalFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5335ee05e5..4719ed525c 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 @@ -216,7 +216,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli CareportalEvent careportalEvent; NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); - double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 86); + double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 96); double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 72); double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 72); double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 48); From e8406320e0db8fd436bbf4e99a52fcc9dad851c6 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 11:48:00 +0200 Subject: [PATCH 003/152] COB settings --- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/pref_absorption_aaps.xml | 4 ++-- app/src/main/res/xml/pref_absorption_oref0.xml | 13 +++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index abdb0e1160..8dcce74685 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -995,4 +995,6 @@ openapsmb_max_iob Maximum total IOB OpenAPS can\'t go over [U] This value is called Max IOB in OpenAPS context\nOpenAPS will not add more insulin if current IOB is greater than this value + Meal max absorption time [h] + Time at which any meal is considered absorbed. Remaining carbs will be cut off. diff --git a/app/src/main/res/xml/pref_absorption_aaps.xml b/app/src/main/res/xml/pref_absorption_aaps.xml index f86a21ec88..e5dab3128e 100644 --- a/app/src/main/res/xml/pref_absorption_aaps.xml +++ b/app/src/main/res/xml/pref_absorption_aaps.xml @@ -6,10 +6,10 @@ android:title="@string/absorptionsettings_title"> + + From 00c05c0e230591d7a3c5c2bfb092cca882897815 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 12:57:13 +0200 Subject: [PATCH 004/152] totalMinCarbsImpact depending on sensitivty plugin --- .../info/nightscout/androidaps/Constants.java | 1 + .../plugins/IobCobCalculator/AutosensData.java | 8 +++++--- .../plugins/IobCobCalculator/IobCobThread.java | 17 ++++++++++++++--- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/pref_absorption_oref0.xml | 2 +- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java index aeb4977584..56fd2b6de9 100644 --- a/app/src/main/java/info/nightscout/androidaps/Constants.java +++ b/app/src/main/java/info/nightscout/androidaps/Constants.java @@ -59,6 +59,7 @@ public class Constants { //Autosens public static final double DEVIATION_TO_BE_EQUAL = 2.0; + public static final double DEFAULT_MAX_ABSORPTION_TIME = 6.0; // Pump public static final int PUMP_MAX_CONNECTION_TIME_IN_SECONDS = 120 - 1; 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 397656306b..4fe46f3a80 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 @@ -7,9 +7,11 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; +import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; @@ -34,14 +36,14 @@ public class AutosensData { carbs = t.carbs; remaining = t.carbs; if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { - double maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, 4d); + double maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME); Profile profile = MainApp.getConfigBuilder().getProfile(t.date); double sens = Profile.toMgdl(profile.getIsf(t.date), profile.getUnits()); double ic = profile.getIc(t.date); min5minCarbImpact = t.carbs / (maxAbsorptionHours * 60 / 5) * sens / ic; log.debug("Min 5m carbs impact for " + carbs + "g @" + new Date(t.date).toLocaleString() + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic); } else { - min5minCarbImpact = SP.getDouble("openapsama_min_5m_carbimpact", 3.0); + min5minCarbImpact = SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact); } } } @@ -73,7 +75,7 @@ public class AutosensData { return (int) ((System.currentTimeMillis() - time) / 1000 / 60); } - // remove carbs older than 4h + // remove carbs older than timeframe public void removeOldCarbs(long toTime) { for (int i = 0; i < activeCarbsList.size(); i++) { CarbsInPast c = activeCarbsList.get(i); 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 e3f12cbea6..7789f8a5a6 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 @@ -20,12 +20,17 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; +import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; +import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.FabricPrivacy; +import info.nightscout.utils.SP; /** * Created by mike on 23.01.2018. @@ -199,9 +204,15 @@ public class IobCobThread extends Thread { if (previous != null && previous.cob > 0) { // calculate sum of min carb impact from all active treatments double totalMinCarbsImpact = 0d; - for (int ii = 0; ii < autosensData.activeCarbsList.size(); ++ii) { - AutosensData.CarbsInPast c = autosensData.activeCarbsList.get(ii); - totalMinCarbsImpact += c.min5minCarbImpact; + if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { + //when the impact depends on a max time, sum them up as smaller carb sizes make them smaller + for (int ii = 0; ii < autosensData.activeCarbsList.size(); ++ii) { + AutosensData.CarbsInPast c = autosensData.activeCarbsList.get(ii); + totalMinCarbsImpact += c.min5minCarbImpact; + } + } else { + //Oref sensitivity + totalMinCarbsImpact = SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact); } // figure out how many carbs that represents diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8dcce74685..c721b7adb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -619,6 +619,8 @@ Sensitivity AAPS Absorption settings absorption_maxtime + absorption_cutoff + Meal max absorption time [h] Time in hours where is expected all carbs from meal will be absorbed rangetodisplay diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml index bac14608c7..4cdd7fb8f0 100644 --- a/app/src/main/res/xml/pref_absorption_oref0.xml +++ b/app/src/main/res/xml/pref_absorption_oref0.xml @@ -28,7 +28,7 @@ android:maxLines="20" android:title="@string/absorption_cutoff_title" android:dialogMessage="@string/absorption_cutoff_summary" - android:key="@string/key_absorption_maxtime" /> + android:key="@string/key_absorption_cutoff" /> From f4dea97f3638f6387f98679afc3346e22d61c11d Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 13:04:21 +0200 Subject: [PATCH 005/152] cutoff at max absorption time --- .../plugins/IobCobCalculator/AutosensData.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 4fe46f3a80..b4013a7a3c 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 @@ -77,13 +77,19 @@ public class AutosensData { // remove carbs older than timeframe public void removeOldCarbs(long toTime) { + double maxAbsorptionHours = Constants.DEFAULT_MAX_ABSORPTION_TIME; + if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } else { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_cutoff, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } for (int i = 0; i < activeCarbsList.size(); i++) { CarbsInPast c = activeCarbsList.get(i); - if (c.time + 4 * 60 * 60 * 1000L < toTime) { + if (c.time + maxAbsorptionHours * 60 * 60 * 1000L < toTime) { activeCarbsList.remove(i--); if (c.remaining > 0) cob -= c.remaining; - log.debug("Removing carbs at "+ new Date(toTime).toLocaleString() + " + after 4h :" + new Date(c.time).toLocaleString()); + log.debug("Removing carbs at "+ new Date(toTime).toLocaleString() + " + after "+ maxAbsorptionHours +"h :" + new Date(c.time).toLocaleString()); } } } From 09cc8c01b645ecfe89d27314fffcd0b9b05b0996 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 13:31:34 +0200 Subject: [PATCH 006/152] use min5min impact actually used for SMB --- .../java/info/nightscout/androidaps/data/MealData.java | 1 + .../plugins/IobCobCalculator/AutosensData.java | 2 ++ .../plugins/IobCobCalculator/IobCobThread.java | 1 + .../plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java | 8 ++++++-- .../plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java | 9 ++++++--- .../androidaps/plugins/Source/SourceXdripPlugin.java | 2 +- .../androidaps/plugins/Treatments/TreatmentsPlugin.java | 1 + 7 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/data/MealData.java b/app/src/main/java/info/nightscout/androidaps/data/MealData.java index 054c76d602..8acf4285bf 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/MealData.java +++ b/app/src/main/java/info/nightscout/androidaps/data/MealData.java @@ -11,4 +11,5 @@ public class MealData { public double slopeFromMinDeviation = 999; public long lastBolusTime; public long lastCarbTime = 0L; + public double usedMinCarbsImpact = 0d; } 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 b4013a7a3c..85dc6999a0 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 @@ -65,6 +65,8 @@ public class AutosensData { public double autosensRatio = 1d; public double slopeFromMaxDeviation = 0; public double slopeFromMinDeviation = 999; + public double usedMinCarbsImpact = -0; + @Override public String toString() { 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 7789f8a5a6..60d315a070 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 @@ -222,6 +222,7 @@ public class IobCobThread extends Thread { // and add that to the running total carbsAbsorbed autosensData.cob = Math.max(previous.cob - autosensData.absorbed, 0d); autosensData.substractAbosorbedCarbs(); + autosensData.usedMinCarbsImpact = totalMinCarbsImpact; } autosensData.removeOldCarbs(bgTime); autosensData.cob += autosensData.carbsFromBolus; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index 96e004d996..928987393d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -213,8 +213,12 @@ public class DetermineBasalAdapterAMAJS { mProfile.put("current_basal", basalrate); mProfile.put("temptargetSet", tempTargetSet); mProfile.put("autosens_adjust_targets", SP.getBoolean("openapsama_autosens_adjusttargets", true)); - //TODO: align with max-absorption model in AMA sensitivity - mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); + //align with max-absorption model in AMA sensitivity + if(mealData.usedMinCarbsImpact >0){ + mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); + } else { + mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); + } if (units.equals(Constants.MMOL)) { mProfile.put("out_units", "mmol/L"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java index 89bf8431f4..b28ce599f7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java @@ -243,9 +243,12 @@ public class DetermineBasalAdapterSMBJS { 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); - //TODO: align with max-absorption model in AMA sensitivity - mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); - ; + //align with max-absorption model in AMA sensitivity + if(mealData.usedMinCarbsImpact >0){ + mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); + } else { + mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); + } mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap); mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false)); mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java index 0d33f529b3..bfc1a184ff 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java @@ -29,6 +29,6 @@ public class SourceXdripPlugin extends PluginBase implements BgSourceInterface { @Override public boolean advancedFilteringSupported() { - return false; + return true; } } 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 2f5135c0cb..c3198f752a 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 @@ -235,6 +235,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface result.mealCOB = autosensData.cob; result.slopeFromMinDeviation = autosensData.slopeFromMinDeviation; result.slopeFromMaxDeviation = autosensData.slopeFromMaxDeviation; + result.usedMinCarbsImpact = autosensData.usedMinCarbsImpact; } result.lastBolusTime = getLastBolusTime(); return result; From d7bf3c563a72af08da7ca36a6c763d511fcd07bf Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 13:35:52 +0200 Subject: [PATCH 007/152] cleanup --- .../nightscout/androidaps/plugins/Source/SourceXdripPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java index bfc1a184ff..0d33f529b3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java @@ -29,6 +29,6 @@ public class SourceXdripPlugin extends PluginBase implements BgSourceInterface { @Override public boolean advancedFilteringSupported() { - return true; + return false; } } From 8d94acb0515f9a8530fe25eadf59021bd7831d4c Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 13:44:06 +0200 Subject: [PATCH 008/152] more cleanups --- .../androidaps/plugins/IobCobCalculator/AutosensData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 85dc6999a0..11b86c5fc5 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 @@ -65,7 +65,7 @@ public class AutosensData { public double autosensRatio = 1d; public double slopeFromMaxDeviation = 0; public double slopeFromMinDeviation = 999; - public double usedMinCarbsImpact = -0; + public double usedMinCarbsImpact = 0d; @Override From d810be9b6a52ed108baf5a1ed3b93f74ec028d26 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 14:03:30 +0200 Subject: [PATCH 009/152] consider absorption time for carbs - not DIA --- .../plugins/Treatments/TreatmentsPlugin.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) 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 c3198f752a..feb99d5166 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 @@ -40,6 +40,8 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; +import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; +import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; @@ -211,22 +213,35 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (profile == null) return result; long now = System.currentTimeMillis(); - long dia_ago = now - (Double.valueOf(1.5d * profile.getDia() * T.hours(1).msecs())).longValue(); + long dia_ago = now - (Double.valueOf(profile.getDia() * T.hours(1).msecs())).longValue(); + + double maxAbsorptionHours = Constants.DEFAULT_MAX_ABSORPTION_TIME; + if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } else { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_cutoff, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } + long absorptionTime_ago = now - (Double.valueOf(maxAbsorptionHours * T.hours(1).msecs())).longValue(); synchronized (treatments) { for (Treatment treatment : treatments) { if (!treatment.isValid) continue; long t = treatment.date; + if (t > dia_ago && t <= now) { - if (treatment.carbs >= 1) { - result.carbs += treatment.carbs; - result.lastCarbTime = t; - } if (treatment.insulin > 0 && treatment.mealBolus) { result.boluses += treatment.insulin; } } + + if (t > absorptionTime_ago && t <= now) { + if (treatment.carbs >= 1) { + result.carbs += treatment.carbs; + if(t > result.lastCarbTime) + result.lastCarbTime = t; + } + } } } From ed24a129ae2ff846513dcbaf43110a2f70fffaf8 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 19:32:50 +0200 Subject: [PATCH 010/152] unify Default in settings xml and constants --- app/src/main/res/xml/pref_absorption_oref0.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml index 4cdd7fb8f0..a194b754a9 100644 --- a/app/src/main/res/xml/pref_absorption_oref0.xml +++ b/app/src/main/res/xml/pref_absorption_oref0.xml @@ -8,7 +8,7 @@ validate:testType="floatNumericRange" validate:floatminNumber="0.1" validate:floatmaxNumber="12.0" - android:defaultValue="3.0" + android:defaultValue="8.0" android:selectAllOnFocus="true" android:singleLine="true" android:inputType="numberDecimal" From 9e9270bff7e38c16923b961845fbf5de2ab3bec2 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 19 Apr 2018 19:34:38 +0200 Subject: [PATCH 011/152] cleanups --- .../plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java | 2 +- .../plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index 928987393d..89739ef626 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -214,7 +214,7 @@ public class DetermineBasalAdapterAMAJS { mProfile.put("temptargetSet", tempTargetSet); mProfile.put("autosens_adjust_targets", SP.getBoolean("openapsama_autosens_adjusttargets", true)); //align with max-absorption model in AMA sensitivity - if(mealData.usedMinCarbsImpact >0){ + if(mealData.usedMinCarbsImpact > 0){ mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); } else { mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java index b28ce599f7..fe14147853 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java @@ -244,7 +244,7 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("maxCOB", SMBDefaults.maxCOB); mProfile.put("skip_neutral_temps", SMBDefaults.skip_neutral_temps); //align with max-absorption model in AMA sensitivity - if(mealData.usedMinCarbsImpact >0){ + if(mealData.usedMinCarbsImpact > 0){ mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); } else { mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); From e1dc69cd4d8b5263ba47319d3fc1a255cabdaa61 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 19 Apr 2018 22:31:07 +0200 Subject: [PATCH 012/152] visualize min carbs absorption --- .../nightscout/androidaps/db/BgReading.java | 3 +- .../IobCobCalculator/AutosensData.java | 61 +++++++++++++++-- .../IobCobCalculator/IobCobThread.java | 6 +- .../plugins/Overview/graphData/GraphData.java | 7 ++ .../PointsWithLabelGraphSeries.java | 67 ++++++++++--------- 5 files changed, 103 insertions(+), 41 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 e842979ecb..20b9040065 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/BgReading.java +++ b/app/src/main/java/info/nightscout/androidaps/db/BgReading.java @@ -195,8 +195,7 @@ public class BgReading implements DataPointWithLabelInterface { @Override public float getSize() { - boolean isTablet = MainApp.sResources.getBoolean(R.bool.isTablet); - return isTablet ? 8 : 5; + return 1; } @Override 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 11b86c5fc5..97ea10b1a7 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 @@ -11,18 +11,20 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; -import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; +import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface; +import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.utils.SP; /** * Created by mike on 25.04.2017. */ -public class AutosensData { +public class AutosensData implements DataPointWithLabelInterface { private static Logger log = LoggerFactory.getLogger(AutosensData.class); static class CarbsInPast { @@ -66,11 +68,11 @@ public class AutosensData { public double slopeFromMaxDeviation = 0; public double slopeFromMinDeviation = 999; public double usedMinCarbsImpact = 0d; - + public boolean failoverToMinAbsorbtionRate = false; @Override public String toString() { - return "AutosensData: " + new Date(time).toLocaleString() + " " + pastSensitivity + " Delta=" + delta + " avgDelta=" + avgDelta + " Bgi=" + bgi + " Deviation=" + deviation + " avgDeviation=" + avgDeviation + " Absorbed=" + absorbed + " CarbsFromBolus=" + carbsFromBolus + " COB=" + cob + " autosensRatio=" + autosensRatio + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation =" + slopeFromMinDeviation ; + return "AutosensData: " + new Date(time).toLocaleString() + " " + pastSensitivity + " Delta=" + delta + " avgDelta=" + avgDelta + " Bgi=" + bgi + " Deviation=" + deviation + " avgDeviation=" + avgDeviation + " Absorbed=" + absorbed + " CarbsFromBolus=" + carbsFromBolus + " COB=" + cob + " autosensRatio=" + autosensRatio + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation =" + slopeFromMinDeviation; } public int minOld() { @@ -91,7 +93,7 @@ public class AutosensData { activeCarbsList.remove(i--); if (c.remaining > 0) cob -= c.remaining; - log.debug("Removing carbs at "+ new Date(toTime).toLocaleString() + " + after "+ maxAbsorptionHours +"h :" + new Date(c.time).toLocaleString()); + log.debug("Removing carbs at " + new Date(toTime).toLocaleString() + " + after " + maxAbsorptionHours + "h :" + new Date(c.time).toLocaleString()); } } } @@ -108,4 +110,51 @@ public class AutosensData { } } + // ------- DataPointWithLabelInterface ------ + + @Override + public double getX() { + return time; + } + + @Override + public double getY() { + return cob; + } + + @Override + public void setY(double y) { + + } + + @Override + public String getLabel() { + return null; + } + + @Override + public long getDuration() { + return 0; + } + + @Override + public PointsWithLabelGraphSeries.Shape getShape() { + return PointsWithLabelGraphSeries.Shape.COBFAILOVER; + } + + @Override + public float getSize() { + return 1f; + } + + @Override + public int getColor() { + return MainApp.gc(R.color.cob); + } + + @Override + public int getSecondColor() { + return 0; + } + } 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 60d315a070..e1616112ab 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 @@ -20,13 +20,13 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.plugins.Treatments.Treatment; -import info.nightscout.androidaps.events.Event; -import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.FabricPrivacy; @@ -218,6 +218,8 @@ public class IobCobThread extends Thread { // figure out how many carbs that represents // but always assume at least 3mg/dL/5m (default) absorption per active treatment double ci = Math.max(deviation, totalMinCarbsImpact); + if (ci != deviation) + autosensData.failoverToMinAbsorbtionRate = true; autosensData.absorbed = ci * profile.getIc(bgTime) / sens; // and add that to the running total carbsAbsorbed autosensData.cob = Math.max(previous.cob - autosensData.absorbed, 0d); 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 9921d236a1..7cae0bd284 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 @@ -365,6 +365,7 @@ public class GraphData { // scale in % of vertical size (like 0.3) public void addCob(long fromTime, long toTime, boolean useForScale, double scale) { + List minFailoverActiveList = new ArrayList<>(); FixedLineGraphSeries cobSeries; List cobArray = new ArrayList<>(); Double maxCobValueFound = 0d; @@ -382,6 +383,8 @@ public class GraphData { maxCobValueFound = Math.max(maxCobValueFound, cob); lastCob = cob; } + if (autosensData.failoverToMinAbsorbtionRate) + minFailoverActiveList.add(autosensData); } } @@ -400,6 +403,10 @@ public class GraphData { cobScale.setMultiplier(maxY * scale / maxCobValueFound); addSeries(cobSeries); + + DataPointWithLabelInterface[] minFailover = new DataPointWithLabelInterface[minFailoverActiveList.size()]; + minFailover = minFailoverActiveList.toArray(minFailover); + addSeries(new PointsWithLabelGraphSeries<>(minFailover)); } // scale in % of vertical size (like 0.3) 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 9c8e312fb6..8ac3be0ad8 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 @@ -3,42 +3,46 @@ package info.nightscout.androidaps.plugins.Overview.graphExtensions; /** * GraphView * Copyright (C) 2014 Jonas Gehring - * + *

* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, * with the "Linking Exception", which can be found at the license.txt * file in this program. - * + *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + *

* You should have received a copy of the GNU General Public License * with the "Linking Exception" along with this program; if not, * write to the author Jonas Gehring . + *

+ * Added by mike */ /** * Added by mike */ +import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Typeface; -import android.util.TypedValue; -// Added by Rumen for scalable text -import android.content.Context; -import info.nightscout.androidaps.MainApp; + import com.jjoe64.graphview.GraphView; import com.jjoe64.graphview.series.BaseSeries; import java.util.Iterator; +import info.nightscout.androidaps.MainApp; + +// Added by Rumen for scalable text + /** * Series that plots the data as points. * The points can be different shapes or a @@ -74,7 +78,8 @@ public class PointsWithLabelGraphSeries e OPENAPSOFFLINE, EXERCISE, GENERAL, - GENERALWITHDURATION + GENERALWITHDURATION, + COBFAILOVER } /** @@ -148,7 +153,7 @@ public class PointsWithLabelGraphSeries e float scaleX = (float) (graphWidth / diffX); - int i=0; + int i = 0; while (values.hasNext()) { E value = values.next(); @@ -182,7 +187,7 @@ public class PointsWithLabelGraphSeries e } /* Fix a bug that continue to show the DOT after Y axis */ - if(x < 0) { + if (x < 0) { overdraw = true; } @@ -197,10 +202,10 @@ public class PointsWithLabelGraphSeries e // draw data point if (!overdraw) { - if (value.getShape() == Shape.BG) { + if (value.getShape() == Shape.BG || value.getShape() == Shape.COBFAILOVER) { mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, scaledPxSize, mPaint); + canvas.drawCircle(endX, endY, value.getSize() * scaledPxSize, mPaint); } else if (value.getShape() == Shape.PREDICTION) { mPaint.setColor(value.getColor()); mPaint.setStyle(Paint.Style.FILL); @@ -211,20 +216,20 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(0); canvas.drawCircle(endX, endY, scaledPxSize / 3, mPaint); } else if (value.getShape() == Shape.RECTANGLE) { - canvas.drawRect(endX-scaledPxSize, endY-scaledPxSize, endX+scaledPxSize, endY+scaledPxSize, mPaint); + canvas.drawRect(endX - scaledPxSize, endY - scaledPxSize, endX + scaledPxSize, endY + scaledPxSize, mPaint); } else if (value.getShape() == Shape.TRIANGLE) { mPaint.setStrokeWidth(0); Point[] points = new Point[3]; - points[0] = new Point((int)endX, (int)(endY-scaledPxSize)); - points[1] = new Point((int)(endX+scaledPxSize), (int)(endY+scaledPxSize*0.67)); - points[2] = new Point((int)(endX-scaledPxSize), (int)(endY+scaledPxSize*0.67)); + points[0] = new Point((int) endX, (int) (endY - scaledPxSize)); + points[1] = new Point((int) (endX + scaledPxSize), (int) (endY + scaledPxSize * 0.67)); + points[2] = new Point((int) (endX - scaledPxSize), (int) (endY + scaledPxSize * 0.67)); drawArrows(points, canvas, mPaint); } else if (value.getShape() == Shape.BOLUS) { mPaint.setStrokeWidth(0); Point[] points = new Point[3]; - points[0] = new Point((int)endX, (int)(endY-scaledPxSize)); - points[1] = new Point((int)(endX+scaledPxSize), (int)(endY+scaledPxSize*0.67)); - points[2] = new Point((int)(endX-scaledPxSize), (int)(endY+scaledPxSize*0.67)); + points[0] = new Point((int) endX, (int) (endY - scaledPxSize)); + points[1] = new Point((int) (endX + scaledPxSize), (int) (endY + scaledPxSize * 0.67)); + points[2] = new Point((int) (endX - scaledPxSize), (int) (endY + scaledPxSize * 0.67)); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); drawArrows(points, canvas, mPaint); if (value.getLabel() != null) { @@ -234,15 +239,15 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(2); Point[] points = new Point[3]; float size = value.getSize() * scaledPxSize; - points[0] = new Point((int)endX, (int)(endY-size)); - points[1] = new Point((int)(endX+size), (int)(endY+size*0.67)); - points[2] = new Point((int)(endX-size), (int)(endY+size*0.67)); + points[0] = new Point((int) endX, (int) (endY - size)); + points[1] = new Point((int) (endX + size), (int) (endY + size * 0.67)); + points[2] = new Point((int) (endX - size), (int) (endY + size * 0.67)); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); drawArrows(points, canvas, mPaint); } else if (value.getShape() == Shape.EXTENDEDBOLUS) { mPaint.setStrokeWidth(0); if (value.getLabel() != null) { - Rect bounds = new Rect((int)endX, (int)endY + 3, (int) (xpluslength), (int) endY + 8); + Rect bounds = new Rect((int) endX, (int) endY + 3, (int) (xpluslength), (int) endY + 8); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawRect(bounds, mPaint); mPaint.setTextSize((float) (scaledTextSize)); @@ -254,7 +259,7 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(0); if (value.getLabel() != null) { //mPaint.setTextSize((int) (scaledPxSize * 3)); - mPaint.setTextSize((float) (scaledTextSize*1.2)); + mPaint.setTextSize((float) (scaledTextSize * 1.2)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); Rect bounds = new Rect(); mPaint.getTextBounds(value.getLabel(), 0, value.getLabel().length(), bounds); @@ -355,7 +360,7 @@ public class PointsWithLabelGraphSeries e * @param paint paint object */ private void drawArrows(Point[] point, Canvas canvas, Paint paint) { - float [] points = new float[8]; + float[] points = new float[8]; points[0] = point[0].x; points[1] = point[0].y; points[2] = point[1].x; @@ -368,10 +373,10 @@ public class PointsWithLabelGraphSeries e canvas.save(); canvas.drawVertices(Canvas.VertexMode.TRIANGLES, 8, points, 0, null, 0, null, 0, null, 0, 0, paint); Path path = new Path(); - path.moveTo(point[0].x , point[0].y); - path.lineTo(point[1].x,point[1].y); - path.lineTo(point[2].x,point[2].y); - canvas.drawPath(path,paint); + path.moveTo(point[0].x, point[0].y); + path.lineTo(point[1].x, point[1].y); + path.lineTo(point[2].x, point[2].y); + canvas.drawPath(path, paint); canvas.restore(); } @@ -381,7 +386,7 @@ public class PointsWithLabelGraphSeries e float py = endY + scaledPxSize; canvas.save(); canvas.rotate(-45, px, py); - mPaint.setTextSize((float) (scaledTextSize*0.8)); + mPaint.setTextSize((float) (scaledTextSize * 0.8)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); mPaint.setTextAlign(Paint.Align.RIGHT); @@ -393,7 +398,7 @@ public class PointsWithLabelGraphSeries e float py = endY - scaledPxSize; canvas.save(); canvas.rotate(-45, px, py); - mPaint.setTextSize((float) (scaledTextSize*0.8)); + mPaint.setTextSize((float) (scaledTextSize * 0.8)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); canvas.drawText(value.getLabel(), px + scaledPxSize, py, mPaint); From 0ab04c4d959dc0396b02b3fa61997bdb20c32125 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 20 Apr 2018 12:28:07 +0200 Subject: [PATCH 013/152] fix cob scaling --- .../plugins/IobCobCalculator/AutosensData.java | 9 ++++++++- .../androidaps/plugins/Overview/graphData/GraphData.java | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) 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 97ea10b1a7..7d23862cef 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 @@ -15,6 +15,7 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface; import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries; +import info.nightscout.androidaps.plugins.Overview.graphExtensions.Scale; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; import info.nightscout.androidaps.plugins.Treatments.Treatment; @@ -112,6 +113,12 @@ public class AutosensData implements DataPointWithLabelInterface { // ------- DataPointWithLabelInterface ------ + private Scale scale; + + public void setScale(Scale scale) { + this.scale = scale; + } + @Override public double getX() { return time; @@ -119,7 +126,7 @@ public class AutosensData implements DataPointWithLabelInterface { @Override public double getY() { - return cob; + return scale.transform(cob); } @Override 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 7cae0bd284..06ea2d6d65 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 @@ -383,8 +383,10 @@ public class GraphData { maxCobValueFound = Math.max(maxCobValueFound, cob); lastCob = cob; } - if (autosensData.failoverToMinAbsorbtionRate) + if (autosensData.failoverToMinAbsorbtionRate) { + autosensData.setScale(cobScale); minFailoverActiveList.add(autosensData); + } } } From 41b5636c1377962f6e421804f2d30d0073335c23 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 20 Apr 2018 12:44:19 +0200 Subject: [PATCH 014/152] clear autosens cache on new preferences change --- .../androidaps/plugins/IobCobCalculator/AutosensData.java | 2 +- .../plugins/IobCobCalculator/IobCobCalculatorPlugin.java | 6 ++++-- .../androidaps/plugins/IobCobCalculator/IobCobThread.java | 3 ++- .../plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java | 2 +- .../plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java | 2 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_absorption_oref0.xml | 2 +- 7 files changed, 11 insertions(+), 7 deletions(-) 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 7d23862cef..ea0ce7d4cb 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 @@ -46,7 +46,7 @@ public class AutosensData implements DataPointWithLabelInterface { min5minCarbImpact = t.carbs / (maxAbsorptionHours * 60 / 5) * sens / ic; log.debug("Min 5m carbs impact for " + carbs + "g @" + new Date(t.date).toLocaleString() + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic); } else { - min5minCarbImpact = SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact); + min5minCarbImpact = SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact); } } } 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 f51c7f7a94..2241c256ac 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 @@ -74,7 +74,7 @@ public class IobCobCalculatorPlugin extends PluginBase { .neverVisible(true) .alwaysEnabled(true) ); - } + } @Override protected void onStart() { @@ -548,7 +548,9 @@ public class IobCobCalculatorPlugin extends PluginBase { } if (ev.isChanged(R.string.key_openapsama_autosens_period) || ev.isChanged(R.string.key_age) || - ev.isChanged(R.string.key_absorption_maxtime) + ev.isChanged(R.string.key_absorption_maxtime) || + ev.isChanged(R.string.key_openapsama_min_5m_carbimpact) || + ev.isChanged(R.string.key_absorption_cutoff) ) { stopCalculation("onEventPreferenceChange"); synchronized (dataLock) { 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 e1616112ab..a41f12764d 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 @@ -17,6 +17,7 @@ import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; @@ -212,7 +213,7 @@ public class IobCobThread extends Thread { } } else { //Oref sensitivity - totalMinCarbsImpact = SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact); + totalMinCarbsImpact = SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact); } // figure out how many carbs that represents diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index 89739ef626..ed0fa1f0bb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -217,7 +217,7 @@ public class DetermineBasalAdapterAMAJS { if(mealData.usedMinCarbsImpact > 0){ mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); } else { - mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); + mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact)); } if (units.equals(Constants.MMOL)) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java index fe14147853..0c665c7f9f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java @@ -247,7 +247,7 @@ public class DetermineBasalAdapterSMBJS { if(mealData.usedMinCarbsImpact > 0){ mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); } else { - mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); + mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact)); } mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap); mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false)); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0c4363c01..1e8d21ac37 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1004,4 +1004,5 @@ Time show_notes_entry_dialogs Show notes field in treatment dialogs + openapsama_min_5m_carbimpact diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml index a194b754a9..4c3b11d283 100644 --- a/app/src/main/res/xml/pref_absorption_oref0.xml +++ b/app/src/main/res/xml/pref_absorption_oref0.xml @@ -15,7 +15,7 @@ android:maxLines="20" android:title="@string/openapsama_min_5m_carbimpact" android:dialogMessage="@string/openapsama_min_5m_carbimpact_summary" - android:key="openapsama_min_5m_carbimpact" /> + android:key="@string/key_openapsama_min_5m_carbimpact" /> Date: Fri, 20 Apr 2018 18:05:37 +0200 Subject: [PATCH 015/152] Enforce TBRs on enforceNew --- .../java/info/nightscout/androidaps/queue/CommandQueue.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 a514a85815..93b6f99db0 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -205,7 +205,7 @@ public class CommandQueue { // returns true if command is queued public boolean tempBasalAbsolute(double absoluteRate, int durationInMinutes, boolean enforceNew, Profile profile, Callback callback) { - if (isRunning(Command.CommandType.TEMPBASAL)) { + if (!enforceNew && isRunning(Command.CommandType.TEMPBASAL)) { if (callback != null) callback.result(executingNowError()).run(); return false; @@ -226,7 +226,7 @@ public class CommandQueue { // returns true if command is queued public boolean tempBasalPercent(Integer percent, int durationInMinutes, boolean enforceNew, Profile profile, Callback callback) { - if (isRunning(Command.CommandType.TEMPBASAL)) { + if (!enforceNew && isRunning(Command.CommandType.TEMPBASAL)) { if (callback != null) callback.result(executingNowError()).run(); return false; @@ -268,7 +268,7 @@ public class CommandQueue { // returns true if command is queued public boolean cancelTempBasal(boolean enforceNew, Callback callback) { - if (isRunning(Command.CommandType.TEMPBASAL)) { + if (!enforceNew && isRunning(Command.CommandType.TEMPBASAL)) { if (callback != null) callback.result(executingNowError()).run(); return false; From 870d23c08c2684bfbebd579ae40832db3332cda2 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 20 Apr 2018 22:13:20 +0200 Subject: [PATCH 016/152] fix bolus step for Dana pumps --- .../plugins/Overview/Dialogs/NewTreatmentDialog.java | 3 ++- .../androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java | 6 +++++- .../androidaps/plugins/PumpDanaRS/DanaRSPlugin.java | 7 ++++--- .../main/java/info/nightscout/utils/DecimalFormatter.java | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java index f21ccac0e2..a315310dc8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java @@ -35,6 +35,7 @@ import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.queue.Callback; +import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.FabricPrivacy; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SafeParse; @@ -104,7 +105,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene editInsulin = (NumberPicker) view.findViewById(R.id.treatments_newtreatment_insulinamount); editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, textWatcher); - editInsulin.setParams(0d, 0d, maxInsulin, ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep, new DecimalFormat("0.00"), false, textWatcher); + editInsulin.setParams(0d, 0d, maxInsulin, ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep, DecimalFormatter.pumpSupportedBolusFormat(), false, textWatcher); recordOnlyCheckbox = (CheckBox) view.findViewById(R.id.newtreatment_record_only); 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 fc57e72e01..ea83e6d4d6 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 @@ -304,7 +304,11 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte @Override public void getPumpStatus() { - if (sExecutionService != null) sExecutionService.getPumpStatus(); + if (sExecutionService != null) { + sExecutionService.getPumpStatus(); + pumpDescription.basalStep = pump.basalStep; + pumpDescription.bolusStep = pump.bolusStep; + } } @Override 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 7655c0ff46..de1f146a51 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 @@ -178,8 +178,6 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte final Object o = new Object(); danaRSService.connect(from, mDeviceAddress, o); - pumpDescription.basalStep = pump.basalStep; - pumpDescription.bolusStep = pump.bolusStep; } } @@ -205,8 +203,11 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte @Override public void getPumpStatus() { - if (danaRSService != null) + if (danaRSService != null) { danaRSService.getPumpStatus(); + pumpDescription.basalStep = pump.basalStep; + pumpDescription.bolusStep = pump.bolusStep; + } } // DanaR interface diff --git a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java index 6709b304d9..0f7164b690 100644 --- a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java +++ b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java @@ -46,13 +46,13 @@ public class DecimalFormatter { } public static String toPumpSupportedBolus(double value) { - return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.01 + return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05 ? to2Decimal(value) : to1Decimal(value); } public static DecimalFormat pumpSupportedBolusFormat() { - return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.01 + return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05 ? new DecimalFormat("0.00") : new DecimalFormat("0.0"); } From 883da922e56fd3adfc85929b2c45043edf5c0e75 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 20 Apr 2018 22:14:54 +0200 Subject: [PATCH 017/152] 1.60e-dev --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 72b483c9fe..16e3bfbe71 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { targetSdkVersion 25 multiDexEnabled true versionCode 1500 - version "1.60d-dev" + version "1.60e-dev" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" From c27ceb0a72907a7af70752c34799f8f4c54a18d6 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 00:02:15 +0200 Subject: [PATCH 018/152] better bolus error handling for Dana pumps --- .../plugins/PumpDanaR/DanaRPlugin.java | 18 +++-- .../plugins/PumpDanaR/comm/MsgBolusStart.java | 10 ++- .../comm/MsgBolusStartWithSpeed.java | 10 ++- .../services/DanaRExecutionService.java | 2 +- .../PumpDanaRKorean/DanaRKoreanPlugin.java | 20 +++-- .../services/DanaRKoreanExecutionService.java | 2 +- .../plugins/PumpDanaRS/DanaRSPlugin.java | 38 +++++---- ...aRS_Packet_Bolus_Set_Step_Bolus_Start.java | 81 ++++++++++--------- .../PumpDanaRS/services/DanaRSService.java | 2 +- .../plugins/PumpDanaRv2/DanaRv2Plugin.java | 28 ++++--- .../services/DanaRv2ExecutionService.java | 2 +- app/src/main/res/values/strings.xml | 1 + 12 files changed, 120 insertions(+), 94 deletions(-) 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 cbcf21cd48..280d37c273 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 @@ -18,6 +18,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; @@ -129,7 +130,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { // Plugin base interface @Override public String getName() { - return MainApp.instance().getString(R.string.danarpump); + return MainApp.gs(R.string.danarpump); } @Override @@ -158,10 +159,13 @@ 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; + result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStartWithSpeed.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); detailedBolusInfo.insulin = t.insulin; @@ -173,7 +177,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -342,7 +346,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { PumpEnactResult result = new PumpEnactResult(); result.success = true; result.enacted = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = true; return result; } @@ -358,13 +362,13 @@ public class DanaRPlugin extends AbstractDanaRPlugin { if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java index 9173794199..7586edf825 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java @@ -11,6 +11,8 @@ import info.nightscout.utils.HardLimits; public class MsgBolusStart extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgBolusStart.class); + public static int errorCode; + public MsgBolusStart() { SetCommand(0x0102); } @@ -29,13 +31,13 @@ public class MsgBolusStart extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int result = intFromBuff(bytes, 0, 1); - if (result != 2) { + errorCode = intFromBuff(bytes, 0, 1); + if (errorCode != 2) { failed = true; - log.debug("Messsage response: " + result + " FAILED!!"); + log.debug("Messsage response: " + errorCode + " FAILED!!"); } else { if (Config.logDanaMessageDetail) - log.debug("Messsage response: " + result); + log.debug("Messsage response: " + errorCode + " OK"); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java index 3a33e9f866..dd4251a350 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java @@ -11,6 +11,8 @@ import info.nightscout.utils.HardLimits; public class MsgBolusStartWithSpeed extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgBolusStartWithSpeed.class); + public static int errorCode; + public MsgBolusStartWithSpeed() { SetCommand(0x0104); } @@ -30,13 +32,13 @@ public class MsgBolusStartWithSpeed extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int result = intFromBuff(bytes, 0, 1); - if (result != 2) { + errorCode = intFromBuff(bytes, 0, 1); + if (errorCode != 2) { failed = true; - log.debug("Messsage response: " + result + " FAILED!!"); + log.debug("Messsage response: " + errorCode + " FAILED!!"); } else { if (Config.logDanaMessageDetail) - log.debug("Messsage response: " + result); + log.debug("Messsage response: " + errorCode + " OK"); } } } 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 eabf4fc94a..bee8dd1662 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 @@ -339,7 +339,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ } else { ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); } - return true; + return !start.failed; } public boolean carbsEntry(int amount) { 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 a3a39a30f1..f2150ebb7d 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 @@ -18,14 +18,15 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStart; import info.nightscout.androidaps.plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.Round; import info.nightscout.utils.SP; @@ -130,7 +131,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { // Plugin base interface @Override public String getName() { - return MainApp.instance().getString(R.string.danarkoreanpump); + return MainApp.gs(R.string.danarkoreanpump); } @Override @@ -159,10 +160,13 @@ 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; + result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStart.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); detailedBolusInfo.insulin = t.insulin; @@ -174,7 +178,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -343,7 +347,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { PumpEnactResult result = new PumpEnactResult(); result.success = true; result.enacted = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = true; return result; } @@ -359,13 +363,13 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; 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 c136666d5e..2619453df7 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 @@ -286,7 +286,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { mBolusingTreatment = null; ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); - return true; + return !start.failed; } public boolean carbsEntry(int amount) { 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 de1f146a51..a2ec13d184 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 @@ -26,6 +26,7 @@ import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Bolus_Set_Step_Bolus_Start; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.Constraint; @@ -369,7 +370,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } // RS stores end time for bolus, we need to adjust time // default delivery speed is 12 sec/U - detailedBolusInfo.date = DateUtil.now() + (long)(speed * detailedBolusInfo.insulin * 1000); + detailedBolusInfo.date = DateUtil.now() + (long) (speed * detailedBolusInfo.insulin * 1000); // clean carbs to prevent counting them as twice because they will picked up as another record // I don't think it's necessary to copy DetailedBolusInfo right now for carbs records double carbs = detailedBolusInfo.carbs; @@ -385,10 +386,13 @@ 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; + result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); return result; @@ -397,7 +401,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -501,7 +505,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte 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; } @@ -513,7 +517,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte 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; @@ -531,7 +535,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte 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; @@ -542,7 +546,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } 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; } @@ -553,7 +557,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte 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; @@ -564,7 +568,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } 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("setHighTempBasalPercent: Failed to set temp basal"); return result; } @@ -580,7 +584,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte 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; @@ -593,7 +597,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (connectionOK && pump.isExtendedInProgress && Math.abs(pump.extendedBolusAbsoluteRate - 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; @@ -605,7 +609,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } 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; } @@ -622,13 +626,13 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; @@ -646,13 +650,13 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } 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/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 12f2fa95c6..f90dd77b74 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 @@ -7,58 +7,63 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.utils.HardLimits; +import info.nightscout.androidaps.plugins.Overview.notifications.Notification; public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet { - private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Start.class); + private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Start.class); - private double amount; - private int speed; + private double amount; + private int speed; - public boolean failed; + public boolean failed; + public static int errorCode; - public DanaRS_Packet_Bolus_Set_Step_Bolus_Start() { + public DanaRS_Packet_Bolus_Set_Step_Bolus_Start() { super(); opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__SET_STEP_BOLUS_START; } // Speed 0 => 12 sec/U, 1 => 30 sec/U, 2 => 60 sec/U - public DanaRS_Packet_Bolus_Set_Step_Bolus_Start(double amount, int speed) { - this(); + public DanaRS_Packet_Bolus_Set_Step_Bolus_Start(double amount, int speed) { + this(); - // HARDCODED LIMIT - amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); + // HARDCODED LIMIT + amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - this.amount = amount; - this.speed = speed; + this.amount = amount; + this.speed = speed; - if (Config.logDanaMessageDetail) - log.debug("Bolus start : " + amount + " speed: " + speed); - } + if (Config.logDanaMessageDetail) + log.debug("Bolus start : " + amount + " speed: " + speed); + } - @Override - public byte[] getRequestParams() { - int stepBolusRate = (int) (amount * 100); - byte[] request = new byte[3]; - request[0] = (byte) (stepBolusRate & 0xff); - request[1] = (byte) ((stepBolusRate >>> 8) & 0xff); - request[2] = (byte) (speed & 0xff); - return request; - } - @Override - public void handleMessage(byte[] data) { - int result = intFromBuff(data, 0, 1); - if (Config.logDanaMessageDetail) { - if (result == 0) - log.debug("Result OK"); - else - log.error("Result Error: " + result); - } - } + @Override + public byte[] getRequestParams() { + int stepBolusRate = (int) (amount * 100); + byte[] request = new byte[3]; + request[0] = (byte) (stepBolusRate & 0xff); + request[1] = (byte) ((stepBolusRate >>> 8) & 0xff); + request[2] = (byte) (speed & 0xff); + return request; + } - @Override - public String getFriendlyName() { - return "BOLUS__SET_STEP_BOLUS_START"; - } + @Override + public void handleMessage(byte[] data) { + errorCode = intFromBuff(data, 0, 1); + if (Config.logDanaMessageDetail) { + if (errorCode == 0) + log.debug("Result OK"); + else { + failed = true; + log.error("Result Error: " + errorCode); + } + } + } + + @Override + public String getFriendlyName() { + return "BOLUS__SET_STEP_BOLUS_START"; + } } 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 384c1a3772..91859c759a 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 @@ -273,7 +273,7 @@ public class DanaRSService extends Service { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); } }); - return true; + return !start.failed; } public void bolusStop() { 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 81c5d4d944..0ea6f192e4 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 @@ -22,6 +22,7 @@ import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage; import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed; import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; @@ -119,7 +120,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { // Plugin base interface @Override public String getName() { - return MainApp.instance().getString(R.string.danarv2pump); + return MainApp.gs(R.string.danarv2pump); } @Override @@ -173,10 +174,13 @@ 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; + result.success = connectionOK && detailedBolusInfo.insulin == t.insulin; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStartWithSpeed.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); // remove carbs because it's get from history seprately @@ -186,7 +190,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -287,7 +291,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { 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; } @@ -299,7 +303,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { 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; @@ -317,7 +321,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { 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; @@ -328,7 +332,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { } 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; } @@ -339,7 +343,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { 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; @@ -350,7 +354,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { } 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("setHighTempBasalPercent: Failed to set temp basal"); return result; } @@ -367,13 +371,13 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; 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 551c2684c0..25cac9da1c 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 @@ -386,7 +386,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); } }); - return true; + return !start.failed; } public void bolusStop() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e8d21ac37..c2839b19d8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1005,4 +1005,5 @@ show_notes_entry_dialogs Show notes field in treatment dialogs openapsama_min_5m_carbimpact + Asked: %.2fU Delivered: %.2fU Error code: %d From cb65bed0a74ec25259c0dc774238784fb4c836d6 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 10:20:49 +0200 Subject: [PATCH 019/152] alling code to xdrip changes --- .../nightscout/androidaps/plugins/Source/SourceXdripPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java index f47d25abb1..bd3d96162e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java @@ -35,6 +35,6 @@ public class SourceXdripPlugin extends PluginBase implements BgSourceInterface { } public void setSource(String source) { - this.advancedFiltering = "G5 Native".equals(source); + this.advancedFiltering = source.contains("G5 Native"); } } From c0250dd62c254df9e4d27951867fbbde108edeb9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 10:50:55 +0200 Subject: [PATCH 020/152] show calculation cob progress on graph --- .../IobCobCalculator/IobCobThread.java | 4 ++ .../events/EventIobCalculationProgress.java | 11 ++++++ .../plugins/Overview/OverviewFragment.java | 31 ++++++++-------- .../res/layout/activity_historybrowse.xml | 7 ++++ app/src/main/res/layout/overview_fragment.xml | 37 +++++++++++-------- .../res/layout/overview_fragment_nsclient.xml | 7 ++++ .../overview_fragment_nsclient_tablet.xml | 7 ++++ .../layout/overview_fragment_smallheight.xml | 7 ++++ 8 files changed, 81 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java 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 a41f12764d..c4309ce2f1 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 @@ -24,6 +24,7 @@ import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; +import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress; import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; @@ -97,6 +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())); + if (iobCobCalculatorPlugin.stopCalculationTrigger) { iobCobCalculatorPlugin.stopCalculationTrigger = false; log.debug("Aborting calculation thread (trigger): " + from); @@ -269,6 +272,7 @@ public class IobCobThread extends Thread { log.debug("Finishing calculation thread: " + from); } finally { mWakeLock.release(); + MainApp.bus().post(new EventIobCalculationProgress("")); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java new file mode 100644 index 0000000000..08f2747e60 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java @@ -0,0 +1,11 @@ +package info.nightscout.androidaps.plugins.IobCobCalculator.events; + +import info.nightscout.androidaps.events.Event; + +public class EventIobCalculationProgress extends Event { + public String progress; + + public EventIobCalculationProgress(String progress) { + this.progress = progress; + } +} 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 b22d0450e0..26f20a7eb9 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 @@ -5,7 +5,6 @@ import android.app.Activity; import android.app.NotificationManager; import android.content.ActivityNotFoundException; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Color; @@ -15,10 +14,8 @@ import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; -import android.support.v4.content.ContextCompat; import android.support.v4.content.res.ResourcesCompat; import android.support.v7.app.AlertDialog; -import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; @@ -33,7 +30,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageButton; @@ -52,8 +48,6 @@ import org.slf4j.LoggerFactory; import java.text.DecimalFormat; import java.util.Calendar; import java.util.Date; -import java.util.List; -import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -97,9 +91,9 @@ import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; +import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification; -import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastAckAlarm; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; @@ -108,10 +102,8 @@ import info.nightscout.androidaps.plugins.Overview.Dialogs.NewInsulinDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialog; import info.nightscout.androidaps.plugins.Overview.activities.QuickWizardListActivity; -import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock; import info.nightscout.androidaps.plugins.Overview.graphData.GraphData; -import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.Overview.notifications.NotificationRecyclerViewAdapter; import info.nightscout.androidaps.plugins.Overview.notifications.NotificationStore; import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin; @@ -150,6 +142,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TextView pumpDeviceStatusView; TextView openapsDeviceStatusView; TextView uploaderDeviceStatusView; + TextView iobCalculationProgressView; LinearLayout loopStatusLayout; LinearLayout pumpStatusLayout; GraphView bgGraph; @@ -245,6 +238,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump); openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps); uploaderDeviceStatusView = (TextView) view.findViewById(R.id.overview_uploader); + iobCalculationProgressView = (TextView) view.findViewById(R.id.overview_iobcalculationprogess); loopStatusLayout = (LinearLayout) view.findViewById(R.id.overview_looplayout); pumpStatusLayout = (LinearLayout) view.findViewById(R.id.overview_pumpstatuslayout); @@ -911,15 +905,22 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, activity.runOnUiThread(() -> updatePumpStatus(s.textStatus())); } + @Subscribe + public void onStatusEvent(final EventIobCalculationProgress e) { + Activity activity = getActivity(); + if (activity != null) + activity.runOnUiThread(() -> { + if (iobCalculationProgressView != null) + iobCalculationProgressView.setText(e.progress); + }); + } + private void hideTempRecommendation() { Activity activity = getActivity(); if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - if (acceptTempLayout != null) - acceptTempLayout.setVisibility(View.GONE); - } + activity.runOnUiThread(() -> { + if (acceptTempLayout != null) + acceptTempLayout.setVisibility(View.GONE); }); } diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml index 88946033f4..1d52560eff 100644 --- a/app/src/main/res/layout/activity_historybrowse.xml +++ b/app/src/main/res/layout/activity_historybrowse.xml @@ -96,6 +96,13 @@ android:paddingTop="5dp" app:srcCompat="@drawable/ic_arrow_drop_down_white_24dp" /> + + - + - + + + @@ -299,8 +306,8 @@ + android:orientation="horizontal" + android:paddingRight="5dp"> + + + + + + Date: Sat, 21 Apr 2018 12:09:09 +0200 Subject: [PATCH 021/152] allow to show dev slope in dev --- .../info/nightscout/androidaps/Config.java | 2 -- .../androidaps/HistoryBrowseActivity.java | 25 +++++++++++---- .../plugins/Overview/OverviewFragment.java | 31 ++++++++++++------- .../plugins/Overview/graphData/GraphData.java | 26 ++++++++-------- app/src/main/res/values/colors.xml | 2 ++ 5 files changed, 54 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/Config.java b/app/src/main/java/info/nightscout/androidaps/Config.java index afb40421df..a12e0a9ea0 100644 --- a/app/src/main/java/info/nightscout/androidaps/Config.java +++ b/app/src/main/java/info/nightscout/androidaps/Config.java @@ -23,8 +23,6 @@ public class Config { public static final boolean SMSCOMMUNICATORENABLED = !BuildConfig.NSCLIENTOLNY && !BuildConfig.G5UPLOADER; - public static final boolean displayDeviationSlope = false; - public static final boolean detailedLog = true; public static final boolean logFunctionCalls = true; public static final boolean logIncommingData = true; diff --git a/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java b/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java index a9243ab995..cf3d1fc34c 100644 --- a/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/HistoryBrowseActivity.java @@ -46,7 +46,7 @@ public class HistoryBrowseActivity extends AppCompatActivity { ImageButton chartButton; boolean showBasal = true; - boolean showIob, showCob, showDev, showRat; + boolean showIob, showCob, showDev, showRat, showDevslope; @BindView(R.id.historybrowse_date) @@ -267,6 +267,7 @@ public class HistoryBrowseActivity extends AppCompatActivity { boolean useCobForScale = false; boolean useDevForScale = false; boolean useRatioForScale = false; + boolean useDevSlopeForScale = false; if (showIob) { useIobForScale = true; @@ -276,6 +277,8 @@ public class HistoryBrowseActivity extends AppCompatActivity { useDevForScale = true; } else if (showRat) { useRatioForScale = true; + } else if (showDevslope) { + useDevSlopeForScale = true; } if (showIob) @@ -286,6 +289,8 @@ public class HistoryBrowseActivity extends AppCompatActivity { secondGraphData.addDeviations(fromTime, toTime, useDevForScale, 1d); if (showRat) secondGraphData.addRatio(fromTime, toTime, useRatioForScale, 1d); + if (showDevslope) + secondGraphData.addDeviationSlope(fromTime, toTime, useDevSlopeForScale, 1d); // **** NOW line **** // set manual x bounds to have nice steps @@ -293,7 +298,7 @@ public class HistoryBrowseActivity extends AppCompatActivity { secondGraphData.addNowLine(pointer); // do GUI update - if (showIob || showCob || showDev || showRat) { + if (showIob || showCob || showDev || showRat || showDevslope) { iobGraph.setVisibility(View.VISIBLE); } else { iobGraph.setVisibility(View.GONE); @@ -354,23 +359,31 @@ public class HistoryBrowseActivity extends AppCompatActivity { item.setCheckable(true); item.setChecked(showRat); + if (MainApp.devBranch) { + item = popup.getMenu().add(Menu.NONE, OverviewFragment.CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope"); + title = item.getTitle(); + s = new SpannableString(title); + s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0); + item.setTitle(s); + item.setCheckable(true); + item.setChecked(showDevslope); + } + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == OverviewFragment.CHARTTYPE.BAS.ordinal()) { showBasal = !item.isChecked(); - } else if (item.getItemId() == OverviewFragment.CHARTTYPE.IOB.ordinal()) { showIob = !item.isChecked(); - } else if (item.getItemId() == OverviewFragment.CHARTTYPE.COB.ordinal()) { showCob = !item.isChecked(); - } else if (item.getItemId() == OverviewFragment.CHARTTYPE.DEV.ordinal()) { showDev = !item.isChecked(); - } else if (item.getItemId() == OverviewFragment.CHARTTYPE.SEN.ordinal()) { showRat = !item.isChecked(); + } else if (item.getItemId() == OverviewFragment.CHARTTYPE.DEVSLOPE.ordinal()) { + showDevslope = !item.isChecked(); } updateGUI("onGraphCheckboxesCheckedChanged"); return true; 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 26f20a7eb9..8f00c18d75 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 @@ -184,9 +184,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final Object updateSync = new Object(); - public enum CHARTTYPE {PRE, BAS, IOB, COB, DEV, SEN} - - ; + public enum CHARTTYPE {PRE, BAS, IOB, COB, DEV, SEN, DEVSLOPE} private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledUpdate = null; @@ -410,26 +408,33 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, item.setCheckable(true); item.setChecked(SP.getBoolean("showratios", false)); + if (MainApp.devBranch) { + item = popup.getMenu().add(Menu.NONE, CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope"); + title = item.getTitle(); + s = new SpannableString(title); + s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0); + item.setTitle(s); + item.setCheckable(true); + item.setChecked(SP.getBoolean("showdevslope", false)); + } + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == CHARTTYPE.PRE.ordinal()) { SP.putBoolean("showprediction", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.BAS.ordinal()) { SP.putBoolean("showbasals", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.IOB.ordinal()) { SP.putBoolean("showiob", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.COB.ordinal()) { SP.putBoolean("showcob", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.DEV.ordinal()) { SP.putBoolean("showdeviations", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.SEN.ordinal()) { SP.putBoolean("showratios", !item.isChecked()); + } else if (item.getItemId() == CHARTTYPE.DEVSLOPE.ordinal()) { + SP.putBoolean("showdevslope", !item.isChecked()); } scheduleUpdateGUI("onGraphCheckboxesCheckedChanged"); return true; @@ -1387,7 +1392,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, useDevForScale = true; } else if (SP.getBoolean("showratios", false)) { useRatioForScale = true; - } else if (Config.displayDeviationSlope) { + } else if (SP.getBoolean("showdevslope", false)) { useDSForScale = true; } @@ -1399,7 +1404,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, secondGraphData.addDeviations(fromTime, now, useDevForScale, 1d); if (SP.getBoolean("showratios", false)) secondGraphData.addRatio(fromTime, now, useRatioForScale, 1d); - if (Config.displayDeviationSlope) + if (SP.getBoolean("showdevslope", false)) secondGraphData.addDeviationSlope(fromTime, now, useDSForScale, 1d); // **** NOW line **** @@ -1411,7 +1416,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, FragmentActivity activity = getActivity(); if (activity != null) { activity.runOnUiThread(() -> { - if (SP.getBoolean("showiob", true) || SP.getBoolean("showcob", true) || SP.getBoolean("showdeviations", false) || SP.getBoolean("showratios", false) || Config.displayDeviationSlope) { + if (SP.getBoolean("showiob", true) + || SP.getBoolean("showcob", true) + || SP.getBoolean("showdeviations", false) + || SP.getBoolean("showratios", false) + || SP.getBoolean("showdevslope", false)) { iobGraph.setVisibility(View.VISIBLE); } else { iobGraph.setVisibility(View.GONE); 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 06ea2d6d65..1bf59db4de 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 @@ -108,7 +108,7 @@ public class GraphData { inRangeAreaSeries = new AreaGraphSeries<>(inRangeAreaDataPoints); inRangeAreaSeries.setColor(0); inRangeAreaSeries.setDrawBackground(true); - inRangeAreaSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.inrangebackground)); + inRangeAreaSeries.setBackgroundColor(MainApp.gc(R.color.inrangebackground)); addSeries(inRangeAreaSeries); } @@ -184,14 +184,14 @@ public class GraphData { baseBasal = baseBasalArray.toArray(baseBasal); baseBasalsSeries = new LineGraphSeries<>(baseBasal); baseBasalsSeries.setDrawBackground(true); - baseBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.basebasal)); + baseBasalsSeries.setBackgroundColor(MainApp.gc(R.color.basebasal)); baseBasalsSeries.setThickness(0); ScaledDataPoint[] tempBasal = new ScaledDataPoint[tempBasalArray.size()]; tempBasal = tempBasalArray.toArray(tempBasal); tempBasalsSeries = new LineGraphSeries<>(tempBasal); tempBasalsSeries.setDrawBackground(true); - tempBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.tempbasal)); + tempBasalsSeries.setBackgroundColor(MainApp.gc(R.color.tempbasal)); tempBasalsSeries.setThickness(0); ScaledDataPoint[] basalLine = new ScaledDataPoint[basalLineArray.size()]; @@ -201,7 +201,7 @@ public class GraphData { paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity * 2); paint.setPathEffect(new DashPathEffect(new float[]{2, 4}, 0)); - paint.setColor(MainApp.sResources.getColor(R.color.basal)); + paint.setColor(MainApp.gc(R.color.basal)); basalsLineSeries.setCustomPaint(paint); ScaledDataPoint[] absoluteBasalLine = new ScaledDataPoint[absoluteBasalLineArray.size()]; @@ -210,7 +210,7 @@ public class GraphData { Paint absolutePaint = new Paint(); absolutePaint.setStyle(Paint.Style.STROKE); absolutePaint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity * 2); - absolutePaint.setColor(MainApp.sResources.getColor(R.color.basal)); + absolutePaint.setColor(MainApp.gc(R.color.basal)); absoluteBasalsLineSeries.setCustomPaint(absolutePaint); basalScale.setMultiplier(maxY * scale / maxBasalValueFound); @@ -259,7 +259,7 @@ public class GraphData { targets = targetsSeriesArray.toArray(targets); targetsSeries = new LineGraphSeries<>(targets); targetsSeries.setDrawBackground(false); - targetsSeries.setColor(MainApp.sResources.getColor(R.color.tempTargetBackground)); + targetsSeries.setColor(MainApp.gc(R.color.tempTargetBackground)); targetsSeries.setThickness(2); addSeries(targetsSeries); @@ -351,8 +351,8 @@ public class GraphData { iobData = iobArray.toArray(iobData); iobSeries = new FixedLineGraphSeries<>(iobData); iobSeries.setDrawBackground(true); - iobSeries.setBackgroundColor(0x80FFFFFF & MainApp.sResources.getColor(R.color.iob)); //50% - iobSeries.setColor(MainApp.sResources.getColor(R.color.iob)); + iobSeries.setBackgroundColor(0x80FFFFFF & MainApp.gc(R.color.iob)); //50% + iobSeries.setColor(MainApp.gc(R.color.iob)); iobSeries.setThickness(3); if (useForScale) @@ -395,8 +395,8 @@ public class GraphData { cobData = cobArray.toArray(cobData); cobSeries = new FixedLineGraphSeries<>(cobData); cobSeries.setDrawBackground(true); - cobSeries.setBackgroundColor(0xB0FFFFFF & MainApp.sResources.getColor(R.color.cob)); //50% - cobSeries.setColor(MainApp.sResources.getColor(R.color.cob)); + cobSeries.setBackgroundColor(0xB0FFFFFF & MainApp.gc(R.color.cob)); //50% + cobSeries.setColor(MainApp.gc(R.color.cob)); cobSeries.setThickness(3); if (useForScale) @@ -477,7 +477,7 @@ public class GraphData { ScaledDataPoint[] ratioData = new ScaledDataPoint[ratioArray.size()]; ratioData = ratioArray.toArray(ratioData); ratioSeries = new LineGraphSeries<>(ratioData); - ratioSeries.setColor(MainApp.sResources.getColor(R.color.ratio)); + ratioSeries.setColor(MainApp.gc(R.color.ratio)); ratioSeries.setThickness(3); if (useForScale) @@ -513,13 +513,13 @@ public class GraphData { ScaledDataPoint[] ratioMaxData = new ScaledDataPoint[dsMaxArray.size()]; ratioMaxData = dsMaxArray.toArray(ratioMaxData); dsMaxSeries = new LineGraphSeries<>(ratioMaxData); - dsMaxSeries.setColor(Color.MAGENTA); + dsMaxSeries.setColor(MainApp.gc(R.color.devslopepos)); dsMaxSeries.setThickness(3); ScaledDataPoint[] ratioMinData = new ScaledDataPoint[dsMinArray.size()]; ratioMinData = dsMinArray.toArray(ratioMinData); dsMinSeries = new LineGraphSeries<>(ratioMinData); - dsMinSeries.setColor(Color.YELLOW); + dsMinSeries.setColor(MainApp.gc(R.color.devslopeneg)); dsMinSeries.setThickness(3); if (useForScale) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a0b229946e..4aa21abf19 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -8,6 +8,8 @@ #ffea00 #ff9500 #FFFFFF + #FFFFFF00 + #FFFF00FF #00FF00 #FF0000 #FFFF00 From 9c6ee32586be0860c2b92f6b80fa10dc51386255 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Sat, 21 Apr 2018 14:08:42 +0200 Subject: [PATCH 022/152] Don't send future carbs to pumps. --- .../androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java | 2 +- 1 file changed, 1 insertion(+), 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 bd489971c2..d3e5986f77 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 @@ -431,7 +431,7 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C carbInfo.context = getContext(); carbInfo.source = Source.USER; carbInfo.notes = notes; - if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo) { + if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) { ConfigBuilderPlugin.getCommandQueue().bolus(carbInfo, new Callback() { @Override public void run() { From d0405014b207f239955ef7d9d606ae61806ec5ce Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Sat, 21 Apr 2018 11:40:18 +0200 Subject: [PATCH 023/152] Don't loop with old BG value, don't loop twice for the same value. Loop is potentially triggered twice when BG reading sent to NS comes back. This should also deal with backfilled data coming in, since any previous reading will be older than 9m, for which DatabaseHelper.actualBg() returns null. The previous approach to solve multiple invocations for the same value added a isNew flag to EventNewBG, but since DatabaseHelper.scheduleBgChange() drops excessive updates the event carrying that flag is not guarantued to be delivered, resulting in missed loop invocations. The approach taken now lets the receiver of the event fully decide how to deal with it. Should fix, or at least improve, #901, #671. --- .../androidaps/plugins/Loop/LoopPlugin.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) 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 e5510aae00..f96cbb0af1 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 @@ -27,6 +27,8 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.APSInterface; @@ -54,6 +56,7 @@ public class LoopPlugin extends PluginBase { public static final String CHANNEL_ID = "AndroidAPS-Openloop"; + long lastBgTriggeredRun = 0; protected static LoopPlugin loopPlugin; @@ -135,9 +138,22 @@ public class LoopPlugin extends PluginBase { @Subscribe public void onStatusEvent(final EventAutosensCalculationFinished ev) { - if (ev.cause instanceof EventNewBG) { - invoke(ev.getClass().getSimpleName() + "(" + ev.cause.getClass().getSimpleName() + ")", true); + if (!(ev.cause instanceof EventNewBG)) { + // Autosens calculation not triggered by a new BG + return; } + BgReading bgReading = DatabaseHelper.actualBg(); + if (bgReading == null) { + // BG outdated + return; + } + if (bgReading.date <= lastBgTriggeredRun) { + // already looped with that value + return; + } + + lastBgTriggeredRun = bgReading.date; + invoke("AutosenseCalculation for " + bgReading, true); } public long suspendedTo() { From e4a4e07d21141028caa82a420ff448e39f058dc5 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Sat, 21 Apr 2018 15:28:37 +0200 Subject: [PATCH 024/152] Add javadoc. --- .../nightscout/androidaps/plugins/Loop/LoopPlugin.java | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 f96cbb0af1..a4cf0c60ac 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 @@ -29,6 +29,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; +import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.APSInterface; @@ -136,6 +137,15 @@ public class LoopPlugin extends PluginBase { } } + /** + * This method is triggered once autosens calculation has completed, so the LoopPlugin + * has current data to work with. However, autosens calculation can be triggered by multiple + * sources and currently only a new BG should trigger a loop run. Hence we return early if + * the event causing the calculation is not EventNewBg. + * + * Callers of {@link info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin#runCalculation(String, long, boolean, Event)} + * are sources triggering a calculation which triggers this method upon completion. + */ @Subscribe public void onStatusEvent(final EventAutosensCalculationFinished ev) { if (!(ev.cause instanceof EventNewBG)) { From 3d7cdd3819ef417b6c7f87ba1abd0712e9e90653 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 19:51:52 +0200 Subject: [PATCH 025/152] fix ns backfill bug --- .../java/info/nightscout/androidaps/Services/DataService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3e0bbf9c74..17dea50108 100644 --- a/app/src/main/java/info/nightscout/androidaps/Services/DataService.java +++ b/app/src/main/java/info/nightscout/androidaps/Services/DataService.java @@ -130,7 +130,7 @@ public class DataService extends IntentService { handleNewDataFromDexcomG5(intent); } } else if (Intents.ACTION_NEW_SGV.equals(action)) { - if (nsClientEnabled || SP.getBoolean(R.string.ns_autobackfill, true)) + if (nsClientEnabled || SP.getBoolean(R.string.key_ns_autobackfill, true)) handleNewDataFromNSClient(intent); // Objectives 0 ObjectivesPlugin.bgIsAvailableInNS = true; From ea594583831fc5acaae1a876ae254261b92cf0ae Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 20:46:55 +0200 Subject: [PATCH 026/152] nsclient preferences cleanup --- .../androidaps/PreferencesActivity.java | 7 +- .../main/res/xml/pref_nsclientinternal.xml | 82 ++++++++++--------- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index b6b117381f..52984d3697 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -67,7 +67,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre MainApp.bus().post(new EventRefreshGui()); } if (key.equals(MainApp.gs(R.string.key_openapsama_useautosens)) && SP.getBoolean(R.string.key_openapsama_useautosens, false)) { - OKDialog.show(this, MainApp.sResources.getString(R.string.configbuilder_sensitivity), MainApp.sResources.getString(R.string.sensitivity_warning), null); + OKDialog.show(this, MainApp.gs(R.string.configbuilder_sensitivity), MainApp.gs(R.string.sensitivity_warning), null); } updatePrefSummary(myPreferenceFragment.getPreference(key)); } @@ -81,13 +81,13 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre EditTextPreference editTextPref = (EditTextPreference) pref; if (pref.getKey().contains("password") || pref.getKey().contains("secret")) { pref.setSummary("******"); - } else if (pref.getKey().equals(MainApp.sResources.getString(R.string.key_danars_name))) { + } else if (pref.getKey().equals(MainApp.gs(R.string.key_danars_name))) { pref.setSummary(SP.getString(R.string.key_danars_name, "")); } else if (editTextPref.getText() != null && !editTextPref.getText().equals("")) { ((EditTextPreference) pref).setDialogMessage(editTextPref.getDialogMessage()); pref.setSummary(editTextPref.getText()); } else if (pref.getKey().contains("smscommunicator_allowednumbers") && TextUtils.isEmpty(editTextPref.getText().trim())) { - pref.setSummary(MainApp.sResources.getString(R.string.smscommunicator_allowednumbers_summary)); + pref.setSummary(MainApp.gs(R.string.smscommunicator_allowednumbers_summary)); } } } @@ -127,7 +127,6 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre if (id != -1) { addPreferencesFromResource(id); - addPreferencesFromResource(R.xml.pref_advanced); } else { addPreferencesFromResource(R.xml.pref_overview); diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml index f6972cd179..f07251929a 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -2,7 +2,6 @@ - - - - - - - + android:title="@string/nsalarm_urgenthigh" /> + android:title="@string/nsalarm_high" /> - + android:title="@string/nsalarm_low" /> + android:title="@string/nsalarm_urgentlow" /> + android:title="@string/nsalarm_staledata" /> + validate:maxNumber="120" + validate:minNumber="15" + validate:testType="numericRange" /> + android:title="@string/nsalarm_urgentstaledata" /> + validate:maxNumber="180" + validate:minNumber="30" + validate:testType="numericRange" /> + + + + + + + + + + From fe762248a53bfe9a26a37025fe656e1a9eab57d4 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 21:14:09 +0200 Subject: [PATCH 027/152] nsclient preferences cleanup --- app/src/main/res/xml/pref_advanced.xml | 16 -------------- .../main/res/xml/pref_nsclientinternal.xml | 22 ++++++++++++++++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml index 260e2c5135..f5ab617946 100644 --- a/app/src/main/res/xml/pref_advanced.xml +++ b/app/src/main/res/xml/pref_advanced.xml @@ -5,22 +5,6 @@ android:key="advanced" android:title="@string/advancedsettings_title"> - - - - - - + + + + + + + + From cab592efb526cf6a08f9a9375bae877d4bb66e0e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 21:31:42 +0200 Subject: [PATCH 028/152] overview preferences cleanup --- .../androidaps/PreferencesActivity.java | 3 +- app/src/main/res/xml/pref_advanced.xml | 7 - app/src/main/res/xml/pref_overview.xml | 146 ++++++++++-------- 3 files changed, 87 insertions(+), 69 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index 52984d3697..915e1ef00d 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -128,7 +128,6 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre if (id != -1) { addPreferencesFromResource(id); } else { - addPreferencesFromResource(R.xml.pref_overview); if (!Config.NSCLIENT && !Config.G5UPLOADER) { addPreferencesFromResource(R.xml.pref_password); @@ -136,6 +135,8 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre addPreferencesFromResource(R.xml.pref_age); addPreferencesFromResource(R.xml.pref_language); + addPreferencesFromResource(R.xml.pref_overview); + if (!Config.NSCLIENT && !Config.G5UPLOADER) { addPreferencesFromResource(R.xml.pref_quickwizard); } diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml index f5ab617946..1ca031a94e 100644 --- a/app/src/main/res/xml/pref_advanced.xml +++ b/app/src/main/res/xml/pref_advanced.xml @@ -5,13 +5,6 @@ android:key="advanced" android:title="@string/advancedsettings_title"> - - - + + + + + android:title="@string/overview_calculator_label" /> + - + + - + + + android:inputType="numberDecimal|numberSigned" + android:key="@string/key_insulin_button_increment_3" + android:maxLines="20" + android:selectAllOnFocus="true" + android:singleLine="true" + android:title="Third insulin increment" + validate:floatmaxNumber="5.0" + validate:floatminNumber="-5.0" + validate:testType="floatNumericRange" /> + - + + - + + + android:inputType="numberSigned" + android:key="@string/key_carbs_button_increment_3" + android:maxLines="20" + android:selectAllOnFocus="true" + android:singleLine="true" + android:title="Third carbs increment" + validate:maxNumber="50" + validate:minNumber="-50" + validate:testType="numericRange" /> + android:summary="@string/show_cgm_button_summary" + android:title="CGM" /> + + android:summary="@string/show_calibration_button_summary" + android:title="@string/overview_calibration" /> + + + + + + + + + \ No newline at end of file From 1f55078aa308a07c75395ba6a4151b46150a8e0d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sat, 21 Apr 2018 21:37:50 +0200 Subject: [PATCH 029/152] extract strings from overview preferences --- app/src/main/res/values/strings.xml | 7 +++++++ app/src/main/res/xml/pref_overview.xml | 20 ++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c2839b19d8..b368e5336f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1006,4 +1006,11 @@ Show notes field in treatment dialogs openapsama_min_5m_carbimpact Asked: %.2fU Delivered: %.2fU Error code: %d + First insulin increment + Second insulin increment + Third insulin increment + First carbs increment + Second carbs increment + Third carbs increment + CGM diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index 0b17bb7400..5a4836be53 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -9,7 +9,7 @@ + android:title="@string/treatments" /> + android:title="@string/configbuilder_insulin" /> @@ -44,7 +44,7 @@ android:maxLines="20" android:selectAllOnFocus="true" android:singleLine="true" - android:title="Second insulin increment" + android:title="@string/secondinsulinincrement" validate:floatmaxNumber="5.0" validate:floatminNumber="-5.0" validate:testType="floatNumericRange" /> @@ -58,7 +58,7 @@ android:maxLines="20" android:selectAllOnFocus="true" android:singleLine="true" - android:title="Third insulin increment" + android:title="@string/thirdinsulinincrement" validate:floatmaxNumber="5.0" validate:floatminNumber="-5.0" validate:testType="floatNumericRange" /> @@ -66,7 +66,7 @@ + android:title="@string/carbs" /> @@ -91,7 +91,7 @@ android:maxLines="20" android:selectAllOnFocus="true" android:singleLine="true" - android:title="Second carbs increment" + android:title="@string/secondcarbsincrement" validate:maxNumber="50" validate:minNumber="-50" validate:testType="numericRange" /> @@ -105,7 +105,7 @@ android:maxLines="20" android:selectAllOnFocus="true" android:singleLine="true" - android:title="Third carbs increment" + android:title="@string/thirdcarbsincrement" validate:maxNumber="50" validate:minNumber="-50" validate:testType="numericRange" /> @@ -114,7 +114,7 @@ android:defaultValue="false" android:key="@string/key_show_cgm_button" android:summary="@string/show_cgm_button_summary" - android:title="CGM" /> + android:title="@string/cgm" /> Date: Sat, 21 Apr 2018 21:58:07 +0200 Subject: [PATCH 030/152] move quickwizard preferences under overview --- .../nightscout/androidaps/PreferencesActivity.java | 3 --- app/src/main/res/xml/pref_overview.xml | 6 ++++++ app/src/main/res/xml/pref_quickwizard.xml | 12 ------------ 3 files changed, 6 insertions(+), 15 deletions(-) delete mode 100644 app/src/main/res/xml/pref_quickwizard.xml diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index 915e1ef00d..a59a22e965 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -137,9 +137,6 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre addPreferencesFromResource(R.xml.pref_overview); - if (!Config.NSCLIENT && !Config.G5UPLOADER) { - addPreferencesFromResource(R.xml.pref_quickwizard); - } addPreferencesFromResourceIfEnabled(SourceDexcomG5Plugin.getPlugin(), PluginType.BGSOURCE); addPreferencesFromResourceIfEnabled(CareportalPlugin.getPlugin(), PluginType.GENERAL); addPreferencesFromResourceIfEnabled(SafetyPlugin.getPlugin(), PluginType.CONSTRAINTS); diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index 5a4836be53..5d08cd671e 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -129,6 +129,12 @@ + + + + - - - - - - - - \ No newline at end of file From d82a24873f6addbd34f7ab1028a9c3a0a50902aa Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Sat, 21 Apr 2018 22:47:38 +0200 Subject: [PATCH 031/152] Use SightRemote's history broadcast permission --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 00d59f09bb..e8ed6a2f7f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ + From fd776a2a0eda5e2b3fc5da2ad1a01ab0d61669a6 Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Sat, 21 Apr 2018 23:20:33 +0200 Subject: [PATCH 032/152] Add 0%-TBR to history when pump has been started or stopped --- app/libs/sightparser-release.aar | Bin 202440 -> 203059 bytes .../history/HistoryIntentAdapter.java | 56 ++++++++++++++---- .../PumpInsight/history/HistoryReceiver.java | 4 ++ app/src/main/res/values-de/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + 5 files changed, 56 insertions(+), 10 deletions(-) diff --git a/app/libs/sightparser-release.aar b/app/libs/sightparser-release.aar index 4e474e608ec43954c73edb13f808065edc521148..0d656738d24594734d2dc9798c48ce2c8f8d3a1a 100644 GIT binary patch delta 189652 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%0AK^)(|IG9LQtBAqW{^t)p+L z!Gtb5T;^4ofay$)k~(0*Zpi{EYk2?w?Gk1!MO z)-2spA6=gG0sDSdMpm7aH!z#4y_#_tQUmlF`kk3D9|h=nOn>8Pc(0EG_V@OqEI@3kl>&nb z<6MFJsMIPKe)I-Qrl<{zY8j+D@OMx*G4!YfAx@NbG^qED0h^)$R~0g~9)F@3I_g%4 zt@Kt*dd(Hc);G-qmXWh|)WeoM5xpuQO{*|d4rI$n?Xy;uxl$Kn^bjg8GFk=UH;6^l zVRI=s&6edyRj@hC;_UX*8dVb#a9+EvbdhP6Pn`PCW@?RsMb3+;lzJ9Mx0UavH4)+C zTIQB=-vXtRom(i)_L*3P&3_AckS`&4F!UZ}t;#Y=+OOpMa-p@KTmu&ZCf+?%y6^Zj z&y3W)zOUwD!!L$fe&)7h{uv|+5d_=4=g%5u6h5*Y#}*(QFPEqlvw}e?RM<64{FL)C zR^0w@%w^I@n~|hCJD8r*hJ!h%Psq-Y3l{3CstOct8+_nUV>?`2Lsdo z$>ZyOIup}BycMW9_$=n3z{VmlZJ?-wLZKS`h|^46L5msOX2tNK;IzAgQl|Av;p&09_reoWG^w0rLkSDH*&+fn4`yd-1?SD`$0IDdf(+nN%E^T%E5us}a5 zX-N^$VS-yx=iAC|+~N$eK+<4l*)F95Jja&qbK<}{3~GBTC?ayRmM7;pf+R79vc*Cx zq!KyzS%~%}Hv1ZvDnz!yWqb@kAt_tGyuivpBw+hTT_ELB`FC`VtESKvHO%AQBQ87Q zP;&j{ZhOT0Dt`g9g?YSr>Qy>@)O5Y)j@tCiOTJ@nm>!W6%p3>1#8u?>k)U0MvW(5a zB7)mBV~3XZhME;aHNNd?I`EhgCyWQ{b;M=Y*!%FS#v9z`S(HZwyqUmrF|wv@)RxPZ zZ;2uC=hl;BorLx`%?EZHNYql(+`=lKz^`f^q)dOiHh-pEj)oV^69XiL9EL3RLV7_1 zJA`lQ@yJ~qqlFjd&?bBY*Lndo8M-xscifb@Cnqma_e3Wz_>0uE8~VfZ3amPr4}K>H z<1l0gFVWiHMGTSLc|rzUn--9&7#~vnE{_;1CS6%#^icY2c?fJ?{%8vtuxdpL|BAaK zf4P70Uw>^k{V#L=r>he*)w8rTvNrkG?WTWT!ltFsbfXv+{HPPJqK1O_QOFFG22G4Q z76Umh8(<{e(z3LM^eF2s*F!Ybi@zcI9=aak;+!NvDI{Pyox;VmpZUzr^t^q)a1Mf} zPZ9aCU*9ld0I@3gw_H04d^)KJX5XOP8#KtpIaka~}WT35aY)sYd9S%V;cp(O}GYvJmv2dio) zEeMwzOFedR#b-W2?`B=ku`)iAk!le{txD%mled61LGSF_BKSI1QBg*1xL{vO1%KE^ zZ}pKT&a)(Jixy+tr>dBwK9Bo)D+?*8qPJqt4VZkEoy1m|jF2=1$y(4 z`I18Xy(xsAm^Ol^cG}FCSyUlNH_JVTI`_A^Gi=5 z=lVEuyTsT%srB4*{p-tZ^?1WRihmAxgI$o^G+UU+k8gWQ&2_gR5zlgwic!y^ugvfd z%o(7}c`@@}0Z2~MWcdx^2GEDmPhZ8>?qOrtrUZqq4`=aaKQIq*IDd0}0vQ|VtB+$N zug0jZN3=n|#1lP*$?X^Oe=54+=(1f5rx1|zWS*;muhRzhLiL-LM;299T7Paq8tGK- z;l;ZPYse@o4jhl_d9VJYGQoX14$un7+e2aLW)PG(92mFfQZGOPx zbX-5A4p!2mcwUe-O>j6j4!Sf&Gvy7>p6!Uvz$}lzR8k1pEx*%4@!Hr?Zlz=Xp($!j zp&gT+v0|7z52Eu71rM;bsFLf7KLWVuTANg^qyHHPg~4RI&Y#Uy()8^;1`0pR@`)o7 zn`lR-nWxVl@=kBf!hg%+?XzdHd5fB8WXI=sVx?$N-wAf zSf+zx|Hn}S0v2im24ou}{bM91bYzYF%=zY-_Ri_N`j`C^PXSGDxt8=F z+HZfJDcv2nw~~IPCPx3Z_V@p0Ex)IN{yWB^Z1JZ9p(&s!(0>aJ-F_Ju5G3?b7?1b+ zcN#Q#=+W<4i9h1mNkYVr7Tgp0Vd3O1fuW9jL9v6I&PL7%fRwjL{Q&?yhll z`|8@hyJ*qm_J65<(3X1p_u+Njj3lZY)LVE1)Aj0?&dZWgWmS5qy;q44kG*=bfJ4pv zjLuy=hSXK3kyeTR#EY=ZU8G*N8jne{;S;EKqosVe5#+vau}sv=f(=Ny1V?!_ZKq-1 z!ZAnc{hk3d{hgftv3B*Q3j^1QG?^;SY=I5KY$H2|qkmk&=3s>?lbrUHpmW1=?2d{p z-S=+d55}|D4oj$a=Pgunkf&C~c;cF~5`^TC=MlWs1IB9eIqssM|a8gGa737LhqfPEbQneTLTybNz@_@voXS^^HI}7RZ*g--Il$AaF++E z-hjvK{xy_nj@;b_z&9dRx$YmFGF$PX>5;-(bC)08aMupxtMj&*r#UnAl?E7}Ff-p> zh8R|P828JL_woxtPh<1bjI5JJfdGvD)M)AmPGTKT@`c-R%>(H3ELbj>ARSboj zB*=3X#x)7KMY~ox6maphM|i(ni&)nMduMuQst!3>@`R0T#W^H{%+VH-G9VDo-(#lVB zx_=UbQQ^n9;`iL0^iaZ{plU@J$d+N9>n~pWbWt_}+abAd^pGWR+}!XPr}(u+`O1l} zSlUXEnAabGi4l%RF!3*w8)UWf(Pdu}j7xy^gR|zQ_$6P~smigh#+)*+W@Ot~icmi= z!vV!xj(g=5BA{6gC~^z!VE}?R*aiEyNPh+78vSGtLA<#vKOZ8!!iR$8HLiq=4v99K zUc2H#uk+wHVnU<2*%+2L%(5$Y4qpK@<1=m`6NhqkfQIgeYMtL~`)ai@RP- z$o_ZO{tfhhRJi?Dg{dlx1F|v(PXqB1@z?M1^=hEypAj@ZQ-UpnNf>1NPMRx*qJL6Z z$5}NeTW_5eDD<+muZKSH%U^&}l5---8RM9w+llx9`Fi9pSH~2lYaddLjn98RubtbS z-8ZM{yuF-xfUs?i&?oA5`gA=9R(-q=sKUOdoa~0wOrh15i{*v_*xbsmE(Xs6UnYxOaSdxk8c4H=R0YmUv(ME=br z2x>OTz#4g75kt4EZ*+;0$O9(|vsTTLvPnHEt84yFpaD||V`IGQ5| z+X%Tl&55)FCN^|-2uAF=Tz}$gSS$*)RkS}|_?kMAZ)SV#iHK5DoZ*vDF0hTu$o4AE zwua}3stD~lVBCl*O%8)ipObSN(1FW&L9NZBc%iVM0s0glQJKkk>Xf8>$OtXYB536O)$^A>2xA}=oZ9cO63~s)Mx4^7!v zQ_?q^AJkS-IjYrQRDa6cVf#wlQRqsokU461bk~9!*&C9s>U~tM%6%5DU;DnaW^Y7? zvRx+nH7K|G_nbhY`l?*g{zP76lpa^K``A#l7_5oXTDkQBXV)!GAzO6{ucotAl0P=m zC^_ZMFGgCDjPB=DU3sa8iK?Or_tMJR%zAB;$;@5kd_iP;WPioaf}d|I9IAEz{NYU^ zU@pb{+S~|__!~wRIeW#{M_%PiOkP!6g+2<;F6gZKJyP45j`=!@ELpMP#)DPKeY^=T z-?{f(jvu2u@K9xsS!;7P@YsSUfOfG}t5CG4Rw8T8g-U71#zR`JWMa}Fhs5nMqxow3 z*Z8Hm@yJ9v_J8fXucr#KEF+>N>R$dzLa~JJ9>-56*=A72eQ53Sf;4EBN*iv*<7;i{W3w~^cZz>UB!eQ^?Xs#B5IOoRSR>v3WH~^duj}}^FPqgjI?r$LU3fe! zS-JP5pI^EvIMqqQfBFU16C&#K>?*&PV}H8)JIAbdSd;Pts8e}%|D>#`H2_uq{R5Up zPsC;^roBD{yfJ<a?27iQb92Mj*vZkWfGLHNxR$FGW)$j zkB+k`SIz-{YcUjIZ_{GhV3h4?H7qEdgnzuNc>vRL-x{?#DMuytq+sXt44>#7Kbfo- z{OTj>YW8>0i-9Eg2V86vVmkU;FZ70Q>%m0}x51royk3jyq1;|_!vp*c#KK3?c>sNZ^v2j;y;Ts`BqU&MN?BWa92*^9 zz1=@Q=L4bM6vz3H9HNKjU^lw$4S(Q7^VECT@{J7Q#AC>dweOZg z>{&^=tzJ1dEg>M*dWRF7YL>2+SFklPKl)NYE)un{-vub67M}Lp0uP5=S}9~Ob7k{M z+DrhiODSJJ(b%XCrBX{sTCyBLbgw~e=6ua=W>*${o-A?`RbXhPED?!l>3`3r3dlA* z9du}vL}zH+PJRhMbIL}kgfeQ(vG&mK(AUhgNE2y^PPbx>mrJARU;(;HyBck>8UHNR9Rb9AGfbYyM4gF=q%Q^)IqOAk>fcOV$9(-> zr^jBCNE>;D9!b@GX__c8Kz}GGQeuDKTU6DyQ8vj_hgi(&F-oIdk8Lf?o%CkB70yfB zx+|U8Nzcfch@{qUfJ+5crcdchK#VN*NEksZc*qwOt#`YMxPV)Dpt)??U%5ixq|CJZ zYM|EIN!3YT`*o4}6y@$ZzdYkqAx7`fuX6f^qj21I2(>k}#!Ar^rhnn!8t;3Qa*uK^ z0tD_%1w53y>8CDE)Fa35PFLA6F*w;7Us7WtN4-BhV>Esx#e@xK2#=Mj#jyo9cMDEH?GvniIaZE@>uVRywzpV8i2jJT4Kw47K@q~_Y!_bH_eU= z;C#9#?D^<73F@bqoPQ_B=D(3!4x(r4!y--={&ZNV-zYtSE9K;L$W%LS4&mW^Xf4Y= z4F!K2aDE$*n_>Hdj2qY0=>3nt3Q5LbQxX^m2+m)&5G4K$RQ?e1FZfVgky+tK;6YAL z7TQBHJq*UMq#P3PIUoA7oyP&pGO?uX?qXt_$bW9u)1*q9nAZWsO>Rjf zE}Jl@Qb2J0QpOSolgYlT&+FSIawk%v{osZ?nj-lQeMAcNbn+ZS;WmRFeRMm?3C|%! z;_-=!3e*j7Qq?|#A4>ETiYwl%)<v%xB~zQc zob4ne1z;Qym1zfl3P?hyt=V#$BcJw#6Gf5MWS6dC0_ol&VJ5z@NmyWW8Gg3;|;h8Y&2_oTpTK^3Lpu1sVYm!F| z-D2Un#=W7C8LJuV?a~HRvn)el^w%AbY;lSpU3h}c^Ag=w!=&-~&T%ecH!ekt-G_T0 zbVsK9&e?`l#)no@wHCOJjgNW@PN3 z&VQ_(O+sGC_=@Dkm@gq7s9s3=xmN08OJWex9Ph?YIqp|ETncqMe4fBIKvky22$BTw z0*Q^M54tU(*BVQ6IO-0>S0(i`^*YfrhswWhJ{B09E2&^EVhP#|ReKFtHI0<>_f9?0 z19#dDz`gTjs-Ok8s?E}_pafNEJ4U`Iq<=T-9*SLRuV3}~t-+pu#3LlP7H;!Amy>QfYbd)H!AAc&o z)_OCNceA4wW?X>n zkGgB&J_6O6>S|26BI3h$w@T&R%QUD@9})-{^NG=WO2?&GR{HdcF{mppJd&)d_Uyx? zr^ew@U07jJB$dXQCsUxgYJFg}f`5TVORorQH+S=LXlYelUR|uP#sY+)d$PH&@}DVL za&#ERV>Tbw$!R||imOr!FAxJ6@}@ojr5ca(=^iER{Op-YG=fYEXX2)qwAsNu&;{s( zKg$*CX)w`%h|rgu;nQwQ2xW#1E_?L;bhfQAY1ByL0$$2k->p2P!JQ4_H-BPP==;fq zYUcYyC3ky?EL=ZOFdGzHfLi!&8*TBL!YY1-o#jam+{(>X(W|h*A86x}4$r z6BTSwge($%F(Un!jQpLGQh$HVh?0Q9zk24Dwwd8a0Ir*5eDr&c5y+0Gv$Nosh2a0j zFQyy%-5#4l+@ZXFJeu}L+x%Gp(tF4U+b>(4@Ef88q>;+mkWfn1K`Cph*R3^N%lLd9 zUJw@`F3XU%r-ZDwZGmHG)(9%Nn&m$TGz+Ee9_~Y4H_L}|)KDo*{FB;V)w>i0JVx6m?vx6rH>T$A zblOBu6iOv+%EHX6>VHF|GfVZA+REt^)}<_mD{pU(j<3sIewHet=0r%+tOD#{8lY_6 z7Fr;q-j|Mq)kzh10c}2!PzZ@0EzfIRXY#8&7&pyOo10CfAuVe0vZOxXX{O&Pnn()4 zwGc82wqr3uk;F-dB0O}yWR=E}gp5g8>Z|LsQ*}bCQ1!sgn}53&0{!XK9+(G!9o1c! z9+;|oOXG17Q4W^-Q77)oPPcz1B6wUWP7*;uKt%ttoBVH?$REYnzhNR1zn$nn2Yh{b zA{e+ZqE8>Tt1i4bw<&woJO~Bz;k@=xm6!Fv$r&?~BGNm46y9tY6vR8oJNZ`b8pd>T zGV|zW8{2y8gnx^%_TK$&9~}tYWo;zLy^R4fy!m3uCPDV$qItsY5~o!te9$?hqmWvp z)MhKCr;d?9g>G}OoL4E#={;oF3YV7vLJBCd%1ZM_oSk=nec?Ex{QL?jq9)1S54yfi z_&Oq-x;1uX))&(h!NQqrdM`|UT@*kou18i*-&k1Yy>Oz-v?%fy$*deLb=Isg>I3qa8+N=wuU0D{?E&*Xz z+dJF3Fn_2@BnyTO-!yY(=1z!Ng`h~{c80IBzMsb>8imXi2cw2W{LmJ5&~F6ZBK@S< z+<-u9AFGmFSlpoVfN(Kcs(Tn&z^s3ibvBrGI{!1>=uKr99rw#Vl>Tk0%Kywhgv=bQ z%p4s4oO1bBarU2=rY&1)m7>ESx4>Jce#O~V;eQCI_*7=vXcS_3pXh9W(U`Lf6BEf5 zPCJlqmYg{C0faaHQmSRXpi3;+XFQ$5q1~bVdTjjd&s#%_+TiC13$tI@IW`;9L6;*| z+aM;LjZ{~Ec!c_=v}b{%E5;90OnI5EzJ*zgH#=8p02PK+M8Jm%^x!!WFU>*N_ESZ} zL4VlN)%Bfere}83LmpX%vc?km?dhci0ruh2)5Bm%lDwYW!F`CG*+7L>(s&|ao>~1; ztWO%i_L`I8=EB(=z1rzvx6$Zgs5aW2cGY}5c>716#C60H$~Lhe1r7#!T1CLI6W$5) zfM($mMeQgH*-_KWF$uIKzG?OBqS1pz(tluBfUG^cWVw=J(@i}k;c1}n54$iS0Cuw) z1#3%djseNdmQ75#))HizIz09d%1k$rhH8VoOpl&>H#GJ1YKEjh{}sRtS)QS8oVwv; zQeW%knQr*zqfaX;Fo>+89z(byq&B<9n0a9T%a|F=K$UH%rqMxVyvjVQgl1peTz|xH z>WJ-mypE{O>?GZ=Z)V4NB8K~654}F6)KsbXOq{+L#+M<<7}*7Z`YdO-^6+`XO~?}> z4k$pc_~!%lA4@7=pBQGTnZsi+xY7N~WyL%Xy5Ssk%USPmL|Ur-&lS#Fs)z=3Y0?KU zj4&+&y+NQfL_4zgjjkXQxfCD5cYg>Jn1ZU_=?@FJb<;mK@+*_3DvN3kHkzjfU=%8f z6c#}A2>(d3TGeuKtl^&X8F)TvdQU^M7{o%Bi3r zfEwX`f{uv}C!Bhsfne0acqgWt}uvWj0c4VQL4TWv9!NcY&g zJ6S2D1KF!CA&3w_V!|S9%uiftn`B5+TM>Sk(cOqFnJ9kxTGx`)>xp!a`Q){kvbv0z zX~TKvoZs8YiZOj0c`9i=f`4lbPWW>R)IjW_0C_Q1F5sjX0x#(XHy_o#L4UbG%P4s7 ziVINfR7i{QR8m00>c5wHk$KG%M(M9yC?aalnSABUKngFFrB`zV0egn|oQVLmVTH>Z z;h8qI{grYeTBUa1y9qu3$x^TXN zeB|@w;A=b^{IzCK(ZpFpMHNu|y|yNYgIG38L|%!}FxcO^=eP!c3?+4P%2 zDa|!yHs*Sf6jp&6V zb}2N8oh$;VsiiGD#SjOJ2wgqY(Md zWsk`Eh0^3t<9|1Y=hFtAT?uKF^jm4QkDkYdFZ=i#fz(HE`DiP0)Gtc>0Sw_pf^Ym{!6AFq zJR)@#X>a_Oie`km%$FY?2wsT$U3J*d2&m-^(%M%%Jb#>j^6am9JwHBDeKXrZb=*+F zL53EX+_7)L6_@HqYe3Y3KGT($FEo0s&@wi3r;B{H9y@VDW93PL?Wb?s@`*_ zan08BTWOx1nzC#*w^C}2A+n4h(~Tq^awKM#KLQIoHlGP?Fxy*HM8_C5EKgd^SQ_J0x+2hgW`7<$o)%MXCdxRb9zQg&4t$6T@$z3s1!d z6=t%<3drq-fxBErmug8l&l6VeTd3>%l(gAddMEH{@fYc#9HXTNUu3f!aZj-YwDm@F$XvNl2yT(f9Z_u|6^?xtJ3}ZZB6bel*(=^w7O03TK+nq;(eaulL@hX`#DYd$Yy=+Xxf4&0&`V6f zhO|1l*i{jA-IZS_T^S93O* zzqr~sTRe>T2%a(iPv^tfB&5|pY73qPI)s$>8@v(sOhq6w7S!cL3X{pW%eYH>%H!qr zu?vVxRq_`s)tO)a7^$`4q<;#tdwWX&3dAim@1vGq)&@-oel= z8%B6e2Mxw2%K>Byc?Zcsr}kY1!@;}b)wPZ3sb3jc(N{7 zpnwK9q*lAEjA8(RP4HxF&LLH``aKVc*MdewyxO#*$_i8z1|w{?xxg8RlYhA_U(&nD zsTJaUJ~FuuPz4Y^g7Rt{=dn`0WX{YUsM5IA%a!EQCgof1MUt3{3+!-)O6PCP3#?m} znM;tgIVO~gJP#zbj`j1-3!T$19iifc3)FZjuZp3vP-bG`i*>r3oyv)DhUa+)o?lY` zU^md`g@I|nFqRnl}B>!WPT+E2B^ff zqC7g189tktObwe#qrr9Y#>RE>r+@UzBuTR((?t+07wEwV>AGfEe18b&4Wd2iWGI{J ziqtQ|=6ayLZHM8yf++KKz$m1SD4*_-o#ecO<)MoUqCZ*cHX(+OPUZRL)|;1g^$iMX zgIhVpQW@8RXuHG=N#9QfGvf#kfIg_*o1eU^HOi>x=#b9Y&oGs8&e*py7=$vHp%6Gk zC+19*#?eoLnp;;`DSzgYZoRAX_(wrY-9-=lcgqjre=HwUG;;j^&hPx|rr(SlhWGe^ ziVBQ}`H7#>F6DQTPo&A9K+upUUz~ouSxc*#%s*4CxzVOu@E4+(>oqI}>hy%w z;uE{4&)ny`96bM!42PZoV2F{$d{G%_^hH~hB@BW3fQDCeDu2krJ}(KM8%`LfE{Fj`TkR4$c7$Fxc?3c)bGmp%At*`N*7JRL)vL>v#fD3tr|bmEC+s|7 zXga|qEFQ0r*nbQklf}(c@!_@uSQ-3zg9K5ny{J*)1nsNnll2lMq+8;c##l%!ql5rj zfR7N#UyEVS}XMB3Gh51-I^l0m{UkP|A}Y z&72nM_3(4f1u+HcL2?0YbM~m!UWxqAX!9=yUjZ=1BY)6&%nZ=h2k3n;nsuHVt%=gD z+oG#N=*>=}$;o{K(*oRh@{KYPJGNmFlygcM@vKU5A+e`%v%bC?*RlEhsu zH?JLDrBJ`!W0KO|GNiAysVK9uEI-*}oo`@ey8_H4aqDTAD^oB#a5!OV9I~stTWYvx zQ{yzZD}R-N_m%Kc#()84`t&A!@OzxJe4#k?<^VxJzQ4Y5wGrc#BO4Munw?~42s7n! zWO9H%D>=2HarhRwn=xC!9SC+b%hB`CvRnv#oaZIFtA<*c`!;v9h>c;{?;LsOW7>U} z;Xh}KEVz?jwc?1|Z;JO2nYeJNX!>Zm2eU;cmd-zs`Tc*EI>p%@99$ZyH3$;L&IT3- zk*t`m!8XkgR<(zIHQVl^ORmsBu8@I-Ln;xhS^p8q&mPl&bh6UW_(8)C!k??F^*}8o zM2+%z3CbsgMKLEV*-){A0~Yff#?yJ$ zUB*34Only+o^U&vGY6*pE-~ey`?lijp>$XU1W6dF3b|Z> z&2VKTz^Pjg%CWYSEW4&>r9ezYt8$)wdgwGSByiVvld*NQMLUJ-shud`3~Tp;nM2Ui zOp}%B0|SThuLO)*YYkCZGITA+NMfMm0Gyyfg>}JPHjBP@N@9>+`H3aT zHRqw-D$`9^d*Zw!aVcZrI=irfqp0>A2%PD|6vCS1wHirW+Ev_zN?ud1IBN?ZP3CcC zYHu2=S6U3xI|YI=)mj-Zu-5-*Nr|{EAB*7b8Aa8JM_Y+o;ZT$r->Y$?F;!)+!trqh zXK6Kdw}|hh1%9WcIDq~s09O8;)D&HS>s8!&UG_;O*MwO}qs6Q+&d8AHP_Zh?dl`RL zBiFkMlc$!{9I8=#)=_mTYz5Sn5G06?;3gY1joTk~q1x-frq}uHz-|58DF+00KgcHv zNj><(WP%?(>ytOlMDC%s-qf#{F~~v*bMdD*olvO*G6>Hz>TI*l0UR<@7JMw*TkilcS!sp`QKU z>K7>duYLh_*cFm6qR^M+oH9s4-rRf)3(AnwUeH~j%lGT(=C58zQ^2f zllp}3F{a@yOI%DQ=RZBhm!5A|1|~qzYF55^Ysf zMJzZ3*Ysi>Bgwd=_YrB?a0F=swYT9N%ytt1{T=gZQgcCpQ9xkr!B61LS?*kCONg zbw*ybjOD`WaF)!~Aby%v4lkF|(m|JURp7U%&J8Xie#NI8*e189^=ke~*A#a?R8z8y`e42#sZjU z1e@*IxbPH=(JhqRC7Di0Nid4^F7le20i9sdM&9>;UXk?+-q?hcx8fZ<1*X?+_S#;# zP26e0!Pb{=6+Dg&)jL`1XI-uiofa`U{0yI-+~A|vKlf9Z#QJ~j4Vi_gy9A>R-9bH8 z#GR5pn&b9ZRp8=&TF>aisEZgV`8a-=()k$4z-FeTz$KsT9d%PVeuGnze5f?bWmV03 zBaqJbi2Iv?NA4vShhGe&{N<+6e`&+_A7@_vp?vXoYLa{vD+erP6mMFBC6F{=t7*SR zowS7{q;a{GfuetDe6&&s@f3f~`~tZ3V8O_bGuo*aGQMOPMIB!D*Nt$dw-4`O+pcFu z*@oE$f+?Fnc}yl8&YC88CIUO&UQb;>*fvEN0_Py-ZRtYcFZ4df4TcrolJg3DNybJD zH(&~-@xm0h)+o}mJXFb8 zapipyK;7_848+uqW>h!*0eoT#T_V4Rp`+=ZySj*4c?$WgKIUhspSx{+-`CV zSN{F5-s(v7MsC--kHNBXvr(fSJKZ>V$WmDLK9#m-ddZ>gd%T&Nv3{dN0S?kmVGc17 zW)EYl5iozdca>Ie-IsucVs!z%5VtG!TOvZ@@D94iJ? z+EVAR>e(YbRoCRWdXR9SqZyPNrt#lQsk_-QeN}&HNp6;$l|q5L5&X*JR9Ya84&LgS zI!x3ey>Cp<&cydHMLQ#5FiVvHf!$1l{<&Jt$%0R*@iYdY1+Ih00!&yL7tc9sXdJ2c z$kLj9y{tbj206>TwDdz_UyxZ+`QjcOfQuVmKf_=+o=pB3Xj(nxNcoaUAY)L_AdcSq zSk!+QpboB6`tWI;@^edgZK$fPwlMfLbO|Nn2Bmf%II2ex#iFX-27lKFRMI2j%1#cd zDkWy!Qdii@(g!%Wp3^V)*;}w$N-^D<04h4#(fy*lIAV(x@XbU1!c6Ph85aQCCj{0t zr9OrFT0t65i_WmkWe4-*FHVixYeSkpZ~K3`u>^&Z`(A+uRr$WyS$Z7uo(!AehAVbt>_Is#W;B`(}+EDLaGNUkKa^VZ?r1I ztPem@C1G3+brw^6T@MfVj4#ixuY$B{ha7Wc>xh@cpBz8|+uQ}0NC#-7Q~{VzvG#wv zOoz(jd0#l5O5t>7aVc$=VlvXg1&=CLtV`Y*Oxxx z!m=?K+9%n)MuLV=7k8>gI-+-nILyrT48XH(J(oAOZGcyU%G?#wxnTTx`~iOt#*ggT zZ=H`0ceDy1LkoNNiWijaK@$1U|;(h>!> zJ*F2tjON`XsU>>H1^GLr^~*@$=xJPHj1Ib^vDG=|C2hk9GA8wyc{zXD$bb(d%E+=A z#=^;It<&EJb;T=@G-c9iG9c23J0e34#5dktjj(~ZLVJzjr8hg zDM@t1Od_2W@DBbqA%zriw0}z#|c&XffI$X7K1L6+XPj!ocrgE_H-I+Ad<1*tk zky>V4fDR+)kD|CVE3JP|_Ws!3Q(N#l%7J={Gc=fC00w={3y(Cey%czthB&i=kpjGd zk!AyxzUCuqzUk6CMLO3oGWq}}#zZ7F5t)7ouHALS+*N!GK+sqz-0!~3w%-{;Tbt3 zuKJ%y#_h#isi$7h7L5Y;3gNUEQ0NE)6!gS{Fxgq!=B*}$o;(MKyc&WI0$0>-&}Jf> zv9DlvU7D;?j7Q)G?4pcQ+TX4*>}(j9O=lrwA9W9j1kOJ!Zqk;`c4_zKe`d`WT?enq z<*7pIw_O^Ld0KyrMiKgdSbL}FOuMFAIOy26?WAMdwr$($*tTsa9ox2TTb*>cyZiaa zzxT=4@3Y^r&#rsiXRB&f)vPsFRkSOCAkG0>62$?*c03xP_Lz*9@G}yzuBaEznIDegVlI@^$71RKxo7OFkX)+!H^8HM0$96-(0n; z>Cr?sd&BGf@)I5a?tY#h)0L4OnkDF!K6e1}9S0;wIP|^37Zz6y!q}!`mWuY@Pw6kB zk0l1R7x!ey70`Vmv8}5U!9fqZ(AvWNE1*x&nk;`SQlLk@@&(bq@{WQi%6ZXGvDKp;Gjl=t2OQ$pzgo=jLqKtnKqy3-Hoa~G&2~Q ze`wci8g*{s<`lg&YhB4Y7Df7aKFY4y?K6Kw%b=B8%v4dm=Ap4(kdaw~TCP^KoK)N# z-@|;83Mfdrg~23dtx+-}GMVe1?SlHQZbb82e;ZQ=dN?Tf(I|v0WX=6#6Uy z&{ZafRB;~fpp%p#>Z|kAdHt^suL2qyTPSnQS|u9P^tGnYo$kxGD6R{%&A@SHfW7E1 z7Fv|%i&zE)r=ZdKcK*b8n$bns^aG5m+MqPoOCW>E)S?~G>7D{A&)L%1z43pV1qPWC zbFG&P3x0=;7m07Vy+y5bLG<1g_PJcNVOgWx(?_C4OhMQ8!8g(d#X#E=pVEiI=l2|f zZ3If{BZ3tor>b99eNC#Nx=CqdTjyBUdtA~x)~y^$aGh05#Dv6xS0~ijxyO-M9<6O~ zDe5pTYC?c#pESUN8Cx@ZO_sH)>j{m0$kxXQ2Xv1sHev5nh!Hg6_gF@L{4nEwqc%{ zML|!k#V6L5bvPzcBymQgeM2afqsSPH8(*s7wD9I&9%18BoJ#XmDhq#b8=*#!5mAFV$55Gy&;;T2tXI(F_BW8a z82LB5@3#yd#kmMCkm@2-h(zcx&6uk8RawT-Tf3~6NPBo3&qfDWT)~SRD-4mYhG0v3 z*KM^0C3?(Kdhz)J7mj~tqz7z?8K<&7K|fs3A)YuN6xUMm2@~Yo;!q2-XulWRWl3y= z#xr6P^wVtE%rjDOQ0I(zi(Gi4b?-ZhJ9)Gt32(mtshUC#4O4x8Awli0jSlhu1_{m% z4#qZ40{V{nR{v5Abm3A&jW#aKC)|Z9XggkCz%;<3#*N_x$0#!e~ z1Kk@dP4p{DS2ut62-PowT(9AHc2yHm@yU+Xo8$<#9b2|V1|GqZ69c%~3ox7724>=s zSM*{O4Pw|?>YMPII>xFi?p>O&YLh^NgA^R~{lcT0%Q(S}mHSC8RhO#*X3;upt~54^ zgqY2hUwI3~h1p=~AVdp@wWenkoM*YJuH<9u;_V#!cxHc~2Dnqu-^r}y*+4X#wdP&E z!=uj?PDlh{4dPc}2UKE}nU?i<@T>In(`U0?evxbzN|VT~!fi8HT-Us@EVxjC305TH z^eZr1(m@M6j8BjD7Y?@JZ9~d`lxvbUI=8m_sKP$vUmJ8NHbom~yRw|!E-XgkDGKM& zQkV_U0f~Q6qTa3ZH%6gSQ;rkR5XRo5T&k_!2@8iYLRa|Ymks{O*ifmavZPza-~PFf zufh{t=J){Y>_*!izg`XIut~Em^rB`kG-$e&#ds( z2INL*xi#Hn-U8zxm^_%3j|=)mm_IOsvFgya$F4DJfu(B^4?TzmqC-|f7ecYi1w|}I zGFpFxlViLf*hg&KqcqI?^kEw%}{(1~b(5@NA-e73tEH+Vs|p_`PiBp49VX(5HPDxB&)i&gDmA z#WXrWlivQ%UBXGb^@>DDnU!+c$Vodh4;Yd4cq}a?cy0nGU8`)+T32zFS?$$>F{gPH zUO8{i9PF?Hx~u}zL=lTsSt+-4SOyH7F*Zlp1J0lZ=}^w_eD9HRfG5;|mnG-LdO*M<{x&Ga6lM=aKSZa062l7D z<@}g&GV2stg(_zZFBq)R8}xsA|59e~^2NNBJcrOKaY>(pFCP-ZlxUZ0s5F0&o_0UH z;~t$1tL_F!_-Do)Mp_I_R+rJIt%`Zwul$vO!!hY~qDSUY3t7D{(lkjwmza1 zkvSkeM*K6_Abiiw{tDT<9>HFUtgZsbwUofM3}K#_87VAg5Gbt0E4_b@hU3P?37Nyq*xRw9yK`R6W->Hj%! zg!Ij=+?8yd{!KM@Ux|s#@O|*Y^X)l{pAnawyVrS&so?vD4d^vymMM{$8rSjn%A;?o@4FDtR zs*Z1X#i{k#`7H*KT)FBf^`-l?g9$X%D3^Z(8dn5&wJRFw#bCTZ1>10Hx&CN53g1$} zr4Ke*oY87GVACoX$v@s=D_gIGtmv!2 zbXOoL5E*2b$LF*Y$pT(9Ay2ew?xiu_Mii)99P%@Ch*+WAU}E+W3MsC&-hyuukiuD3 z3D;VT_9B(lkX;JX5o9yg$0=tX>qsB{U^LfWVU}dZ>90=$Krf^~|Hb~#eH4w)7Dc~K zn8=Komlw~J8k2wc9)xzZcVA5kls7>KBei1p%fDYPGwXAFC)DiYrmQ{-G6l&QgIYta z8+W}3>KN=;4JS z5=jNCpGQGKb^sp zKg2q~BM7;A8=LjKt{0Bze*%q=2k|nc=umTFMrALzz^Oe9L+CJH(nBwPhg$4UY7#(7 zIBN%$fI}m+c4-=GJE7tZP}Ao*_$vl+oNb_b&n?zJ^;LaIYawdlj(c(+&><~V4t>H zTf2W(TU|fIKc3H@&;V@qGN6lV6NYFdFgAL1Fxf98?^~I`<`RoqsV2GA72;;|n4XH< z@h9aW;S}8l=uyD8_gn;@{SG-E?{Gj}QuON&IQU1hYI`rc#0+kROSjOPcKk|t!VrSJ z4n2J)q%%0R8!%sz=Qj;T9;=A9t+Ob{-D!VF60RF9`&8oRCu=X9Hi))R`ZuI{I0?Dr zDakad=j+;xOK7s^%EqCG45`4iKZ#|GO9SKvA~x#Q_a?h0Lu_NLHKS3sOweg)SpewKTXZCrb77l;1 zP4AH)JqW=|Q+g6ZPQi}44xh5^K68#>!EEOTzG@?=1o>Jun!Qf$-T7W^pz@D5b6K#_ z8`5tTAN=sxFc-~I#)wB4wX1qA=l+M1U1bLvG;goQ1B)|*K?SR3A3}>xZ+osG>WEc= zP|Wn3o^ZuXnHBTBn=2)h?6py1r*VHNG&)AdhhY9hChzuC;cswg;Xp7hu+N%9h>A>1 zEO_Yc9$=zyWh)|cFAt_HlUlrdrKz(O52HS*@sR#uy@R7AlV_3}Edr^F{*0)Lkvgae zdQ`|xH`&1iHAgLR&)fvv5k&%wR@h2DNkYwV@ySbQ)bhB7b?K%fY!ZAjF@ArJP5Eti z2rD#|Cv9;}rb=c{-M1gEcX4@vN^lLWqf?P4>2z)yWn4oUv%XlzrSBXoi96jby35ZG zqAlC}fWKq<_{yVnJpK{vW*+r)@&==eDP|o=ScF7o;4MdGZK<_K#zhcSfIzm6FE&&wt!E9!Hn@sfm!sj%aR@+}OSr{t;# z;vGr`&6aCqEeUFFtj+7Y*LX&v;VSEk(0Fb_ohrYHNBv+bf4Q*z9XXDJ8ry1q6|l#D zU54@BtD zX*z7AdXdor*dwNO1IUIT7>Y&_SPN%St9Lc!-oChaD|o*>Uv~wdTA9h+a{-DNu^1t! z(T527GGs3*EFUyQPZ4B!CnMc5_q}SfWF7hfL$KURb8bIbbsv96cVN~NJ>ckBd-$g1 zSTZ;&{6TYL@kxuo$-HSTyI&i!)N%Oq1~{E5$f~7yf3GS zH}SGqFSRr^*=^VLyszrcBSd8mrJeuOULyX&O#XI_)LQrB_=h$Di7iCgxZSoNa`w}Q z9I1w+Td>{JB&dI|&h(Ltb1`^iU*e@riss~v9H`*N_c6NhyvOiLdRRdM&kfk<(@s$q`JiaNvTnJCVHYoDmx`bx2`zxRDr4Tj2*D)BUW@6zRdON_XjzErB zV;cI2`kXQjbqV|oe9lp{-0gO!ToOPho4=3R`_fR+B2rfqB9Gzz^{&IdG!YL0k5=?- zL}3fM)8-xYx4%c6;dNO2%9O}|&6NL5`{ehKr+ z9rU0SAJQ73)~(lEb?ykC*QDznQ+C;)<>!ox>HV;Gffw|SL;dlatO8)S!Jcb z1zmrh6x-J(8SAY>(_qZoY1y=dbZDV4EciweXdrDAr_%(h4Ki&Y1s4<6%npUA7e%=V zvzAxq_8@@FlPlEbW3{zQIG@f6mXD_jui1>B2fHa(VMBQ4;3b(CG1{V*BFJ3IUD1hb zB5mrA9A;UBt*_P51Rk9fAuaE*I9J<`Q{I1Lf}rfObr54mwYgM8H&MAUjBD4`s1C?@ z+olmHBVJ|K%02>Rb*AFJAJ+-*B3o@bNUzU&&G3>Ms!(ce;cYJA!U(c{ZO5SV6ijo4 z?H78fr&4Pp8Dj#n?mP;AJiD#WjB-$tMW?;I0219i*g^?BjQ5HLvf$6V(($B}XDokI z^uNn$Q?iF_P@qw7IE6?~Z0|A=x8-tPRq*_-4Ug59n8$0Bsc8F?Le(A^7_y$yVMXpn zV33ql*(qOg5Vc9!X}nZ4UB~>T@Kh8{@Q9autk&sJafzCWP8HKEA0t+~6&moKLGjX9?@j%sW&ca483B!H$rOMT>6Oe<|nTK3X;BQHg>NL9HPKw}2d zW1c)BH|wJ?9L@E$Yxt?N>-yfi`#2+v#C{Z3p*YU;z|e5JhsWKRb#$n6kk}?p`5Xkj z&-!Oo4?VMDNQoEQ3r1WFVAB&emUXSGJ>7`QTVDtOCwiZVJszBwOP?vxEIxm`S9B!P zNCLYM42&Lq4!fCUNvaMOJ6yV$(3=xDS) z=DrSa=VQb(%m}$ON+hKbXJq*amj5UerdMwerv=2K9wl-#*zS^?8dOjc{stht zbofv0{NGYYbZ*5a?Kbs5e-#9}ov0=~)jj6k)I=b0@!KM_?2=2lB`a4}#&)yM1UQQh zVxDKkj==J3wM7Fst;9#r##;wj(g{~OXxib&m}#m+brIjcKqqPbP2wg+=S<* zpf0#mE46z5*s>mWt!yYZBo_R*q0a2Rjt0BAwsr<)K*hBYc`&019Iz`zTVm(*G1cC5 z1AG=XS1004$OGmpDO)M#Rd5tkPvdeaHZdrkkGy?jXtRfC;#_~3;TD|@yi|_ozwsKMO5%lr=6hyPzV~Um`RpCaa zU=I{)x|~xj&owDuHNMCBBo$PUqX`2uztc>n=nFX*8O1Jp*Nc{@8QCj%dl>FZa_i+IPc~v~ZS&8MkP$ z*#UL1Ai{qe23LXJ7&rsy>TTw*!T1%Ca9kIDxPmr!FW(0E*;k%E&-Qp)G&v!E5%D@* zO>Us%-mX@*rKJTAr2+~_(^!P7w5YXUcU}z{lC=w%%e^Ye(zyLF2pe}xx^snC`yI(&t<91o9Uh8G|+Zs41|CU^qRM=y;R6S<-D8cVRrP7;cM6F3x zPm5a7e=JrCa^6H2>uW59a{8*G-UK#aRHZe%RVnEZ3NB(! zx$4dt8RSJk+3$3~5=)*0Ef9NZtAVAm&`^1NbP#mjN>bgXE%jW^0b9K(Q>kvmqmdG( zKDRReFqnpLa?~!^M3u2sD)sX+_JF@Dt66`8u*Lv`;(7%mpL|*3Gfs6_&d%wL^q126NNZQdeKnpzEH`|+N1UbJ0evs4J>)JU7@dDX zdL%geLhTx=(JwX~_xrSVM~&9STC5es(kIU@12p{EUIFIVYU>_)oZ?#)j@Fe?3Nx&Uuf~7484xIZ!(DChYgRXi1~WjSNHpc+L7w&K6Vg}6 zx9_S+aF~(GFzI4W%9t+P?U;eC+u^1tB(S&2-6_{*FnD@+pFpoa7XsjZ9=pRVb7kyK z2==Y!!rB5xi~dYJpk{lL<_>YgF2~tNhYA7~vtz=7OdUvkLGQ7b65UAyujGH`pRU1K z@upF$3VUZ7_^vOi3imeW$2|j5!LWd|ps<3?8|cAy{S&ye`6XL$95=@!yo+Wa+LnJi z+9=dRZ_b{SYb-HoksHRyh&h_yD|q_!)aXR;Mo>x-P5j{0Rzr@3R(96mlQCI*k`CS% z)bI=fG;tk`-nU;5PRGCus-J(3;SRbWF-F1h0zo9XxS9SI{M};fKGkK|9^G4n`N z-4^{Ex&mfsVfrPyK}K9chOu0|`Y83Md-Z%IbH5oK!jrIP;?}Br7Kche|3pK(w}RqMW@*+P!FkRg#~7 z8o(%Rr@~dg!sp;$)nBZC38BtTX8*)c{$F2GzrX$-BD2&W+_aQYK5R`$ZI2E~(xkqc z>-x>re_vhmLj{tNBoKdB#1zvMlgOi4KR8-%vy``w ziosL8ud-3Ri^Ku+Y!phBgLvYCaW!*ep2kZA#!EGGZ1mg_yFq_3gJ$%c5A8Z?*BpDj zU=Mdy)#r^qOJA;^5`EgD+k_XZ-wX|B@f;s*zEYrH6J2l{8%%ee8Wkca)I~_8o3v|* zi5r(B3i7ipn*BLAdiX{_Q3*$T$?56wsZygXH&ofxn9+TCti`g@srSe1Z3D7D zRom+;=hVfOYU$;sk#(H`2y0SwRjoq=vcP+p(U1dFbQOPn%jeY|VS3ZoQMKb*OS(0% zYYEMtZ+lByUIgasby3mQ!*^u|xfuu`Uf4Pg>EVnZX+H$@bU8*9pvx2|1Y-8WL$aBS!X=NDpb{ zZH;%NHsrO+KrX(iGSeMimNh4u7ExmtC9gQN76gjx07rOyoP+JwMZJT(e zzJYNuv>j8e7Gf;cFJ+0d^|LP*%e3uux{#j2&Z%-gD7OWgVTE5H!-_gAe(Q{3*Gw;# z;;7rKG5m4T;dptmiDhI2bLf z{veY%b4r7FZlkUd9wci&%p`PamMx}GbU@{)eM67Hb9AgCxj8#nXDfQ4##6Iz%Kfl- z7X!w3@rLzmuT?hB`YbOloxwqdg})?Gi@|>|p6d~jqc-p4Cq84RlaGhuy-^Y-Wl|_I z6;%YdYLD-2xSy(UkL3fQj>4E6io<__ z)`R(&DS0=fS^1n?I^>-U2R=WtOu7)9T!ds(7heMcK=JiutsK;2UePIEs45?0l}y+BN%%Viid}y^B7csC za8135S!3&@j~$1`M40nxwe_Qj$y!OV3x?3xW!juwo#RbKMubTpI*A%MrhRq@D!7@q z7+l7$#zB5u|wm^-Bwl zq_P%A%+qSvW#{JI8!8<5pwBuK+DKFPDRm4?P9 z!tYRy=|9+8E&54O-|~+FQhv-}WW$cYlQ5|xFJ8ewVu|e5iQ$#%+G`RpS zE(Dvb9$V3jC?bqf5S$O(Epuqt^NmR_<4ztz#BN(fa*$dQA37)&gC$#OD89_+O9tt7 z$@H>n?Tq3_uSMD#mfi0O)sT?xk$@X~1!0ZG z=;QJh7r}9G$~}L-CGDF*s>yGstW>VOc*|1OvYzx_N=$C2&X;+c;FVFqeZ7*R@)*m~ z-elhqzDRRpV)Ba>hf{Ikb6I{-E|y6S1``U{`l?zXy;=ESHbF=M7t+5-RGKHnjSVdd z@^CFs)vVcMf^o)1o8J^+K53pBOu~j(vd@<32XexPorQnhj$T^?Ey1eY6`7nPjz=R3 z%1v%}%n>Z#Q5VObJ4j*+PE4SHOUz$>lPe9~nsc`mGZ_e!=)pV}NJ;VP0F5wL+Uw#l zO(@2VeE=R*Itf5aRE#v$Pr~}L>PmEqd3tTBY37=mU8XsQ2!B#q%R}!kwy{mvB)SK9 zwb-ocQP6*c1S4;amj6^x2Lz|D!DR-DC;Vt5rHi#FqJM=Va!C-)C^M@$5EIw3J1II) zp-D_FI%KKQ$Dd|NB%1ccq$$L8|D@66k=$hPJU?kyy*bx~)uaZ+4te;(+WSjY6{r0L zcyv2L!(`hM0`_$`$h?aoY*`DV>lbOM1bL?Gs9=BFKomE6^cW#QKftL+lPEru0koAM z)P^C`rB@^V*cUgLWwfQ;#^zLnZq|^1b(im~VjY_61+&3s3-d+RRo@Cyo1b6@Cem5v zW0fiyU=q~lhBiV)Co~xAq3&(t_v;${qxJ$j4YtGJ_>X-CD%;_pCd3MS@K7bT(wRMp zEzf_Y%gI|&7|uoQ;xXco@7*a}IMdmy4N9l=Z>EH4EZ2>!r%jBfjjg8*wR58H-GQ}w zP{h-mrScx75}`1zB2ppI_9Z}HF&)~o!(6CbuT8_br~JL+#h;K9Zq1Xo7^%C^#2+D9 zDm)4op`pv%M@o@mmF*7}zG@ZI3h7t}Rs?^`$SP>}6`Y_fenXm9wKdy+7OZY?;?y);q6(vImaH`3~7e2jvT|>I&2HqF-d`SfvVEr3`6yBVkarHlV09vY1u`Uf~z(KP`u|9YmoHTRdZ`VH1B) zE0MW{lpF>{DTwhl&9IaG86jpK2KH?!#a>*PY9GYny#H10Y{XHwbi*B`>i4?J zwRNxEvn6ioPsKG6JBy$7mW8(bc%Ua08ZX6uI%(p*p)=~jE=8&&J&#x?3_iB^iJ>+4 zZvd;<&FOLU5G6*NW906m%7hC19Kt}EIpB+0RY_4|3*YO z{tXckR1o~PTtw*~J^VUpoh39(3bMl0GAWIogygqm%`9Xw@z)t3#2dcmQx=9o@dGw7 zVKFgqh%i;3FK*!A#5~_(1Tr^;@ChhsqdOQmIUP-=F4%OtyI2C^|EncFf&HUL!3pE0;*Wvz+c=J7{p)?)vlXDagU)QvtoFU1Hko&05TS_0Ao-VSz7#Z+zN+Kfvvq|lc9&GVJecW3kzK=qF1~E$MSmu)w3OAOYPw|&;HBu#Q7Bzap z?sp6741RylH(x);^{j%q7ecqj`@xv81iOQ8F!6{OQaYG+jRCt4P9qp=6JyQXPgdp+{kYQ<=^$pZ2t;=|NmM%1!H?>V@Id|0enfZoihFO$U!j~OnG@T zbAF}(#G!nfd}8on6!gdoo6>Y)@;*H-l(#a}QeuD5TmW!EEf5&+(BN=SFWB4D!*{R4 z=UCq;NCB}Uy&}D>Al%5xm3}DotgdE3wa7OT`^i^Iw3SDIoMN?(tfmbp6W+Hjl+R|J zu1R6|nOmJHo!zJ)1&I`;b*8Mv!WvsQXz|?9mXF0FR+Kx4z%gTZQo|P-6_k@3wOZ{@ zueN_xTV%}yS=elUfZ%M5CSmsp>+YOKmdRdz`vP*{r}bkj&`;-j{jo-jIDqBZ3E$&3?@H0v(r9007RkCuYR%kh>CjT zrR^C!hy?@H7lnwQ1AT!5JzzKT;G9N$^!U5Govt<8w@Ggww=bZ2{`Ozs`r!-U*P(mU zV)J=SZ(N>CpndXD2k51O3Nwn+6T0^A=Q#G2j5{*zX)>>*x@iOT*~Fz29C5ZS^H+aD zJ4#cuu;v(S&+-pqTqF_`6Bh+WDbkAKgJm%CGtY#SQBopUKIb%=%V#mPA)el*Y|n1| zYMudjUZ96R#f($mq@@#}s1(SmN71v9qGuYqk7VE`2G=pwP}ZlcuCKelaW^mLRqG=6gyYITca4B0WiD7EbAk#UO>=)4$ba_Rfmv`6HS4+I!P0ogr36jRtL!8X#1S1!{TSKq zI8fc_1K0yirm4g?<`3Z?`)v3UT%|kz1c5?)=CJg^M%WJ^O%4O6`EZBn4d!86mJlnF zdN6MuZ#+L)$ol%lMU<}>Kg;8UNpIHN8Ie9vzfGAqHgW_DL4DTtB{hExw|LGtT93)# zDnT`mGh5p?@b24+sU;(HWWrEbtyp;iI!c^bWPbham%*2k7SW3)S;@By3UpEilsH#H z8V{HEh*;S53xqsZ;gj93#`CB2zDIwa_MgT^`B(k&441!-g8f%f@_#SD{ZCQyH$vfq zeOb+cen-h5v|nK|yv=_vHaC=l9^mY%Skz#FSdUYz0|^QV5g4vVkYI`c*dK6r_v6!N z`#9krghuLrfqRD!fIkQ7&7(}>M!aciDgpW^Oi$qBl_$|&7>s;q%%ow%AXTPBQ!GmW zQ$Vc0I$xh@Zv6_hKd_Lta2rJ$9yR9RN!Cb!Gro2N^>gG(DeXI@q{JnE$>y@rg&$vH zT$YkB!MJV{zI1K$j*v}MB z9Ps9J%O33sO0{-QI{4{H=MiQz0XRu5PhDU&k%2SAB5~}F^}a2=`%^GXFTqY!6gBJO zC7wTZV)oB#-QQ7i@UH-WW&AfL5O#2|{SO6VlES!5A0INepd?fy55TsqDi9AQk}D<> zLz@6ACTle)h6IeInl{D4cszR4MAOMnQ>PTsPHZ(d^LYgE?)^oz-S>v?X&;!Xy?K?U*Yt@W6Na_sAG^oWCxh{A zQ0EIV2Ssdm3pTBPHSw%9&&d-Ygw|Ve|Y6LK)>{r}D#|E*QG1 zC=)>Q;l%s};$cjJoFI$-v}B%enqYjScwAP`^@{>}{(NWvs1?Vh4`46@;=CwBax5!i zJ&VZ(v|LEHTqB$X?9ae9*+q)_)w?w!1-Ka=Q%!q9Swbj(`-D*+{W+mLprQRyq(m&O zecZLnZ^;v^mh@7C%JbL1J)nBfw4@z#_UAy5@DR#eQhVkdBf1yWarcNngM9me#bTB4Z-Jk& z-tj^i&x>e(^ALooCf`#%r@5cDR(U_(9$f*b+{_3fG+)$Y^alliuBG>(Z7eUnBi6t) zUgcg@8kebVINh;}5 zNa|U)4e~w(8><=NU$Gbmwy12Z>cT0-*FviOp{#c9%yEFaNJ7Op2Hzsj1ygbTsGLzr z*_L*;bDCb9v4(>MRJ1&0hdU% zsg4nUsMD?x(fLIJ)S{*&10Gt|rQ?dv6sv0M8+%ysf!Cx=4OY_$mmKDaRBqp8imL%? zj*>H(x{lY6m`Sx9BokTgn}@=N1VCDIN|vd;%&3SKVmY_TDd(wT7_bJGaTD6r?$@ekK#mZl!k@lV5fAgWJ)4DI!5>p3&C{W?gX)*3Li%JaCw*8uu# zh2XQ4N1GO}3VYpc-pH%gq3-LlrFMSucF&1vG|8GRReycMXAYaY>CrpYjJ@GFAr0Di z3UF@iY{&1EiT-m=F$6y0eRo_5ag0&-T$lC$TRj29+#SC#8F~VqVNtsL}dN zV^`DkF|pLVf@iNpg^k=*mqcp3U8Tk6-!6?tE~r~4k=`+H$&w=M520;`lW5*+_r|8x z*@Y=`2<}ImO`_==t~gi*ah6BrtXj-}vzuX-7y6uFXyP5kOIBU4a5>O|9g7pVo$mT) zGk3LkoJ>LrBsJFhXN7TMv7?VDL=$dx4psPoK(|QC&b7`siPd)4!nq{X{IO=Y2^oNO z8P7a~d_(L(=B9S%$sNMgH6!V2gFvjlR`fgrsmLFhBbs8cmYzD(&SA24aHy|;)6vUz zp`9ltor0C>N*pe-&6C+*DB3wNOts6uO?LkgA#rtc%Ig0Dv&>(`fd8uI`UB{{R=i0H z+LphELM2RIk*-($l+)xrQ>}1G_^ut;rThg6A-pV6>1D1&{HwT1yjAKZ%3Y3^TrGmv z4cK$R0B3@*V5pjUi{tcRHs|qwM%JG_40fU3VC);NHvn+=wYOr%>y#Jd&nrVnSh5({ zqr;na58=a^1dj5i3y}w@762Csi6d;cjxnJ3kh3sbC%7=-|`%car-$ow>4Iz zmnupx6U)5XI`EIFrHn*7U=w%u{9^*1-hf?q4K|0Wq2N%^+}UW$OIueI?OuQ2WuZmIxBSW0Q83KoWZCX{n! zVW0JgXzrGBeSoIwl;x2c>kVjsK7MQiG9YrOl2CKp$dtrg(slFo&jd~V4@t?lU)kgS zui1m?-#D9`zPZEi1;Kw5LjM!NQq=zayoozy^RmgAUqho->=vqsMuPv1mQbNwfD&Cb z13o9YEqSp%_Ht=|fK2xd>;rH=BJ39MmJu^*`UBz9U-oRmSTOuf;g#Oe^lBo_@yMq8 z^W_1hha!UAPDJY@v z2q@Jf8y&hy$jBtD$@Ig+YxkxsTee0N-_1MBrj+LN4~b2G51|sQNa4Dnu&)I6!CX9!#OM+Co%^Mn953QZC*1ifI9V(4yDC3T9eDuQ3 zRmvIHA8CAlW289Cw$;8g7*BvlHnH~g;D>`o>n-uoy+A*I7xXyY%-wJ)4c{cEJ0s7K0V*8{@q)IjX;O!Fe^D0GDM*<$u@-&ZzwSTJ4N5V z6;t(p5s$ztsI%adSrxC?(n@(BL3+>Ach34qyC_Pf>X9gDFFx`VAF%gF77?^fAW!gd z{B?>tkJD&`7zu7K17XPM(Q5s4p=qR>@r2`1jVqc5RbTmYo4jHWJA?yzL?+&1i>S97 z(ZF#cT{=p|Q@`UAJn@{4+#e+iPoZ3bfnp!Tk@O-(K&1N;QhFbZ3q@{9VJITJded0wU$2x5 z>A;LPNcKB5F3iP-HuLBb1p3bd4Gcw|2~=XcUi~v*G$0tZ@{VOZo_YA`Ja+OZ1-<+HN^XeTq&U90>Tj;qkjmQN zY+xabfUXL(V!3!_{x)Y`GA}Yyj4r`{@)+Y*q>c5?mTk)Akv-&Joe7=YYQh8x;=gN1 zSc`?!SI?1O!XN2&{}XeTgyC5W8awXH7!)_-z%Xn|yhn%XQt3q3wsJ3e794uFY&?yLc| zBHXz!sIaH@+UT3o`#eQE^A*fOMOm?FbNPo_9d4uEL;ebl9e<@(|EjS5b^8CIu$G&Y z=;uSvw4M_(WNt*$?ZvYocT@aA;}(uv`Osy}n~=mbyBRg(dbcNjvjhArx7W;&>xS@j zGwId9$XR=hS7QqhO&_{L06PnRS4RV%S*ozA2x#kSOSuzM0Rk~lMtNGUGbOe?qTV}( zUv*TUDp9qu72Y+Ogn(XLJXI)T!z^#0l)Ua)26HO3#6ouvzG|ebGcPDTgbO8vv1;F_ zHRdq;klnykX2D$ob(kI1y&2+qC;wxofXePB2Gwsi=Zev!%rM0$asr%x$m!W~i=sv z!JO%8f&4n~+P@w;=f6306=Mf;6L&#d8xwN}>%Sj=mV)I!RgjfSf^))TaeDiE4=&-5afrY{whJ6EQiu z-M}pY!4cR~oGm+qK@sdm_M?NwS`5n-q*{)4o4qi>Z;6s5@A|5aI6=_O9QsTLpCi2dbM~Gx@V%$rxK0BdW`|vy|r_Hab0e>(k}v?2k#67 z6|(tqfocBhsD!^Lm6Z2WooBgk+wLweu80E!FM&`vFMrpb z!!L&em2sMO&F)SnAS5Q#@JFx-Hlx~@E7bDu0|9Es1_}e$Zb)flQ}?=91j*D z$KAPq!rFyqQn0SNm8Hm;l89JO+r+WXOhW32?W_AY7-{k{#}!CD@%m>y^yX+Aw#PIR z?ptegCWp{RNyvB9PpvycvewbBx;nzP(9`j1_Emzyx`mFs?~@Gd)er6mw}Y=>SOGw{ zs&l7FLwU4z5KU4JVXv?`t`n+*0;Pjk?o8z;4YKISwjg_VYyL8(mpv!y`C3;=~UR4QK*Yo1BP zLNierG9T(nc1-hqH&IVSdm307l>fOUOq{(OT^)WmHT)-s9N(cu@y*L$imP{T1aJoKT1Wya|Q~>6#ix4OKVhlczAiZjQL(_Mg}r=n}vNvMw`v= zUw(g8tW8za2;A-7Tl}({^q$H z(c6`=abLD^yPeO3hSv)7D+z?)P+6c#W1=e8y25Gl%FI}n!%TC`3o_yRwpn%EZDbBFbuMQg_hpt3d4I7$5%A2 zHQdftV83YKsHIwss|FEITa2*Hq`+S&k> z8N(&t3wJutQ*0`KNl2G2At{7qWk?@YH~~BGNjr!Zk>06YLob2!GNDJD3yh#|Kl=(O zHfDewzmYDVzzd9nU)uzvG>Er=_A%=8Qub|(%h!DavULWgRS)7L_3Q-onS=9bL&Spv zk?`#;@!F90y*QR;`bkKqhsfa$PM91J6|#|z>)C+dqXSBR_XEZmC$NFvP?XoPh2?=B z5$_HhQ@ZyF=;BSBsf?A10bC)f*Mnf=Mcc6$hiVPtmn~T8DM*_gO}TEtf&G9186)j#M8s<~_>hZth_Xq{v@f3<&h%c)X2n12BygPVDAFZ}Jav@p+2SHlMO??**f^B{!PYd%3&&+C*p$x8MtC7LRza(m0BI@v0Z zo9z2r>y!CDyUY*Y!Tq-@m)9tGK?W76!Y?1}nqC@R!}Qzx3h^f=rz@fv7r zh@lQ-TcC)uqc8FV!FL%{-B>|0qstJz1}MgKTsR!gIl97^Svdt~LAX+B+`O3Q)-Gf| zf84o$m|`f5sA(B@aWAqC;kmb67y8NBOf#;k_sKRGKHX6CDk8<>D}gE;@uG`*LE{fVwVd^Ij%Xyp1sGQm9?I9m8xY z4&Y%0nNe&dsY)05Q&I~NJ{2+2q2vs2g8V#xCD!5i)v#VG!wI0f4tFW2PnXbrAA%_u zx1ZnyQnVsX)?NWeJN$;E3XU>*c8R!aOpf71bfJZ0bG{RQHjU>@_{oWMIS+RLI9iPj zVW*TS&qs>euFPD2 zF98`3h<+6%)>NxUX%#2d-0Pm%HqfLE9&f~M(=##&-k4kh8AYamWxD5YODw%dR z#t-wyGn7VX&5~rkNw)_>N~T^3jj_bWqg@k?Imad^*J(8bLdvLLA&t>gx+%7QXVM&O zc8ae}N-Zh&N**4w-Nm}nXQ&iAOh=c^x+SxyJW(7Q)$A7}!sF5Z7#$$X;u3Gj2$T7> zg`7xlo6spofAh(%WRkMvJidisk)zUE?1`a-T(V_uJZ$!!s-JpI*hF7)-GaYUnSlK9 zi-ZioGkQmqfcD4OHW}firxdq;4mqJpn&_WePhnCD z&`tcB?Q_GVpw#6(%Q(6dpIaKgKg-CiWIoY5e?ZT(zoO`Rt=$N^GLsBNga7i|1 zhU4|=a|px{{Uy3w8(EjM)aS%*igle?8&xU9d!AcQx-Q`Wl@d-Z#BB@<$!?=As1|OO zEBa%4&oD}v?rqyKyHgdH5&&FS9!W!xEyUi~A zc3a;UrRLCc!Fz3W5mm|}sklk*`|S6}*SI9c&dWn`k`>}aoURmor9)13>-=@)!zdiD z1DVbTI|9G3u=U-4&3iVSqV@evM7Af<&uT@2g@Wpb3T)Pe8lKMzYEP^&i&tCUZ!+`V zvN_)a!+Lf$Yds&1fkJzf4jtI73p7Bm-eSXgG!AKLUW3G2u1@7{;`m-r5#PsK-o#4$ z7c60;9@Q8x{R4x=4T}6#4%gWuFH64OxCvYl^1YNvzn9E^aQu3Mcx{ocg{*rZ)b~*- zak$)qPpPqNltDra41*v*gS)}egh52qS9@S<4?A2P*ouZmXWiTqQp!17XGQyPra|fHD zm|oaMyus^#SklZKKqHr~!hKSWOIhvvnx2fZhTEW6jxE{G9ky$3<8~JzXOj@O34R)9_J2P@H$z}%Wl@y zn*K<^^E`}qMf+AwYF~!N=_Psv5lMb*S)yD0CECNf*|txX1bXEWAW-q8cEj&>`9~C! z*|z5o*&JNo_}CE8RN>hH~QF^DiLxE06V(@Yj8 zgZccttR{V~)T@Ns{8hFohL=gRsxZb1(|YR^=)timX_Q7cNz)uD^zu4PXU*+kPTldL zgr|cueXl0ZYv{*K?|sQ?bQZ8)I_ML#4_A@%E{=EpDXsp5Oyk6U2p=iT&uvFjUuC1i zuO|WC*UW`k`8=RpRnb3=*1%x=J%?Cm5!CNc8h}GU5K?d6U?!9lgqXn0Fi|b1L$Sdh zya7g4w>g1%MJ+>tGx=-z6NM7DXBdrth0)08E3|K7w2-9{#QO(d#*GraP~3!L=v?41 zCVuGl$;N$eY%$J+0^XX~Gka695F*m3 z=k`F0QYWy;)J=CO1v9d2%Z4|lrpi2I!yO5OBZW`(M18r2=4Ey&aOAL2I8T#*xwETO z%oei~OLPN$iEktgm+wd#MxRqi$2MisfY5+hU=PYSXUNxLP3y9B=EHAMM)8uihKXqF z@EZ~?XhIzj9T25e$8m%MTxlMfMMNJ>F0;riR48_hm*|SX0$nQRsHEV9&D9%ercFeD zCM|uCg-(3%D08;2SQ>^+Q3mjT#P8zR&#Ug+PrmcWO?yDCbXr#o3L}e%=#fv`m}J%3 zP7jGYMKSajieY{&l*2qVPLeM>;C1^P$xyzfuICy)QQ0bo*%HMICU(p$`908vau^Z* zj%!Gxj7_*~a=||O?B}7b;t+=3Ds?l+l0EkcmA>Th4HUX7%~kyVCZFDa^dT1J?j&vv zL3{XgD+AA?`uzm?0q2Y%_ROdjLgtTRB@QcDOg)mCx%)XpsH5k*+1&gN4TYbrJNiJY z8newb?QRK3Kf#(tIY97r!0}gXjk76JRbsSO2vVChFn{~^9BR3r#WRE=v)#b))0Q8bqrk#8I=D4ypa}#l@_1#}o-SDh2-HM^wsTP-e8mA` z{{hx!R+7iZa|?u0l>h593EB02g6LdqC+cF*u60;ocbA`N!>TKPp@$1Wj}g~I-{>tP zx2!b}LU*ZCi$iI4d*~99$8ictE^eyITcVUeNhvI3gBR<*Y6DrGwf2njd@}vHEXULq z+3r3LY4p^JnN6qx<0`oeyoh_%=`=nqJX!5G@;2Nhj)T!-B=1o#Lr)U_AUTQ<(2nzn;W@wX7_xX;EBGW3xNCRgUb(oOM8YO!!m3YSA!(vXX~3WRT&6z%6m1 zch_o4%;X1?-n+-@o+I_2*NoowM9)ug)~vbDYjntSBz>;dvKK{Uym$FI6ZXqTP?PiQ zNY|aS{Wrt z(bT#9@}#RzyW*CHy=k`K6)MMJD11*1xlnd^)V#+`lc((JCsST(qiY%|nPyqDeL{8| zd2%b(m>Hejo~uU3A0xJ)dk0ZW1S2$k?{7f{4z9U_luTCns93(v-$Kp?%6TCz6Xmxw zw%>-kUVyKEklsmWo5iftPckWYC4Cb3l8AP5NDX{q=P_Sjb3J7v=qC~c3GS#|(72HA z_%wFsK;%EQD1YIh0yFw~$gv{QqLO_U-|4}1bJ&QMV{vanv2$YQ3ZV+pm?E1=0`9S- z0%O1*k35k?yRFgJ7q@O&y*>xw)G3|ExMR~H+fitLq~H_K=!ZyA4-Nwe!BJ1C!-N#+ zcGc9=Ch`ry5fzY~x_QiPyLzlk3(+XPP+}s9G+cnjP=Zm8UR1_Rjub7o$NAzGMtlH# zlmNgRsQ5ZBZb4iOAW>V8R$q`-4lOOfn9>vm_eW4vuiPyY{tU#*$aPxc!nI$7C(ofg zfQzPoY6amhCKxPIwr?#MH~{09RapOV7Ma;)?69VM9x-_y(w98hNooa|l_KnIB37%C z`e|3%iuxY-0FQN|T_9h~6kPzMQzm?!0FT7+61$1vIo2>pNDX<9MB@4e9%U9F@#S-+ zy$D{30wRtBv>L@n2f z@F5W%Q?Ml#gz`Ob(SYM~0FCt0#(dE9(15Jv;sTpEW(k#Fw!frxCFm)liGr5X8ctuV zcTRu&LqcVMKk_GRa?lxa2Za9NG_LeQY266XfMH7?=u5P_3qArHoqYIL{SB<7nAh%q zI?fZFd>!@iCaJ`B%x$9!ynr!rWGe}vm7+#`>cA$how};eR$qRdeYWboO@xuNC^?Dw zaxVrApdxx-LrMNwuzPQ~7sRmfqCjA#*nQjY0+ zChx4Q3wwivN-2omSD>+#QR1VtWF)EsI-#;9Fc1S1pd57z{r8PB?Z5jzNc zo`uuzUT;Ke&_M0;%V*LXggkU{@eVUL6#Mp|$Hd)!%qPAWJs~gY5Dt1^-2M_<0Vz4- z!_zDNnlyo?MKo@_e58F$IUuModbXy>!Q3GEvu=%b1wE_iSDNKBY-3OvuR&oq=0Q!3 zjUFp}vT4FL;TPaZCB{NS#0emO??>y>4XS6L*K#%`$XBdaF4N-@odc;S=!~G;N(i^% z3E@+`c?{ymluT1c#7Lr~@tgVMP~C^{EUJ$pXJMr zQ%3HH)zWB_Amcw{&(qu8y^ZUQus4N$a@iP|=mh+l3s2-PIVK*_ooP>`^cd z3BG(r%9!8ZOr@aE$s{gOfUh8)GCP8LZWpQCA4i2{8-ERq^mb`~JRc-SZ|}lD^iJ@7 zUN}gc6Zuk@_Y5QW1_<6YQ0l}yLNT6;qJkqq$O?FM&liN)IS0FwxbTJ>6@*^R1ILs3 zLV~+ZSG^v?5E0W?S~c2A!RY``!*+K2KPGh5=4P5KhgPjCCvKRdLa`@t}$0ayuNsuX<$JAC{Nlg$(CxcZDEk z32c7`6Cn*vW=86u5y&q0!7+b8dbu|Ody=pgT8iZvwLZKc7y;&Scw(b(7kJ_MWH-2^ zk@gyLMEr{G@q&IgKI3<1v5Xo+-=_t+K^KDGBne5mCUfn7I(qBk?EGlI%&TxeIb-z2 z73|_b!-TIt!bp%p$ljj_ZzHgp+P6;;$z@9u%r82C4%gy#w-r5bWw4 zbWe_m7u5EDr{j%S>op7B6P<3W(De<=Fk@e=?ZSN_27lnq_d4i?-AdtCny!QXJvFOq z2ySoLehMLjWTeY4=ODh~{pLtSdWBOU926*5GAJC_jZTa*%gdI%dHr-iR%dBKb3{`d zPvql)T;CG>uvzu`tFkt4p$?laKpJ-*Xf=#t``jUaE#GKfGhv%4iBUN%_>W^xVq@Lu zPgD5yp3PQPL(FTYep){e`sKzphjzx*l+Zey`?9~DB@$Tz*!tDUZ;|i#Sth1Edu1h2|C~clZGfI83Z{?jN~XN zr{~!gQW&)uy#z*oU4Qsf8#v*s6Rkl60!kWqz( ze*NTb+t01NzI?nx*uaAHvRs}N9*U*w;JI@>K}Ad7e=yl=<8&3zcg+&HDw@9SDLKKu z*7TH*uUO;(I|^AZ11rI}KCojuQ}T1T7Z;&!@fjg-vz^@GMqY621ql?V4cE=mLCjWv zrZqex%3kKnUv+-4MR{5z-?f!~CSl|vr)p>G)Gt=9Vjok3Q*Kv3=zBe9R%!F%v)Q&tBLm(i4}Bqj7<)SH zYFEJs6CQF7BNpnLuV`R>zik>pS+7r}hXyy!%}Tld{+3PlPZvs^6>(S!NrR?bzc%nO zxGj@rfjX$sP6-|h9w+GOB^BJ$uW9szOLC7}CN^Ni5DY}*9;>{T?kC)p_~Ml0k^~+e zbE?q#ZCXxpd|6?frF{iegACSx&~f{&fp|MGkHmsmRbMZ3K`!NWn2|E+uh^~q=TKi0 zuglZf_0XA5*ou}>GuLgXy^1?)h*{7u=}UK{3jVnXd%tRaxBsx~&0p>Mm(EMG-|saTg&iILJlqg< zFg5%0!+&Pr|Jh~0xlO@;Ca1zsP^>$vYpHuSt)4mUfk*Bctiovb`vN0a6Zf{qR&Ev34v zui^x0BQ;-A^xcd73?-nk9yed0HfHVOtvGz}D^cbXALoo(pIqw2KMKo^%e+misEIwqo^1O85B_f9C!ems)Td8Xsq4ZkMIi(RY^1-Ai|JkmwX^F z@K&y=iHXzbrRS@s8#qH$Sn?gFW5dZlz5?T7brMTyJ5{t?!ZYN9a3;+-k)&`Yt4N|0 z@EZbu5;Pkc)iDkuAfC!pan&EIZ1)Qz!-ki36!{aJST;g$t* z!u9Um0!ZdyTWPz#kM4@-AykNWveYt70L0CM0 ziXS_aDSM(Q2u8d$S*!@lO z@P4i|Az##T5j$-_UKAlY;D4qnzxjfHc>LqX56*82=bM*j1icvDi%bz>h%yAJ(C}5! zd*!v!3sNuM{$WCb&?;+W&DbMac}2P@%x~d}R>zta`28=|j+2-t5_n;LoW?dfT}=W7 z^Kzk)O!x3oAsf0CJHoys~XXu|N-r+Kln&}r8C-*mJk7oiszXXA@ z4S7YrD1|$P)A!ezTDa!c(aIT}*G@va${mb^(04Tp%y81alh8q19iphO`cBr$5NXXd&Fur)#gUq8*n$jt1MW==%E4rR2@)1#^Uu&&N!LCC z*pK5+{%b?dzlI_I>;3NEKZYss%nBc;AF|GFr7V&kUf^8@B0A9vVNA^=M)$kJ+%iTw zdJ_6Q3OXWyus2R*ITRimTIX~7{oz`UD`B3)Inbn|B2k}y>?@wAh`SNaoIXlo(Ka}7 z&JT3d&=jkOW^dhphSkH}#iRki;^&TO~Lyy^z|T}<*D|XlQJD-u~?r{(ghAI^hm_=m|oW%`*)^7y@;42m_NUvZ6>_? zWh{;JqVrD+dVzO66o#$ZU>F4kEM4(_!AGn2G>mni^L`S_3@vY{q;cqm1ik? zcOzRX(~s~@R9W<|C#w8UV28`=(L!w{5>OhCk}sdn4xS4{EKHSHl^g~^a_f{uSCLR( z)P#De#P{Ws3iO|GE#oWp!HJb9seEbQKB78(zxT&W*j`jVhF&4kIFd6e7tSbe@B_=8 zx{}TcS=O+B)T{e%p7BE*1JXpr18ceQ0o&f^r%Q0Qc}5kd-om3@bt7x_lB91~qVkd5 zjugg1ZX6|B*OE7)DdxGnxv1TSl3C4bC(H+S{zO>P_#>zeBYCkQJ|l5@A^`jzg~aS& zY6T&FJ|~dSHF+iiXDi=$5zPQrK4=Nu+33{x*|gMuQ@Pe-IQ>}h(}BC(z+7guP!c{Q z;oh+MGGh*2!pC48hWk);&g59m;!KhSyh-t;@lt#f?{AN=dj53JTQNnYS~_SeN_z0B z^(OhzYM|)V%A1{wRrT8l!Nq?2&I-p6bbPAjX`hbw6Jh*=;USI%TgL0$sEexNixb_Y zH4-*|ixMs@lYZ`PZPMjxG(hq+XIdFFXT!c?^;2|l1?7f^;%fG@9Q>k|F$(eH`ASvu zNx!U#rY2FZ=p@`R#;3v!Vo_UAtWu3P1cC*Hz~VVO?I3~%oa6_fyHb_xN^)+bb9V6 z^XlN&;wCZuuO(_7j4nGbf;%_Sx;^pL6G>5+iJV21KmGq?8Wa(xF$5n`*!^D>_Aiq( z{&yn(W9`o0sLc7_s4V`6N<~lL;7`&Cfyx9>pN_UUv~-IMb!;fNiadcLN>L<#M`7uI zO>0mkYJ}m*ZP_`j78d+H?=KJF8_4c3Ow;2<;W~iT$t`(co=k3A8V8y=K*86SHM%pi z`k^`$sKbj(q0!#U)%&$HxD)n)*_wR_Vvhk}LWNH_mvPKH#aJ*FG~%jD1*$%GLrkhx zdl}n2n=YY^KMorq;GSwYQQ%5)w<9@!lN7>4y0^njL;(B_lK+ECXOPg5E<L?dLapN6^8&y&OR)*o zOK}ChQBWGAsS!ZdoCvA~$;t4;2)qHeRY`4~odqrJrsoEs$#+rtsj(QB zu@#awPX;g2%J#=UTMCQlQyd6Cumt^Ub2P_)6-zf)%m1QMW<3wtNoP)fi>OFKD^gCk zqy2A68T(r)@&7+c$zvZpTmBzPd2(`gE-2^+>=`%$ZfUurG^l5GX6DrM1r3MWmbR95 zZoHu6C5Vo|yndi=3)ae|jI!9l`^@{A9hBEp)7ra+(2?`Ni4x69R&Y2zsgUuc9!oJt zs^WnUc_4MS1~Z~k0l!g7-GW(!WvWs~(7$M?QqfeSs|z6M4RRz&% z@aWYn)e})&Fm@J1WbB>O-r7rsh6))H#o9g7st*Dj*mrLpmZ7J#)OsOqjZy%wAqE=rM_4`!@xq!U{s$mxP=avQ+Z56ZS9x1@Je8r6r~ z8f=ntkaEcktaE~Ynm8uoEf*%^Uoemt$9^-JUKr|S-4bonDlF+MP1+W7;PoF`DeMHF zRX?uuTPr1VvPtzOW#jF9C5!`gxdmgA&=eFOc#fr7yXn#P- zBJl^x(c6%n9lo~K_)c`SwMW?BP$tph`4D|T`Se$<{L9>bwf`TK{|&MH4;P*m2`MC5 z+^DPw01c4zU8RUJF+H)g)9^tq>I z_vJ&oq8D_9ruKLRmU2cZku||vFb|uEtYZp%>Rg`Ow~5N(-L-fc)ybK zu3m_s8Pzh$DyDF+owYi1)*9kV_=gj>t-_QZ`BqVXD#`9(e!nzs?j3nL8A^5YB8f1V zTU4X^9JZ2bZI>TO4{An-TW*+PWTsz-&wZvSY5lqKvDm)1-`9*F-uYEkV-vA{xb9VO zfYnx4@|c>eqB!I5yXk``9UqRz9N)97g#iP0FhQNUI|I*T$QxQe4}HEcZqX(VMjezk z=!aT=77Frf;b|EEhgvHBqn13tHeU%y7b@{ZpK(xY;^|R==M~F-lNm14D*cDd1y41Z zdblW3^5nwS(56r3f|CKmhzF3Al4-1{raJ5KnM4|s3Ljn^8pgnUHX~g*W;dFeKf$Cm z7FWt9s*^{i$~|v?^s#635WCHfK`V=<3}}{6QwfU*+;&1NHwP zQ{LetUHZFN>iyo}%0Fi>XxV}$1KcwWLSq-eK=YJ897ggHD3f}u%UYD~rm;JY=*H_9f^n8CnN6tEW)tlIz|r_kjUj##FY?`bf@J)H{86A4mXr~GwAoeouKIOm>`p&{Jljg zC5dBGcp56stheq5%oBpfqBnUky5v58*NKyunYIYEftL3#Xb&@w^?Td;B2oox=U6C% zD54F75^4>buZSJmF#-m2xo8(@ix!CW>I<-RT+e+)(6!T zdxjZQMvI@Yzrn#4X-{;!c8Dmo%d}CVqh__{^?{-y){8Zy$S8H)LPf#FymzpF4IBwV z+u>tp%c|e%6noWD^0n`ZyLIw!|3bvTr zuI&9xEq^Fppukb8d~OLsAt1tWV?rpyR!A|Sin65C%VsGJMb0ED$j*87J%QcQ0pYrl z0f{HyGtsu*4_MuRSG2I(FLWm@+%aVle+5~{3Qo5Vt-wm!Iff)9UEGP^bI}2VKh-AGt!79bbr*B03$v&95$gGn-V*mWwrk_ z;ES00d5P<+lJgs*v$bT6EE%Q5SV+W9$-(>;;ctBFNb$90Kk#MvE4~8%MSNAvf1KT| zOw1HN$n|h={+Ghfcln<}X#ALon!$?w&q_3Xv0=fSda7W=YQSVPL6z+jp$p{L<3uJp ztnNrJ=(J=Qzr)baBLU#~4OIHkQ`y`uQ~Bn+ahYrf1crrKNlk=J)l^t`nd0Z#BoQwxQ{P3_ctLF%*uO5 zG7%hn!biuX1ib7eX{L`6okk)@<(%Y=O8b@48`0K@4Gs&kOFybhSa=PKCq4qw=N}-Y z@=VrXQx1=7o~ZTHDh^NEzF`!s#5_J_GF?){XQzPgWQp{jd`IZv) zjc$(?7!#l!n|#}2p|z1d06epTyp*6Q0lgoRu+{VH=Fnu}JH^sKBa>cJt=`M7$I7?E zPFyVEoQqR`Z`oy^`^sQCx3j4?Jhg`=$dOFgz&dK4~`Tf6?tSnQhS1^A1)Q zFhahpiPg_^mbtADd@oa1r#M)c(1dbiiB@kKy$hlaqiKc}^&w~HQ0QY!o-NmZ(KbUo*!!C^nbN4OfT3hOtW-uh~rwe?3A9gZ-)VRPCxag@KPb z2#kY{D(vy^gRADMB+|_^pVt?$G2WrAa1{hubXXk{_q%eT%I8v67Krt7bb1hR)_uzP zD33w{?#Ff$?m|#)4tYr&4-?dOI?+bvlMtjz6+@|4f&&zk=8Y;%VpA7NPXSvH04!iT zSS{@68HH`Rf18L;+OC`t)I4QlE2RFZJC@sU)%C7{vL=sUKNz76LnmQ?g{?v&cGpFl5v3|mybuemHn3K27e*<0oh3%a3LJbpBJL)5v&Ie6r{a2lQN zR%&B0e+k{&umx`hTu@@E{ z!SBv$TA)BHi4r6V?T-4J!XFUSY>*ZqOq6*}FML9V9m2jO z{xdZr1JR0}=tEi_|L-cAzis0FAuC44wtv4^RsM5x&R=8~)MV|uzn zf4m&BV6UrpoE|$!Hcl4uq)`Kg>Gy?@{Fjtlf!L>UW9Pk{Rc;IWv*VxFuwQ(u(U~L7 zAZZcQ!2#mdV!}GsMTHkvJBmWtFtTig(`0BAb}-5rBOAydA(=30%9!cvH)rJ%_Cf{c z93U*ED=XHpJ2*2jXz5p~R9T0wP4k$pfA~zS+hX_}B+c8ekQp-V0H_l$id(6U7H#Pz zs-CRD;(uU+%g20caiZB#*dvbD;b$R`K z`#homD zXPj+D9dr*?iAYsa0qwG6gCcfP)gS%9e8*s4{0Bff05wig%%N03}6CGYDP~92$c{+_S&-*aYYz%qga$0u3=Mt zxl+o@)#$QzW}TFo(;#e$>$&~p?cU`9%W8>o_ueuRyhd3oJu1Eb?gM@Sp~7Oy!lWqy z@8-p6${8Yr^vD)y5%Ne!Qw#g+)YcEu7nLg}wOW5;DRguX%udeKe>33G8U?hmo~VRR zdoZ!w0LFfe)s7BUyMj&wysL70<H7}mEV8)oBd<{UxG|Dt?W** zLb3_mT*y!^i!7t)!I?f!B}c>i^?|-r8t!*k>FG|Y76^{$F|~i4vs-%}rvTJ)0D0kP zU2t5qza3rRTLz;he}|PBv>Dyk!I(!bidH2eP?P3TkvGUkS%RBZF=`<~+fgf4t4%e) z6g|O%n%QGX-KO-TP#fB=cu)CQ`FfB>g*O)aDd<7X7Hmo^;j(zPa&)+P*+AOl(_ZEq z7FJ-f?y;%>l@9JHYVB9fPq22d!~?s6dHvHrmt@zK+bUJHe>^cQXU~@xfWFlS3!K`A zV>{V2f_r<6Kn4RdkM1NK#+N!;kaUUKg7)(mipcNd>)Fjbis`8Kb3x{b7WO|L$ZXQqRj>%U*@@hg0oqI1b7B7SyuHY5fFqpBDNYl$jg@Wc&rED7pg&-NUY@x$Ge=foOSO!gL6V4d8UX>BQzsC zqcEoGl!b=z{I)+Y{RyoYz|9ApyBwo@0Q$Ei~*e;pfds?RzTifGwXryrKE#B}(K zEdZQU%7Pyz**G*b+T}7{*zp9%EHVs1nKus%W`dn`Xr;B#w={+bK6jGlVs>00U*NMG z6K`QQy))T2knkXYg*oIeO(rsh<{T7ErB}l*_vgdnx!0WjX}lo!5mP*!Q z^$j3xyb0=)+`2Fj2o3vL$@lEg<(%7B<<9_Tb!HuL&Qd;E?{s3-uWZtvxT!oY=Y-hK+AD^3HTEP`f*^gm#VORra6u*d~(ns&2MaJ)ryFJ9*S zl1{|e;0?o@hZ<5RBOrhZ!nb)3nZX)%bmFv*D8qPYG*Z~;Id$r=Eooo#xNQSoYUtuuX zUFwd77%z%C$5=;|E%-vxBctoqXYz>wW?SD}UTfF&*X-3e>Oq1LCyftJ0Iv+)u?gE! zY5^hWBlwNt5K)}7CDcGQfsyW`VI`Ise_N_fENkZI%s-Rs(L~H+zI<5y>93yfUoU(9 zm*xLsBJkhqmv#zsifDdkD_?(7!BH|EQ6L~6mMWq@6n-R5a!dn^Ddaw#woA%uE4$4D zg1eA%rey!rid=q*jB7p^CgrB>=kD|Im)+mz5%vI`7`8y69)pi>bhF?>RFk+?fA1@4 zbQg>V@e$DUSQ&o*GQmU$b9m_|F**(V64a#ucS1j4OM5X8{;U*sFF_KuV+04Wkmso< zY$gY2?=$RuB``w}J!{+do`DUmUT{6ahv-7TDQ}p+^SQKV<3hRO7d%2$wujV1*(HM45WhuRX-RiXvdw_X59MK}Q|#c@C56sUomLcP@2)D* z3>`{90Vw+5(pHT7WrNxXe-;qt66;LH7_oJevWj=>N*c#(F-ICO7P~N;F{iSkex@05 z3=<%-vP;si&{{bA4%T*o$n7nxKeR?|YM02zn$n4(vG)8Y=fCl9p(Xvm67sLf(!bW$ z{|A~M3DbXxO*w}-Atc`{2V9j%YWT*0=0-(IMV|^TAQ5Yjlt_@Ye`!g)ma#25u47BP zfxImslwuUg7a%`0<3$d1YcWL4tLXj5i7dp4DT8%Cpyi=hcw8F{y6UBRqoU|02z%@v ztMOFkmg82H5sm?4y2hPN#RE<8ql*n{Q13~{ddv#0O&aVgCUmtOM3eHk!o%b$=9zZ5 zrV-__9ca;^6^lW@}M=Z zoZ3)=seNP_PI7jSBFB=?VMjTU0_9z78J$Q@z)OZm~Hd2IG7~+iX$vf*#)woSvO)m+#xNNlwIY2T6sb4zuJ>2As7YK zjFrMt8G&PNd|@Dq!Z;|oo%YCJ!qgaLP-;~0jObkBhWLL-dj~FCvu#;4SLRCFwr$(C z?ObWwwr$(Ce{E}}ZQJ>(>g;#*Ue(=gpMNlCZ!u!T=+S$8=at^Vrw+qC63%|Dcu^2$ zYDm!r-gjf1#M}y z2_;DVP!*=g_TD70N>PI&iet;VV@nAKnCRz6f8BV2f4LrJ2Y>LM`G2pW^e=GztH1bf zxrrUxe*jC`46^Ho6W|co?N6{UBnsrB&Qy^-y9}x;e|1rdjt?YQJbntl!9T}|)YlRZ^#gxkYEjKLw%@12uPpMFk*`0PZ5LDSI(hEF9!+x zZ0l%~T+_OEk=~GbBf;$6Z)4AF%SG(Km*)x7=r*oN)kmAYMId)c8Mq`yv=s4mO|dP$ z`MMNuL6MP?axgF81F*v#b&0@X#Z9-)AGYrdf3HNfg1lqR%LMk=2Eo6Wv>rJY>#+yZ zaKg3CIMhBuUbG7idV`MjU{cW5N{T$vB1HrkC#9BftJzO-Eheo%U1|qyuYF{PYMrbl z^kU=1f92V+zPM5?hU%|#dVDnylD`*^Rl0io0jwgsANpBOqs1LHdf<$wJ34G;6S ze0U(sjhh>II>SCs`xJw3g_)- zuR8PRspb*dHI$<4g$0|-)9u-w!jXliZgD{HK#9|k&V%l@^=p^y4wt)kUEWWqf7~D2 zV{AvF+`(S1y)mG-a`Z%4&kGC$-dSWn228>8Lz8?BrKs%C_lf0l$JofFNCxxY=}rT7 zL&5@MaZzNb^{pW1;^H0*tH2y2JabSc(CehY6B>B92=?W9&FQH2>2YyTlVwL;=R-=2 zxGo168M2dZGb4|QD=)yFLxMFtf80d~fI{9iIRz0GvlA|mAkQX4K?$Ra&~Hh=i!O`x zIVWvF(y|W_xPYp%5W*c7GQ~)UD#d;iVN1h4)&E3C5^Zel%PbTghi;S2XaH-+CdtS*f0>%iL;+X! z!!a48Qj7pDDBiUl0B?@CW|UF9#A~x)HPkw&LhqzyXCJTn!BXzvw-w3Y6|0^eyO5#t zORE7mTG&5Ekt}N-#@Q5wcgk_oc)}okS5C&B30bYbUDzSNm%uLSbWPnmHm0udN=`_& zS6ap4r7*BRc2`XiA+c89e|Ew+IzdL5rbAPk+FmU!!iXY{e<5{7uS}Rcij9hc-=vxm zofa;P1~MODV^1WJK zkp-wGVi-={LdKeDIW|c?$z>~Fvn46Q$6jDjJaKi}Xry(~PhAHke_31#pFt@N`K>%~ zj1?-XCu={A{_JmWDWr`k=l1A0xo^EzZl?IQWCk6j8w4GdTG)5w#ysu5%T~c*N(h}H z3kDt48<4F+4l-9r8%kHuYYDZal3s`{#2A%n+DQLrJDEOEHrXVoXW{-VZJ@Lh1QlHA z!BjzW=CI#yYYa4Ge~Z^N6fbbNWjmCfRXYeYCQd~d&%R8{Vq`f1i$fQ7{>1vHOU*BZr#J9+=TwR%ouvqq z;Z14o^D;RAXViwL^^vVZxOEE}garc9eXK7}K7&wMd62mKe=VV73mRpq2<^$3)mbo_ znXrwIGr?ZL%(X(i{*OiyexVhZpMax3U9YFCf zY$Mo7vMQm!8IVia2ieh`X?fu994j;@)8;cVMWp>BI8os3#(|pDp_7~Km$b2SSTfv= zquoK`(J=QXf3F-yK%{?|+vyA-tNeOsP{X&v)t8z%5}0xhIJoRT7`1UInPPI9hJyFb zo3EYKNW-6)su(FOZY7Md&W6*UlVl|9)2aWh2NB5WSsHZMD=$zQ;`wS155gv+p6! zSC^&}b#@9|26tYE*dewit?+}32(;nAKHkhawsR!unyBrE$FH1iU}Y(^l?0)N(zs=k zc!Gm6-)_|liYkvXgL&RjCRH+NusS=={k3Qlt}rOQm9|Ie(8qNvzLy z)T)D4f4<2&N8bu0zRo=--5@TYoIrFW#gwWXKiz(}iy~ZN1aH52&1WD8m+4$3G2;a_ zyC2Bxnp);d1#`QkTA78Ji*Bb zf4QPxE=|%pl|N!D>}R4I@u@JFRBdo44-^S!sv`lW0n06@m zI#xMBa_cV~hCF2(#g<9E3Q$3T)ne-$MCVdJ_BXjOe_}cL+rN6_fXq2tDj)y=8_@ruO8Os{nV6Y_ zqm8|rfW3{rk)i(IXHh1bxh#kv1z*SVEyCeZ{SZ)Xm&>h^CfD}!rHVmps!x=t7jG{M zCqyWUmNq7}YPazz&2g9EeE@wBeSE-{OtzNlQ6fDi^WNfg;CA@ssQdjnlj8$Fe@Fdh zm0WzXkN##9%!BNx!RonC2Q;&y&3m(KB{++2LAn83v02-q{1`00vEEL75;%7a9jtG& z3e({cCz1os;bB@$xnvmy$ba0xH&v&hBbSo=JGr{j;-M{9Qr)s?NlTg0E0Rvd(L;Sm zkRKIhO4}*RSk;C_*|tEfs`1=!e*x?xy+Xc3E!2j^IL=aWRse<0aot+oeU^?|GKj#E z0dmP{K?BxvWQ95k2c>Ab_lOC6;6QhY^q*Q(ia^SP*F+TV_Tg+4Nw z(n_#==o|&av~l1p^sQ(}>AoAzk%pFTnI0nJsa`}IMP3o3*vg&Ke7ZU}f5Cpr<+0L} zq%k|!t@`!6LZQH$r+&-cDM_+G^i>RrWi~@*Vi>STNLoR;x#$wqxk5dm)WiSIO4YBR;nlI+9)L(<0AQF?Pc;p$LQtVb%VROG!aU8hOulR_1{B3qj{ zs(V^llV@}ZXd}zg;w*a6e`vriZZAVig*2EfM>kO#yj7k@ z;XAgXAYgj@%TVV@Ng4DZA-7ElvqymU_>t0j-PNk+z?jxK3;95mf8=Vg%e9rr^z5vu zIoGV9C#=JJJlrF$tEB^;*t>O3xn=vzrQe!U%3vssje8^7&XKjMe{V}ARSB0wUI}|p zbA3QmpCL5<%z1VFA|F#pb+4~B2Wv6jyY)9Xs9i)w(CHPKq_A;WWIfTGwNL1bd_As9K0ooq9`*x=PPwvcOoytwx4W3X zIWdD2lMsItg7{Z~e**-AL`|`2-C?=L!=AnJp|obK4#B|g6^&_`5R3`XAp%_w9FgRu z!MvJ8_E{iMlIGODit=5Sem2R8cUenxnr_=vVZ@FKxfmuVk-MsX>n=c6|oNwCJ5 zo*16Nx9T_S!;m}ok+ie-!&Gy~xALH_*d10X7WYK%Nn|89Oa#J<#4Ew;emrXxkv$`kttrgD*HQ zJcig>hL*nPk;JWiuIQcpt3P{YUVv(cTEUyqId_zYarYABc+qYi@{~lS93S3riM(;4 z&34@^iDcw4XWASAxO165P#bwL9_M=gWG>OH0(;?~e*gflQ2)eS{Qm}XiT|r>AozzA zH_$h;5!u@rlgQDut8m!LPWm610y(2i8w%M6hy{=YUXSz@LqvJEpJfsc* zt$HjsPq0QFroi553=%_P2J%7s8IV>7iA|SnDzBAXPq`oD$MkY1U)5#PxrEJVyR2k4 zO8fkF;u_;|^<227&Y&^(Rs|&65}sW9-UOLKf1}CO+09sYuK@L$g@pFjvP2SL&F^rR zqUc1LmeIavf0MTM@_aECW#Kn(?RL(65F0LV)=DQ;Wfc+ZV!(o+y;B6y42o)yy7~2a zWme?_a~oC|bo$9q(K`$ECt}9xk@T?BZCsGe10t=~9wYNuVv&3SJSU&9r>fw{qTboL ze?*re=OmjGE3>9^#be2H`nHvh&f~@I)vlKa20Oco-0QJ38M6Kt^zZF}%cRyhIpyi4pkH-ahF+gQKZI zb9UmR$^&HW*7>J;tMduyz5!LK=w3byf36mB$ys?0UTFbL?y%Ex~x6* z!_Q317Q1i*p8B8qb=TrZ#*D=EIBQ(5h2U7ws&uKWgSjZ}dDV|WZSd`NHR4uaYDh{< z=UnKp=u{fRi5K|P%W)H5k{6rbN;YS!)Y}OKR3&v>zd@wDz}WGDMkk&EbQ>^We+96K zN@jN;uPJIdAoAid)4y`h%eqPEhu#CshlK=bo*Xa1-ZQP;4ucK*8oBtD`sb+Ln4>mi zW~Q0#aTfMm_B|30uY*S}*q!u)bq23=^et@eIBs#^xF3s|wxhboQ7DR^FalyYMeq_d zjMuRwwZP1>GP?n+%heSZFYw}LfAn>o0zEh!6ti{r?PNN+qBVGXNij$`W;v-Fd)p}Zbm;V>J^2O@<|6v6LA&+shNU0*1Z+lFMvNqA(Ah*mcS^gU zcJB(iB|4^(A5J^B;=vU>g9TJ)*{YMTl|Ml39}Wx<=V?ac7^44-8T$2we|qa=;(VG% z=AH3GV%&JrBk0WYyAi!kP&cQ34GH%n>SaD6Lbh&3%4c$iYlX|Dct(`^zK8sV!QSVu zrTBaW&&}vR9^{Ik|DnI}&us8_Vn*3YQBxSno26|m$aeikK@4(j4Taf;XjLO3&_Em_ z9s@8Q%}PFvm}+-<-NWuWe=1q_3&tnl(^vPTlrh?S4&5hV-_;p0b+#B+BlWj~^R?Tw z+w^Y-mhX?}^J{>ukrfgM`bfRL!K@!t!*Ii*f_kkM24h0>!9NlWT0@MRDoYOyjT_1v z>*ud1A4o|kphT!muj$l`SCH!uY`0N)1dRmUWns__o|7$#rtU<%f4ma(8}CAWM($x; zG+#CFtXh=y*i`Sdcz3L4cVsl_B3D>b%A1N5x;k|>pEj6x-#dkmE3rtfBK0pS`|1<3 zm2w22=786m0)&HY8J6(OiEUD1Z^JLc&EIdMW1YJ9!Gs4b>`VHJs-89l30GUfUN6J9 zt?kmb69f*tI+}2?e{4@7)3%SVss%Ie4{1seTr#n@K1?)}eHqaAynjOnZtP3jx1?9X z@wq=)Z{6P?=3ibxsEc*gyVzqrIpff4ogByTtTj)>vfbY%2AA7VIz+3up?Ln=5Yn)lC4& zxU7H*0+7RCnJ15C4`@09*Bz2d+rh0aqLGw0*0@9&G&D=n!T5hwXQ@>T?$eZp%R)!^ow9u@rHVFsGNpICo|8Wuayzj+TfD@d`G z=ntCjiWW*t&fZiJCshW6d*N0{Fjkd6d`_lZQ=($>e_X~;J^#)w5K|>?kFcML$DOxD zi`FXkog(v`(3o-dyN4e|>XE5R^~5NSi!NT}4PD^$q0}yNbY|_2T4RQ=QWeM!N*_%% z$#?{3#Ww2zulUw^Wd+sRuYJ{#U5qBraWy_dqWY1goo1 zvp)7Oe*}3A#B{GjXS+QvajhCSS!9R&ebnn6?RdL!(l8`pX$z3Nlb%*n0zpvqNyjlG zaf&%jpddB@>e?}-?Zt8w6WQ@c;rlO=`F?9n+plki; zW#J8>IB%!xxho!Z>s((D6jP?_S);8b^eP3;NqL=yz_8e%Fp)IJ2BkIVO(=;D@h<_5 z4q**73*1>%!4zf)!!;=)+YHAg1_z_}ylHP7Ln2XeNX0>U!&vXLfmYwu?>~vDSO-TA zfA9ePI2c#PqkWH@yrHKh#68WHKkBIhd zOt)t^n}SgwSEPPYI6w}Fi91)5%G>q#a|{5Q9ln9+U~OnZXb*^bGjmGdfq9R;x&btD ziqU|cJhVCz;Ln7RiUkkgp@X4$3g$jhf9Q7z#~Z|>-ukrQWNK|znUj#i6#K|&WmDXl z>$wf72j6 z?5&wQ*guP1ZfAJ&@<$E4|Iy|ChpC_cS?s?CJ^t18|Gx{uE;Tbtr4@8;m!qg{S1u64 zUOhl?P8}1jX7xzaPMB!u=DK}ia3cH}MpzF$F2gM@!_j%b)9$aUny<+i5(F`FXl2a8 z!l=d4jKpRIN~gGZ5pzl>MKK>He`xOK?&Fb2RN$6Igy-(}E6?q&ZT4r+?T(|WnC?#u zU!a%rXi|aIP|}FHAF{x99DybJqt^95!HEt>6F1R+OOIJ=IFtX*O4@8gD5O{PhcY>^ zP;qXk=d2l+k6X}(JYkGUWmI2BTBXx7idSJtiZphp`?^vhG1I656t*gpe;T(&T~%tz zm8bD&G9Su_cR7-q}tk! zb3yZvwwbPoM@T*R!gx_Vy1nZfgM)*aCZNtRp)H5mYH;t{2S6}1rGBw-tz)({qWx*9 z711;_MngEMlaK=k%}FXM7C}96#ig>V7+&<1&JnQ^QgCrA z+=KeFL}1U7_SbA%A7oRl&v1@*N3MZ^hRHIe=#XQfjr}UO+%ue?N;?Z0UXed*nJd>6 zM;ZV#ju|L{3zV@Fe~?}j#LbE0igpkeCCJjo-Dru~7jQ^8@6{tjFjLr7h4(6dDM*A= zvwLt@6lK#VC~Qk=%ShzJs}J*C1xKRe+Px!ebR#JKp)xQ(Jo ziZCsNi)b5_ZJwIZjvODHO1^_;vPRQ&!lW2wb*_kTK;if7OnZrCJMC|i6k~L*8-Vj{ z2|hEn*rfB>_@R6?bq>ZpU`K}i_X^V5EZwUpJ?r|{f5MAbeOkkcL6m8(UU}MMFVA4} zZeU&MOV-_9zaPzgYxb8Q z;YLUre^!G&i0%L}BG!1LDqMp!N)t~6;~I@YDH4||4;U$s2vXcB<)Q`dZ^~#Pa^qjh z2=)mm+xYz3haVP&uPB$gqRd-*AKL{Z=Z#)K)L6KE&&sQyXlpo$v&ABFYrBB6v*8*- zU__xL?xL;l@GK+M(I~LJE+LX{PJ@n%_qc)4f5EWu%jg^4O+R^AEkWDL3@`Xz*(ro!G$Q9Q<5aUFcP)N%E{DM5N@_8fLf{@HVr^lCYdwPZ5#f$ z4#feyd(pP?hhXbac=M0ErGh>KN$(ZkI;Y5dhDW_+YFg&T>@xR5ZXsh(hEGq+Vu%(? ze-W<+^eHArlJ>*#cvr6Fewu|RSH&lr{6wOT;z++AC8ypg3WDc^XuG5+v?&t^hd|o< zrTXS{vKBG>aY-p|ye=t0;WTlxCw7<;xvSdv!mR!Vee5Gy_7VMb9h=}{cJJZdDX4Uv zAF{90d2FXpQaE2+IDafod?jAAkR(wPe=m_inG`kq6%;BcRKj*ODufhkcc3#b+!J$p zCu;pks_~JA^$~RMLk#Lu@cAD3&LZ#07xQf9k#YR+W8i({n^JqNtu%o~o>hA|MLdOh zZZrc-)Y_m5U`Z z391LfQFJIGtd&h^DWjMbzxB?Qe`mO0guzu|2+5WWqR0lE>tN{RqdyI}(}jVfL#0m; zGT@J2&_)EYVnQW`^f_U>)lVy9Qqj6bj?maINClt=!UfU&2J&($-?U>ml3tA*D4B%U z>V%b0rrWu)?U2fl<=iqSIMZH1Rby_4+&xb~#*w|=C=OMpVt`iD7a3`}e}`BUp7Fwm zoFP0x4_gpBhG>)`x=In>XaB(0P?za`Yr;N`e3fa1ywMPM{T><-c6_CbtZkK>|2k2^ zT`qy3W}OV|t;!zUjgF2P#q7Mlr+>uZKKO_tyv2f(lc~pCZxKeT@&Lg_WON%Y68(5F z&bcsM+$Y^!48kYcTnyqT*<1|#C)=ECrSBKKf0K3_=|dD{KCW?- zUHJ(O>!WCLSDV#mx(9Ka-(z@0yz;W2AeFgZM8z*}aIZ|yOe1Vpf2SSsWxtYI!AufR z+5K3t*Z?A4VUl+Ct7F&LeSJHUYeuF$JBI$57>6LtzMs6zcZ^IY%0bM*XV$?nhN1aqol zRzfJcN&>(qI6cpeWL>mo^s=?6;7{oOUdd*+SPOe@#Y4u$e?!Q{L(2YLQn{*RVHHvl zs48L+#os*Co^0T+pgZJu;E4`I-?3g|3E$Y%t}=N(K!55z#;+v}2XFv@a+LqB761R$ zdw=)jSF>ttUR*P=~jJUqP@OEPx+rFB<{Q5;_`$HI$$*U^SqN z;R5j~mhXAIRyP<(phGtJ9oUO67Zli?EHuDXZB~#Ue`}Z!keecM#ONhIH)i4{5K1?G zS6m+p{)8ModicQJj_wmX4J#zMQ73(PpeLXk%YLK}8K4B}=u7yGFv(m=S(q(GmwEO5e#} zf6*COT4=XM6oGYzH#5UL7O;OX?6}O3 zo8_ju1V=H@y=W0n0ve|%SiUG2ix_)^zHjb=t%w`vcvbeDa>1(eee^*G& zIUDhS8CT6d6wAp=FyFRNOtj5zWi;wdezeU#Cx;HgFuSMfz_X)eKQK1!{yT;@*{Co! zVQb+&a%cHIL-mQPbnc3s!U!hAhZu?*qNomJe+hM#ow{~1E^!eVPm@BisXc#d*fReEdIi*JLTJjW}W(#W-SLtQsmdldZo0qjkvu}4=l2bm*FIbq0xJV` z?_Cfs)LqAy&D(5ID>|$s#Xny9F%Rt{h$0z~x_y$w)UHZp%%tX}0 zpvrIbJ>o=2<#)lj<|5Uv@vhkS)@j@gB2w2 zhB~I+=(C*FnnKn5>g)?(W$0cFpw;&*1O3L@pWu3dj--9wp+wU??XxlJ91Ey1_#lD( zavN6lxXD1*-S5jlx4GS^imZ9uId>H$sv(VOp)+Q_&MbtD)Dqw)e_~i*1^k|nU>M(b zL@J*PQAo^%!W3p8jG@hy#!&RuTx)2?(K`jq9*A>k_37>%))CGHuyV2~XuP6m)JIzC z0>A7>MzT6Q45t;#s9sJB0EoeNTKh39L7y_>rsjLTn4W~*u^I`JEh!(QIX70}Ob!bH zh-=UsY)xXxFT0HXf4iPd1Fns(ImzErJ7( z>@_3_=BCmfyOjVJ@#ER!)o7>3r&O6QY5wBgv%v9*Yr7l^Sbe_o{v-C`fD4vVmT#qS z;pkO$eZ6Cav9m|Vn&5=9MeHbk6zqY-=M$`WN%fWcL6|Ugf9v45u8|zB>`oO}M2UC||{6xn$#t%~2| zF2_B+c5lSNrz@_}-VurqI5G=4H(a0SzfNj4yd?-eL6AL3IGXL39`3~x3sm`!+0B~m zxf$>hdJ0e}HZP?te?f8N zEve<=<~ON*+@y|jr~ZRIX^;*H(kxYksh`&YaO z;SXydc`@!t6okJc$t$R2e#Bkh*I(RT?9-K2)xxdiVz_;O4(qXYZrvD2lXB?Qs!UX1 zb=~xmyr~O&O+f`L-ISk$w#^>bvqv3ae+JSfjiWcxoaR%T#h(dVy(J-R$2wk0e>#e) zuoc7>4m7VZWGB&%^!qoKD+kvEU4AIUuX&V|P74LgR^bMauCy3eh8`Vl({DY=gy2`* zT9C%OJM~vR{Pt0|i5YhEnzUrfIo@ZT@a;q5USK+sj&X-&HC@Tg61Ctnf;qyT4+IX` z$Sl03U;P09aQ}}3s{atO`oAE_QQy(Y;ompLvy`>}98~?w7?1S*QK#0_C@d{7 zDko_s97;`QwdPw%Qe^Qs4 zxE9|iixsfms3LA8fSbn4f9ndJy6JkPaZ#zHZ%3(LZgk3bqz=!*Tva3nhp|$5UnWBG zxf`iJ>T|i<+yNc(^eQ2^7gp1{sJQiPFoO#WV}mnw#ql1bN_b+cXrAi|!Z>y8Fl5`d zm{^HeNnq;d{pd=7>T@fTULOYPJ;iC3|`F=mUU=S*zd{V1Zb(~tR15t<&gcS%p&bn?3-`tS~r-DxCu3 z_WI#1sfQ?Ne@Ju*vih$hMA3@k$md@m6DpQ(^_SnC!Rw0bfF%bT1J6yQF_0+}MdfNV z7thQr6}_EDy-{-vQ$8$43uNwm2!*0N&((@PIi4cV{Kq`na#|Sjy73-S+`Piv5FLWl zj>wml-@H)5T7-;#x0(?CB9zso!vqF}EDnVd2Bc0$e@e2=UZ%QqEc-?EdEIvd&T#!# z%1;)+p^3~N2U#8DKirY|$HV-$$5_(_QyA%MxZ{aqnnlLJ0TWbWLC!ORH8EBI3$QE$ zDd7C)I$ED3Q#0#y^ZI6ONAOeFcApI%>@G1fp7ISK0>U>K{&Xa*y`rkW#$6^Om>jyntE=VkrFnj@o^d)w@7|u>;Hj)=c}T8_ zQzSGRWbF~yRz#-OO#nndyT4|1l=G!539Aw{+Dla!?SB%Ko7{8M81WDqb#eTQNc?(Z zc9q(x+`@TiKzYY?M{HWnX!TPb^K_joRx8C;N6igu+ZlxSuRIJa%|N??3m47}#%Qhu zCeI27tW4V(R_=hzCM$toiEmqNR;+I4yWwC-c(V3A2S1Bl1~rW?b;_mgvMrjRS6C%n zs7kEdgMS{rnPr@jTV8$jtuxu%8>vF@Z#NF%f<_6`EVw&oWQ}4mcuYd=drGEjVdnJAokyOPaNhq038b>*XA+g8*I9Gi{qmRMlf1}@O-;vXjwGv4q$ zjqYI%d79r_jkABEEa?b_Ju$aP=6fWU&TIrN9)Ae0%Ten>@r@9~L!H+sh=B-}9|mc7 z3sLjRP3X!k+=BBg$q#?}UHQ0-)xJ{TsUBd3(NSVNIbrQEVk_4z%B|eC?O=$VjS`I5 zx)BKmjL*bap`|y(-Iu?PLQm?8o5s5GZ8~xhWJ`7x-s@zV(Z@FEx=3G#VRge3{$4~o zO@DEAH2BbC&W>qVF9EY&?7(UHLg#)~nt4TEQ-XvsmUtR&6I+DXSN{NENLo#nSs|3r0+l1CNGd%7uf$-1P zSxC)B^i~?KQ!T6oj`Bw=Z9u4fqZ3B9Y&Dn#&Y)Cj8X&iyDL56nJ(R$jYb=Qv@U-fV*VVTiN^-{Q2mB5mGD1X5z9Z$C+A=C3> zmy3Wq|Ez`1@R6B5%)thS!&0o>kq%e^^QjGwbMO}7-?#BWCW;ZSHA>YsRlhUtTsU3J zbTqLMZK7WwEwt-Cx^c<V#RXdV00+Io%#;k4 zm0HNh3;1vx<&ZpqAn3U%Y=u1JQOLEh=^ISfy!>_9ihocP- zmiNo|lo|l%+N43iD`Hz*ScK61Jgqx>@=@U!L&9k3U?yA`i+_)-+Vg%pS5>-;(A+J zjnq_u1pYE84u7V1$Ek~mfH`r=Rp_mHvVn&tPFNX~&a9nqHAwPG@TQd|-j$$zz@2%jO~q*CL2g@*zZ| zjsKwj16tgZ7y&Z@j^FrB#?Z_Ne3SSh$ zd^vJ+Q-2UUmxV}2mxZaJEeQ*km8_` z?M5ov-~Tcw*bcs{|BQoT{73cn?>y@N1>*l=+kd}fS;hZ1qOs$$UQP`j_!d%r?XJ%E zWifbm(L8<8U}G)tg|FC{OtM+Cq2tg+Tzt@!iR=9j5DyQ}ib-+6K3`>dT(uofPk($o zK7#sUUliu)5AmU}V>fWzffUzLOld%%2gF+-)MfWaK46lo&98H?phv!W@7F3>D`g;q zbbp{cadOqh0O4QEUS92m!vAEntdU(MzSpIU@SG73Yiqjii)Y4si-%JL>=scW@ zt~Py+K_CCUM$Wt6JW{q52AEHNFwE<(QGYYlMFOie#%r1X+DU12l>@@0I`_C~nxcOd z{I#T&P+owTawNlPJyJsRgMO%iA&#QCOW*EP!)oZ-CBhJ5o0vFw;T+WJc04J*D()lL zh}BL~r&JwLbJau*w;~|Sjf?db09M+F&dNXp19AaMv0xq@!K&ssA^5lD)tcISm4D(~ zwAgXPIjHiJD;kRRn?pfmP#1Okq2hy3W0zYQ03I*nL-NA{q&;64A4Us3XfP)dbzI5> zny;701;ni^68#2ohEf~b?r|O6;5A;cGqmJ{5C0xS`rwGj>rwkDS_|S5ipCH;~KT`TZ0zZM-T#LB+m6h{-?* zl7wyYaM+W4Y*Qd9HqfviBw3KP_dWL-;S7G_@%4ODs$x=>tDfkxNj^`1ZMiCTG5r+# z1Gy3ZxSP-WZy@(yjVQtY`Wk?ljrITi3WMpVgA2$~AafKDtDLNj4GL-tO@GQm@JPq8 zl1R*bINn8b1;BxbqrwB}RJ(Ke_4?Y*3vdxjl1h?FPgOZK1}&jr5{3U;evD4TW*TY& zmZMa~+bn&3OPqs38meO3##ox9ktVRy8j~I@*lS(2|2Befud4j)ibP8?dZj;6BQ5-! zS}!#OqB^LD139V$5hNIlUw{6>g#e^8CcuLMoIRfP&jN7^`2`mI@pF#={=0*H|C{wl zPelKBr(5aIPz^M0myGk$ps3qoI;WFFdL0O|ZvKxQmZ^9Kgyx;&j;nTUs>^w2q3@_L z`3FMq+}nUZGYdU6NN5OfmkXZ{AKH#HJ!IGa>f7A_WC+T|L8f<5RDbX306KslC{GsT z5(EJQM^GTBDb!Z-sn(9?;@DEI#5yasLhXaJWKjWM4zoe^#F2zY#orx|d z5>CKRhaE(hH+jpt4D}j8J!~mHd6};>Te6)xKFXlp0>_qv5K?kzuO`AMZ&o5tsh9k{=iH=0 zvy9BOcmo#0%+<#+@NlTZ%muBc3c`&ZthA%i!p6N}eF46p%7>ZLg{D?b)VjR|Uwk2^ z{|-g?4LA`{#zS#p=sMNr1;x{{J?%|;CoO^`W(=@Yf$nR3EPLvW7_QAytA zkYyBN%PZA%b$_>Wuz>0mCwzmfAQoDvz;6ohn26_93Ew_KCnHO0s#NHf_-3TP`?Ipv z)n9CvGGA1Gm#E2(;^&rO_}ZAQ9m0w&HkjxS;!Dtl)KmEGg7jR9gy^CgPr(o6-Bi~Y zc=jOs(7-y|@I1nD>DVxF^Mbr_rc(f1)33OjnLsasA%8)GPy1@FAT)+n__whKu8l%X zek0YsDl~ax!S#k#X|KpHP8T|icu_M?=dv!H0f^;2!JfaqBB0*5$rkwsL-hTpaqWM1 z02u!Ediyh44bDrFM=BB$Kku+22n7%#ub+>-DHI5dsIW057ps-}DV{2od9CSHH;GJ) zyHUYoUw<@jdM$2zshKO=%l&=pBJ%U$;~v$QyK+UYFEfJT$O3J|KSH?E>1MhQL68|; zVqwj$c5)|+g7`sxFbY0czr$kw$I4d`N{Jb-!4--*$tZ>9W}p&|3G+=E!<_caj~yU1Vd>#^%uV-yc7g-3C{m zBN@f(B(Qc^i^;mj)JqL9Mj0xGPpos<=ij8TItI=+0yYbj-1%O6(lf|E@UMH)@>3i{ z!-*%2CRYxACZ5Ws2}jj~=-Tnq$*rDl~1)2dCc8n2ofug!JU_pS4C?XTl4PE7`SZ~^bO=S+tg_J8fK z?{0^F$#1qNCitp-8_5R&{7pVxmxZW@d@0&7$B>NF=!lUC;RgsW!D3b8x8e+)0-LZt zn~t*7Zo)a2p?6{WJ8szKHy8Tn5a9>HH(2_o9Ba!r!?`!w+m|pQ-lWr>&Bj!3l7*R} zS=zz<6o$`n>7L^4QOBB-?`7$pf`4!F!Tsm_$6%@Fwo}-L9)!=FjIW$8vbh|iw}uRg zK^7l)$}b8IpM+Cs)-GWmmj&LFoYb*En@Q{Gea|p$VXhF!jmB(ZdMZO78pnN$xWVv@ zGkmt0p^S(j5}VLC*1BRUYbu2Fxx-$Z`{_rF4}ScN#lz6lSC~qKpZeSkJLd=i+8UlQIP+(9 zcUs)}8OMxENi)`F!mtSyk}ttdIvDng#pYe%G_nP$`3x5XDB%3832_aH^pas+JA57`7zH)4M+34Drf zooPT0l3fYZXer{q)m zTX+>%l6s9ll{+t@;q9J~5rwnXp=J5B-z8pEALG)X-bCwhqiZY(gg^z z2HUo6+qU~@+qP}nwr#s_+qP}ny4`(uW_BZXzsy9u`|d{656FthJQaEJ)Je7$P^m^v z9LS_FZeIhsB!81CYL})$Vj~2Jl`xJ-(+3g3Foy2pC{L;F(io_m0%(D@;DCc1L4On&N%%zDc7+F{9#1>{8c6iqMG268`FK}NiXnauw zzmB1dXMcpS21B(YfiTgXh6Q4XZWCA8!#uvi1(O%D<)tcgs0GV}Y<>1q8Ic*%2lgN> zkY+RjH07%v*k;bZKHAyecJLGS-RKC(KZ&9Z;T=;vI_rwEvnG)%kzJDpIfyxk5iRdps#>%|Mnh(Ad>YRRP z@36NNItZ;Vyg|)_n=k(mvG_GV%>Do;;9Eb;0VQ~6ri03twqN1so%S2}m+0x~CQwnFQBFaoQys1WS<~HPx2)oxG*vsnfI^o%I zd1e@(yNiola4Y0se+d}@1#v;t;N3{V%l|=g`5ezE4vAnq2!nm+i z|Bxm~`luW#;VXY&Ms6ZUSX$@8G5|H)rvyx^R1j?fvw}8dx3jf6yxm`1yf|DXdw=R4 zR)}c^L<-QbnKl3!Y-uOLpS5$if^UP~%Kb7_0xM-+ zd3@!3)ARc`ezOUdJhbqUJ!YW)!r&WLhhnq)A>OPmtX#=aj#xK@tm%t-R%q$y)I4Z_ zOXVk%5>kKXezX#qfdsU4jBTUaLVvk~CSjT*@~#2PFCDW&UD?`5eY3AHE&Di~6*I6d zMhp%3|5;UpVp3}NW`ELNrn`Q{6CZqgNp~}zhBfyAvy`L6M{6ifoW%+3H9}EYB^?vr z>Vr;`E_A@OHDgvvj#aTSvOz;91NG22r8%OMSxinhj!P^)#FsKElUHhtP=7tp;Bq-< zm(8OreTt2vOmTjG{to8a^TThwQ4wijNRAia)#jo&r9-!Hca9=Y{Ngxilt=K9BN!^O zU_sv?kiA2YptnwEuCOQ@7z$(v4QTZ8VGc3+E`vxQcdW$)Eu zUu9s$>6quJkQ0>2^~^2IDt}I&huUrdYsko@(>L*!9d@0ypj3YFIh!#bvP8ZPRoo$f zy0g4Mu!nYSw|xiQtT44>q2G+%LOJ>n7$uP^tTFnru8F>oKnrqK5{xH)W5UvmUUm?_ z+DOVy0HC3%%W1%HY&h6Pqq@tCFoDAqhSD`y<{d7u2OpLgA z3}pgw%6+x-SpZL8vUD3ns#^igJN)eYT3y9bsFLKn$|J2&-cK~w_2tA~5&{kYfr@@` zWM%=oI?l&t&~)WEvVX7i^z$MA3AbflLz}mEMwLASE)0H2P1nEDkc|ixz+SL<*|Q=g zS@kB`y!;BN4E>>+;0r|PNNj!q;o;` z@qzRCaPC*?4ZJ}$hjqopUP+gJEsVzI0q3kGD3s)hY9!^}HhpF4)Y9K5OJZL_xOlNPG`a%bOHSM}rBPtl7HB1?t;V|{I7PyBg2W7e(^D1b zCPJzYcSz54GJkSd`9chTw=NaY-2hbeJ)UV~cN3C84q7_>YBN4` zWG!Z-2!F~?9Rw44TtRoG#B`NO?p79Q2Jh)zX^Gbh-2_e#BPR5;Udc|?2+F>PFHRT# zKGF@~6}w!5dZur+T!g$3UpsW!+i;G}+qrhPXvD2jPQ7;`$Zed6*r1O7-q;SgLi%B~ zG^S=4uY@)Iq$w!oTg*|R!!5rS^8=J$u_nD-1An*p!U*1}(Cu2r)6T8xmvNeOj#YPj zQqSU)C)=m4OxOx4`TvN|VtGAT>A1=LV&x?(7;^=LVyMP1h%DCQlquV6)2u_$^GLaj zTRAmYOe$%A%^1a)5Kl_bj4dNlb1brK$(pr>aVWxS>re~jxpKQL%3qa3y(;FmFS5Hr zn}2T0dn}oyzoaEH3B_EHwi5D+tfjKNFYCE>l;!-mBKo26d}fw$uZQC}5c}cTVfHbM z-7~!yTEVeB)uPkV$K~+=ro*dNFy8g@Pf1&iGs)J4olgamQ3g0h(Xq=lFB^#_W{Y~z zF`Y5me2lbnv>Qb2{^K?_O0?}&b$CU~2!HrR%aWBhiqWb~x|F>h9~R!e#PCT~p`wE}8`$JoD4JkMN3I2ui)?9#B4p$A3cJ zD2`PT-+9(u_Mq|-b{Ph2LK*PN!mpgHZ(iB(%g&UZ5*Ew(c%)!&2WPQEtQ4$UgPB0$ z#H@fvFJ!xt*9I)+B)fy)Jfoml$t@Xgg)?u(8}-Etiu_*4e63UK%Q7y!WlF9Ki)k-h zzsPnG(HROA7C}GIvjy{?>W*KmYJbgYUbVh*k99`b&gr|Piy@zXCEC26TVfp(1@1L} zfMcOa*|xVfmK3#4`5_W2O1Ik8>76!{%-$J;En3w#Nj=+&^c^>m&;8iKpkxjs#qP zZv#{~cr-9_x`-;fFeba8n}o%T<*pc`wnpknRs`}^_eQWNo6b5}PkW{LoWSi_IDDx~ zMAnWruR(OZaLabm^!mvvF$>xa3)*VlS_lnD!&VK6V^HI9psE%gjDLRl>T)x}?Puec z&H6yA-Ixofq^{!HCT*&r=So6@R3e74)erS$CaxH9D!lw*rH|x71IrW5^FqOxEX@x= zsrCq_7v>0$IhmPNnZvFlQIR&ns&sX2x-xCLHdag7erlv>JR(1yRw^d~+q((FJ&emJ z-r$+fG)q4=*s`nTnSa$`()aF}!QArmbA}2)qqh0K@IJ5}ob>tb+T8zO9^Ar*HBcNN zfm+o#HoPGQFNLk^pKfr9c8A&afjxW?2uri8Fyj{%(30~YDoDN<$o>+@KKc<&U#lYS zXz8t&grXkk?0&TW38rtaDOK~KJ1xE<28}pNw1Q` zvlkz*Z^oOoHq2O#vu;U9_R?75Y$wrgdoB%UHrHBht+jpvdW7nS)sB*)2vPqwuH+l>Y-_QI_(WI{ zgFIKWvVYj14e5(tJ3z0iGK1J zAayHW6s|z;c^B6<#UU_DYj+{33q+94Fz`(P*oKfQN8( zal`3H;E#SQGkNBf*=inrg^qXnq1%HEG{6IW)tnrca4S%rwj<5O!tm%c{^xd_4r0o4;@SpUMFKG-{Eiw=g6W#x( z^w59DA(m-ed!UM={gcaaUp6hW3ly0i)~1ysWGjQBqF+shfG-D^wxkx|%pup4@;JUL zS2QRre*KXUM<%5DQ0GI@=8g#QeF)kA_E;d@+kdpP0vV;)a^Z0~zsvKv|GqP!=>PXK z4Gz?CC<~tL)Bs5z*}2GQH~@-C+41ZJNqBcWERR?m>D36|O~VvPEPwlEh~>lOCP+x& zcr1)aFf{D@2t`OHFw&ct^dK^*&zOvL7(!!Mfa$iuNOVf#Nf9Fko0^vbq8nrDhMoL!DJm};60Lx0a3&9c2AEx@?aR!Odf%__wry|m*ky1#6# zO-v3L*fjK+wH!~L5U`SkDYXnBa#d7cO0Tvl?UG%jGs!(mWL20pqhm+E$XJTw$Qd@@ z`oe-~pHWOfobvRB$lP_ozMOkxDz=%d_i};i6tDb}G&ef?{ie~37$tmwQXp(x145*N7HA;x_A}G z9ijRHATb`X<)c6F44CM$K`oFgJ}QKgE~2^ONJ%&jrm@>T|BxNg;-NgWMLImtn^o2( zK$wcMNGczv)8qgv+gw-&n?DB{X9gLLwZ1GaV4V_*+9_7xB>l95{n)>DS znl5wMT1<|$_CdN{uA}knR(lC|(n-rQsdZi|?$h zEsNg@*0RD0as{>`cL*_5@|nQs$|UiS!bR^W#$$?d-S ztLtQZ8new}|7!iWY7(`;N~Tp3D`^J!w9w20g(q011@m*1e-}&2M7ar~Of_6km(41* zAN$Oj3$1C2Eh*h^aSSfXqq_XF%ddeIHP)28cF{y6<<>*irF5X~q=+%EDc7cCoy6e? zTc(M%JW-5xCDxDlaeppxDJ7oXyXo_MH_s&pS*)^R-3|7_*HBIE`%@_44&}>1GO!b0 z>~$gAg^#|@Vo-ao=p>fDC4I~}8Q7&HFH z(yKFkzGy}xKWrg8j5j7)+B00+AHpUt)T8p1GO}V}c0ENiaeq`KqWT-&Kcf0cO`)av z!6|w|{LO!z3E^E3(q8GqNj)T}5-Q3jJhoin^Ajs3OE7 zrDiQn{O6K3K=$bD*%Iq**BK$MPehEz zs7|1HJJPi#Ie$kB&5hwImbt*lCW>rh8Q0jAV=nzLw0ca6Ew_9VI@h%N5y)(Rvl>S} zed#+`ksI$Fk#(?tpsffefZJPxxi54UjgZERve091}n6-xCOaWq;_>@MlelfwbN!`v18F)751i zXBHd?DD!_buoVAaeLw#1X|<~5f3E-eZ|4nVYC0;*LTJC~?WOd>g*&P}K*gjeiNkiIT_Iqi{OM0w^EIV~0n zefPZG7JnZ5-@dOn17@YYqvt>l1@-WxYmi1o; z0{IT;$A3$R>Wu)gdKpagMiN7Gq9rNow?R(OE^u`+i8n*ly9_?z=XX(irakj#o&VK-HuH~JrMRtJ)&ONrr*^BTyq)p>a z`PvDd5Rb_j=kWAS`v+4en-Cprw-TXz#hsOvp)TvoVgn~{@p?GeS7gLk6&!*ZOGR7^ zlI-R9YCDP*yNvL&bmB~onDns>H{oq}Ec=(Ju9D=V$|7{xoC%bj$s8^0AFgpG{#B;=>-N=ny#u5<;4n|eT>cJt95P%wVmP;%+%OEa`ovw)66>9jH~n`I+gkKpkwp+ zpd=qAJdaD5>Oe<2k?h}f)F?I1L9Ag*xqmWZ44#^8Z7rl#jgO+r2nx03PPrUw=UAfU zw$)EpGW}We62+5vD;_ViChIaeyAWlw}tE z>(*K(yuZDk(5sWnzuQYybbg0v=*+&6fls-WNr6NQGUK+Cd1}Q6$cS0>&LFp)404RP>2nXMchwY|lvNi$@ zEy3^78~pDZ{;f^Om*xa4qk_h%K7XP~0n*XFu4=O+;5C|R$P4(wL&#*5xn=%fSo`V_ zsO5DT4FxdD37DjY9DhFf{rD%j=l_zEz5_+B0)qkpb^VVrC(-}iBK&Vka97LA7i|^) z->*4G)+`G*6fg)F^h6W)MA43=8p_BB*#cQ0UYk5eim72sOI}`F`_{DeWq(~;JG!<` zTbXA^A)V6IVzuY$)^z(`x;g@IoAMMg*-!5#X-JMZ2$pU2Um zB=Ah37ffGr__SjlB&}mFmY-Un8%*CB@ZmLx?{J8!ugZU<+(5_j1O5(?Bd7O+-VWKo zJ6NYy;JuIMC*nvCVV6@3)nqm z&tKiZIQwrAK2B)I3P_Jb`=&dB!9#uEJ5-n*#sNm~kF?-f0<>dqW}6rwL@LjP5EfhX zi^$9tIjTKsI6tYt2ypxE!e8xJ0;Pva$Y-z!Rlc*aW05I`oew)%HGeM!+lM)H0=^*1 zT~C1HX3>EaXTH)yEz(ym&^+t|FQ-0I*T20uOn%D|!ktd-K|=ly)Zf|zMuMKuewvRQ z$ms_Ua7J3sutYT@2#~IMju|17oHCnPu(oJs^)Lh2uoom@`*q*Yn{0ON2=%LVkh(JX zb~7;TbJWyA^GM<#b$=A)TMkmTKe39+s4yMY>Q*sj*JZ>dZLQWtm?N*_deIz`v zX5kJVxPm!f<#|?+@E>TAG7n3czqD=5hS-B@MjY3nGdQG$>tWkDt~E+FPuD{*%N3s) zR_VlhCQ=y-IgW#gVhVTHoE)O~9t#v(oGLKz&PA;L0q_1Gj=>45;7^lqBOrT!#&e9 z@duUBCKt+%x}y;y|4=W^=oH%HnYtV(=%H|b&5_$nu3r=Fw_~R;nT^A5zcHq5=QX%b zq=2GSsDJi3@Iz~pW0cVVYSP3V0IL%vE37J-GL>*ZR%+Rj<62O2Q@H3ZGEO^ufE8&= zyDE+_H%(lrQf@pUEiPq7OMz7@;18QbSreOl8J{~#Tt$m&_JDtxZ_%h2Fa@+4K%PXt zgKn9oj!mSm60Fy&XrR)SLyp2!^+OK%?vr@ALw~(PEt|yCY(2}puK`oMsES68l#!VJ zWc{_Uuu@ehEVRX&&j9@Z#V{;H1i+Wcjat95#v|@N0yJ5tjEr8xmIv^3sY+$4ws!Il z&UOHM63uPuYT?$+j)FXOMY!&yp?1mD7BnbwQOg!){p0zXh{0KBRD+&fwq%=)x?beb zSAWH(k?Hq4zSX3!d|WAAQJ<+>Ag`t9T{YV?OIwn*U-IdzJ4`W8XR^+Q(DaU$YwKNR zZUf(LWmQ*9hZr+SRX`f5>r@{4B71%dA3?*`-ybEz2dnF^j64|)pVmM%>Etm>e+<-R zUs?C%Dswt%cPGfMMfr9&#d^9ML?*|-x_?tSu2~j6>gEPZi&Jxj;S|AD7J1S9Sg|oQtR~{#((vmL-JFh&rKPeR7Zyj{{!I&)c!n3TVHeW!5{j$ z*rSWro^p0ZF)LRdsd?P2Jm?JCRRAj!xC;i>bNfLBrbtKJ@ zNv^B-FUj7SUvf}C3w!hhWf0kOG0{dUARab+tmI#vLgxhjQ`_aNkrMN`=YL-qs}&I& zuMjV7Z5stY#+UrAcQTw1ZLL+LYiig(m1Qnk%`buYf@H7pmm_v;yHMnLlv*YH0=pMT>k}uP3HdIv&w5!yAIc1N5bA*4j3I=5oZ z(JmvWIzj7AyiGQ&Vum{b;eT`R72Se_f7J^V1KuQQe0CHh;T0uv_o>SfPtFHnuq6{+ z)X(v5+AbGCeZNIkL!u${>~1Lh4uQO1`XSKZ-1q1BvExFfpjC4aw6hf?1sH~59#yc&oKDY@$nN%q)YChYc+rk%+Y*de`+xQ3TrmY*U}D-u zXm%j}IDV^l!o+ltn6?_5~QB8=_z5V$ly zx0`%N+i}tQh=6@EYlES-P(EHi%xsfz@di)kWga;mi05T`Yst2N&09q!aRvuhN@z7n zBcs`icpsHfSvxbwxM4^;|*Jbeq*>Rx6XcPT90ZNv!htl;`4(%owDU z+g6D4pSqur|G>taAZSES&$?=%@ps`(W7`jUdIN>M5PtzIY0s3v&}*lRy`g9?jB1N0 z4VP0o)ANUVTS2!kuzSSjjT!kPLSFc!UqDV5r`duEQZCT56&jYvUvO5JuUoU-o6EZ` z@o&phnRZ@gDzwiOJ_$%I1Y;4-|$yR9RrbO#J;Qq1E!Wx@g1qd@T2#Evgi{EJRa!9PAJ3_b zJPJR0b#6QDqc?>ca%i)~f1yAB<;aP&W`7`>2@3=yf%iXk1}y)Joxy*v{WC;6eGOpD zG3A&}G$9uv0)z%mhMWFD54L15W!6X`$FhY@*(KK6xT$UF4$`dCezdJ?_e8rdp~0Vccd%2Vbz zxSS^Cp)%&o7!N^xM&lqj`id|kLyDspaO6J#!C3<>neJsUjqYgPDoVZ6Ac^kj$a9`& z5bXL94<^TvH#DQ`5d`MSk+^(M=6^K>frGno4607v#@R@me2>_W9D{a6Ld>juPwKTh zrF&-~Ja0@RZ1b_?@^CILnK4kymVES6p&DFD9)HF&QBIf? zjw52EO|kvANsbLAsa*_;jw?|b&OgkUy1^QMfFF3yUZ9~HG8_pJ_YQ*fJV`M*r9E3< zNjzaOJ4jO7Et4W~A|qNO1Ee(4h=OlQkbB8%M~toEih9awO1dZSZQk1ce*bL$-SYPK z)60Xpd()eWJc6f95_WLVMSm2Bz(qDk>DJVZ8u^>*DB^ZRDJ@dd&{0;?(o#3t-`iH# zTSW-$hY&bN^R;$(y>s{O*6L>W=&-+a^31!j!?)+UIr1oYFGST6Z+HLN;kFDp&I{$@ z``nlci!P%y}udvVYR1xR4VWF|@Z= zSvcNrYFje{0yeoCPC3~Tk>EHM$?EW!3PAU!eS*>4W>Iv#f?Ch zpn$>-wunZdq!jNh7=~_KREKsDqjgjRd@Cj4LyKjD8>v%_{Q!*gXRquLB*JPAt=Khl zC(E5h%ykK)p_pysD1RZ*ce_;j`M7zCzG9b7E0&rShRZG}L{2aN&Qpis@7k4H8Y?Wq(ui;&a^Nip{sW8Vf~4 zkwj)w*O)6en?i~*FKK@ln0Vc@#Mzm}T28pwTg99KN%h%mXpq|z183)TfJg}d1l7!O zHU{C?+BPx|mjqNMc|@iiMY7v2|^m42l>wN&z*rIcX`>G70}x;DMkZ z?>_-%CmGYJs1r!#DO&S&**)lXX2x-*3K{C^P|sKnNPiKY#vBnLA#vQEP!C0ac^~p3 z4N|I@HmKRvWBRR!#-XmND1Rtv@s4?K>_jY8UHk-3no$}iVF`Kngz(0e@v~Dls?>Z7 zL&1z_@P9fr6I_tA7OS*NiJfDfc=Wby_vjhHx*b&F11pMuI#VRPmCrX$m^Mb;--}2g zkr%O2+Gg_99sV=TiZ?P6WR8r7c3?xG36ji>-aLiG8O>6=v znpJA}nv6$ve5lGM&DUnL6|2eY%^T5)Jt{As41cF4zFA*x)_%+E85>Hw2WfZOOuc1D z!;G13t8iM&d9J!qosT@g5Fq{F-@(I{m$C9#wHby_{n?x=_!(A_G`5ZAn3)A&>|~ae z`rJ2t+1LB6J>m-F42w@CyWlG~HT6%rnLY2Zr50lFr6Vuv;Eu)NAKy)y(9>nLfR?Zj zsDEu$2QvwUk9zkpc$U>9UUGv_nfun$bLTsNBy3rrO@&P=UWgfvQkwQNj!oYL+xTbg zb+px0S6oWK)^^lzA8YScYDZe-)W(^;?Wk=5Ffdg#!Et5W7xjq`I)Dvk|nZ1*5{3l2WaXxrrmes|GvE>iF)L&M@{~G|7ihancQ)5A8tfi+ zm$r3J9%`@cuP>k4TVy>tV?GZqC?!UkPjr0uqt_l zZLzSAoWbP!NYubi%FU>K@ zjc(n`b1`hfQ)CMd6^Hw^`h0b4!VnFz@19tL0mdm$B*F|O!)D_z3v%p&0e{Ap9Z^>; znN3oh*K8iZM`^6WASw$VBIAT3q%VZg;R@thDJJJbDFm~$MnoG|8+>0A#A9+6i09mh zjRWkuk92>-!E)`s5p+S)V~wZS7&BhRLuKsvgN-X~M~0||J$Aw9G2Hxm)X#{Ex(f*! zLUmW{{=hj^f@+q=8qKkGSARVWaLvc@GfUrq^kD?r+lQR5(pbiW4piCMxA(J%wnD}N zg*}Q*ah^)qNOf@+56Tis(}N{CaJ3Dowc?P&v?qwd)CWtSNZ0oMtC=r)|8T~xn6K2b zs7Cd6i8dGAvCW4bwm}3lih>u#97e2rB^xCcE%nHK+7K!^iod}aXMZA^Kk6PyOnJs` zJ7=N9=IVt!&nFMc`om1S8>STaCG}^5Lf{b=?7W~Wd+QBP`cs-DI}$gm zom##b62(bvN83e-MT40n;&~p_$ZjDqtg+S{U_A{%gk<+KuulCrqfVqhErshZyz(lR zx+NdaJrxLcHbuumWj#Da#U5-;R~S*8x@Ekly2Qv45Jp___peqHr}BoQy{ zub^-IZg1w1=RUr2;@zF5X`4`yzmd}R11^>-l-lp}Wr8b4-W1PdfE0M2zOvC2+OnRY8 zgDln2b_ldAsb^%6qkyW4hRi|fle$xYGJ@%y*+_Q3N`UuRo5hQV3RqEb(E(+&CkDN=u{M9ZtG5YFi{s>j*kP)6+hmzCXLlwXOl{iA!c5B36U%yKnoaf#O5 z>JGi0s^vw=%_=aeocO00zb?u{Lh5*^l-($*AsclvS%|T!Nv^*m)p1!I98(e(gmKjs z?~6!Y)>~VX2HYL5;YZdbp#jBs>C4_obKI|dT$nUP&_I7Q7YcAkfr*9s1hE5r8=yWa zKT1~yR+j;>Um99p8Y=&e(|_4l`qzdUKzDr6G3>hBVzTX5i_3Z0XS=mp1*HQnlNq*L zDKXjgxWwevU6l5%vH~!FdbgMQBYu}o^;$277_R=#egS(bt{_5x&VG{+eI;anEvRX( zKpr|(Uq^pY?mkw1v%K~pe6E0OTyn#l<{vY4|D&404*8Q`%uH465B_={H>h=4&bph* zH$U*rO!YPs+%gWt&jkT4+ZkA{`ieU4GHyuRhUwJp4fliq%a5S+2gH;HGwFqgDyWPJ z7RL~{77VdAc=g4Czcvg*6EdeTiAf*v=OUCcN`!x-HLT)*R+W?wK4La4G)jYDmHlq? zj(q%}r*6FPjBDksTiQL(hdPaQyyzFa5Szz|MTjd_Sd z?9e{AoH|}-aZp2sdSSQ>ngH(h~kZuR+*(n7)e=1cwjpRv@>KG_j zVb)VHaULbCMRxP-D<*0en#+pio)Y)D)Fsm9S~^K* z>x=&`Zp3$4=^;*-Ho((6IMYAT5m$fp;1q-T+%&q1h?#Miwmeg#>b%r@n0dpO*vQlB zl&jTatspS`%k2~WbH0w+v6h;Sk&e+5jfVDV8djq=g@(*yoXeFUF!)>aFU;e?UkBc$ z$O2H5swVs=C&*2MAQn8Lb+`eX>h)v!qBWZ4=!jIGv|MH5O=?`*zvK$>njwR3QR8) z7`zAy`e$XAth>?iqMWCfh^w)p@m(45un~Gebg_Ojye}~#RVhiMYhb_;9a#V#1FI6Z zv2Yo%d7^wbRN8Ln1k=ng6ghta{F*VE`vE$V2)=8nU;0@6ND>;rhT4Zxsf#9TNsT)7 zEt_gK1Q-_ZTzH^|^2~sS%5xtiWB9_kVQTmS@jcM`W4#<;!9*6i%=J={()A$FvvefM zDhvMfF*qIiCn)tGAk|AlZ;O&kMDAi|8;Wi$VW2pXA2>$2vWt;Z@Q;6>t*-@BRA>M3 zsL2B|h)WO;tbq4<$ib^(!Mm7pa@dXGeXhnm0anDonzu)yXQdAJ*Y&v3`BDZ#u#MjD zQU=Xa0p<5|A-;W)3+Tc=ubAD234R#t!MG8GJ}A2BG%o}x&MO@!5I@bfwJt~$Pp*umO(}X&RtA~G`z6bBDJQSDvMF7QH z(2fIfP}esQWoDQf4`8V!7-0aVc2=gE1=$~JP^R`LR*ic0ShTwefSSZIDXU(>@DI!K z7)kE_F8uFp2c3&~^t-G{R+;<<{P&t^$J|aC48NPC(OQwLfU7*F zr9x3m?$W74JMiI*9r67Zip(G6e}X+0qPm&5kAHL7D3CEv#9|}8+L2R7uWv{$fN+8E z+o6dCIq9G5a^I!esq&?C1H)3%nF`VmxYQoZ84iV;z@qA7+%-*|%y=a_U?s#anziKh z?WePXn(KcswBW2OMoC3tvZ@jvvMmVKKornnt>~kh$jZcnHU!A$L14=0PTaL`P_0{bB6s>4N8%4=-Uq#XoqzLHpz+BWvLEUEzOR4*nxQ^`AZdlfR?tQ%Y1o1p@MA z|KGNO_(D=LKUQ>{uYZ_U}_%wC}xAz8G8 zDOIm=8_St3)7rQ(cjrV8i2el@@PGh!mB9ZPn}1N?8ist?kz39X4o|*0x%*==?=^SL z|9*e@y#EWt6m$QTG@=R;!t}))s|&LH!4!l&Lt`CpA^;o@-lmH)K=Ncw?MMeNG%krZ zjaR@lGTen9E9atXv>;PY`%_FBECc};W4^G3(dRUsu>^H<>%D>IPvlp^u#;`ly)7Zm zOuMw-M6dNCwF$!?VB00sDAR5eF%2h^Rj+?E#);KhtdRm2Qhqz-T%(ls+f~Uk!foZ9 z?#L19Q1e5eqB6*Y*2RwfC;w#!KsBVUNcLza!k@?N5QA^TC1MpW04&x=9@3uam|NX= z$8@4^_Z}HOrGhIu`Wy@&9_p$SH-m6)n(kxeknO#%vrMbraP%*-NhTbGU}p7tt<&UoeYdUpY(s}oAF%1 zB%e3o5xSgg(^1U)b_B=u8+6mjR-#MecAM;_=;#&<#g)cALhBtbnyk89iRAa@uaY~7 zw|2`0d->c2HT7hVl@>>`wqwbThzwBUbC_6k|!ngrtRk-pAqM^lypMJ`*w;y*{K3`;vrptZ0AlbY5JN%Fj$q zfo{6RL7h;rpH#(kY)9{hc0D1PPu_y#wNpTQ~RKGV?Bp6N2H6FUd*s=4V>@!BNLpouK)cP?;jysYka z@+1*X-n`kIV&gZe?~U@~M!R>!y-wh3fpFEmAWOHfjKs;U+1Y$P-|y!w%kPaa;P;C+ zkbA?(H!uup?pPb_xsza!#9oSqI)fa18ktJ-a#U_7Id>aI9ld|lyKyb#73%Jw{$wwP zC=OnF_g)+#Cwa>KN3EaiIw&{-MnL5uQdmwW-BFpsL+_Bq)rWjIPL5S~x^tDp1H~sE z33{C>y$8la_mB**Lz5YPDLlpdg4PIvU_6e+znfq;CQ~tTYF%jDGTgO0? zZ=`d=W}1W?9z*GAq_{)G5k7dV%kpx{S1-7If=-xZXu^L4$DX3is@t2kej)8OiATcS zeRXjZPmD|;fboYqi&)KScS&xWJdiU?qZt;)nMPnll18Gj?8wEIc0=hAted89AcLlF zNTpgmXEb_Ns@s6}LjqhhOu6qRy+(V@(d`h^=dz>(F~dka@0-s zK!-vvFjNpnCI=6X_JiJI&4ihv5lBbGXjhXpiRqi?7&O7MGfH|@2`=Vv)sm(hJGp@p?J9{=O3 z0CyJ|VoLi5J8K8=mcj$jagRdr`mVe^`?=zuvE?dmr)8h_QT5H7>ms)3ST(VN+*_S< zRGw9_Ho@fKjCWbWGx->YVcT-w>c&}G6*T5v;~kzgu^~>FyY`;>jMtp#OKMSbvN3O# zpb&pwp))u;nJr+~U*6{@NMjA`z3LQ9T4e2I^X5W3%-<`P*7J>F3}@6kXgSKsc>Mg^ z&;Q;KzDjqvoy+>KY$rOv$QuJk&f;8{5`JSKkZ;e@^1AdN6a$I|sWmwM3n&SyMgU08 z2RJ_CWff?K_*e5{--XX3&X)(sV9@$Sjf&v0tdO`tNxyvW zkXCpG+6I!jCC2UR{d$pdG|M;j5s*`86izXzWq9}kH{GJGS4wHRm9pL-jlB_WhY^1Y z`xPZFiGLAoue5)ugMa`o`D?I!hw@wGgJpj!_c36L$BG{g|A~EX6tMGwU_e0Uu>b#H-+%kJ zMb%DaSqRC$o_?eqxcVcw4#s-5oroIhsa^!qB9q#`aSHPDh@F31YGRelY$V`l-cUl~ z0Q6~-@U%0-y}HCTaZBEw)2I6{Uw22wyEoYP8NepZjOh02(fY^ z`XG~HE8b&qlODz$t$zEYa}|G86(#OY+ltRLmXe$D_!`tQ{l?BSSnr&hBp1K5nPk~= z@#sRzrmj-1_f&V^6z-O;(FN`2h+E#e4w`Wdp`6k?{iP>PIX2s6ZCAZ3wJe)iEg5b- zb-vCNzZcERhfm*d)s@ZoGdNou%eV6Btk7 zCc^5I_wHGDsVyh$Q|zgCZzWwF3_IT{bEpMe2+V#XcU!q$e7q6eGML+@4E##%WlQk- zZ)T9|q(kbZZVrjGeSPcy!P+~8+qNZJgKIByFWa_l+qP|6d)c;a+qP}nw(Df({i^f#X$2tf9e|7Ax9!IZwDC{qyJ%J8)9BFcWDaLS2C_Qk1tLo(TWAodDQVj88TN>+>cvdMOhY2YsWR>Ooj%A!A_Z%^|+ zg%^fJ8{{CfiJt09lvG(Vm|;i}lzw$Q$2Fb~@Tm(#AS|$*9YBA)UBn1tA)!}zRy3#) zP{7X^kF^~(8FNFF>;-v`8#$a`!*dLNb;MYsCO%5b9%SVYpCUQ>SBPEKvr>NxQIaaf z3&4;VK`QQvgAQ&1p=d1 z;hEc>JsmcoN85i*!~QRkHCc|`Xs3Rd1DDwx&Q{FT`Bu?AJRE$9wa+2?urjen(tp4R z*X_Ju0uTTI@_#+j`TrG0|BgVYL%CroBY%@-7{yO9i7yaY3oa;VtQ##5dCw9^lRy4S zZe(Ui z|4B>Bx}=oGAlhkpna=c_VgGU8be!>We~s$62DS6|H=r7jX4s?}NHJ~|4%Re&4Tsi! zIxxDVc3b#Tykq8-s8vmVE^D2NQMgpL@4!8JZHEIhTGjQp-OZr5zAb{17qv(Iv_F3GGjqNVl-|(62-J-a@GbHIgApLPYI@3W8`C`KfAh_f~zfRfvwRW3Z z>s12`ySInHM#{iNIMBerMLO_6 zp(A&v2%=%hW~El)@u)T#N=_Ct^yEg+EOB#oHYZsOuRQqYdfSb1y%c}_o| zJ%tHfF$0ZWQJ+d)Ur35D@2Qf$Co`ZxH>QXa#>^>nO)fb?r2^b??(N}7VDrobHkGPJ zxvhWa64W-ufK)lDro+N9$OJ<@K`wU@O4Of4;{q~OFmASmr<8&}q$zST97-y(CPkTG z1MON=X-30bIwH6Q87*7qN0}FB%-$y!cu+z3rSFN^Bo%4wq1snjiDnY?Co^bbvKC#p zT2Esul)h%C5YJb+FyVFF-(=NH^3ertS)_lfAS5w7chDxmChh(j;o)G5gwSdKlt%V0 zIf9a4t~wn3?ovsrz^ER-Fl-Y&`w?)R(I^UZOfTF>91>#Up@s$#YV*Tf)g=``#b%HxF>@a^z zKRhB5RtBJ=8xlOBfwR3#9k~4N4U^%vm|AxXN*;SsgkjqX`@O zcshz$s z!8Uf?WESX7g=3&)!>T+&5fP;If~R?e#9W+@K3OevcrG6IVgmP%X zs!|UQB>dCm+XL!-GKQee36)p|vHE@UOp1PA?JNkvditk4y zmqJJKV6D*ocn^Mjt-$bEvC@B1dggihUoLksTda?)V#x+{Gj}V~DLFvSraaIAzgVlH z!kVvWQ#ko7J7CV1MZHiPp`w=DEeJS6VyH!v+Qrw{RjSX;Vy5PoM4>ZZ3vx0W8h7Ib zLkrdKzpz}R+mbCz{UTkR%hHi_9wpN6^pa>`YAoIWBeKd?fqI3ob{R;47-Pg{4;-R+gZHNi=i{(JAyqK^MN9woi@P%BuXLGfxUVO&PJ);mF5+DLrnl zic6aM$+SkP_R4?Sa?s&vhjcls%i&Q6KLe4m4w@9`mQc2um*;5g%W$R>`zmcEi~AuO zxP$1!9mcnl{K`}(`MGmC%RO(Mk(P0~>2NKSk=I7#^ne6@{_~^s>Tnj0eMpz|}v|`pJYIGm@YW)0w zs-qa>nr{!NF>nEn0vUQUJYR3%my)U!&MrcpL4R9o`&iWATb%|Ge2v-OjVOuQg$w-YpNJz@B z8%nAB!&Nw^KCILhS#rq}gFAuvlT(5W=^xhiNvWCe6LjV$aTt9_Lg{P2y)p1kq!$5|B9mfI^g9PI&^PO9`fy;O!bNkL8BLBSRZ>nGPx>I&kHXyZut7F@p3- zy+E}ep~=3F$qh^EhQl@9YY#MiSIADA75_C-< z+<9{G`B?Wfwm=ggyy)v3V5+d*-W&FOc1*DF#Qa=ZZ2)TRH~9uutvP&9etacWgcPk( zWwS^_kuOKWQ;dBf5q?$5Ea_K(56CC@#vlTOfL%?ZspaFSE#|u9FZ-C!1UiyR=D&Ys zUCCCI*O^+HnJrqG%~~nWg?1wYA}5>J^~7cjwP^yYjxj&_6QNKmD-oPffM{%C7w^<9 zJN>Oe%3on-rHm0ebNBU7s54{XDhL^h0V@Q9=o$j$PhSy#2)wga)v@l}vab@c4ko|5 zak97x0{IN${ek!6Rn}VwJ;fUDfmnaW${5?Sn$C=A=qwRkI!bAS>bA z+$%p)GtF6N)+^&>+`FtHY<>pjKwI|l>V-+@!x^#s$MoS4{&%4sI0qWdF1#I`R^K|6 z$ZAQ=o=m14c*F+K!*7EzI2oiE)Fx&R01N56PpxjOHkP@VWA5GOIOOFAsvcGd-+t-wb9_)-yLFAStogSh614JA!441iy`jo zxcW{w4Rcr%+(k4P_Af-RQ$*RXMj~(n8mK@$Ra(#;qZHd^jr3BO{o-jf82-XAIAr*^=v8Y$={Yju{zr$THbf$_(Q!^o+FF zlZ=JjvgZwt1{CN_TsW&u@Tuo~Ry zG+m7)n&j2Xu|1VgE?LNs9?88pB;|lWkbg(2%gv%VF;`eA$oXNzGSeAC*^X@tQ=KYl z&N5Ri7}{AFr|VWbeBG;WBd$%pwMC5?bw@jMWVi#%8Zqe30Om|xVq!kPybAn2?yRHt zwGY%9l_(-S1}tM;|LA`iya8r+cDJI*>TxiA|L4qrJ!cq^w!c*OG4B6fdE1y;8UI() zbtQdAO9kh@bi=&M)o`Z>E(+0E}w_;X5eOz7#^oRNXA@3%+(j&XYW8 zQkVYlB4Hl7l|!O1JRlpyQvlYO=vkpiD6z!D)#EuzF!)@@Lx_7aNFmI1NL}|7Xj>Ni zEYN%~L9n{$X+(dI8CPuJcK>%#IUBrTK9G$JFN#u4aWMCTDiHKc$z^6v8&()qN*M!9cKnVc6n0q4JPwU)>ew;_?mf%7+p-9Z4JM^p zQJNIHKIo4wt1TF<+CAPL@Xn$PCifN1dQ>^~f=I@%fqj3ESJIDK;#sV_Tm9M|sdDv2Dtj%LJ=9s|8p!>>$Hr8F>xITe7q! zDnG%%htt^RGu}8CG0!c^#jhH>>91>7rB!zQBuy+FWF}dcl0!9&t+u_}@kyqhdlbuE z9&}|ul(T;xrR0y@fA;q#_Oxi9{RIFZ__yti|D(nv|H*_D=jb}femW%Kn}zlA0PycX z0;Y(Jf?Xmuq|JqQDMdle_{A8tl`D0aMbd{O&gvbgNPp^NAGl5h?aRbOr6U6DhW&H4AeQR-2 zr?|koDC+Yxf5{-NaOz7Y-5$36BqfcP6dv>}u5ciJez!i7!=Hc6m7AM;$;tWaQx^gL zx3&EL51{^iA75qdf849*mL#uZo`)=b{Zd9=7gz_($0JkWs|6{9ex*N{L{I?_EF>W> zko|xD{RPDH)*DIizFPqMO*YaYO}*6D=YMs0e7)B7lI>Z)=Jj)TMEOT&G6;^JA(E`U zUo2M>LpnW?>5PuyRDKq-SlJt)jV8|LY%BKoSRXo9wlCLT6EYYry%TvLst7Hfy`^yy z`>KsF@EBu)QYVhH+O84VhB_^{sdCER)w+M#NWCAuuvIhI*lhq>LzLSu>j64S-BX-S z$RU`xSmGk0KkXob1fQB+^W>Pz6`H;JPgFc!00;g-1Bt6P|G+gz`0)H7tC6PrUb|PC z!tbvn23i#9@9<1#->QlzqzLvfCI2r_s=IkZv{hdeP!X=^Bb7JM6)71fQQhMS}Wwz zR7ny`U2Qp+fhERnz2xf9m|$x*U~7gwtwuzs^176sG&Ewhc$qMQsOlO1PBY11f;-)S z=;_#Z`9xYZ@5vfqvDUKBzL$x8>!dq`M;^~TNB6C&4i!&m>sWO*wxK)r!P$RZ7vFK^ z$sQa@`eIAMU*cEQS4mZ@GmtGt9-NtxKb68$5#OHV@khtq0rq~~?(%e4AQ2)*^dh*E z0NU1UBB%EE!E=1Rcv!Mtz!AOz10+!xcK%j~RlkPkWS(1lAW7{p$UGS^vDeuG8j`eb z$Xh12aen}sqk1*Xx>sI7RSSPpRt4yCK7&JHS&0uc<+kw?V@O-z)(e@ePX!=D$fAhs zenYN_3pgqf$vQGJaRxCJ+haEv8`v|=Yb7pclZKlEmz_lz*MBM3f3*rVK&OnAY-+nA z5Bf6|H?#?SISU6%1*Q2y+3wjj1tiQvSqW<2<`IU?nA!B2sLvxBhxvaSorqt8lz)KJ zbCK}KS{_a)p&Q#psl7)6>X|cO8*g!z;mb)v)R&xE;8Owqu=1S_6wm&1E>R!cJmo(+ za=-oU`P}~y%l~d;`Y$a1Yc9!hb)qmF96yLWq(GkyNH`g8c#&8FU>Gr)`>a%pU`Oqx zjf-Y}&oHaka_JwEVN-wK#JlNcz;q@#!}RS<_O6%dHr)kW-X1R?x-cn38hi|XO3)0t zKu&mQJvM*%!9o^_p;Z5lsZhZLPzaD00<+;q;A zI*qj{DA%kLX@T{I=IJSzYm9p>Ai=+2oF4a0p5U3CYuM>0S#U7;5^sGp-l=t`U?gAI zTHx%?8B9nPI9vXk=cM-J0{Z0Hzzkn{M}1F*Izeo@y0u-6;V|zhP}eKt#$I4P*=8Nb zUKjo-UR#c?XrF&!UD;{3+us}+cD7_6-vnv0JawQmT-2@7;Fl~~@x|t1ny#B=?e6?lAdj8%Si~aIMer$4Rc!^r^o_QfAv^9g_ zRH2BO<(qZ5%Fp%zc+<80!la@yy1_|LJU$y$2Afm&GChA&(Xxu_LfO+JfpgRahcX36 zb}lh|6wF83FgwI?V29}`fiiU^bqnR2Y&3LM^=i}0;7(IITgGz^&G+QbG*?<~GBL)u zm!r|cps$3=^^$M3mbFI=#Dd^rE>zQ6vjy6KmbQJ2YHVS z5i)_?{_ZluUK3TlN~tmPu?Khpr~V~I!Ji|6ixhvKX_Q^PbT$w8H33dk7i63$BR`3y zIGLOBiDnazBY?LpSoi*QXtUQG0~33Bmyoxz@zO{84_uwXmi3dvRGtlJM5bB1+I|3^MdoV>&?`D`rCSAcIs(;5ks$XDH%8>{iSxyNn7x zvW}^v_LFfKPv@PF--74Wlv}qr0ooYEb}oNW`05WUAcD<%5_fDKYX}xeEnM@57~KP1 z%+*?5*Axl*8!%|a*Ph)C!i^X&oyFh;w2KN6oSM+fgfKPkT;RZOJXm`|Lwj1|4x1_1 z*n)YBtB0JM&ul}y=GKs;kqzQy)q>ZuoB?|i?Fu|guJx?l-|O%jc^4CCePmPpe3XA% zbK$t;qEsF2C~E$dl<*mtECvNHv0UUHhOV+-@4^}baOel1M}dg zK3c`P^eXd1WVkruOMB6T{<&@y?Y*;DWr$##$GK3O8+$HIuZ0CSXdU~C10Pq3)klTei~8>m<+$y(?tYa(Yt63 znW(S`rGpEN=Sfd3lY9JJnUcN%kVcpF zd9D~9j%LJ^TzBN^%k_d&*RFpl0;VdW3@y&`=lF6R?bU$;wXnDAn-E=}tWp5N^fy96 zi$Jq8^5^gIle{^BYf93I3*UbZ1k*-x3|;+ejZ%L*)sF6eWYvEc1XM3Hkyg-uvbyLx2EhFVB1!y+Es}}r zbMw&_7b|BaeqrK~%q}~jMbj}%TA7&0uNPOHeQg&$8#ta(OQ*9~i&MZ|JS_T*hkXC~ z+Wsk!U3i(CtiPon`eOQ#(d+Y^S+jnCViKtNAO>toP+MfFr9B4ayON~zb z+N|~|gS9jCLgdwh!`ll>{3$jp=q4|vlYAQ<$)c4Ib~Pd}y?}lYIcW09{#APi{Jmq=hl~oNY7imP1gGd`u=} zL$ZCC5hc!|+L#dw*WSUgJgeKtG27*_&7HMkT_`zQbxJ)zsfcuNUkKs=K)gk=5Oz~> zvGANK@&tJDYiNH~Olx&I4caO_ZyI%Smdin1TVWwsqVmL)Ccz*-!eIlYSChpXtF!#B zvO<%@yXK`$R7o|%lxNNY>XGP&%?DkH;&!|+JzrP6umaWs^&x~zB@CSWGsN7?a- zc)E7PUYYgekU#o?eapU$+6)7=?V!}LQ_uT`y9$@u1fG9}N~L$!@n(x`9}nG`)LGG0 zmXRxN^H{}2M=#WBjG%sZdIk*Gx^^>+C8eSI@s zxe1VGK}vrss&vWC)&4j>4RDKx|8#1@OnLi9q#!hZ=CzDVGSqW&)njrJG5grwUOlwE zz_UPf#yUe*kv{0y5^7sg!GIF2h*8Rw2mSR3Cw50+FL6b>$o2Zp!oomo_0YJV3`bpF z1vdzK7k36p$WY)4iQNV|dCg;}oX4FHB{jDjh$nySLSL2mM&nK6wts8^V7*Tc{torl zG4cz<XW1@zG(#hDrhT-{5&II{ zNsKL9Fupw8UZWz5Ws8(yn|E-FA~wHalq(cfkK!%LcJi$!$jvS+^w&n02+^l}U&kw= zpeqQxj&?jx1!sCr{Oe_|n*6QlXOMm^XpDbS^*vJNNC{Gk#wV4p0VGYB!}fi7u@5zL>Ht&{BHQNc`SlGa|}BHA6`NWZWUUz4wxvA-w1$!$<%{ zgRSNYjP@FfZe#MRkT`^EVK_tOD+Rn;I7J-93JHTPH_wQ6PUdD#WvW$!M{o@~7r3o`Q+ zGDUhgpuIub`HOIHG2UL7AbmMzFqugi90mE;ocOFGwJ`0N zN1%{Fk-S);Mor1&(NkhrSGGgLilTqV^Sj^f$5<{e@?&CSS9U$~)0AFfE5l-T(Ha85 zBgm;tRRNDP=D3m(Hm3@FzWo3aHA^*tz(JP5W+No|Qd9V6Zlh3p$l-quX2!m1TTN=vRjJ% zvW(J;_Ml@pGo&s*&~t-F+A94NK7{93rUc+!c%ieUjZhb&Q&qm%I=|e32i$?wkue0O z!a`IspO9qWH?*)FZy-*a0^{;FXKdI_abcA@O*CCn5kN&N7|-pI09$=jX@X1KRZpl7 z0k@5uonb-63%6Gk9Ed!CdLVy#iD&<(z8H7@ z-GFF<&BZ0Lgc5ogBf#e4w^-l>nWnHT3td5fxxnSoAl5#f$Iqc_IYb@uJ2lopjf40sem!QC&()CMObTgw2`Gods{gHCt4PoJ83N*Fr1L6rZ zHAf<;=HU`8C^Z#;-uuZVpI6g08bK-!$U5m4qdg>B=NTL@NICL)owMN)xs508Sd*yd zACbrpATIYK;ZT8iSFnFG5UoQ*OUPZotmJT3%>3{7H2BD-)9=|6Pig{tr^T(_bmx z;h!nqkygQ2-$>Bb#>Cvz*+KuGE%E-l{NJSPYl|ri=WWT!v#*s9+b9l!1XwiWA{8x= zD;JXZX%-Q&#fN{z4v8Ru>1n8Yv0BpQDD+D5g(93^CP1w8eU#%vIJnVpF=#I+M^@no|V~dSfF(tCy8$ zch!n82%>WDv@HL6-xO_sC#1?aDR9)#~wWbR6 zikxxr1WtdAKsgbdrj3f4e_ZE=+=~XMrbNv|6$iE9n~D0eq(XTN{c^{Bo%;baC$!<2_>PDM;5z7r^%bW%=5K$Uq{!L_J^!smYm( zujpHMCB=^VV`pa_(t5Df`K2gGFq7q`Jcz^(kJ5h(z_TkwX7>Qo@^l0e>o?T8;}9Q1 z$=EqS8J~TF50C!^*Z@pZp@0;Ud5hyyQLJ<2w=fDc~H~fp}D{a)cdH?|cWd7|2 zoAUpMC?IC;=w$2Q{(q>d|9bK-arJ-iqJfg-zxLpgla~RH_MmV>^OKd+s_rlY1K}WI zMGW{63`5gwLh4(sGSajKd=tY+5D=t4e|?iZO}i+PAsHH2C#-dtUbmfWHzd5>JzTf~ z(CV4ehvuuBIF9yXydwWFxWx-%sDREeq#B|<3E?^4-pjrBRov!MAOmTdqOE^BI?u{g zArt>DG$BiT8Oqz$-}UH}(tLnklWw_=z*CCf+iJTCs{ef?zWE16ro; zhUF2B+}_f(x8g2yPx^;>IZAB5R7fHtN{-!Oh?&%;p45MJ`ZZScx9a_< zAz2Kd2>P(>mb!vOW27*;U2qf+t0XB+{5`NeYx&1KzS&uhFrBokRPuEu@RxZrS^ixw z9o7(`(*_+QWtCxICB8Vk-4+M`d^+Db+T?ri;|8KpblfXe+^{)zvCtnvkc{zUI)2+X z7GzcXfNW@1di0c|K?Z+Mpk>tBm@I-b@Wz=~FpfjbR%vx>hKpFloas18?$N8cYa~#6 zRK={{-*SPj$Ze+KaPAl{KgD0$hhV8;V-JBCH4Mv((|5*?mVxpT892hQV=5foZb(PG zB%1uXv2!n85^HNa|8V-s0}eBNz`xY(-|l{i{{P|h|Nj1mBa(kG(zgdKx(j2Q8I1ri zBAppSm=qtK7+jPj0R$#OJ$~$IK-QWGBi-6odfHYz#TS@Lw%b^Q@^^q*5`aV!h^)$6 z0+r;KhXa0v9tG<2-s9QA)(Phhdx_`COOMYRa<98r(y-?1Xs;dyy_QrSHm;?;cmzH* z4d&}$ZxWM2Yw3TBS9#OSIep|zQ}SGMg+?UN&-N!enskA%t?dXZXf-+-qFL)PsQ#EQ zU6p@0DrBnRQ2sq*HZ&kI_+rX9>l<5VbWswgGrV6aJ$IvFe&nxL003f{C0VD4Y}_~ty?p9Moou8R!VQx8P=$<*liF7Fj+js zWvtJL!rp&fo(4iV(saJ3q_Z#E?BI!`%4Vyg0@okWwP7A{o0hw$E>%m>coFZhBh>Dw zBI=%$-v|bRG)9~pSk=Dxj9`- zC9;1-RisAcZaVoWyG)Hs{p||N!}o?iFzT><`<^RJI3F-pm-R9cTb*Cg4loL@X?`~S zh5eeRl!U72+w5Y}^qk$xHr}d!5xv&+VoFmN-?%Z|JBS*t9Fw(vARTpNdPlI$0BEc1 z7=mAr8#ux%a0i)nmals3pz4!n|ctVw^b`L&CY%mtemG{aW~sAUOpP9a+k;BF6m z@D)DgrkH6g#0?Qhj}*pHKhE`w38go%tt5Z=48U8$I9GVj*c*X7$;KH-nR825@jY`3 zTKHdtk(S>00za5C4ccXB90b>$?ZKMOm$Pv5KVWk=??;7Dnl&6R$4Yr|*OXQDy~=-c z+U7khFJa?R4>mRih?*f*M3Uj$@dS8`Cwx+I1{FlMCM?@9bn_LfjyZ>OQ5wBtvwO>` zln`dWUt+!A@eg{sb5c$`nle%XEoSH!V*Cu|`ZbJ1@#-<{YblBQ!MdM&CB8wi4bw|& zMkeuuFY^8)q``%gx(|{yNh}?k_Tu+YA}vjkJKKE6grbhAI~x$Lj8)}c(;F%W!kJ@ zr;yncCX>-F8~@1dI+98m5JzGLo7{7naA-E$cl4x98^U;PS`zsfO#`z2@V*uSJb1qR zR!>J+f~(dP5Z{VevLSB*}_d>Dt;@f#c=t4C8PrS` z&2{_f1oeSzI)mUNHCiL}p;YaElJ?er%E_S9o)o^g*pa`sjb*OapYlA{%$h=d4sf=b zmsViPvm|&B!3nKI_g3c&f`GC^=YH3(nW!2_-_RLRa{m5dgO7k z%2q!>#$ZEtJR=4TZcGPJ^%Pbfu}~Rm;5XNOTNJ)(1i)~^O_!0vX!sO)b@pA84!Sne|LTwv{TiyLx2 z!R%tu5NFc&34ZUjL$ zcE*2!*qBzp-N{(M+2r5VX{mWSAuXZ*n7AgaS&`_gi-BJX04}9}USi|}2e5>q32B4h z)%}849FNZ;s?c{`+fwsa&NHyAXl{Dm>p-!VzW~xyE5%z6(Xh7me*EGn;V!9J;PsHP z{wXa<{_f^@B(If;g!Q+PN3)BkwJ!4Yz8aGwS+x+TRk zap?H#oy$8fxH9K|fXf*+!82`h`(gXgwH!9 z@5|d6eHISvEaKx5K+{};k4N}P&hi;L@6}0}DbOSHdwb6B+X?^Ru^4vAwAJ{-d{sHvTkEF?<5Jf^l!~FJ9DKb7fN$~RAz^3n>BGYvD@Yrg+t8c z+S${E5tMW*@Hd-(M#`-qB^g2I(H-p^HdGjS6E`{h(q{Qwh}i4!(_|kyG9Qsg767iW z$fTl)AGQkI7cOZEM}{NXjJoxXI~>n4*?$#Y``F#&U|j(XKrk|@V6BX9%t3s6*wl|k zQ1S6XYIOTJF6)QMPS_3mJVa+pxaA7lv(TH$L; znKBBXXOCu#B{mJwvZAVmyLBq2dJ|=2_=i5v_gZ9sCD&;zJ7jrdn4T}Cg6Pu``*bqm zzY-rpw8_PA8w0c z!f1#wb$yD}%Hr-_?@5q`e$i~Qw-fA-_9RP9W?igeDpF5=sorHcI9W&eM`OOUYyev{Rk;qT&3X^O0o-XH z1zxTR#5{;31)E?$cO@uH`L6Xb9xLK@(u8!SNJab`2 zqrOhMK<{nRShI#%G@QeGCiiCH0`%*TPbiQorc&;HW0cFEx4mGRXP|(dyoHR;C+etw z(cG3ZQH(4XiaWj8m^Bhkv+%K~%5m9Mx)g>m%*F^8#uA|vyI6itw*#DQH*{^AS<+J% z5?3>)Ve(|Qy+)V?;q00Nq@;f6Q zc7?-R^K-SM@Pd=6O(6$h1Kq>KU|EvMs{|91!OIGk8%Q?75PtbhG(q=Ym&v=OUX5_5 zrf4laU_D~Q^a472Ytk6~b+AtC+tqNKp(Y}*aVSqXM6yg?i@vd)GvS0M0l}kxU>dL* zA-Vzni+q%H3s%^LP-aDDOeXU|dVdmo8+7|~h_}Nm3cyA^FU5n@DNOI`B$?Yspbp@+I#S<8ejxNL zqsO3;pTenWzIo+@zH|nl4HQIy*d>d0(;H-_r((8z|h8W<6rVqUku8qCx-T11Vzo;2C%neZ%?PA~8W7OxTfh1h+pxbv z^+rDNrq_m-ET>BR@yonTj|uDXrV}c%K)*PNg60<=Y-RVN{!p#~x=^VOd1b1cIXh9D zX8vB9(#y zC)YRtoI#3}NGs$;HL53J#85GBBY;rY)7Vop2*@05?{Ja3V%vfw-{yGaZTb1Pck%(V6*M`-3vKrni|Ao&W+lXF;-}s7BkU zO^pd}DS5AQ_$$W96?e6cb3HAqWo6}1kUni?>CkX_G>$}8u%tSqsCC4~=2%O|nb)ki-LK9^fig+1lU=#OET(u%X7$UsMT6yMm zlFUo~EV{9w+H`wy_`=nPu_SVCutaWL0zecQo($WwU;*(Q2Tkvjsfvd=wCPA#$Am+b zg;Hx2g6atEP8(KC83h(bx!r1T1G?R4HUk(_cl-c{d1M=Z!R)h{hU{$5fCObVX2*54 zRJi{D*L1ukDeAg;%b`W(;M!ig*1`E>5kp&~S(ph`%yR3|atOQ$Ykv6FVeD9}8rC0| zC?Qu`dD@h7k;L{&V|87!o(hHe7`9nLiG$F2wyRSuEDSJ8d!FO+JLmI8#e+0urfzJH ztzS_$mHBml+6{Negz`0DwA)KHOx;P8_m3^Pz80=SQgYLyE6HVBvdX89DT2X1#wk9= zs9r*CYs5-njxiP5_2*0*LzGtxmc~jU+8R0KwG%+I-~6jbc@!>nH*j7H;)}q??kiZ= zEYa^^YU(woyj-PCb>mnYP_d%3P+aGFbfOHi_Sm|Agc<47;e9sl>MjzX+YjugT%L1B zLYFinDdB~38r)=6Juyj=6+`#*0KCy1cMwU-&SdqLLUV^GqbA*A45~*B(-b)m!gcjS zD+Kf)m7iX)H%VEGrRTcHxBAcxy~0!8aArZBPQrNRRn5*@WLB7GHWneY)A9G z*nB&GUU2J)Sdkja&`k*m~$p}+j6e#H@ zp4t5a0+C`f`r$;s7rb=fO?(JZH1L{}N}H^1K>$cSe*ba;_Qwtam=XL#2zLsiHA71Q zhGsTq1y-4~4=Sfi8fTIWgfaSogU;bC2Gs?Bg%-uzUj*7R=Gk=x-UK5$0I!9f7ZhR^ z_d?f2>!cATv%|ZpoX^ViS8(lu8uyyKz>7uk9T$6Li(kcFn*eIRlmUv11sN4gw))v2a+eJ$m2C|ud zzkfM=-MgU_qa#)fB>+qq=(p*R0F)#Wc4WUsT`B9lGu2-&e~Hsgy-~+^LA+eynQG$& z`eMg=g{u6*sOSk~_6@>%iz?7JNBVU=B(YWumFNUzhqy^Ki^^tIo?uF7b&i<7O(5LG zht3=vzM}l*{HSU6+CdTAv9L4^@r`K^^NRWGs2IYQkM*)JLTM@y2x7zk>leUfx7H-^@CL7 z$Q9c^1StgW{c*!6oHfq0N(PrVS`{{%W$E?DqY-eTcCiV~6{cpu|&?NtFe>x=K*|$<9d&ABU zrvv!NIb&;C?5QAsuvpW}rJ&(@ zM|+`(($LiYIZco0BEZdm@vqnW{_XPq=F-Fey*zOn16yYsqyOe_mYcBX=R@LFRU8r3 zg!B<|PFQPo+>8 z9A4u3WYsNk0S`>hrIyVPh1=s-5>+Bng=p{BJk9#21im`!_gOz3}!g*MnIW2^P zS;yDY1ly{;O5y;>Q+qw$@j{LEXVj>bVDRQ6aAF*VhU`&)$QQXu_I2PG;m3hI6TM|@ zEyia8{9R`tDr&YzTimS+)qxrI`!8um4VZ`T7RxIy6grEvgn&Gz>@T_p(>U`F(UuK z{DKa3W^hb@gO)NGPQzqUshXi!YPPVZG+%Q0s6Agtu|yyX&)x8L>gdpZk$&mgdMW7G zxGt#DeDS>Qax{&fOr_8HGW|*QoPNuC_{iG1_{4e0%JIFx`XhbsPAjFgc*fVsc;-x95xc+oXAJfxtc3dgQ{9uHy;sYvB<4ZB;JIo zX*WlI=*TVs6O`<(b2sJ{Lv^bF1BKkWOc`NRM|14UMIsj!%@y+My+%6(j5+I}zV3v%brFSkq;#5YshQ!I;eq)N@LR z0u8@v0&1_>L>69L7CK{0zhOlRy$_$iYKor;{&d=pa(~Wkx-RIt?)kM)QJ)Z*+a~Y@ zjWBUpH#A7jg2-a zAym$)kLyJ*2A%`Lw>bW zm9dp;)WjyD{>R)lY@k3UV4XX!8oq)@N={&C&+^_1oNbi{NP}6Uf8Z_=M&n zi1sV&RfN{)bhOBZ@dqv^*UF-Q2S8zaZmaIHH}Ke6_UokjrKfbM{Mqarhk7vRXN^w= z-V4GDMzjGb*yiX)=&NNnjqoK2Ge-killMuC+w0uuL5C}hTtf(9h4nqTT0^Ys^@nl| zkg36I=^vS_NKUO>H){-#BTJYD-+pRsP zqBj2*ZRY`x_4odNSy>6$D|>IsR`%X|cjLxwyX~2TWEI)7tU^Y1NFggBo9swvg=oq-&S=0Y1XBFb#eR%B|(WThpW>-lDXKai8wQQ=Xj z1x09dfY$>Cp3dt=sJV={P@=!AUudsUl?27-GNMZtL%h>BzyfW5ohxg70cENeCnjDx zu~>}ZXm3`sT%h1*+7hB{T|~AGW0UnX@^&4I5?(jK$I} z8Dj~&!6X^2$c7Z5QNv4unTk@Vkoc(FiTa}TqWH>*$|A9S1+fe*jSF7sK9vs(a|->g z8x}-$v+xoYql3GjJatvM^5y5b5IY(2>;9NCF73Rg>5JWq&JgvZi#1y#*r<6czp3IK4 zE$Ri1_`02cx@+ECm(64(ml2v3=`%r5%cJbvxB4v29<5aqED_ew6k6XYZj(9#{#>gk zBcN`QP)l(AQ`;@Kr@HHX^Zs4|+Cd!WUrE;ZN>Osq=u{I(Q#WArU#$_LVdRlXG%{QE zq*!znxoL%R8 z8nEA*<3(KBDi>+U*GRZ0z&NbOWU+Z}n45J)%OT`rcWA$Gj9_8MBaBF&aFsXIpTt_y zln#3E!@)e^wi>LL%R9r0R(u`Sc*-bC<)SQ-eN_^yf+|Nv$ryN;`=UGM=W0f9Y@=G5 zID!{{M%1j6GVh9(QO~qBYOoOU&O}G32~ETNo}UjTd_sd-#Io$;C~;b zMmU~jBz4k(H1B?1;K#v{_}Ki%j#WY}H|<4NCv=E(<+*99DnC`adbm|o>{L9d+!k^{ zHECGTkCP{%uV3JdS9|r=XrEx*atb9GW9h2H_>X(RD*L2eA0E9;>T7j9ZGl(-1HNF zRCHM4@UU)S@~xkZyB#B6kYQ{ZJD93f_)S~$nK)ZwuHeGZB4v4i2$u&&s9+3}aRc=` zsJNfWO;4{EZuWPQO8A!ylIrZjHIJ9gwPCuFVgXPXxHVs23zJAuYPEKFeXu(; zO><-T4#zv0ytne_v>Cid4r;S&BZQR-WV03HnhTpP$b>m$4H;%s24XrTy?o1dub1Jc zY~yVz^~`8=#*05aNY%k1jvP5ijW*twA>nWA%CfIYS&%P&`gp>7KF%_5lWI19y5gOy z7!ikZ0ghI-)p}KN3O;T8zsfq>~8XAqwxBJ1NRal)<)zQPL5AZ^K!1D~nnC$UF0IJ`-PG4HPVWaBKSbJpa>kiW@OHu1`kX-vq&vocjpiLKC3Vx< zY*pAs-lPeU=E2WQlJ$#sKEGp2O-8kqSvuPmGwJaZ#aK$AV81X<=*o=&i~je9ybu@V zE=&66!Yk5G6*uMm&z2-klBtE9+n^4Z9}W}ZGh;8JpYyhp;Wg+9RPlFgR3UHSm?`gz zsfDD8_S>FKmn5nWbBF+cadu71)J0PIUVOGoy}v=b+N4kGZWHKZZ+ ziWQeLWN2t}h(%OWuZ&*EAQrts+%>c=R?%0<)^cN}K-FrL*fGC?{y?YTx;w^vqU5mQH_TyIysEu!bIpg2+xm9Xow}bZqh^!cW`{3F$#nUS zuFY4Fw>+8UD-teQM=ZM7T-j$W6u#hZ+JS7~XOCSO>DlD^(s@@Fh4BjK{cXCzqAPd0?7@n!zVw52nbTV{?dM;Owm$jfr3J0e_9f>R zJ6PY-)M|4n-&HJsO3GN$zL`6|Lro**f#uLp=WFtz4?NbbF?(lRZ+z8?+-^3}wS63(7G~|!C z_OMP>OY-YMqpxV?o;T0J3cE#pJh@3lHlUA<{4D8M32{w%H3#DzjfU9&Re-PH6aZqFngLastKD}=|hT`akA z1Myg@Pp2Ku=9h-dS{qkFUHk%r@nl5fNZxym0cRMG?m%OhF)>GJa zBis{e@3GKxRZL1s`x1lPh!KVeS(ZxFL zixnJyb*WopJld2g--y~r5}3LZT$YAvc5DmruJ&AKzw%Wf{9AJ4jw#hwBKd7ZFHcy%Wjnsb3^vbc?q$bkym8|Q+ znjs{B>Y`nI{!r$IvQ}?F=~EdGm(IO9S5!HF#@Jh3$jhl+ii?4YiyXJQEHU&yU^JRG zcx&*;+R~S!MoWE1&Mzcb=Q_@k`XCS?-6E zt7+aY<|cDh+cdf=()E`)x86^AY*XnfOV^75KTm)1vSBH8WP!R+TGY<&A~k+{ll-;k z0P*{7VN3)U!82yyys&nB*W!&5|J~1b(FSM8lhM%?R6>Vd4wrVblxs1Wm6=2xwpH z6J)&(3FBS>6U@G5#n7R5CE?_MDS+5Em+M^4AeJ_i5Ye@brMR*==rJzU$@;wDy`X>R zhYLOv>4uy64vj^^A7t2>K~r9D*_`H~{(ijox=E1-OP_w@Gv?Zk55mSZ zlWt--YQ$5>HX!$=%}!k=)S7BI*GlBM&<1EQ|Xb3Xc zmp0AE^3Bq{;w~{Ci^)8`vE-oT-GkWnq;Yewkp7Raw1t`h*!^7{sSa2ynGOb^q(d0fZpHJ0v!Wj6DmAxaq1M~`o z?jE}864$0)%D9^KP#L2Z4R=uexl1SMX+>UTY0l*0a|UNm+2PLyyXFD8LY zP@%Yguk`MxdDc09vnsrOA z)j;_fr?(+PTD2!LfJ?~w>@(LDTh~5)1E1s>!nd2rAD<|Hk9;amtGq_$;jFsx^?MF( zN7)`e4iW;w!2fw}_bMDi&-%v(qzk9Glamt23k+3*I+}xBT>ka$)HIzD4Ki7L(Q|>g zP1o$6klY(4W|Vn6yNZ2Hm<_7Lh8c*4d`|!pNy_cX$D4#gX60O2+-AB#^GIzTYNEN9 zrIiCUq(yFj!NDhzo?K6_P3!wqx!--=|2pcF@t6F}^ZfW@T26}66k;0ccjN_?@~Q)t z1uXHiwfLrG$g6U`=oySfm+1@oX3lW*vaC~QnPG2Zh((%XkU`V_kq;VRKS7-41%=S5`tYEur`;KZ7aLjMc5I& zdx+7Pzq2Zc|Gi+yhF>e0mB7kynR^%d+85EcGbm7B)})E46r-wY<2Q>?vPQHP)pIdOL@iGGwdQs(eroH8p2kZNhG&78RZANV;-88 zv^#Mt?xm&TYxfsaak*{uV4D*Qc1|iS8O&^^wXsT$-Uzo5#8X7UZL@h$z#v#6MBn^) zb-kJlwUlFN3nEvf(q6bwM|HqZ^_mfXS(eUrz4(IglXw#wI(pC|`uk}z)_l<|UkSli zn4x!-4aXRf?c1Be<~uiOu~|P2UKhejwGMwEx>uT6XZ1;uA4^G5RXDqyY5SWw&lS`T zHp$Y#@EGi_aMBwOW(CMyO};+7G-yG$Y;ikZfAoAcyPT8gT~3g@one^H{n|=QLDfimXYCdleYlTaTZkFOPM~4H`5~HKvSTajBJCePB=DQ-3o`%1Sz?AZWY0M@Qn5J4w)M zD1Ij&1J1*V`AVZ@2rfmd&Z4We`6lELq z7=_$%+CHr3CfmdVS;Ghsm08g`RW@H7b>ddH$DafULYH-E-|q!9Q!Mae)iEk-!&`BZ@68w$*O(soSjJx4}Bc=dm#6N{h7 zd%C$=!{t76bVhtGXyYG@TlS{pUXbIbvI`5$RV2lE+*>NgFE6jT#1KZ9+iuUpmxRuH zPr><&v#HqRe6yGj@a8brpWsMZ}woV`826u@aeQ z)+1L!IY?M; zt;5^f^JHX{W_f4L^VI-P4kajnf zT0X|#Plp)7C>g?ynrRGDkf|$ymrnOi*2Gz%tybRAZYTv+aFh! z6Q@JVOZFdsk+gRQ>6gTq=_MGKUbpS3&B+V1a*mj8HeR@IMyXFANQ_^Galwng;Y|oXS3^%q z9rdh5y^&VqwjsSKmc91GRgETFs~y3ITIzd$$@-=}=%BkVdE@Vg`IO_M^c%C@Uwfyl z>+sfyUA#$X?yRjR*$8S6OEF?IA!;*WIe&1Jxq!qZJy!P{*|1ygH5m}UsPxQo-nY*v zuH0n5pnhu+Qs|N7SVB)8jgxam`W zw=Z&Cn3iS|4fA!-46HZ25+jpcfX4ZC zz=U^`M=U0+7yWgP$~1i=3&M@Q9k->1j+c>5i#~|KS&Qh{WdvcJ9h(@f1>{z@ zKH81DTNmDj4G$H#N=slYuN`2IJx5kCID1)(iH=q4WdjYiTW~B5HfOCpow}GpTYylb zEaO?U3_^(|fd{-YyGpp1TgQvd_+v1{`Ure;S$AKeWngcO1fHprsZck{u9trH{v!Fz zlE?IL*%|EidjYA&1U{8vaTs}jkJYT~I9qj|dMK+TI==9Jkrvl*@cogzuUk>95)cLN z|DW&S5IKo2hozSv8wG1A0*g}oZw?og40APJNlKwi?zD%Vmtwv@Pkm`V`r2?wa%F;h z$!ostt2+;?xtyDmrEF&!mj<7)9)#g`r^Uz6phrT4Kc%|7->ZM0>LPr9<(uyw#?%>; zARHMQG!l9AJe-=l*dX$-pxVYHoGww&`1zjYTQl6u)6qf9=yyo68_80v((FS#C!nwL z^XyVmS>ttzhA$12SLgMYlNQ?u>6S)j^a;ZEB3+zCD9Hl>}m^?aCnI3`J zz~jwLn{^f!wOdE0g>8XJw?$LLoOs3QK2K?4!jk}L5=Bpy*F5pujI_5%LfQ{fNFrBV z6-jy*LF@t*ER&`VR6ILrSIfQIa8_IivA%KySTgl*B%3=9Gw6Dd)NylvLy!)#tV#Md ztTXrwmw^*%e~0IPY*)4MdUI8I)tGc!&j(JIS_&^F!tRV_`5_uP+q~w4a7Qr2&)(*8 z!(LTEly-yL{`Rc~ryKs1+&bRep6%<>vFUzu?CN8ZwoIEOY|&qkyQ#e>clx#w(@<)r zX=ACTvF`E@3n;Hhzoh2J~z4d(Q*U0a+t!I*RN7#Uc8EDLeU^3VOAEkelshBk>}R3F?v4l)m_lm zzWi%s^dts<5($UQhJlzANP8#We8__-)DImi7#TONY>9yG*rP^^|b<4G6s zlx#wiY@!8q1;Q%0fX)7m2sZQ>AM@`b0E^Hs|K}o9>Lf$&=ZiZajtP{V z-^Uv}>dXs-?I_o$&BTp;$XWNk;3#JEOK70@kko9~-9Zo<{r8PEq|C)3Y z%V25s%@1v(YRDjCP>bf3rl2OahfcB9z8{_<*u-w;cl;WbrkLE7tpj^ zEHtzB2OBF`+eKw-J7aH_-=i__1x%@i75aTkC%f!{+T!4t(fIDdg=Z?M-mb(SoL(F3 z5;b!PN0~9Hp0{jsLv)~Ab>hqm9Q<+(gHz~#o|byHSL-=H&ARf;1pY2jXZC$^iiG>T z#6;N(Ag=N~T(30R#U!r{8M!+eINN*Dxas^Da$W4_w%PWox8%LFV_jp_)zt@_FJ7WR zrR1{vYD$}T=lW36gUh#*_`VIGb(ZYja@NrgnJK5B(N~z>A;DNgV~S~Bpu_vXk0w8V zG}7WwJ8rjn$y9CsHU^1wv{>=|z z9EhU)vz(^izTa^xdu>?dG9m)PqyO{PU&)hnTs05`3URRdN3Z?YOK)?u>{Ty_4ppT8SfygE=j!x21^N|5+Pl^>=Qm_YtWrpSC#mjt z&bwP#S*3efy1PI3|Gb0pf>uO@I#^wJ%zfJIbpr*Fd_>OOR%6z27w3y8XJ@g)uqG(a zZ`DF|ku}gm%$i@a7ky=C4|239pjd<22YtMrxNB<+ih6LxM)6*TnWuNYZc2eARr%&n zb-zXhq4LX>8+`T;*x%G?@p!j?lo&6eFR#wE+G4dshqGh*2s9qQ6n1;SkA9nPL}7SJ zJkl02WDM?QQ2bz^qp$>h5s6!Fv=r>Ud>+qSsBMfbE6cN zstQKq>?4W|zZjcV0ley3+?E>Z`0UPWbB?I@Mt$#Sq7!P|R%*ET$Y^QTTW-us0c< ze}t8!#$Mn}Twtk9++?U#87z@=foUp#zId=ons&ccCPk#e#+Zc+_m0`Sd@V0GFvROw z&2AXz-A>a%XNrobxzx^o*_qe3iB{-{73-V^`IfzjA0%Tnwc^{>g{XT+8F{Dg^N@@x zBXsr~=ty2CCE+rn$x~Vh8o*aPd#(94(hk9$yPlKWuX~48LtcoWLh8ocC~43s+9i1Q zW$vyZ)-#aV#(j>MOQB6Ih!wkkfTOZWyRUGIc=vW{&O=&1P^3^C)0_g!3QJRs}T*3X5DqKm>E9$l^B z2VVOm2x*?$4dPPZm-zV91|j^^9JJK4;wURP+5(rQyYWN~#qo%w-mjUhn~`XE$~6dY zsBC)awbZ^0k;T`V9mkls`6+DTv()>qW=-@Y7u8Cno#dx~fzX+5wh5y$Y*Thay~jtZ zr4`?!VRgOpvyJ9!-@oq)D3$Qm`g3j{$Y=s3g^_S43=-r@c{9AH#*`9V9maNvF+!Oo`W(vv}Dk*1-@6QWoaXYBv8i zY#~B|d2TsAC-}DS%e3fAnazz8)9o(aZ`KXsI^-(*=v6Y+)U)<)%8!@QmoH=u#C&v> zQhdUHcU0x}pzuo_8p<*zCBqy2NnhzEJ;nJW^RzNR^wp{NX3__o8FZ+OkXIvHbFp}9 z++XB>1R>Yil1w$KpMOlk?Xk2a)lz9*Y00=u;G=Vk^l4fk4%D^b+a-@=Q;Frk9C}X- z4^#yi)P`+IgGOgV)ar;1SDeY_`{^a;!Z>F~@mLybM7@3Lo{lNg%;0yOXG1o=SDQCg za)DBSvO93i<$OzLiLNzkDuzuwMGp~^T(LBN`}-xmD#?x;4!k-w@gNId-R4glegs0fT3--UU+q2!W36VHO%A&_%}g*99sj0( zG+s{I8OepkKSG{FwIH!oncxbpT}DG0OM25b-{=9s6Bhrl0=$pKah~Fu!BAt;!5tfd zD^2JGS6VTHT}%nvS^RGpviLJQ`O~ZP#GjSr@2pcf-*g_vYhGI|N_Y zg^0vAbgJH6bdM_mMMKsXW(%#@YdaadQbr+!frCw;B4ll&2CJQ(EIN1ry@zigshY~N|}5Ix1f zEE%09TexqI=0WYf|EdO141pe(-Vs!uU7mX}+&bSyn!`KKp(_-v62L3 z%T^qJAVhl?`~I^%*03+Z8q1H~R~LI2wdt(4)eD$Rit<1!TQ4rnjwF76ll2{$csk(s zu_Aw`f?zU7$H~BIyrDYJjq|!&gzey7(X3g@8)qt34}GQQ)>iMS;>~F$YMtoiB0g32w<^5bZ=s2HN{t^N7{x0p`!X}s+5=jT9oF%3 zxVrT^YpMSnzUi%%e94~fVox{33a1B@vLl+jpPjM%EAgVt1B64hwUq6|bm*V%dBwiI z)-5uKtBhTaSIZa4)58LJoN+T*#;fC!R<`;`Z?en)xK1MZ9SOOAgFp7bjri9sq#X8% zO)}zL>&7m_u`LT;cGNa&;zVcOAzv-*5cf<)b4(N;7pa6k6MN%*ZnW3aobXEfz#6Y- z!0sqg>RabG+AB37A^QC|iw-ld%^8>7MOkyJI?XU2dSLE)@j)ln?%Q1mS1uc#^TH_d z@>KCMaJcV9YtU}*4LQ0N#umU z*|SrOxBR}E=-|HKw{U+5MI@b)J1Tf?G(a3nJ@a!Y&I>MoA5ErKv@LHlu8-s>A^OvFGSGK+U=do&tg zXE(5mtF9x|_TTTu)q{9y4UqVETg0R&ap0KYQK+G#xXCeK;o>Oabmm3`U6n_^iTNza z=pN?1q|FI=z493ilpX`=+Lwblh4k(fPlTvv9Bd8O%nIBqQYvbV{db7YtFHO1KjUqu zBa!!i^!0>xJzex&G@N`dJh}1eAl;kr1;&@rTLZ&+RPSz{6%H@K@M{jGE~29LD2ltO zkA*2OxWh`UR?;C`Iv!(phy3HK?iF9AmJiaqOb&Mo{KVK=A~77crY*;2Bn8D5nhL9x z8~iVR8D_qPw6*H~RESB}qirBf%$MAwefmOw%!l!qX;BPpdE8G5EuZ!_()j|V7Fpl{gfn{X)M;oXoJ<*CULPEc~!cUxz$f_Jt3`b#q~E7-QC9Y{CsABL7>Qe=wQHo{dFrUoq^wz z16w<{(({N7wfJn7qxE{ zNBq80Fa-QvlIs%MPj`@lPfY}W!Xf(RS<-$V4d1=iHC3P}s+9!J4>sZ3?|9FPK1XTM z(>tg5C8?Ilk9<9^e?fL^+$HhM+VG*bHcc*V=FR@kxt1-Z@UsL)8==g&Sv_+KlhOvO z*%rkfsoAdB1J%)Ws|mdtx(!;UOD#J_vGE|I309#fUY$UZxa52^xeO5`omj(PCc~fC zOu9cezlCAOEVics$wKYD&&FM6pXD~H`(w_vNPi;z?rv8(S23|PHu)X9@zOG7PTc$3 zq*H`fT`Zjn!FObsJY8g^^k-LKvP6jcJ;8)z>;EV*yS$`CmRIP>34LJW&rr8WU zRa33p)1go|)|^Xe*){cPzfBh3=sSrH6xOML?$mx-m~JUlVqF|*gwwG?_t@LM|J1)f}n?U^8NWJHhR1>`o%c`i$ z>R?~k$t+P&%u2vmS%Mcg7a?BviNI26;vnu*dPYohNezA@vkz$;ygNa2YWuUl?U?=E z#g6R%J?vKV0(w~8T)hmO(QO9j*HyfbomQKxLD7DRr=KQCG`W(=j2Lv;F!oxU8$R5@ z;EMWh-cG$$e^cwlY5p-AhOGOA`A%`37jb28JiOW*&#nz*wr;1AloJKJn2 zK}N%CGe;t2nyQT|4xg?iw`6Bk9MNyB3{T(CpO2{#umPk=+nrsD_Bm|n6s^)(L-=-= zYKGE?3`HP>_T+dr56Hc*no(P80Rp*83xB*{F)+;ud+FLMhx= z4Ck=pm<~NP!x0=oJ;Lm%Ntt-B_dMpSx5mKfu1)tssNKau(&h#clfH9Wnq*1yFIJT^ z?QJwkLjX}`VY+fZlct2KG35#02re@!A;B;083rW?a)EJ*qtHIN{daL zNk^mTqx%B23z-QibIRitvgv*ziOS>6IO#nsTYGjL5#~Sl3S!q7 zItX+{iEp0^d?t_8+O>|ir)`X=ssR2ZZQU5eTEche3@<7Pr=OtF_@rll_4SGsSBm4y zH>|j)BF-6JtkRYn;pf{&`!f?=*q_)_@!r+mM7%Hsj5hPJOvR9c==`TRnq-EtmuY74 zCx6Gl>jS5-6y4MvCiUl(}+xBeH$h62e*Lv;kPcpWg11cmH zic3YaHFj<{KZAXDN0qBf&BEPw7u?BenRKO1ZV6gAJ!S7im7$aNzkiq?MyOQoR_|Rb zm0oVgtHgi$x_F?pGt)peyA|c-V5QT4fckZB>U%(18V{YT{OOw?_eUjsTUGkFYnE>T zCY|4_I#s)UPvL>~SVVHK0|n*Rvbr_|v9TG7&m~&%D+mvJ$MiTnSWi-U{xleHOK)Rl zmJq$+_Z@*JENgXAL@=tS$Y?Z5$Qp;~hUCx`JKr7-mCxW*pAk^74RZG|3fqtGB#6cf zMzRP2+-t}=GPliA5O&Mn5l4MZ-cm5o6xgQ1^BT4LXt?^lpr8|$e>@;v7N_}%o-xu? zyW$28{M}MYeE}INBBJ-_;;W~a9%W*aH1qwC^Bh7`e3B?<@X}PP)wW07@i6yqvbxtV zT^3Q1;a+zvH0&u?GLLoR%=teZK#mm=}c+*D2n?}N(~_;22f*b}G#+`c@? z&wZQOvt`j1>(XBtaKG8n3P4w9w6;A$H~F$FGip;T(p%b^mDK{MjQ+zNa|yXycu@Q;FR$Ygw%;oTTxl)v*1|2K${e|sQPY(v8q&U z&Iy7$UDR8o9LxXgW6)hp<)3);Kg@qzw;;V`b-CaB3KO5m|FZn}j$$6m8crLgv?goG z;ls}R?p;t|x@=ut#&)~%H?I?@p6*&o_-e&j4hnmny${pk3&qy0}AhLGc03 z5!GCAm0SaPrD;QBx5#s~BITGn+}Bm)B`LqcqGv^As92nb^8^eQs94!(fceA|16`K& zJbh^wPb=w=*H%>-S?1fW?u|h<#uU1iyPWY##w07n{nsX{wd0F|h6~EbrrVQ`Y`e zPi8uatnto@9U0HCAP}_!I?D+6(}(wc2v2G71YBCmVP58%en$p8xjwUKdaG)uDElOM zRU)5`GpxtKv%MRGi$1S{E9Wk-4)oYB$d?+ZyRuyF2)b7X?nanq*Y^Cn+UFn&CEP@= zqA9$?a##gTlEUTMR4aZ{mOK65cP;Ptn~B#4BFS1uCb4!||7ZsSEGx1B(_c9aBUOc} zHWDOy)HBsfs->xX#4-GC($Fi((7;l{1RM^cfnl*nt)u5xA^75plTzLwPD18OI&}rfvZzbVIbwaiJDJ&)Ve%Ul4Wy9$v8;c0QB}ei9t9Bew_@L9o zPqd5S`r_NVB9VDT0|M0x-`M=YqTg`zzQ*iDc?SG)<|}U#GnsK&bFPSUwI$IIzmS2`w0y(IU7U@GSfz8~|`?!f}ET zNZQ4vvX?=wy=yp~@+H?8@NE($3**Dd+kyzjo!0M&FJF*GnCf3hj7XhXx-ho|xxTD! zmg2jY2jynWJEn^X6vp%*%%8H^_FiYD+YkZ8MH?F~dWzwg9&`DSpSF*dny(5D*mvQ( zVC;9A3P2qD%mBfzYZTj7o;`>P8K5|kOJb1y0GaH(I(zs!OE{nat2$zrc)J>Bj&a)0 z4=m1OmxXhWV~H1nL+qa|d#~eR>Xtvm^B@n5!UB_spx0}&$Gq3B#II6xQ0{ONb9;tY zA6-I)c9l}guHF;y{Do-D$oA%-ZHlISOaI&q2lVzEv%BnOVHyOedzLq1o8oDCXfxf! zSXXvBjO8Mi+h?vCS|}sUND4Jg%;g`;bStr6nc-+JlSI01h33a=qeCvhDx>HWD3Zvy z%#5!7Gl}x{Q)e8ir{9fx>tw-7M5h);_FgvymL*7acNwYC(q9V2{GHE&SVYH-wtNYJRg3T9P2I+-SHH~$rbfg^D+u1Z>??9r7phiuU51bVs~fPYV-g$ z=XZl^tF;)N!URqr6ZmBzHJI-Ay$!zDJ7;GjCNV#HjmBDf*<)R2{=Hj)Zbn8xE-sM0 zi@JChCT4d89Xcbd0O3bT7@|^v9mj5L;szh~eH=F1sRmo6UbmnoqoXb;m4!H z*S#kOFX4sK9~xaP%u_G1yOHyJ5(g29$jf=lG)@}EAK55aw(U*eK=QddHZwF^C0OQe z34*vVc0nAi9uK5MEHAt$A&wIJR7%(Lc4KxIn)nZx=rNCeNEX{6u92#3a(DOvft`kQ zM*|}Dfk;{s1n_VGD8{bfw?r699M5YZI(Ev0F7v23G&ue3)r{!HxcG(Fa(f=#EN3@w zHHlJ;_2HYc`!QL|uipkl{6@hW#_+BgrNcm-ZVkY{Jovuc&Eh31EdA)*va)ilNfz)B z9`1L)N(NJ!z86g1{e$S=4#Wi=&_L~yvJyNZ&}ZI<{KkGtD$J?a zVm_Fzb&`@2LV>8>cbhr9)WEJ$Z+X4geI*5eS{_6|lfi8NEfYMLLz>#&S(TKRoQr#w z-Da3P;F(s?zP7o#Yxy9$xVjk-TF|KZOp|oE0riNCW;J|7>?3umO-QJfN=cCcmC?`p z!Jd)*KX1(g&_h>juU$Do%ouIF!a-}d+lh|LHKUgZn}$t$P8ZGxm-yv$9+$aQlNtc9 zp$qOUh=P;_Tc5q>wz`{=l9DNigidoX)k*Muz0t)UOZmbFYa($fO-g@zQxY8ZT9p*D zwCG&F)S+nDp7X2(`OkJ-wEsCgdP!&7w|j@aU0?~XwUqJtj)kIB_yeT}XP375-lezr z#NRWQc&^UCQ;eeZ!9z|B9q$35BS1%9#n$`of@HwQ?Wg?h(XvKmL<|Mhs?ZFRstvVflwxI2efn5xxJAg_xrv&@L zgs-RmgJig4_wZ(TXtb!K%_bxGqe0|SY;kG)Z)gC!NeR++@%L4U>ta+U8&1=dB>hqU zZL@1;Y!(x~&luaJ$ThH}`xweg!+5zSrg12J5d>Nb@p94pZg$P@zif>8fp6CVtQDq? zkFNx)h#SfRN8KKNp0sO)p=UQUURDi~o%vv0eEvIFIIW_(Y|j1VWBx@GwHR5cpw9(ut{q%S z2!ql)P&R?|i(M$KNP)C7-)SOUoltxFN1UteX9vZq1t4e{_W%a(?&Cp@DekJeAyGZR zhqFhcaP%!%O=2$i)Z)GysMPpi)G8X1ZzQ-NOoWND0-qbxc-PAf^nz{DvoPNt<@8-k z(0)cJSdLH&C<0_1X|1yAk6QvLhWjg~lDwH%x{&lj?49kvfzv*qn;z52!J!J$FJaVx ze-tO*$I5Sy!eAdC1KVMlXl1xc<8?_m=vb#a#osha_3J03lYU@-!iwKDtT;GEY=({} zi;R+4p#nkNdR85JqR6KVjeS(-QNB5P(84ZDRpKEa;PY0@x67-n2llWmIo)OB@`b(Q z&|guMGjf4qXaTJzY661pfdN!Q?cbA^V$Iqhfg*~fSc=}vw~XNZr=pyxhg&Gi{;WSG z*?xiAc+iVcE`@%#omi}_G4mR3E(l&C_)$Hg1sjmeHv~FrVO0s>6R}dp zyvw-%vLOQY0mWRtsdWS)_y*MFsP|8{K;pxeUqG)WK6wgIlRd9&rPM2Oc+kZ$B7o5Z ziT~(c@CF4=9Vk6ofND*zS!)J{qf>5Lz;|*jmNW67kScDA0IsUxG`6@%?CU)c|Bh zva$VTiR7;)tpi??XnedP7f6!uME&ik%pIyfdtW;kDyl%baa}Ff4V94Ki46%*8e;}s zRg~U&n(spO>7O2#EI>K%ZjoaOW-JG)8>;+~GMXHO;UEx2pBze8f(q>Dbha}#l=leb zPr9J$ZRTVU;B-dI_GY&q<-Re?mk_#gazw0QwAv>j>P0i&5G5|*5Gd6SDI2=%_tYer_x z(C$g*c~~3f6Prfpgx?h@`lz9s)7=B5TgXmlL$0h^6^A~C;-Ai!KZnDMUh=lZW^^B# zUyfl|mmf0EJ)%`!o^vGKaRem6oZnG@(>|+)M|swx@e_I@${I)_kzWN2gID3ob_TZ zszj^T@{SvfDAU2IgGYq#zu1L>S}5z9;eivL>UYf^jld$Vr24 zSCXa3<8gLSk#O?{#p_05;qm-)9Nr2lpk5|lDc1Y;LzPj0HYCD_f1R2EVTgp*u;=9S zsDYs`;$qzhnN2RC?}(N}Nl1B@CsdgwqMy70|LKMwl(E5fPzJiApoCQg3r% z92R<@E6crb^)}}3sKNRz7{PKJJ1>K%lJ#pZ2DfE%gk_bw$B3t#VgR);L7!JDgpsq` zXvh%bu3X#{Y245$fSRrS>7*d-0rky%NMxR{+Ggo|8W(JHi|gO9j4T;ALXOYJw7E-^6=$t3Ho3LLUO(9 z%H`F2@|*Yd9IO@=15m@5Gql}HH7mwDGFfj|nc!N>?{6E}0_C{3TkyLcBq zumbAQ2US|3bsZZNc=csB_tHv`>QRA+|K9zkA~{@G!b8~YU^~Jq{Kl}mr8NeomD&FM zzKxnzM1=Oh-7&a>k1uxcnd)G`YY1*#sB5(yF}Qc|ZmYu=D16%2LFr;!omI3VLXE0O zFYbM&j}`N^H?sf1mQNwu&z#m-S6Eq7@Y&3Vmzli_k2z7Lirfea8D7kd@vbo6hyLtk z*%bL~j|7WfWxcR|FO~L*o%(6d&BwMj)X_fXm%9S?108gK7sBt5IY;wnC1Z)H&ySvB zFOK=`e!XY@+6zp^vncvqZi)39qkDBP2RZeYDBy2$z5@~aPUK<-&&wXM-1VJ{I?^cD z8z~6Fyf2;p7Ha-(_-j$wn@_>ZvE~QzbGl;;^00L@X*aDdWwV>828plSew8uuY?|tq z4Q%@(IrczNNM#&9BdXl>(rkb`|Ay5u>G2b`Na2{W2(}_wN zEcx1@FvJIefdvv9C^;F9%P2hDgSRM|p!|E@<w(AEl za9Z@qYygG9p9d; zskQ`)Of2)Lx#Z_rbFRpp?{5gy6TxI$49#z{69N4Fe3)Vv<*{d!zhwjof0)#61jHnoLP60H*s`RV;$9zax-YU^u70?#dc|>u(oozXCQD(c(X%IRG){- zrUW=;Z$*X{VCV)P5wuU71OOX3TWu33S-1;dYqsPo!_)|8hsIZzLDiNdJzktsiVWJ1 z`TsD`BmAZKSZeC|3xfK1qKR1#>QT(Dc)pUNY?Z~WgU4+b{_x~OS#nviiYwG?-!;od zlt7Cy8=701uu_dS9kLHs*6ZbF(h0K#WQ=Sgc-@Qf_d^6?OZX&on|*lRKR*?vU%)N* z9>ZUO8D8UJ`GM_N=VpLg&TYPzTxY1fLx5`0GKmztHe+*+WE2_sQ=ihe{XsFLE-yb)*O*AaLhT}XI3v=VmE3r%TO1t!T^t-Q7B}sCMq5o#qGVgb z@6SL42I$l6JEN=8Kod+n?q`yUVY~9ISuGcE7qxy?uCqnoMvyT(AFXll3xX^j-9cTOkO%9YHlRt)q^1agVu3&y7$Cx&ggUH6u<~=rqm-gU1fhozJqiF3gyBEJHzEk#f6%}` z;U7A9L>P~Ql|sHT@1;B;hP;41zE;W$aSoDQ0)t#CQ;dlr?Ele;C5BLtSuTS?Z@64M zT+|d%z(kP$KW$1334}tqo&*9iwlcHj{_pgkJD`O@Adco*Kx{C>Uu3GSJK*;2X14$mOeZ+xfz z{xW<6P)h>@3KIYT2nYZ;riM(8M+ukP+yVf5ud@*W%>jRs+vG|ho>NZw&3#<;%GypksL_m3?mjurYGH5mmg07i$7tr(F}Hc z5PO4h!{>im-|JQL{WM2d^B3A2w^r=!x2@9Zg~)R{U245FMriXdn(5w4_!~DZABwYiW>>{H-}>RMCCt43j(#i-^;$1ZrOkPC7#uDtBr7Gwl_}st56$8)V+Tx zT7RyIyFKEMG8k|?X^fbecn2q@1^|%w#wV+BHON-(er2DgpE5necoQ-ajGD}>QGkTl`SJHEji)uiNghIv zUQ~bj!&H~x8PTXz_X7Q0a9je2gvdXOtq%NuxZuJD&IU@(c8&&SCjYSDDalrLi}Zj{ zz0%g^Xh8ly#Hkx5f%p;c3-UFgee5l8Sj)FkbeYtYCp;(MM>;HlpV zI_N#!G<5l?AvD(7HD8<{J#Bk`&5%}d@gAhmYLqCQfAYAgjYXyiImoby+d5iIRCIrr z)!B8uk=P2hF1#`Dq%8aDkF8_d9MeH1Q`xQd<`urc7anK1T_+YxXcH1IxYks;=I{1? z#8t>TD-)H~Xn=K7ZmgKK4ssUXs>eERgmhR#!dPXM^ij zm(=Hji*PGHTI1OjXvL{|7jE$TU}Ars(kOu~MrppNTP$*d#BX29L|k!M>uOT_y}p3<{-)48S1QgYEd>XWkU(j9^rD`&Zs-k=n!-8`TCoKP^!Q^bFK)(CQ> zL}sr9&vpe?Ms?sWaRp4BwD_ltS@WEUg-N}9l{Lf!NM48~b`y$U=_L@%*`l;wO;l|c zi#td%9!CJ1aB`tyPGRamf&*Bi&E(OE_~FD+UF>P-HICfs0+UGQ$n(DUO75r2_+MFJ z;^r^TvK(yrS@3n|{2r*QK5Ktec&WHl2n>ZG*mO$As-$!4K-o|8Shns?EB3RQB79VD zn7c7#U;oi}-=&AO#~*EXf&H7liT+vNB94xBj!yp|?UNMpxiSw zix&Sh0AolcAreiD3Moaedp-yMGybP76PMQ0$PnA@$|yhGEz#XKZ!CYjK8#sw0@S$+ zTi2NxyOXR3z6_>aU*AvYJ$PF)dVi?cao7&}c?bw4OzA_$QE9%KJ<3s**h?HXc3Ved z4o6rXs?5yG%sw%c^96|@|hoY`s?Tl z%IQ=h4l3quYEtK-6`FrcaDN(;PPt3jwqaqtpY`h^&3{-GGN4=}F9;8)l5j`mdk7g|E<>0$$ z`ukpOwV;w)mEok0@(ITv&V7-xxCU8QZuHQ6SCs0TtMP{XB))lb*ev8BN1rqU=F4MQ z7Q(^4devfC%b|axmUNoz=o~&7$5JHIGeWpIFrzkextuG+=?;2nyha(pLvo}vYNAaZ zFQArOYYs6ZIpEnn?ig7skP-U;YdSD)N8c#G)x!r&N6vTrr*G%a;s`e!c=J394^Z48 zWN2NOjd`tbx@38^aK6N}8LaNl+ku~GYjV)_9VLAhID&tn%+X1q9tF?h$5`cFqHh?q zBrMTiz<&iRM(^?@_eZe$p#LUV;(r#bxQVsB$v-OACt+LmPx^+;a`M5)W(N1p0f+Fz z5JT=`U-Nh8DTEaBs{{}_v`e6wB^VVpPb(1+*zyCHBg};fPI1y!Bkn~tGBxt%nvM8< zzwrZE6PSM#gnA%FqsCBQy4RRYOf^A)L!p8l=D{3$!4|4nzhFG-4FlSuFY{K8BvzF+rYbDg*e#>{{tq!Kqs^TI!S*H zKB>NT-L@GMI&Dji+ysEl6PLfkahkS;dFOt1B~^b*^X53@)3Ey4m>X=17>7w4r4GwfOYpQ^5kvQ4X#{u4$~tGP?&$|>No4ZMeVdir?KD5Tk=LC< zh=jKoSQhbGa@n$jRm3fBb`}d!n!R{Nf;sdBO{=QE5Vt4?FO49eSu&NMG_SGN1=5+{ z=P!SwiGzL@urzZ3UEwU77dk%m0pl_7tr3As; zDs=TCE+#|BIl$5=lrgA)^JHh_^z$G}jqVn;K^02R3w`#M;mODIKSE%^HB2t~lg#t~ zn#}(q1Q`=2r+-dmA2|luL4L%n7+h=|A;N#}{&_(FZ6SyPfdWQ}Z<4*NQBHpZz?JEz zK%j67^c}UHwR}BAl&df!;g{L-6WktFBj~qSL!8lcuZ0T=d{*_<}{<&=OjwYu6L^5iZegHF6UsA7( zX=8sxae733BrL}ul_)?!XlPx)FbRKXphSQsjw@Maz_fG+lT^McWr}8HarH)pa`jWB zrY6NwNU~-v%|^wtet@PWFXf>?j<<9`aG3k?A(D3iJi;L;TinvV0{6%?na3N&cb|VBVsTXN zz_|wFDBN#V(X)4rNn70G*u1mT=Vbzy zSqGn)NZwKJc2w@*r5aZnwmDIITwA#jdmgHushLhlU434?lbX)(^+GM_@Erl5~@u}07$f>HJ zYpoPH($-Q}kvGYRYs-xsfiTE|ha5gbr1eFnB~GacvBlJj^D<=nn4k3c*tP8}Hw zHi~Er!8L$$jr67mOd53T@pI29R>s1aw$#Qa?PwBnEB9^#EZNrJ6q|ol{%1$OH4V3F zo}WU{WhY(619b!>2%S&|BqCkJdO@foxR#gU!r#{j_ zNlN21!XASQ7mMn(!_BS6>L55YGQ$@|Cnqj`oDa9iO>PWHQSg%2Iv@;+KPp`%W;5YX zC5>Nvc2#{6RMaq%8g~gV5Z-kOS2D(WXUW(^tB1n3Kb4P=YN54hJ;Wx&$h^Jg*er@6mX73E-#aesN>Mk{WW1rzo&ti}LAj&$OX+`mb zqp6Oqa_99CP=Kj3k83iJX7ZshoO^4A>SvJGdq6`w(%w~bVE4iW<{iAK6f$lMQ7yUr2JIIf{fZKw`AbjQhA6+$s6n^Sw`o$(eve>Q}6<@Ex#gXB1M5LhaD^8 zy&Pty|Rvd|QS~sm75XFEObC8{9$jhrp3(hDHTX5AJjQUJ{7+lzl zht5Pn8mvQ`jRM{{UNfl*UA?fxw(3fy0d$>h2}xDiMRQ*zII%jPgmQ9fkw`+)f{GqE zPE~)Et!cW4v2vr>HhOoRuUd}ea57|PnC_N8&2eI(c;wWM5Zye%8#Pe#bXx{5fVeBu zlqFs6VVUG1q{&fg+#3#1v&O92Hl@Uurds}EF&2(_GXUuKHy7Mfg~j=G75+UB0(b0Y zrs2X6NJFFuI#Gn_f@@c6fIj!dFe&h%LKc5uH4n{aO`2!$hGZS8QwCf=SgDLv$&B;-rpNOq2Ml3zBe)6h$NJ%XFt-e?EsV30Q-&SXw#f+veJJH z>D;<3+aI|P6L0g_(J3OMBCgV~lV0iIa#=`9S~Oz5VUJFBe3l3=yKf3VCtI+m z6#BjuW^H@zFv-mz>Ilk9wGQ}|J>h>QGxbAP4yL;``N4Y<^a6yPC*)&=a%`7E|M|5J z{-^2v6K*yQI(?^qC``IjNAGb{ygWnDS!z!7&n8CxLtH^Mi18WXAq0LDxl5nwr=Ath zD|F4)HtyDO@p(@y&*8NsmzWeoK4I_BQkUIuGc)kQoKzcTvsY2QNzfmbl;nTyAWmZf z!%XvMR2Gl3!TUmPUUSf5roa!DHBiy2fhwN1WcBbb>eyY2lm$5HeVa8g_u^1%%?hb6 z+0B9z$=|r-MJA%5)PC?Rb46uZtVRQIf?%29un8gW_HEU>5$9nxZQT-#jKHh}FY_URb*a*lN_6-_2T zA#FGpR~qnDhKL8I~DTdqCj3^a~Kn61Ea*r8+si54@3!w6qGjS~GvcC-^&X?s8hH z{Kgud%^5J~fh-fSd{42o*d;YJ*uU&pIF-miaQbNl9z2=m!VDoXAGxoTE;i`TrED=4 zth(TyAjd8WyIuvnvyVj6(TUJl-knKXItVx;az5S`s)fWGa@>kSeGFjmFLX}69+YAi z-8FtbM2Y&CKX(kk!Z)E+d~8+7hjk~x~7y2YJXwN$3r@I z8b&xmT{tS4MO|o}sHDG?_exO~-g=4ndX|MJk4`V1QA@4_^yr_%-_N2-f<{2%J?UcD zqJ~9)l0Mi0-z3v>KWX}AUF@O+c3;>&zmNzICyzNox!r^q9}a&ueWl0u;Gu_f1&fV? z(1lukA^hbpsorWgd?+9wSJZ#wFS>u`FC`O43j=ElPXlKQJKMjTxc@kOtLUhqr~$Uw zh_%zB3%sGo@ifaNAVKA|u=y#4DS!BbHHo~jKoLd9V6IFRt@J!qe+{kv5=m`P-8}s) z>`A`nLP?A$syTl#xb8m9SwFq%zS;VCn%&&}w#6?Y#D_*~YZYGRpdbXu9dUq=x~Q)j z;CO1IsxJ^2G(&!7K2uL=tKFymK9nFPU?>BY(NwdaFZrfzD3s^3Q=z_N6VM`jU(fHn zzQY36aj!b8UCB%LVxe02D*=C>N6t19Q^$2-$Te^s)B4zZ&sa- zmq}{JbD68ma|p@1x3;If!}obK(IXGqLC#Ic+#tGyl31SE8X2SdhOYZ@iYwNr3wFZV zGuDFJ%&>oI49-+k*~pBQr|{9IpZ(S(ufbW&P>E0ihPVavpwkp(GQ0T5uNkqP(%}2I z@ny-rdNexhly2#Cym!@sxUB0wE>GeJ;gi zgFN!NO-aju`q0!#lR=kNYrEkZRoBbz7fF(@XALy=Reo4c=w6)mFokA+ z1e|}$gI5UeNe0R2p{4WVOOP1wfiP(si>#k3sN%$OtD~@Q?s4UM*f*3pO!3HSs~pg= z^-Bapc3HyoL!}*aeUns?wAx3~2#NMkgE(9af%8E8AA zR7Fa5bKeEt;E3(YSI^WB3m;Gu*UzZ5r$v7u3Tu%N1bm%_a;<6rv3Yij8%#YkW+^l}U~dkxdvaN7uFhKoqKWu$T1eeqi=9babw;1;N!ZcRB)9BNg*25AzvHmn& z+-)4*fzf1&Sd!g>c-%wD7m5fipP^e^&P39ajQ5m9|^vnAK`U`sL9$A;}kt+q~gT;EDk ziSnxO>B9)FD$xvWq#oXLYsfx?HcOYoR#jLj4xDK>CLd1JNN~BJ9Z!FWq{Le!o{h<> zQI?irD>}|9$GH>6{a#9w(qM?3ax64WnYonv%UsE$e<`+2m+tL8l{RxIxu44n1Pw!z zaGnSJIWmnd$C{T?+F);qr%a zGPGJmY%)8m#{lI}Ve5aI?3ijMz4qqugfDFMeJ&|%03jQS%h%c3m_WU5#g8_Oc81X( zF$R|DZ>tg;5x=ZTAlbO3c^)W+VXrlGiBaLmXibu&Q zzzPmyi>|O&{A5~PYE;i21Z*#kEP2Z{mZ{JrM3XRz;$$$6c)QL-AUG{{L~@bQJI>`) z*_{~sBAl;euPT3seNWr@G469l1SW_hqYKDf;eQQl{0bMXReC&Rh%t2emZLvb4rf#Z z{wc14KK%2>{%39>2@e)m&^zEemnR*5)&TlLR{ss`%pigeq&YgG9Fq0ersdw;**Hmz z!3KQMs95Ac(Wojjzh|iUB%oZq*gC0fjrm5o96yj;1h0QPn?cj85_@Ahst zvASm0pqSK-yXW4;O zm4f;j5|+*lXErT%H`#SIn&1N}U=5y&d>nC3maXzB25Xv<53Y>%d!Hw;)ayW=`i0{u zF9m;2wN`BV%H|H^cIZ~acp(_^B?9R6@nzgmEcN<=MH=jGbCzp6J-$uJj)ejdNpsQ~ zq2zMHCh6#>m>3J4dhD?pXe@4l=`uO9Md#OCK?yNj+T+pHZek=r1t@X>pp~Wyexv%{d_J-7?k^#YD$aBOH!FMtf_L zb%&>JJE$A>%&i7JRg0NUmNM2n;$1h;@YH&*ZNCFje#zjtQb11^M?E@V6t-gM{V;#F z09v;;9$ioTEKCQ|q56T>@9?H1(zga^jdCL#KUNq?Yx+Sj*}L?8hzjQw$RtgVQx+@( zM~U1ITuf-Sd(BFM4C^3a>|BHX|<#7G1$EcJ}GIXpHR~b_WY$ z4FVejgi{BSy4??$zvlMp0JqcmW9|X)e=|4Ve`{`Q6Gvwu17{O6J4cUyw6>JfhAQB* zh9thP0qzB=d6PK~%O3m3k_CUZP#Fa&6jU6n;~Bk02AkF&M40**Y5IiuAQ$Rls>kbV7voOGvEU2`~KkocD}HH;2&&LyR4NKd|@%vmPofnb^nad1!Z9&3d8m1$Og zNy3G$TjpzT(k(+b8%7Acmdur(S)`e&N^z_ zw#)3`VtkAKF8UrD9F%|PT;bZIQMN@hPx<^)**!>CA&ekbT1HKR_SZF1M@XavW^@03 zfWgf}5UmHGR^&IY5RZn(Se$#wWVNiQo6X{dv62!?jEbjCK|D&r(xe@^*2f%T{TEB2 zhf|43heznLQeEyFIcfS~64Bu{2xP+B4dr#;K+^&3-ski5z$IE6;g;1A;GQ+B6?ctOcN$`VUfe;C%xVIV!7rTR!@s0zVKa5zjtAN1hIQI#{*#&(Vf ze_CQW!}kjagqVL8sX=W_z7xYVF4XFKeaf1K8Ulp(aqBtMO+tlV58%ITd3^O zeQ?=Yh02%c33H*hp7R91S(Iu7P6*CR@D>Oj+DpDe(lC>VBI5>qhhwV6$Bo*Ilc7@@ zBA$>VJU+Ek;@O8AJ$iHk)fM3V^%i|vDq&ejZM|E>?rxp) zr#DdlYw-Wq{Qb8#C^;KA{|kRhDJ{waK4~R#i{{Y2m2-RNJ?1MT3g_Xg+Y3igLuVUk z>qwIK$GavbV?KW(j>cf4b1P%uVy=9`p?`v@owZ907gXUhwV&pkK4&{QJ^XxmAn+%c z0>ytfA`ds%dL}p-6i1YC$4^z*$Anp6ycTPW$27>eB_cd3LO{UmT3jD)AD|vIpQ%V~ z%g|*~VX?6&cIh0Dkz!fwQk;LK+Ni2fonNAKU2j@g?6BPM$lO%1%Iat8ZDQvdL@aTS zxddBoYHFxw79;(YOpr{2ojMKI+4od&5%7ObKe34n4n4v2;t8|ZUaYYZ)7=JyTC22R zI5vcWUQT2-Svge2QHpu-aB&i8Nqdi)P0b6TZxCa^o3pv6#a-=Gm^`ytVwyaHg6wi`qVKBm}KiJ3zjH;Z3=84gUE2(Ayj{g z@;id>a)#O`;Su($UP|O*$%|u-nx)PQRMlQiGeB+*^PNegTQmn&_*6p&qEXa^$;p;B zX^1qPPHnp2O&w)#pVO|FUtx~GR#LhjP=YBs6H$~05eIlAtjxnrL)8{2mA9ib7gZMk zH3%(Pw3%nqTbcx~?*PaxHFwoD~#gj|J&B@pm zY@TFXAXWh-A`u`70ch|Eo9y_hx|cu^Vn4$a^5vtnP%A<vxyV?4j8QdoL*^$iD^$jK54cXA%UubJA-`o+vENDIYaE&-hKqYc-OPtx{htulKi?}MQHhncqO7gJ_S$GW@a?-z<=TN)3fYdz;Pn4@EJ{>Vpt zynY^L&JIGco=(rPhZNWaTC9i3ds>}Ip1SNLCnvMB{0m)9wg`;2B&@zXqMP6U0du-t zZ-3%H{xtd5>=yhl{V8tY^yl5|G)KxCtr#poH zw@Qh!w)6pn7ll7$UJMwi8xzVPN>gH1Miy`E9{7LAyyAbz{E}*!iwZcUW7SHk^>L16 zI?=2d?^WmAvqUR#yM}+p&HTRaQL|?GiK|9UvzfbrOO4BQ*6PZ6T4bPN+iGb=%`!Np zt6jmaYP6^mLEFpd}Uqk{+Ce74Q_9s`8G8?d$6Yx7s-Crbo_``C@Td%}gD8rH{R z8%chnq=V|v{JUv2t9@*gt4VSoHSLCb&Vj)TC+Q6m3IEi3#A^S{Vk z^or+y$ej2unJcm5{tuZ`nv`WJWaWBu0Dc)2r^cJLI`6CEo7IH!94BMLvr;?%ePv49-JyM!*jpEC-V;)j$|HK z%*>1LJp0pY-$i565b1u&F;NqVwvx$eV@arrYps6`f@wouJ%54xb@xa(9nN1epZHgI zOZ=a?ThYY8*uvIK*uv4o=&q}OvD;5HGGg3ksLdP)}<$pqN>Dps(gTj5$RPp z&S^i?NIlyZNPqvw?b$8_{^XO?eekVpyqv^5fT=v*(qzuq;D#ct{ zbqZ-kGLBrZxlX2;CEI;t%vi$?tr47l0=a(%H@Rk}#+)C;I07-q%R@%OrkX`vMHkod z-X%4?L))A6;3#QQ6`81u+x72Xu%tyaHTn{guf`_%?>k??p;2e*H@ zJ1_%^=TZe~Hl`4@(cFC5Yvke(5r~L&lRs@+%x`b4w=9AK&GMC7%9R2dPMkNnqu{cd z!wz>45Ki4dWEdO$JR?vKT(?_EF}$}B))Jx!TU-ifCSp1_8MgL=C2hiuOa@KThK6P_ z_aTc4mlv?G_s>TawI=E6j>3p!|5XyVLzF6yLi?`%PKQ~ znRu2U%yYKlY^{0ixS|KDcrP8A?$283;G*@etl$``{6A z<+lO@0S*7_z0&^{UjLVU{xyFW|Hm@dEAzI=^>D%d_yu{J@|4ho)`WD1K$XPssfc_! zqL?JbS{t#!Uq=ual%j?EjeHaC*V}@j_fS6`bG&wPoN}D(-rr}R^?*q0F+u`M8Mp_F zBEO+3F*qNztCxhFhJ*@7A4SWXvJ?eRS)3s=)*g@uxf|Vq3`U=?PHcZMx$;ahdUtlA zE4QC&<@8sogyGGbj^0b<=)h6t*j26Zju*xhR-_n(Q`cl>f(dHU%Y=fOtZz|h=Gdui zO)sy)TF2xYl^?u)a|+u{t=H2?=~q)aBJO~HMx~%JW-Ww?w%zo zp7P@ukcOu|@T^C1@S|0SE8Xat07X>|hyml$UmR^-Fozrlx z-`gwUKmQs=+l4aY-~-ghFZ=OZ)AV!13Q%Hs$rUp4@3RpaMBtx7XT@n_KoPzSBn={n z!}!j7;*o!3su1sya~uPs2M+@}3PNwfA9c~#iGH#1O(Tkuzpx2UqyM7I_q5ECLAFaeYbm;2({0?K2KE)(_M>PLZZtG%+`iwB9W*RmLcMaBvYnZD$DRs1=&Q#!yUYXHiyH&u)xB?!HwSif!@6Vfmw+PWfQRT$1Jbe%lDb~_Sc55 zeI|c_sZatV@<4-Va`r-e6am;mYTJ4W^Vl^7j%*KdK!7j+8QV%auGZ&*!iGaS4fCF4u<>N(< zJ)Kb2hb=VW_;@+X^VH^%#)uO~$%*7rRm0VcR+^&2QkqQ$b?4Hej1{`xoGO9Wg@2Xz z)Rcclb*PA2)!1l;NZ+4@-&s@0B`sR`f+~w7(fCa3@A`=^otIf;T&MSq3x!XakK+_~ z%1L91s58N!^{;6&?0X1;4f4T$qev*qSWVjZM~IW-5@kwolqvVrJj&&nn_MmtEPORg z;WR+WSjYNYR5h`AEbB9ZtxlnI-D$I8R6c(UctAEPJ3Fd$5*^mrLTPhg#zEz2t0fG; zL@k}qFM!#mq&-01Or$(8SDc?J0FwcR^K%ok^XXA<2-k5U)L4Aox>q8)QG{5vnssU@ zo$r9Rc`R-5H|Kwf zi(*1L`A%^_{c|SagscIqKB$979NRl{d?w-Q?@ZXe{31{>x+1PE+byP#a330`guN@K z_*7{B{dZ2TsYD{xRw-l#ks=6gCu9lduE6?-Qei+B{t*6gP9EN>B?+FIw8!teNUlWs zJrf;#V$K@MUS+Bx1i z4;NwEBsWA`zX<)zt~){GT0dVDY~9w=F5XM-93SS_-RMlnGiZtH=3PDz?I*4+G4%jq z;YqhZn0+jnWitK#ubdg*;4VO%czx~KaD+|SPLFP^%j-M1-7ZG>@7w43Ju-hraV_~~ z5)T--4Mlwz1siO`hgpje9@1~Z78u*|Wfl?YZ%kdW*f~9~|JmV1t5DjI`ood=|G!R& ziY89Zju!u6M`;sRlYjanUvcuf9f}%Yq&MQH`vLoSbR!p(RuUo^K**3>ignb1HEU>S zXlagBIvNUml(i)(bpcM&tz&;7hF3+UxIz(6pFBzv^-l5o8-nsrrDEPDKS3&$Ij8IB z0>lS2sZU?0Ua!+Er`FfwPXsrhms=6cDsuL^U=yy`wYw@1uREMcjcbn`0ms;5FwFOK zx`yA0(Yhy-jBn|+V`pYLX$*Z`_(t)s6|j5{1Rmx4S#{E5=Mg!Sb6z~AbJ0Ns=P*0-hoABB@mi5jbRo(VckK% z%ghcDlQ(fl(4fj3-8aEB9wrO_h?hqiD|!H<(FwOKFAjzqkxPHn*D?(P7a^ClTEhDQ zx3JhZ|8(tD9-f)DcXM0CmCh2+AimtcghQ6eXveh!(vkji2w zDMjZ_1ih|mx(g?htVNe4 zwa}O#91m$yRiA%w7=oWaR2K(?&WOhRzD;V~xlh@`iklHA${UuGv(#{6WISeO(&XfB zdT_MkHkk>4t)T3(BYIQ1EmZ)GZxT_;-z1%6jB$W* zf^md#hOyt#pJa$}oN<_O8rhTsQZry8Y&E&YfICHE(Q?VzUA6l8@uOV0i~rEAnpZX; zId%5NZ^^-row8f)xyumre%=Yn^juC0hTN8y{V1g%`Z+_C zTc(;u_>;p~oK3+IJ+<=Vb&$!B_<7y@11C1)&<7Bw6E?Zwf!)$sr;F;L8n-H*JwiT3 zMEiEmo!}VEpl%*xA#A4hK$Gm+vgQAKLo!*$>Q3P3oD~s_=<)VoR@}Y2NdxK;-SDUk@4G z4k<#XfE=M>J|bp_)w!Cuwj{Zff+KFt@{iI*>z@@&!$cA-zw(=qcX1mL=@h8NPM_=i zT1|grSZg(jGCAllF^yx=q-w%B@``?nsT_6Hd&cGu@&l&Z9GYq|4A>=AbKp+PEIQfTLWf_hPP@1W|%?| z3MD(N5pV-*WgN>AWsJ<=dJPJ-#?X2Zj5vP^*{4K7tUY8H9{RNjs~am{FY&YVHPMlQMk_EAkMKu&dYFxz-Hzmy8S7&OOW)0 zhT%A$p3j`WBC$SVG(Vy^#{)deq2PZOSeYe#?4^{<6Hn%-P38%+ON}%Pbvv2HpiaIZ z{wB$ZG>z%_9~K0I{kJ6H_%D-0$;8ps!swsIscdB}HEb2YCw#li01yGqs^g-o1+q2K zu^~-3D3qkj6y7yhyR2VVwAAxLOU`Es| zV29LE(4^|A0BK6{#<$`?3NXETO{jgVfH6&9E2>7-sgqXF6DQfqlFf3TO?t&x4KDNV zmn}wX6u)2EYQFdA_>#~zg*T_tl)d7%}!_M_ZP-VC#W?VYrcF@7!O`8pS z0v-p!I(mlJa*J9V}B-bH;50FM#s7uSWrW*oJ`AHU_dsG!e#w8vOEV{?JDoh+MuX^b%P*);559VG@3Xj=lxw;vD3U<$u%D*X zYl=y!5xQn5iZzK&)?i(dDpholxv_Uf#=QvjR3AX~Af1?N7~MUOjg)_A5gGN!78Kt3bH<2W6+QITnL zoKH}s9{v8l6V@lQ&}kp_ITW!JfkqL5iO)GPw5Th9;TB&I9%nI{@DbHS;489f^^)_@ z8HlMFbWbh*>BfI>`8KP-+ahZCd1MFK75dd)<*?%iFJ1XKz`a`HgauojwU5Dj|1C6W z(Wn+tIyRRu8Rs@vP$Cvo7RlEk)eiAvCMN!wyaURLkAYFx+WwRHPK3i=&an@x@Rvl4 zgPSa-2T<-r^mBQk2z5I<2A>;-_-EkUY#RP!ZV;lq6r_K5s7ajuvEwbv?A~ns0r)Q2 z4ec*kSv~&Ei0|?9LAY^D&H@p^Q6=>k^TIFph~PXwequfxcH+Wbt@ zvcnd^2;CjGz+x+w!Sdv7l}IXClE^BN$VNjZv&etmaKP@QD4t`iCmTvVpY2Smu??**O{{W*!yq#VW6{$td9vZS)eSm1AeGZSanCR13!q(-mx?HMpDncb{W+=DGzq>u4R( zA*TR&mc7DSg0;xcL5vMjCnlI;!ois>pL)_n1@rasuGJFO0^&UT^J8HQNfSjWxPqNayqbArynk8!J=hs%8!KUzfO&ptoGf{sp zwHXadd~obZ){kxYu0SW)Y*Uh&Nc|MmLXh9=gATPIc0%;pHu_UA4VE0J=Lj-N`c@0M zjz7uw)GzokQA4R1h{GOK5yv7`jniZDlYcaY=uNNLzT$>@!{#SUQIb?laZV;|kceQ8 zWH!STmxn}aJy~N;NE#`&2H&X9NLqiA6Mf9JQc^LV@|s(Buoi`u3S&t6>A>hj5hPD= zS`D;NE)ph_R7z@O#N@Lw9x6jmDnFdFYsRr@6f54iiFbc|Nzk%j zhS;hEtG3s5ZK?0rq+(MfPqyql+zD~@){lU3(qUc?C1d-vAU6+2qZGZLo!2rj<$v(hQ-orj30|g zO}&F|GPr}KVar&-OX_m_$LPjuAO!JcW673D0IQ{&UcFzG7%}!+Rur+-X?YRm#cINyTdd+A@Q=c> zX4`{+1gFcI z=aviX1>&U;9mtWzDRQ4(p07?==q?0+zj~UjW2+c`yE(pOyU@(0d)Q7%U_+yJcS( z7EWb=m}i0t)(gAvF+6b{48**I#cGJuT8xMD;dheIux@v}_gjYI)6(RB20i)zi@mdo zsw>;pb%F$UcXxM!2X~i+26uNS5L^Sn-5tWhf+u)z_u%d>K`)T1E$7}!?S1N;{d6DK zY>fxnH~!xLE_2M1g7HlX+}1bsp)G;SHu%T`?uck{Jj zT|m8>Hb^yERFY%~-(_uox_S<$B;V%3M!{aZ@PPkSIFCpja&W(==HI2jgg#ORHULx2}X`6AQKWfhcYODV4I^Sxis~2_g?zSP$e?$?aO;g zJ9}UiN`WiO;jt@A|K`*U#5?-Q9mwI33S_;wVdvxsNr>b$;LLn~CzUTf)Ij<`s#+33 zVfC;|e;8y9$ww?7X~^1I2>%L`?&M)f>HJTj-B}x&Y|PbQpJIVPA}uW8;_~$8N<~WT;v^&+NEed zma4P!#rS!M^IU9yfI!;tLqeYad;Yc5er$Gy=&3#&pf94zHk%%rF!RWsc&muQN(|^k z8pp7OnHl7yB$I$r1rvuZR2g%Hc0>G^mrsZkEm`-mUcPv-{>wL{W&R2x7HK_e6DK_r zqhCT&_zjX=ct}@afU~ptGLZ&kDBL>rK3W#+P6|@o~D#2uETeAH(wE zI6G6^qPpkwHcxl&K)(`AY8GZsb(o`A_?L6&zsAEpo;13A?*O8W!sV6l7t?suCc|VVe=n7#3 zed#qTX1LdXVFyTd=>@mh?HyOZX&%mFqykaDD0<=4J%Wx@GH{Cg+;0ELG8#im`h8lT zRgSR*5`G697*nM3`)$3p5rUXOV>r#it(Rvkz!2=6S)5*K(;eX|HZ%;C5J~uPmqme3 zd3j~il%3REq5JhOr2zDxjd>R9I8ThGgZBq8ANlNm{*saGUtq*8V`N~eXKiMnXZf!} z3Q&tK{)JC0XFWh8M6)UB(zOZ8nE%TH z{|j8*5?|&9C(Ci5#Fi^b{6`>?jkddwlV~PU7MpDmLTVrrMSYR}k6?N3+9Eg#|C7Ok zM0u=#x+0=#F?KeNA7dTg@Z^wH8b~lKXf5ha2!O~NlPG~C8AE_<2qy9qXLbavCrI&R zx7h>ZR{%@&)T>|=l2)-zVp;f4GCZ5(=8mm5{#|8#Wb7EuOqrJ@77x)G^&x1ikO>cL z$+l-fg<~SE?2^|I?s8}HZ&WN~)S;aAO@Re}E5+0bt-d=8I9oLptY{Vi08uGmJ*zI< zK5>Oo-Q-UpRWW7&o**6kuR-Dvu{1Jpw6}T0^lL~!$!ADw^sbNL&T4d~C}0W_8tIL` zuuz4rFSf+3$Pmb^Ka44+q>E41!tSAKbO0VB^yv?i)%oC zG*4+@aC-0l+E2hh(8H8vQ)Q!on$Gdv1c{)lIrHie1YIhFCZ1P6ZnMZe+PGZ1?Qh|Z#JI0JN0}ns z$~Yzz0dk~_j&md-A9wg+!s)6oT?NK}A{bKb3DZeX;c2BV2HOwNdWvgP!VlQcC0SH> zaURg+VaRH@knjrvpW^b!Fje*OtXd~~-@!Q+f3;qpy?tI|s+@rw#`;rA8vi{?GJ0m# zjz-pc)&@q*j6!<$j`n7TCPuP0juO_7f9hyt_y@#lev?(ov#fBqaTH+WIt1l^!9pOT z6T4jR)~uyf2j>l3{!v%cFn&+EN_4xKzPojQcwy^ThF-kI0UYVb7aXb@i|yQNs@?E* z&C9e#wZscuD9FWVin8gXQqkxTj*q5#R5 zFz!hv+q66aT-U;|>bF{%#B_##Hi#%FUK978hU?@?%uvW~wsH|DbkSdJ#aBaFek1kt zWF^E%l{Mk1)iX6@vvtoOZm0^7y3$~vpSyEfJ&H~*ia@JIC4WGYSUy9jO$hVDQ(nth z8vsUN?o{G>*+Ki(z;L_~d)?T7q6Gv7xdy{Fgc zaC#o)q^cAQ#^)Wsq-Q-qGg!0Vg9Wy#{ovVEkXVk(3pa+=P)|b9F$~&%$Jmt7C-}qw z=_q9Ch`b9rH@wODkr_RI2r^E|K!%e9)y4V7Uy%X}Dr<&K)qTd1@W2-WNWE{(JPw$& zUFX-Qk`AZ%?&QU8jKTXl`di8|Y3^RNSce(*sdPg0RThhxcxn_UI)Zn}a^MV9mUD)oHKm%d_rN5>!kvltGFQAj$=UtqSIbv_2)>)AzE-GbYG(n! z5aeDinqKI_9nsU;(7s~f*ATrPHkni371c`D^pW5?uiM_Cv7UZaJ<#~MHP~MlA3*qs z?8PsUDgJe2%z}E3jz;!w{{}FaR#`e8NOV79Q)PL5Y_>b86KPd?kM4u?56^)S^j2Y| zuX9rLyZ%CoULu}<^Uw69R}x4(t754PlrVL(3taW(v_Zacb&$x^6wFBh5KITY>`saW z@(35EVq3IfWz~J=CyZ_A0YDC<14oC9h3pV`!d1*JW1_n%18E+Rr1Z>rvKCKg{I$>4 zgo$m)$39e!;Ug88^*d;Ht%wcg64~*s0JM%q@NjTCD)A(L3LILAf>YiOj56{QjURmM zk64?frJwmR;da%}pw$g+?(b73zHQ=)JuKg8=H@bj`Aui2vk@wUtS`eglo)fBMTd>NHt6tYFryW6yed%0r$ z>hULGv2pn5AL#z*Wp5S$0!P`G^T!OHTsaY!hnX|6NeRNGue z;dcO~DMY!i0eOswcJrNI=_OAHPHLw`!Bvvj^vHxOA9*bmQ`$Xxj@D<-0ruoMlq!Ia zyvm4wE3|+29D&-#Z3KVHOYX1pVwE#6uyk_x#q!?orbEjf69pxQUE|SoK*T)fu#v(5 z_q(-9a+=KrU?atqx~g9Q!ID^r1BMihT^I*TRCh}E-g7j3$*xhDL!eLB!IiZcJCWMe z%axXNGlJzy51FQCoNBUaAPY0`bp6lgFB9fwr z@y;$jm@cfopWkq4a~6rdyF3vXfnTZ^JyumeG$R=qe9E(qVV2)Zrn<>jMZcn~ewa-& z*+tV%t^n~qg;XMp`3Nb?DFuyPVYA_T#d)LUlRb%oQ?k2A<9UBGNGnU$(5FssW9M!+3d7}0|_bpl);S3AZjih zZ!AgX3?(YTec~xv-}8SZAZxL1c1Lo5cv2R*(8-VU`+5?wN2Thjqu`!aQ#-#qu-FrCsLAi7pCr0JSXl;^jdL5FFlQxoB=0)n5VV^ z!7)PS+v!v--o{!Sm`Ov%zGQcSdb{08#{Gp0A!9;|4e0l3`7I5i>^-6j5OZ2Y;$CP0 zeXcN*x{AEizrnJ4i@J_lQrR}s{pgiD9j#2O22uP7vL!tnK&TON54HT<=82ZP?k*qR zpXy5QuhU}xo6`__EWe(;qL7V$m93@GugqfKlhR6iPzY_ggNb}VdlOP$ zSRWiTXq^&nX&j%V-a2$b>UsovO9`wx1{Jo2pU@U@k$L0u?C-z2!>F7k1FZCAvUX?8 zdIO)_;=zg58*M5_{U^5=7>lOWeM=S474k@rTKRKr5OmFSerd(`sX&N-PREXec+n)v z<`$Wb_ztbBC;$w~J{taY3+Bf#d_0G>b5~@0`xugJo}n#~vMtgoyMyJ>~ra!OJ~3RA1~r7w6LA~ zisGJ0zFQf^pnjxC@k;{&`0FG&p02(XwsEnxw9zvZ)ibmFLxBH9eG6a+kLp80MSY_I zEqR_M@gMygej;cmWR_5x|<~n%n_U zI5ycQj{)sem zQVz`|Ib}P!DukGS7yS3nL*zB7uz&*U*F>z=RtNfQ!>1*+KF5drM<^UX|5wW!54(tw z4~Xu31k-{N-r_nqDSwk7s|{@(?UMu>F8@h_uz)wu5}bGjCo`Y;n)neM>@UHo{&jGi z@_J4VMlv>rM#_&-)5hr!Cp3?CMCc7->HtNTu)%njEKSXSkuLxY^$oFKjQDV(_s7zn zp1$VpdEVB)xyOypS-~cKXO~Ae()^nnDbEU4MN3h!L`v34U3R4$OzGg$dW*ajIJ`wV z2~n%}&5qoNmH>&`q$}B0mhylA7AjAc8L7>E3Q#|=L1G7r-`QLJXeX`I2b}JSr1Xq= zmdkgms2aC_MnZ%aq)mv73SJY-jwQaWP6{UA{utQtBiO*MRg9ONJ=lmle$_dHg@IR_ zm(f9@(pIu?o+1gSFHW6y_D03)tYhfeKi>O@5mi6vx&bMtMczD!9){z^%1>&H6um2U zuKre1S1cVnB=F-1?krhqCp0dVHaiRO7P=zv{Ch=zQVDy@vmv?PhCL&Cr1t8U)YSeu zwb#G-{io&V$DpZX^eb$?oBpoCh_va#00{joN%_KfB}E6)7pNk z({BE2omRTxJMg{c0`7_1`rOpsliHwu$xZ!#FLPu0dt2mB$^D+_22l+3^~b|F5d7S2 z!FeG=36UN%-J0DYsTFhOAU#W!Am3A*L^#Un80=~!6Vr0QoB5NFrIN44i`H>scrLX#|g#Y=tSEVu}!xwGHxr z5_qFJ;aqWP#tz6)YK+*Xegx45)F1onO_{JbkK~|)G$joP^~yR3r{*&;R40XIaQ;nj z2$q(Jea^%M6nM_9N!!w|!j#=5wxsF^$FC(e$n7oSUG^VpZErgsYc}jh&GCZ~r#`fv zyQ^0O`FY3iaXKpqs#}N@fE3S;FjuaBG%zdhfv)Fp3|r6_(Wu&21_$bUk$ruYT(3u? zX660-?hf*1B*)YJrU<`e_up(hDjHdtSsNPJGYK16nmszoUtMMMC^b2d#~J_>LKy7L zc;KKcT~i_;(Nr2$KURzOHuJ5nKU?3vkxNuZhLMr}Qx6|2sC~4zt~14rfx(7+-3bA(x%wGnzm6)1xzn2civ03%O|DM0C7SWRHBkHL7;nglOV4H8BnM-EkG`zuj_Rpe z`dF?(*vmO0Wf9j5ITr6A+Z&Ih)3F@&QiW7 zmTFl?{bMRy(>EiNJvLrgJ$9b{sjT3LSH)ZY02rXGDR-?#o=~l9%3hX_Y$lChl?n5v z%0>`1U0t9EQkHiq%f1}sMA|$N(N>Z_RGIJKReoZ`^g_v_|2NU?LM|bFbdZ==Mb7^B zU(ryER>k^oxp|YWwbW;SNL1a@i!rc}oefGHY)ZpadM6vN;!U`urt!5bHaTCjm@P*_ zMsO=lGriq%yWgf37yNl9ruti1O=ru5_owp~>Awblisg-^p1qZjrHz5b zpUo|w8z5*MPl6H*dq?aqE)Rw7otvRGY3StOv3CGYIa9pxYvK{p#8;li_h zVI&QqwBlV)KGlPN$ZpZt!C`XbK4kh^u~Pq}3;(dJp@O{?hyvwjJvrNp^{X3Si3En6 zgp8?I40c<_!tk{yIHbwOa_?X{pSA#d#-OsiEgTXGeRVo)9#&p^u9;Ztf;+V>`Ai}= z_(1N^VLL0t9QIKF-$NIVTC_<98)kRL`ITgMfI}2RJW^_Z8$~Qd)5nr&?HYZ@Rvr4) zd0FG(xwpu41VF)gB((KQN=ko?66?>pOv2jux%=@epYhZHdGr}l_Rmun%Z^7{oFEdslg8N}f@*DD4wm1~QzEZ^HG5>$f?MS!zbYI%NSG#G8uQex znqa6V`3|SWr^cSHzA?T1qs^pO@-g_SXX_XyRi*&aevCH&$Sj+~4&90dVy!-ZmNy>s zV(AO(61phxH%;7dZc}ThGdgtHJ^tvf3Rg-*{QcH{0;;Wt;DkQZ*GqX#YRwH8Ms3dg ztgD>t(xnDUyB^=!5uB}>YF4n_Jj~4B;vd#Dz4p)e=OCfl{?x6y``?(5{SJ&nSy1uM zO6W4hIqNY2MBbEXyOjoc5IFhXyHPD_T2e4^5pfx4VwDadv(uIkjvnIf+DVJtdlUw7 zc~bm;s~3FGOuGQWI6@Uj{{H^RjZ|I_o<$$eyH`t0wc4C@>nrRBiMF2up%0R57h6Fg zG-1*BqN>DMD)@xhzM)PrM`BJYW|1NU3FbNS?HrDD@U@#WL@ExD@UH2RThj80@(dY~ zp2Gy%SFssZxZ4q84k8$mE*PFh%LjR)Di-j61$PVgg`^IOjE%A+G4COaTK2~AD+pc{ zr4Bl_p=}?z#rWSQh6>~wkfGp}jBjSibDbk}Xo>pD%ONyEG`ptz3x??iwGIMd=LWt2 z$(fOewoe64EMu7!{6d)414UG7ya?E( zYJH#MolC%r)s$;hI&2MM6x)wdM4hCjxbPL4XSjU5*`cD4T$6ILXjRELcK-sSBI?IC zkt% zu{XLvv>8)&sC(G_%JohWd^2>tILRs+l$Xx)bZ=OvwV_+0<>qgpo=)HuIZX2TEdt0_8GJeV$QD~a4cSi^29Y*QM+9Ry^`;mbDr=Q5Db^$ayb}yeVP8cp5NR127Za} zU>dWV4QC1n@Hv6*G%5EZX#M${V#fBp23mIb85(kkO|CJ96Ez&_6WaN`YG=fDkJ1wYO ziVC(iWv80)7+ zvBQ;##g)!FHh1?XtO>n;*b2bH=cN~A=H^u?h6qfRCl}d^O{N3}R{Eut;P0#E0jrK4 z>nzlV#tIQ%vM->{zeMbT3{#SC3~WfY6{>qTc1SwFCD^S;<@bt@iH$E3jIg?u=9hq* zFF${bK+{i{;Hm%H`^(e!-?SCKpT6G*VZS(g|F^B+k%xJM#EPtc43EP$`O#43=d`)! zAGV>Yk^gBM3bb@WL6o9R(qBbzj;7%CKFwwgn@hqbSOYO@^0U_iDrl#~g8Kj* zJXy%~vVFd+(HasFQ?l8@-CMKF?{o-?3S1$0lC)BFM+87*@>vvm;WbuR&swuy)q7G&2-`)^mLBI{mSykOg`46c7*? za)`oK(zJWyZ8Q~(BZ-*7P@(L^lL!F40ieswJjroYsq~Yl=)K~!vuQ{+w8* z>QV?|l_6>p)k4V>lx`RnmW~yLDK2!cma*z9}^*iq>Z^MC}(KNe{_=kg=g>eetWG%bD5vrE;zBh?7% z%Qt2PYfGmMrCoj5*mHVsLyPL9+Bx2;C1JUSy$OM#2`r)pIR|c4HFvk}1)Hu_6CGPP zi(p8O2f#bq>!9ks^{;%ACs-#H(<1Le`->}(1!qiu)m470skWYKD)Z->iXNc(=qW^z zrfGkxsk+~g4?TH`%m0lD*zdSlMXU|wj30m5>skL|y8Hy|vHHcuKmt?1DSKj-OZdoY z9IV+iOP}{Eh{a%Y-$6RmbM*^xrO>rpQO#`4#B#X4KG64b0tR1ePML$JPtrl2wH`Z> z3LEQx#Knei=K!LOgxx&OIn;%~*`xAqokZ|l7-wG&YQ6dHW!9)vcj$0Bc5296HSjpZUg5AzMYVtsXjrf(zb>elph5SI8C!8z>gD7xEv#mM`Q7st8@B*z z3ErQM!2V+LWq-1NPn{;qUo_wqwJn~m-2J#G7Gqr_ic_Py>vF1~B}^qKVyf5~yY#+) z_Sh{Zjg(|=-pE;X%jZO77@F_73QilymM1~ABRFVwsNd{Qs=B<1`n33hr%M%%-g?p& z=Ce$lQo#F0^6w6Ii=E`}+oM)!M`25cdP|ECjsjysB2{)yTEWC`d7UUpz`hI8yd7mk&(6bxqT-y5-ZLn>8^dUVVsvlNz77 zSvTI7Ni71p5)D{Pp-XxnMSj`DSG8>w854rBLclBaD9qf+3Z!oDdoV(1|LBuB%NC+{ z8eTihAZ}tW2w5`2G3hROv{XT`9W?iTvpNEPpIlzFhbOu?#*J*9jkXnZUt@tABFwxp zKtGL(&q#E}+UMm>Vw6_y)|w1|L;|Jz>C4h=y?B%aySx_&W(~siBS1NMa~E0pd)Sh1 z7dEwA+RzQ7`Q}MnB^?%tI1Y}jmc=EcQ;-dT=lo#ae&@@vUwZ|8r!f5X$ChRVk0LzH zS1F!O;7bpAjz715@_+3Faz3|S{`3qg@5?@4`+Q9_CnEVqL>N_J2BeaIFqksLP!OYEnE$Re&BA>S0vM}EE$hia_E%{RrsV=2b=eQr2&s4;7scdFCkuU zB0;s?VxwLKEuYHVaS9M@oH*uw?gSfjUA1*3aV{v~QrI~HFRw4oy&Up6!) zfSMiJduknBp-w4(OY#pY(Ly>R&_dLsnEKQAKG%$;_d->cOPKi#g)neYs76G)(i-aeOqKI+(K0q1aPE;ms=_EWe$ zsk(La8CO7)pIxQ72dK3HF{bDD)_If)xe3T0ok=q!!jU5`!CRJl!O05v51fAfUg7sb zlz46@dztSLf;D5ZQLW{76=)F~k8SBJz3pugWma^)xjr!Cg#gPp{GC^gPP#({{=8!h+W5?B90nrY^fF-U(TbKY3OSf2Y5D zR)n9P)#LA;Rmgw#Y2=OE%iZWDm}epuIxJbO@cD;-W9E0>fAFjU04S7wD2|Y!?!6U? zr%sqFGPCn2$p)>|50&`n6QRGa0!62d7<<~r0*dkq%!zPOc3jw9gq*TWTrBU5zx!-p zSnEPLwVm^$6FNS8aAwDu7M0)=!bksoRw~Y(tb(S6PDaluKkot2j20iLTZY(Y3eCRp zsx(u71*{fkYUlYii}GgdDV#qwK_>quDud_m_Bz==e|qDs{!^p!_nWlk?QM+BER6)8 zo{|33qdx%HtRm$wriyw`A44}o+3KuQW57`@6TB}kEjS7RRrK)#s*=!Xuxros~(Q{m#K%`n>#yE zYC~^d0EEdvusSIxE6SJr{B{+>^^|Be+fI#Q<8kz>dh{+7qJ99sLR?ZD* zDkCOYtM$WsW##4KW8&gbqP*}u!vs@j;aq;z$WpmQ1FYzb)l|KI zQsL`-b=$IQ?N6O}Q;yJ06Xr({XSSvdfd(~A`K##R`Px-GRzV)BV+;JItPwZXS)aZ( zRLEQ=#osW|ot3CvPjq@ag%F9F(k>JxMoNiXN={)-%dFIlRBK1g=>%}h8bi(#7(n8| zfP!zs_BtAsHGP(l3tEKrH=SmX^(r%ea(G`vX~T*TvR_|ml=68_3?knlh#>e44PWd& zcKhd<6JGCr7&z-Gn1)S&v)5}5MB5PivCI)WY(hQgcRlR<%mIgV^5b97`f8h00z;G- z6V9{(YCT-&%x#4~@33FaMt(~?=N)O-F5@qB?0!o!C%_4Re2-x%epzStfNleS?x-S& zrW;fFnk#fCbOaI*<7@lbqtJSGKPT?xk`CFLLi3C>tV3TA@9{;v6i9p^mYtCH@DZCc z8lw08;D}jbJ04sDuwa=)+9FXzwSBXW+VT{;D|-9`a$hcBRKJI?hw=NOcmr&>=oq=J`YuQZ%HYcV6@; z6H_iK=Bd0aBD#-pP1n#O-i@;vFHxCl1>M zkee)D1l-QZyBXcycsv?y+I^(@t{w_z`m5WHkGiDGp^zF2fIL?ZB?F_G_c zU?`U;NjekC-C%}MThF}(iylXSq*(uWNOrOM#fRyo&It^Kr+gS@mZ1`<3FZ3k3W@TG z5;Z-sapQi6iFU;&L_P5v~C1# zd5=f>1Zc?!=Ut(uuk0C^w(ya5KkV(aw|LW|J`|L6d-CE(4vDvPjSNHkzwbit0 zNR*+W*=K&G7)>vUt2@BPFh4?v90w)Qk5y{8q|9g|FZe+mLy$v@q7ZxyLLRc55)31~ zeUakmJUDZj_84D(q>X*GEzX zo3tq}B%#x8OyW1fuib4cSY-8@cA*wTiL_(a?ETbn*=ieYS-zQg;{2tUX^WGBD%cosqB<` zFcA4R)s#IB8;|=@a#fjdCQIp*ovzqppC>k^79itVEJ9i)t@p1)hZue2CtL}ZP~Nv-`-Py)LM z@@?_Uy2Q-g>Xh<&%C6xcZ${V;Xsv_;Mvxeq7mRmi71dE6qXv=66238S^=x7F?Z5Ye z7i0)}BLK2my)*Dat5wA*V+A{!y_JOsfHRHtFz(xI3szE7F=a>6Q7-Q&EV6du5$yf` z0u3mCbgz759V;mX;TD(z)Wfey=@@u-ho0XSZZQsq7I*J^l`_qToacD}qwldbD-5^ z(y?mVv99SERJ$XhPs)n2%T|iG>X72~b6&rHk-3j*f3#p0zq}Ls-<@#%Kcyw8D63~> z#Plms{oGqa^ctJ51(ejBH*(nQWQ8rs9LtNy7yC`}iX0rdKL!76R3aiSrGBoQiHEj(O=!%TX{Z@VXd zL#CaCW54kPhC$Yck6g5TfjIPUD-VsEBXQlu!Snm_=@VJjs3MR@2ESocE7-atNkb~= zyRa=yS5EGsbsSl0jpZl`c^#ADE7fyr?YEfDXu;n6$a0?b@$9U{hth8PL+-cKPOYo60LcR=CRLzD5uDq?{@f~$mj8vd>rpeb44|ZWfJ22p@!nW z%0D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 z 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%0AHE>dpfQ};p;(Lv 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 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 1ddc4fd4b7..c3cab11772 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,18 +161,54 @@ 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; - try { - JSONObject data = new JSONObject(); - String enteredBy = SP.getString("careportal_enteredby", ""); - if (!enteredBy.equals("")) data.put("enteredBy", enteredBy); - data.put("created_at", DateUtil.toISOString(date)); - data.put("eventType", CareportalEvent.NOTE); - data.put("notes", MainApp.instance().getString(getAlertText(alertType))); - NSUpload.uploadCareportalEntryToNS(data); - } catch (JSONException e) { - e.printStackTrace(); + logNote(date, MainApp.instance().getString(getAlertText(alertType))); + } + } + + void processPumpStatusChangedIntent(Intent intent) { + Date newStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME); + if (SP.getBoolean("insight_automatic_careportal_events", false)) { + String newStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_NEW_STATUS); + switch (newStatus) { + case "STARTED": + logNote(newStatusTime, MainApp.instance().getString(R.string.pump_started)); + break; + case "STOPPED": + logNote(newStatusTime, MainApp.instance().getString(R.string.pump_stopped)); + break; + case "PAUSED": + logNote(newStatusTime, MainApp.instance().getString(R.string.pump_paused)); + break; } } + if (intent.hasExtra(HistoryBroadcast.EXTRA_OLD_STATUS_TIME)) { + String oldStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_OLD_STATUS); + if (oldStatus.equals("STOPPED") ||oldStatus.equals("PAUSED")) { + Date oldStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_OLD_STATUS_TIME); + int duration = (int) ((newStatusTime.getTime() - oldStatusTime.getTime()) / 60000); + + long serialNumber = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER)); + long recordId = intent.getLongExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1); + long uniqueRecordId = getRecordUniqueID(serialNumber, recordId); + + logAdapter.createTBRrecord(oldStatusTime, 0, duration, uniqueRecordId); + } + } + } + + private void logNote(Date date, String note) { + try { + if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return; + JSONObject data = new JSONObject(); + String enteredBy = SP.getString("careportal_enteredby", ""); + if (!enteredBy.equals("")) data.put("enteredBy", enteredBy); + data.put("created_at", DateUtil.toISOString(date)); + data.put("eventType", CareportalEvent.NOTE); + data.put("notes", note); + NSUpload.uploadCareportalEntryToNS(data); + } catch (JSONException e) { + e.printStackTrace(); + } } private int getAlertText(String type) { 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 0e254e3341..efce8d7a40 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 @@ -47,6 +47,7 @@ public class HistoryReceiver { filter.addAction(ACTION_CARTRIDGE_INSERTED); filter.addAction(ACTION_BATTERY_INSERTED); filter.addAction(ACTION_OCCURENCE_OF_ALERT); + filter.addAction(ACTION_PUMP_STATUS_CHANGED); MainApp.instance().registerReceiver(historyReceiver, filter); } @@ -108,6 +109,9 @@ public class HistoryReceiver { case ACTION_OCCURENCE_OF_ALERT: intentAdapter.processOccurenceOfAlertIntent(intent); break; + case ACTION_PUMP_STATUS_CHANGED: + intentAdapter.processPumpStatusChangedIntent(intent); + break; } } }; diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a07ec4b40c..19783b9c08 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -735,4 +735,7 @@ Zeit/Datum des abgegebenen Boluses auf der Pumpe erscheint falsch, IOB ist wahrscheinlich nicht korrekt. Bitte prüfe Zeit/Datum der Pumpe. Anzahl TBRs Anzahl Boluse + Pumpe gestoppt + Pumpe pausiert + Pumpe gestartet diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index abdb0e1160..4776691fdd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -995,4 +995,7 @@ openapsmb_max_iob Maximum total IOB OpenAPS can\'t go over [U] This value is called Max IOB in OpenAPS context\nOpenAPS will not add more insulin if current IOB is greater than this value + Pump stopped + Pump paused + Pump started From 7c971197c77aab8087c734341c5e2b7de2c60e42 Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Sat, 21 Apr 2018 23:29:23 +0200 Subject: [PATCH 033/152] Swapped pump started and paused strings inadvertently --- app/src/main/res/values-de/strings.xml | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 19783b9c08..2f51b46c1f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -736,6 +736,6 @@ Anzahl TBRs Anzahl Boluse Pumpe gestoppt - Pumpe pausiert - Pumpe gestartet + Pumpe gestartet + Pumpe pausiert diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4cb737b3f4..cce0d0d716 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1000,8 +1000,8 @@ Maximum total IOB OpenAPS can\'t go over [U] This value is called Max IOB in OpenAPS context\nOpenAPS will not add more insulin if current IOB is greater than this value Pump stopped - Pump paused - Pump started + Pump started + Pump paused Meal max absorption time [h] Time at which any meal is considered absorbed. Remaining carbs will be cut off. Time From 89a29d150ffe53903d5172093732a1160a7bf058 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Sun, 22 Apr 2018 00:08:41 +0200 Subject: [PATCH 034/152] Fix delay in COB calculation. --- .../plugins/IobCobCalculator/IobCobThread.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) 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 c4309ce2f1..c37730b227 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 @@ -34,6 +34,8 @@ import info.nightscout.utils.DateUtil; import info.nightscout.utils.FabricPrivacy; import info.nightscout.utils.SP; +import static info.nightscout.utils.DateUtil.now; + /** * Created by mike on 23.01.2018. */ @@ -76,24 +78,22 @@ public class IobCobThread extends Thread { } //log.debug("Locking calculateSensitivityData"); - Object dataLock = iobCobCalculatorPlugin.dataLock; - long oldestTimeWithData = iobCobCalculatorPlugin.oldestDataAvailable(); - synchronized (dataLock) { + synchronized (iobCobCalculatorPlugin.dataLock) { if (bgDataReload) { iobCobCalculatorPlugin.loadBgData(start); iobCobCalculatorPlugin.createBucketedData(); } List bucketed_data = iobCobCalculatorPlugin.getBucketedData(); - LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable(); + LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable(); if (bucketed_data == null || bucketed_data.size() < 3) { log.debug("Aborting calculation thread (No bucketed data available): " + from); return; } - long prevDataTime = iobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date); + long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date); log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString()); AutosensData previous = autosensDataTable.get(prevDataTime); // start from oldest to be able sub cob @@ -107,10 +107,9 @@ public class IobCobThread extends Thread { } // check if data already exists long bgTime = bucketed_data.get(i).date; - bgTime = iobCobCalculatorPlugin.roundUpTime(bgTime); - if (bgTime > System.currentTimeMillis()) + bgTime = IobCobCalculatorPlugin.roundUpTime(bgTime); + if (bgTime > IobCobCalculatorPlugin.roundUpTime(now())) continue; - Profile profile = MainApp.getConfigBuilder().getProfile(bgTime); AutosensData existing; if ((existing = autosensDataTable.get(bgTime)) != null) { @@ -118,6 +117,7 @@ public class IobCobThread extends Thread { continue; } + Profile profile = MainApp.getConfigBuilder().getProfile(bgTime); if (profile == null) { log.debug("Aborting calculation thread (no profile): " + from); return; // profile not set yet @@ -161,7 +161,7 @@ public class IobCobThread extends Thread { // https://github.com/openaps/oref0/blob/master/lib/determine-basal/cob-autosens.js#L169 if (i < bucketed_data.size() - 16) { // we need 1h of data to calculate minDeviationSlope long hourago = bgTime + 10 * 1000 - 60 * 60 * 1000L; - AutosensData hourAgoData = iobCobCalculatorPlugin.getAutosensData(hourago); + AutosensData hourAgoData = IobCobCalculatorPlugin.getPlugin().getAutosensData(hourago); if (hourAgoData != null) { int initialIndex = autosensDataTable.indexOfKey(hourAgoData.time); if (Config.logAutosensData) From 2844be85b5ccf1150ce98d7c881bd943d1320b6f Mon Sep 17 00:00:00 2001 From: TebbeUbben Date: Sun, 22 Apr 2018 13:44:12 +0200 Subject: [PATCH 035/152] Don't create TBR record when pump has been paused --- .../plugins/PumpInsight/history/HistoryIntentAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c3cab11772..244537af3e 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 @@ -183,7 +183,7 @@ class HistoryIntentAdapter { } if (intent.hasExtra(HistoryBroadcast.EXTRA_OLD_STATUS_TIME)) { String oldStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_OLD_STATUS); - if (oldStatus.equals("STOPPED") ||oldStatus.equals("PAUSED")) { + if (oldStatus.equals("STOPPED")) { Date oldStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_OLD_STATUS_TIME); int duration = (int) ((newStatusTime.getTime() - oldStatusTime.getTime()) / 60000); From 6851adbfd3d31aa9b6ee2689d3da26b12efe6c68 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 22 Apr 2018 18:24:06 +0200 Subject: [PATCH 036/152] NSClient connection settings --- app/src/main/AndroidManifest.xml | 11 ++- .../androidaps/events/EventNetworkChange.java | 10 +++ .../NSClientInternal/NSClientPlugin.java | 44 +++++++++++- .../services/NSClientService.java | 7 +- .../receivers/NetworkChangeReceiver.java | 67 +++++++++++++++++++ app/src/main/res/values/strings.xml | 8 +++ .../main/res/xml/pref_nsclientinternal.xml | 22 +++++- 7 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java create mode 100644 app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e8ed6a2f7f..ca4bff0dd5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,9 +15,10 @@ - + + @@ -112,6 +113,14 @@ + + + + + + + + Second carbs increment Third carbs increment CGM + ns_wifionly + ns_wifi_ssids + ns_allowroaming + Use WiFi connection only + WiFi SSID + 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 d1e09a563d..0567885a2c 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -85,7 +85,27 @@ - + + + + + + + + + + + Date: Sun, 22 Apr 2018 19:48:56 +0200 Subject: [PATCH 037/152] Change headertext label size from large to medium --- app/src/main/res/layout/overview_newcarbs_dialog.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/overview_newcarbs_dialog.xml b/app/src/main/res/layout/overview_newcarbs_dialog.xml index 8d0a12e5d2..dff7dabf15 100644 --- a/app/src/main/res/layout/overview_newcarbs_dialog.xml +++ b/app/src/main/res/layout/overview_newcarbs_dialog.xml @@ -41,7 +41,7 @@ android:paddingTop="10dp" android:text="@string/carbs" android:textAlignment="center" - android:textAppearance="?android:attr/textAppearanceLarge" + android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="@color/colorCarbsButton" /> From 47770e9c6c6d4b1bc317121b785e92fd265c1083 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Sun, 22 Apr 2018 21:31:53 +0200 Subject: [PATCH 038/152] Overview: hide ext. bolus line if none running; spacings, alignments. --- .../androidaps/plugins/Overview/OverviewFragment.java | 2 +- app/src/main/res/layout/overview_fragment.xml | 9 +-------- 2 files changed, 2 insertions(+), 9 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 8f00c18d75..40c62d21b3 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 @@ -1174,7 +1174,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, extendedBolusView.setText(extendedBolusText); } if (extendedBolusText.equals("")) - extendedBolusView.setVisibility(View.INVISIBLE); + extendedBolusView.setVisibility(View.GONE); else extendedBolusView.setVisibility(View.VISIBLE); } diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml index a2fbf07874..db1ad49b69 100644 --- a/app/src/main/res/layout/overview_fragment.xml +++ b/app/src/main/res/layout/overview_fragment.xml @@ -163,19 +163,13 @@ android:id="@+id/overview_runningtemp" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="right" android:textAppearance="?android:attr/textAppearanceSmall" android:textStyle="normal|bold" /> - - @@ -193,8 +187,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:orientation="horizontal" - android:paddingTop="5dp"> + android:orientation="horizontal"> Date: Sun, 22 Apr 2018 21:43:31 +0200 Subject: [PATCH 039/152] Disable roaming (pref) when wifi-only is enabled. --- .../androidaps/plugins/NSClientInternal/NSClientPlugin.java | 2 +- app/src/main/res/xml/pref_nsclientinternal.xml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) 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..0525a3a9dd 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 @@ -135,7 +135,7 @@ public class NSClientPlugin extends PluginBase { public void onStatusEvent(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 allowRoaming = SP.getBoolean(R.string.key_ns_allowroaming, true) && !wifiOnly; boolean newAllowedState = true; diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml index 0567885a2c..3a7dc91d4b 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -90,6 +90,7 @@ From c15a4b5efe9cc14da486269113c14fea036e9d51 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 23 Apr 2018 15:24:32 +0200 Subject: [PATCH 040/152] fix wrong error dialog when only carbs are delivered (R,KoreanR) --- .../plugins/PumpDanaR/DanaRPlugin.java | 2 +- .../services/DanaRExecutionService.java | 142 +++++++++--------- .../PumpDanaRKorean/DanaRKoreanPlugin.java | 2 +- .../services/DanaRKoreanExecutionService.java | 38 ++--- .../queue/commands/CommandBolus.java | 3 +- 5 files changed, 96 insertions(+), 91 deletions(-) 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 280d37c273..7a91437f17 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 @@ -72,7 +72,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { pumpDescription.isRefillingCapable = true; - pumpDescription.storesCarbInfo = true; + pumpDescription.storesCarbInfo = false; pumpDescription.supportsTDDs = true; pumpDescription.needsManualTDDLoad = true; 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 bee8dd1662..944931569b 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 @@ -264,80 +264,82 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ mSerialIOThread.sendMessage(new MsgSetCarbsEntry(carbtime, carbs)); } - MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables - long bolusStart = System.currentTimeMillis(); + if (amount > 0) { + MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables + long bolusStart = System.currentTimeMillis(); - if (!stop.stopped) { - mSerialIOThread.sendMessage(start); - } else { - t.insulin = 0d; - return false; - } - while (!stop.stopped && !start.failed) { - SystemClock.sleep(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm - stop.stopped = true; - stop.forced = true; - log.debug("Communication stopped"); + if (!stop.stopped) { + mSerialIOThread.sendMessage(start); + } else { + t.insulin = 0d; + return false; } - } - SystemClock.sleep(300); - - EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.t = t; - bolusingEvent.percent = 99; - - mBolusingTreatment = null; - - int speed = 12; - switch (preferencesSpeed) { - case 0: - speed = 12; - break; - case 1: - speed = 30; - break; - case 2: - speed = 60; - break; - } - // try to find real amount if bolusing was interrupted or comm failed - if (t.insulin != amount) { - disconnect("bolusingInterrupted"); - long bolusDurationInMSec = (long) (amount * speed * 1000); - long expectedEnd = bolusStart + bolusDurationInMSec + 3000; - - while (System.currentTimeMillis() < expectedEnd) { - long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); - MainApp.bus().post(bolusingEvent); - SystemClock.sleep(1000); - } - - final Object o = new Object(); - synchronized(o) { - ConfigBuilderPlugin.getCommandQueue().independentConnect("bolusingInterrupted", new Callback() { - @Override - public void run() { - if (mDanaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old - t.insulin = mDanaRPump.lastBolusAmount; - log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount); - } else { - log.debug("Bolus amount in history too old: " + mDanaRPump.lastBolusTime.toLocaleString()); - } - synchronized (o) { - o.notify(); - } - } - }); - try { - o.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); + while (!stop.stopped && !start.failed) { + SystemClock.sleep(100); + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm + stop.stopped = true; + stop.forced = true; + log.debug("Communication stopped"); } } - } else { - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + SystemClock.sleep(300); + + EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); + bolusingEvent.t = t; + bolusingEvent.percent = 99; + + mBolusingTreatment = null; + + int speed = 12; + switch (preferencesSpeed) { + case 0: + speed = 12; + break; + case 1: + speed = 30; + break; + case 2: + speed = 60; + break; + } + // try to find real amount if bolusing was interrupted or comm failed + if (t.insulin != amount) { + disconnect("bolusingInterrupted"); + long bolusDurationInMSec = (long) (amount * speed * 1000); + long expectedEnd = bolusStart + bolusDurationInMSec + 3000; + + while (System.currentTimeMillis() < expectedEnd) { + long waitTime = expectedEnd - System.currentTimeMillis(); + bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + MainApp.bus().post(bolusingEvent); + SystemClock.sleep(1000); + } + + final Object o = new Object(); + synchronized (o) { + ConfigBuilderPlugin.getCommandQueue().independentConnect("bolusingInterrupted", new Callback() { + @Override + public void run() { + if (mDanaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old + t.insulin = mDanaRPump.lastBolusAmount; + log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount); + } else { + log.debug("Bolus amount in history too old: " + mDanaRPump.lastBolusTime.toLocaleString()); + } + synchronized (o) { + o.notify(); + } + } + }); + try { + o.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } else { + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + } } return !start.failed; } 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 f2150ebb7d..03d60ad605 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 @@ -73,7 +73,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { pumpDescription.isRefillingCapable = true; - pumpDescription.storesCarbInfo = true; + pumpDescription.storesCarbInfo = false; pumpDescription.supportsTDDs = true; pumpDescription.needsManualTDDLoad = true; 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 2619453df7..106074ca3c 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 @@ -264,27 +264,29 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSetCarbsEntry(carbtime, carbs)); } - MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables - long bolusStart = System.currentTimeMillis(); + if (amount > 0) { + MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables + long bolusStart = System.currentTimeMillis(); - if (!stop.stopped) { - mSerialIOThread.sendMessage(start); - } else { - t.insulin = 0d; - return false; - } - while (!stop.stopped && !start.failed) { - SystemClock.sleep(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm - stop.stopped = true; - stop.forced = true; - log.debug("Communication stopped"); + if (!stop.stopped) { + mSerialIOThread.sendMessage(start); + } else { + t.insulin = 0d; + return false; } - } - SystemClock.sleep(300); + while (!stop.stopped && !start.failed) { + SystemClock.sleep(100); + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm + stop.stopped = true; + stop.forced = true; + log.debug("Communication stopped"); + } + } + SystemClock.sleep(300); - mBolusingTreatment = null; - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + mBolusingTreatment = null; + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + } return !start.failed; } diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java index cab7d23311..2be3831ace 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java @@ -34,6 +34,7 @@ public class CommandBolus extends Command { } public String status() { - return "BOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U"; + return (detailedBolusInfo.insulin > 0 ? "BOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U " : "") + + (detailedBolusInfo.carbs > 0 ? "CARBS " + DecimalFormatter.to0Decimal(detailedBolusInfo.carbs) + "g" : "" ); } } From c490499d03f922d5da2c37ff85a8e3e23d321d54 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 24 Apr 2018 00:11:52 +0200 Subject: [PATCH 041/152] preferences cleanup --- .../androidaps/PreferencesActivity.java | 6 +- .../DetermineBasalAdapterAMAJS.java | 4 +- .../OpenAPSMA/DetermineBasalAdapterMAJS.java | 3 +- .../DetermineBasalAdapterSMBJS.java | 4 +- .../SensitivityAAPSPlugin.java | 4 +- .../SensitivityOref0Plugin.java | 4 +- .../SensitivityWeightedAveragePlugin.java | 4 +- .../plugins/Treatments/TreatmentsPlugin.java | 2 +- app/src/main/res/values/strings.xml | 15 ++- app/src/main/res/xml/pref_absorption_aaps.xml | 64 ++++++++--- .../main/res/xml/pref_absorption_oref0.xml | 66 ++++++++--- app/src/main/res/xml/pref_advanced.xml | 106 ------------------ app/src/main/res/xml/pref_danar.xml | 27 +++-- app/src/main/res/xml/pref_danarkorean.xml | 25 ++++- app/src/main/res/xml/pref_danars.xml | 38 +++++-- app/src/main/res/xml/pref_danarv2.xml | 18 ++- app/src/main/res/xml/pref_datachoices.xml | 22 ++++ app/src/main/res/xml/pref_insightpump.xml | 62 ++++++---- app/src/main/res/xml/pref_openapsama.xml | 66 ++++++++++- app/src/main/res/xml/pref_openapsma.xml | 39 ++++++- app/src/main/res/xml/pref_openapssmb.xml | 80 ++++++++++--- 21 files changed, 440 insertions(+), 219 deletions(-) delete mode 100644 app/src/main/res/xml/pref_advanced.xml create mode 100644 app/src/main/res/xml/pref_datachoices.xml diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index a59a22e965..014dfcd863 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -23,10 +23,12 @@ import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin; import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; import info.nightscout.androidaps.plugins.OpenAPSMA.OpenAPSMAPlugin; import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin; +import info.nightscout.androidaps.plugins.PumpCombo.ComboPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; 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.PumpVirtual.VirtualPumpPlugin; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityOref0.SensitivityOref0Plugin; @@ -156,6 +158,8 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre addPreferencesFromResourceIfEnabled(DanaRKoreanPlugin.getPlugin(), PluginType.PUMP); addPreferencesFromResourceIfEnabled(DanaRv2Plugin.getPlugin(), PluginType.PUMP); addPreferencesFromResourceIfEnabled(DanaRSPlugin.getPlugin(), PluginType.PUMP); + addPreferencesFromResourceIfEnabled(InsightPlugin.getPlugin(), PluginType.PUMP); + addPreferencesFromResourceIfEnabled(ComboPlugin.getPlugin(), PluginType.PUMP); if (DanaRPlugin.getPlugin().isEnabled(PluginType.PROFILE) || DanaRKoreanPlugin.getPlugin().isEnabled(PluginType.PROFILE) @@ -177,7 +181,7 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre if (!Config.NSCLIENT && !Config.G5UPLOADER) { addPreferencesFromResource(R.xml.pref_others); } - addPreferencesFromResource(R.xml.pref_advanced); + addPreferencesFromResource(R.xml.pref_datachoices); addPreferencesFromResourceIfEnabled(WearPlugin.getPlugin(), PluginType.GENERAL); addPreferencesFromResourceIfEnabled(StatuslinePlugin.getPlugin(), PluginType.GENERAL); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index ed0fa1f0bb..4c8de10b9c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -212,7 +212,7 @@ public class DetermineBasalAdapterAMAJS { mProfile.put("skip_neutral_temps", true); mProfile.put("current_basal", basalrate); mProfile.put("temptargetSet", tempTargetSet); - mProfile.put("autosens_adjust_targets", SP.getBoolean("openapsama_autosens_adjusttargets", true)); + mProfile.put("autosens_adjust_targets", SP.getBoolean(R.string.key_openapsama_autosens_adjusttargets, true)); //align with max-absorption model in AMA sensitivity if(mealData.usedMinCarbsImpact > 0){ mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); @@ -243,7 +243,7 @@ public class DetermineBasalAdapterAMAJS { mGlucoseStatus = new JSONObject(); mGlucoseStatus.put("glucose", glucoseStatus.glucose); - if (SP.getBoolean("always_use_shortavg", false)) { + if (SP.getBoolean(R.string.key_always_use_shortavg, false)) { mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta); } else { mGlucoseStatus.put("delta", glucoseStatus.delta); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java index a56636385d..6275154450 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java @@ -18,6 +18,7 @@ import java.lang.reflect.InvocationTargetException; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; @@ -197,7 +198,7 @@ public class DetermineBasalAdapterMAJS { mGlucoseStatus = new JSONObject(); mGlucoseStatus.put("glucose", glucoseStatus.glucose); - if (SP.getBoolean("always_use_shortavg", false)) { + if (SP.getBoolean(R.string.key_always_use_shortavg, false)) { mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta); } else { mGlucoseStatus.put("delta", glucoseStatus.delta); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java index 0c665c7f9f..0d1cf1cca8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java @@ -262,7 +262,7 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("current_basal", basalrate); mProfile.put("temptargetSet", tempTargetSet); - mProfile.put("autosens_max", SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + mProfile.put("autosens_max", SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (units.equals(Constants.MMOL)) { mProfile.put("out_units", "mmol/L"); @@ -288,7 +288,7 @@ public class DetermineBasalAdapterSMBJS { mGlucoseStatus = new JSONObject(); mGlucoseStatus.put("glucose", glucoseStatus.glucose); - if (SP.getBoolean("always_use_shortavg", false)) { + if (SP.getBoolean(R.string.key_always_use_shortavg, false)) { mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta); } else { mGlucoseStatus.put("delta", glucoseStatus.delta); 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 0725823ac9..28c4192f99 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 @@ -139,8 +139,8 @@ public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInte log.debug(sensResult); double rawRatio = ratio; - ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); - ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7"))); + ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (ratio != rawRatio) { ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java index 3e9cc2cf9e..15be72880d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java @@ -150,8 +150,8 @@ public class SensitivityOref0Plugin extends PluginBase implements SensitivityInt ratio = 1 + (basalOff / profile.getMaxDailyBasal()); double rawRatio = ratio; - ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); - ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7"))); + ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (ratio != rawRatio) { ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio; 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 4066b1edfb..2f59769f55 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 @@ -159,8 +159,8 @@ public class SensitivityWeightedAveragePlugin extends PluginBase implements Sens log.debug(sensResult); double rawRatio = ratio; - ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); - ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7"))); + ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (ratio != rawRatio) { ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio; 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 bc5f4a7835..209fee9c57 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 @@ -181,7 +181,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface // instead of dividing the DIA that only worked on the bilinear curves, // multiply the time the treatment is seen active. long timeSinceTreatment = time - t.date; - long snoozeTime = t.date + (long) (timeSinceTreatment * SP.getDouble("openapsama_bolussnooze_dia_divisor", 2.0)); + long snoozeTime = t.date + (long) (timeSinceTreatment * SP.getDouble(R.string.key_openapsama_bolussnooze_dia_divisor, 2.0)); Iob bIOB = t.iobCalc(snoozeTime, dia); total.bolussnooze += bIOB.iobContrib; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 551d5b8e6a..e384efc072 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -432,13 +432,14 @@ Profile Default value: 3 This is a key OpenAPS safety cap. What this does is limit your basals to be 3x (in this people) your biggest basal rate. You likely will not need to change this, but you should be aware that’s what is discussed about “3x max daily; 4x current” for safety caps. Default value: 4 This is the other half of the key OpenAPS safety caps, and the other half of “3x max daily; 4x current” of the safety caps. This means your basal, regardless of max basal set on your pump, cannot be any higher than this number times the current level of your basal. This is to prevent people from getting into dangerous territory by setting excessively high max basals before understanding how the algorithm works. Again, the default is 4x; most people will never need to adjust this and are instead more likely to need to adjust other settings if they feel like they are “running into” this safety cap. - autosens_max + autosens_max Default value: 1.2\nThis is a multiplier cap for autosens (and soon autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target. - autosens_min + autosens_min Default value: 0.7\nThe other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets. - autosens_adjust_targets + autosens_adjust_targets + Autosens adjust targets too Default value: true\nThis is used to allow autosens to adjust BG targets, in addition to ISF and basals. - bolussnooze_dia_divisor + bolussnooze_dia_divisor Default value: 2\nBolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2). min_5m_carbimpact Default value: 3.0 This is a setting for default carb absorption impact per 5 minutes. The default is an expected 3mg/dl/5min. This affects how fast COB are decayed, and how much carb absorption is assumed in calculating future predicted BG, when BG is falling more than expected, or not rising as much as expected. @@ -1024,4 +1025,10 @@ Connection settings Allowed SSIDs (semicolon separated) Allow connection in roaming + always_use_shortavg + Max autosens ratio + Min autosens ratio + Bolus snooze dia divisor + Max daily safety multiplier + Current basal safety multiplier diff --git a/app/src/main/res/xml/pref_absorption_aaps.xml b/app/src/main/res/xml/pref_absorption_aaps.xml index e5dab3128e..6996f27aaf 100644 --- a/app/src/main/res/xml/pref_absorption_aaps.xml +++ b/app/src/main/res/xml/pref_absorption_aaps.xml @@ -1,26 +1,25 @@ + - + + + android:title="@string/openapsama_autosens_period" + validate:maxNumber="24" + validate:minNumber="4" + validate:testType="numericRange" /> + + + + + + + + + diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml index 4c3b11d283..d951366d27 100644 --- a/app/src/main/res/xml/pref_absorption_oref0.xml +++ b/app/src/main/res/xml/pref_absorption_oref0.xml @@ -1,34 +1,68 @@ + + + validate:floatmaxNumber="12.0" + validate:floatminNumber="0.1" + validate:testType="floatNumericRange" /> + android:digits="0123456789.," + android:inputType="number" + android:key="@string/key_absorption_cutoff" + android:maxLines="20" + android:selectAllOnFocus="true" + android:title="@string/absorption_cutoff_title" + validate:maxNumber="10" + validate:minNumber="4" + validate:testType="numericRange" /> + + + + + + + + + diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml deleted file mode 100644 index 1ca031a94e..0000000000 --- a/app/src/main/res/xml/pref_advanced.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/xml/pref_danar.xml b/app/src/main/res/xml/pref_danar.xml index 51c5003ec9..d7b321bbaa 100644 --- a/app/src/main/res/xml/pref_danar.xml +++ b/app/src/main/res/xml/pref_danar.xml @@ -1,7 +1,7 @@ + - + android:title="@string/danar_password_title"/> + android:entryValues="@array/danaSpeedValues" + android:key="@string/key_danars_bolusspeed" + android:title="@string/bolusspeed" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_danarkorean.xml b/app/src/main/res/xml/pref_danarkorean.xml index e57a211a16..d902f23bfd 100644 --- a/app/src/main/res/xml/pref_danarkorean.xml +++ b/app/src/main/res/xml/pref_danarkorean.xml @@ -1,27 +1,44 @@ + + - + android:title="@string/danar_password_title" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_danars.xml b/app/src/main/res/xml/pref_danars.xml index 6513ba4290..ec85bfd523 100644 --- a/app/src/main/res/xml/pref_danars.xml +++ b/app/src/main/res/xml/pref_danars.xml @@ -1,33 +1,47 @@ - + + - + + android:selectable="false" + android:summary="" + android:title="@string/selectedpump" /> - + android:title="@string/danar_password_title"/> + android:entryValues="@array/danaSpeedValues" + android:key="@string/key_danars_bolusspeed" + android:title="@string/bolusspeed" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_danarv2.xml b/app/src/main/res/xml/pref_danarv2.xml index 45906e8615..a5c1254275 100644 --- a/app/src/main/res/xml/pref_danarv2.xml +++ b/app/src/main/res/xml/pref_danarv2.xml @@ -1,7 +1,7 @@ + + android:title="@string/danar_password_title" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_datachoices.xml b/app/src/main/res/xml/pref_datachoices.xml new file mode 100644 index 0000000000..692a67b070 --- /dev/null +++ b/app/src/main/res/xml/pref_datachoices.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/pref_insightpump.xml b/app/src/main/res/xml/pref_insightpump.xml index aee9976391..ead03ec31f 100644 --- a/app/src/main/res/xml/pref_insightpump.xml +++ b/app/src/main/res/xml/pref_insightpump.xml @@ -1,27 +1,47 @@ + + + + + + + + + + + + + + + + + + + + - - - - + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_openapsama.xml b/app/src/main/res/xml/pref_openapsama.xml index 944f057919..aac00aee60 100644 --- a/app/src/main/res/xml/pref_openapsama.xml +++ b/app/src/main/res/xml/pref_openapsama.xml @@ -7,26 +7,86 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_openapsma.xml b/app/src/main/res/xml/pref_openapsma.xml index 79393f614a..f5492ad590 100644 --- a/app/src/main/res/xml/pref_openapsma.xml +++ b/app/src/main/res/xml/pref_openapsma.xml @@ -1,20 +1,53 @@ - + + + + + + + + + + + + + + + \ 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 1bdad6392c..c2eee2bc62 100644 --- a/app/src/main/res/xml/pref_openapssmb.xml +++ b/app/src/main/res/xml/pref_openapssmb.xml @@ -4,57 +4,67 @@ + + + + + + android:title="@string/enablesmbwithcob" /> + + android:title="@string/enablesmbwithtemptarget" /> + + android:title="@string/enablesmbwithhightemptarget" /> + + android:title="@string/enablesmbalways" /> + + android:title="@string/enablesmbaftercarbs" /> + + + + + + + + + + + + + + + + + - \ No newline at end of file From f4bafc6260a274cec7910de1106d4b734d7de1ee Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Sun, 22 Apr 2018 19:05:39 +0200 Subject: [PATCH 042/152] Add IobCobCalculatorPlugin.getCobInfo(). --- .../androidaps/data/QuickWizardEntry.java | 14 ++++------- .../plugins/IobCobCalculator/CobInfo.java | 15 +++++++++++ .../IobCobCalculatorPlugin.java | 25 +++++++++++++++++++ .../Overview/Dialogs/WizardDialog.java | 10 +++----- .../plugins/Overview/OverviewFragment.java | 13 ++++++---- app/src/main/res/values/strings.xml | 1 + 6 files changed, 58 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java diff --git a/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java b/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java index e4cd50c490..04f297d7a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java +++ b/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java @@ -11,7 +11,7 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.TreatmentsInterface; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; +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; @@ -79,14 +79,10 @@ public class QuickWizardEntry { // COB double cob = 0d; - AutosensData autosensData; - if (_synchronized) - autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensDataSynchronized("QuickWizard COB"); - else - autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("QuickWizard COB"); - - if (autosensData != null && useCOB() == YES) { - cob = autosensData.cob; + if (useCOB() == YES) { + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(_synchronized, "QuickWizard COB"); + if (cobInfo.displayCob != null) + cob = cobInfo.displayCob; } // Temp target 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 new file mode 100644 index 0000000000..90b72132bd --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java @@ -0,0 +1,15 @@ +package info.nightscout.androidaps.plugins.IobCobCalculator; + +import android.support.annotation.Nullable; + +public class CobInfo { + /** All COB up to now, including carbs not yet processed by IobCob calculation. */ + @Nullable + public final Double displayCob; + public final double futureCarbs; + + public CobInfo(@Nullable Double displayCob, double futureCarbs) { + this.displayCob = displayCob; + this.futureCarbs = futureCarbs; + } +} 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 2241c256ac..4d2f7aa1f7 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 @@ -34,9 +34,12 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData; import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; +import static info.nightscout.utils.DateUtil.now; + /** * Created by mike on 24.04.2017. */ @@ -401,6 +404,28 @@ public class IobCobCalculatorPlugin extends PluginBase { } } + public CobInfo getCobInfo(boolean _synchronized, String reason) { + AutosensData autosensData = _synchronized ? getLastAutosensDataSynchronized(reason) : getLastAutosensData(reason); + Double displayCob = null; + double futureCarbs = 0; + long now = now(); + List treatments = TreatmentsPlugin.getPlugin().getTreatmentsFromHistory(); + + if (autosensData != null) { + displayCob = autosensData.cob; + for (Treatment treatment : treatments) { + if (IobCobCalculatorPlugin.roundUpTime(treatment.date) > autosensData.time && treatment.date < now && treatment.carbs > 0) { + displayCob += treatment.carbs; + } + } + } + for (Treatment treatment : treatments) { + if (treatment.date > now && treatment.carbs > 0) { + futureCarbs += treatment.carbs; + } + } + return new CobInfo(displayCob, futureCarbs); + } @Nullable public AutosensData getLastAutosensData(String reason) { 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 edee0c838d..2aba5e47a1 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 @@ -56,7 +56,7 @@ import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; @@ -488,11 +488,9 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com // COB Double c_cob = 0d; if (cobCheckbox.isChecked()) { - AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Wizard COB"); - - if (autosensData != null) { - c_cob = autosensData.cob; - } + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard COB"); + if (cobInfo != null) + c_cob = cobInfo.displayCob; } BolusWizard wizard = new BolusWizard(); 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 40c62d21b3..93dfc9870e 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 @@ -88,7 +88,7 @@ import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialo import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress; @@ -1283,10 +1283,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // cob if (cobView != null) { // view must not exists - String cobText = ""; - AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Overview COB"); - if (autosensData != null) - cobText = (int) autosensData.cob + " g"; + String cobText = MainApp.gs(R.string.value_unavailable_short); + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Overview COB"); + if (cobInfo.displayCob != null) { + cobText = DecimalFormatter.to0Decimal(cobInfo.displayCob); + if (cobInfo.futureCarbs > 0) + cobText += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; + } cobView.setText(cobText); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e384efc072..dd34d68d5b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1031,4 +1031,5 @@ Bolus snooze dia divisor Max daily safety multiplier Current basal safety multiplier + n/a From 60fbb1eeba85b060e0be590329e5c19849c863d0 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 24 Apr 2018 23:00:22 +0200 Subject: [PATCH 043/152] Fix another NPE. --- .../androidaps/plugins/Overview/Dialogs/WizardDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2aba5e47a1..e15c34bac8 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 @@ -489,7 +489,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com Double c_cob = 0d; if (cobCheckbox.isChecked()) { CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard COB"); - if (cobInfo != null) + if (cobInfo != null && cobInfo.displayCob != null) c_cob = cobInfo.displayCob; } From da96b2d87cbec4dfe7d9babae7d04f22ca7476d4 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Tue, 24 Apr 2018 23:07:57 +0200 Subject: [PATCH 044/152] Round up to be sure. --- .../plugins/IobCobCalculator/IobCobCalculatorPlugin.java | 3 ++- 1 file changed, 2 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 4d2f7aa1f7..fe7aded027 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 @@ -414,7 +414,8 @@ public class IobCobCalculatorPlugin extends PluginBase { if (autosensData != null) { displayCob = autosensData.cob; for (Treatment treatment : treatments) { - if (IobCobCalculatorPlugin.roundUpTime(treatment.date) > autosensData.time && treatment.date < now && treatment.carbs > 0) { + if (IobCobCalculatorPlugin.roundUpTime(treatment.date) > IobCobCalculatorPlugin.roundUpTime(autosensData.time) + && treatment.date < now && treatment.carbs > 0) { displayCob += treatment.carbs; } } From a6a4a8837dfd2ed0e3eab40c4d86aa5048294f6b Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 01:18:40 +0200 Subject: [PATCH 045/152] safety run if SMB fails --- .../androidaps/interfaces/APSInterface.java | 2 +- .../androidaps/plugins/Loop/LoopPlugin.java | 37 +++++++++++++------ .../OpenAPSAMA/OpenAPSAMAFragment.java | 2 +- .../plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 4 +- .../plugins/OpenAPSMA/OpenAPSMAFragment.java | 2 +- .../plugins/OpenAPSMA/OpenAPSMAPlugin.java | 4 +- .../DetermineBasalAdapterSMBJS.java | 10 ++--- .../OpenAPSSMB/OpenAPSSMBFragment.java | 2 +- .../plugins/OpenAPSSMB/OpenAPSSMBPlugin.java | 14 +++---- 9 files changed, 45 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java index 11c01112ba..6c47dd9d6e 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java @@ -11,5 +11,5 @@ public interface APSInterface { public APSResult getLastAPSResult(); public Date getLastAPSRun(); - public void invoke(String initiator); + public void invoke(String initiator, boolean safety); } 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 a4cf0c60ac..9806df37a0 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 @@ -9,6 +9,7 @@ import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; import android.os.Build; +import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.v4.app.NotificationCompat; @@ -253,7 +254,11 @@ public class LoopPlugin extends PluginBase { return isDisconnected; } - public void invoke(String initiator, boolean allowNotification) { + public void invoke(String initiator, boolean allowNotification){ + invoke(initiator, allowNotification, false); + } + + public void invoke(String initiator, boolean allowNotification, boolean safety) { try { if (Config.logFunctionCalls) log.debug("invoke from " + initiator); @@ -284,7 +289,7 @@ public class LoopPlugin extends PluginBase { APSInterface usedAPS = ConfigBuilderPlugin.getActiveAPS(); if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginType.APS)) { - usedAPS.invoke(initiator); + usedAPS.invoke(initiator, safety); result = usedAPS.getLastAPSResult(); } @@ -348,16 +353,24 @@ public class LoopPlugin extends PluginBase { if (result.enacted || result.success) { lastRun.tbrSetByPump = result; lastRun.lastEnact = lastRun.lastAPSRun; - } - MainApp.bus().post(new EventLoopUpdateGui()); - } - }); - MainApp.getConfigBuilder().applySMBRequest(resultAfterConstraints, new Callback() { - @Override - public void run() { - if (result.enacted || result.success) { - lastRun.smbSetByPump = result; - lastRun.lastEnact = lastRun.lastAPSRun; + + MainApp.getConfigBuilder().applySMBRequest(resultAfterConstraints, new Callback() { + @Override + public void run() { + //Callback is only called if a bolus was acutally requested + if (result.enacted || result.success) { + lastRun.smbSetByPump = result; + lastRun.lastEnact = lastRun.lastAPSRun; + } else { + new Thread(() -> { + SystemClock.sleep(1000); + LoopPlugin.getPlugin().invoke("safety", allowNotification, true); + }).start(); + FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run_Safety")); + } + MainApp.bus().post(new EventLoopUpdateGui()); + } + }); } MainApp.bus().post(new EventLoopUpdateGui()); } 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 9c9ad7d222..2e6bb277e6 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 @@ -72,7 +72,7 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli public void onClick(View view) { switch (view.getId()) { case R.id.openapsma_run: - OpenAPSAMAPlugin.getPlugin().invoke("OpenAPSAMA button"); + OpenAPSAMAPlugin.getPlugin().invoke("OpenAPSAMA button", false); FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_AMA_Run")); break; } 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 2789c75252..49973d6cd5 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 @@ -88,8 +88,8 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator) { - log.debug("invoke from " + initiator); + public void invoke(String initiator, boolean safety) { + log.debug("invoke from " + initiator + " safety: " + safety); lastAPSResult = null; DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS; try { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java index 6b8cb9d0aa..7360bb8b2a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java @@ -66,7 +66,7 @@ public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClic public void onClick(View view) { switch (view.getId()) { case R.id.openapsma_run: - OpenAPSMAPlugin.getPlugin().invoke("OpenAPSMA button"); + OpenAPSMAPlugin.getPlugin().invoke("OpenAPSMA button", false); FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_MA_Run")); break; } 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 0d9895bad7..45a8ea470d 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 @@ -88,8 +88,8 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator) { - log.debug("invoke from " + initiator); + public void invoke(String initiator, boolean safety) { + log.debug("invoke from " + initiator + " safety: " + safety); lastAPSResult = null; DetermineBasalAdapterMAJS determineBasalAdapterMAJS = null; try { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java index 0d1cf1cca8..da96241e61 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java @@ -214,7 +214,7 @@ public class DetermineBasalAdapterSMBJS { double autosensDataRatio, boolean tempTargetSet, boolean microBolusAllowed, - boolean smbAlwaysAllowed + boolean advancedFiltering ) throws JSONException { String units = profile.getUnits(); @@ -250,13 +250,13 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact)); } mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap); - mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false)); + mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false)&& advancedFiltering); mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable); mProfile.put("enableSMB_with_COB", SP.getBoolean(R.string.key_enableSMB_with_COB, false)); mProfile.put("enableSMB_with_temptarget", SP.getBoolean(R.string.key_enableSMB_with_temptarget, false)); mProfile.put("allowSMB_with_high_temptarget", SP.getBoolean(R.string.key_allowSMB_with_high_temptarget, false)); - mProfile.put("enableSMB_always", SP.getBoolean(R.string.key_enableSMB_always, false) && smbAlwaysAllowed); - mProfile.put("enableSMB_after_carbs", SP.getBoolean(R.string.key_enableSMB_after_carbs, false) && smbAlwaysAllowed); + mProfile.put("enableSMB_always", SP.getBoolean(R.string.key_enableSMB_always, false) && advancedFiltering); + mProfile.put("enableSMB_after_carbs", SP.getBoolean(R.string.key_enableSMB_after_carbs, false) && advancedFiltering); mProfile.put("maxSMBBasalMinutes", SP.getInt("key_smbmaxminutes", SMBDefaults.maxSMBBasalMinutes)); mProfile.put("carbsReqThreshold", SMBDefaults.carbsReqThreshold); @@ -315,7 +315,7 @@ public class DetermineBasalAdapterSMBJS { mAutosensData.put("ratio", 1.0); } mMicrobolusAllowed = microBolusAllowed; - mSMBAlwaysAllowed = smbAlwaysAllowed; + mSMBAlwaysAllowed = advancedFiltering; } 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 c35e229354..7780fcc9b4 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 @@ -66,7 +66,7 @@ public class OpenAPSSMBFragment extends SubscriberFragment { @OnClick(R.id.openapsma_run) public void onRunClick() { - OpenAPSSMBPlugin.getPlugin().invoke("OpenAPSSMB button"); + OpenAPSSMBPlugin.getPlugin().invoke("OpenAPSSMB button", false); FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_SMB_Run")); } 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 60b516fc63..11fe65a082 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 @@ -91,8 +91,8 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator) { - log.debug("invoke from " + initiator); + public void invoke(String initiator, boolean safety) { + log.debug("invoke from " + initiator + " safety: " + safety); lastAPSResult = null; DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = null; try { @@ -184,13 +184,13 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { lastAutosensResult = new AutosensResult(); } - Constraint smbAllowed = new Constraint<>(true); + Constraint smbAllowed = new Constraint<>(!safety); MainApp.getConstraintChecker().isSMBModeEnabled(smbAllowed); inputConstraints.copyReasons(smbAllowed); - Constraint smbAlwaysEnabled = new Constraint<>(true); - MainApp.getConstraintChecker().isAdvancedFilteringEnabled(smbAlwaysEnabled); - inputConstraints.copyReasons(smbAlwaysEnabled); + Constraint advancedFiltering = new Constraint<>(!safety); + MainApp.getConstraintChecker().isAdvancedFilteringEnabled(advancedFiltering); + inputConstraints.copyReasons(advancedFiltering); Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart); Profiler.log(log, "SMB data gathering", start); @@ -201,7 +201,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { lastAutosensResult.ratio, //autosensDataRatio isTempTarget, smbAllowed.value(), - smbAlwaysEnabled.value() + advancedFiltering.value() ); } catch (JSONException e) { log.error(e.getMessage()); From 2a50248ba53f483441f18ef9591df7320286a11c Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 01:37:48 +0200 Subject: [PATCH 046/152] travis re-invoke commit with cleanup --- .../java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java | 1 - 1 file changed, 1 deletion(-) 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 9806df37a0..c8737e1119 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 @@ -353,7 +353,6 @@ public class LoopPlugin extends PluginBase { if (result.enacted || result.success) { lastRun.tbrSetByPump = result; lastRun.lastEnact = lastRun.lastAPSRun; - MainApp.getConfigBuilder().applySMBRequest(resultAfterConstraints, new Callback() { @Override public void run() { From ac237509427fd87fa8a1fcab18bb1d64019d5c17 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 11:52:01 +0200 Subject: [PATCH 047/152] lastBolusTime - only treatments with insulin --- .../androidaps/plugins/Treatments/TreatmentsPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 209fee9c57..e50c88456c 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 @@ -175,7 +175,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface Iob tIOB = t.iobCalc(time, dia); total.iob += tIOB.iobContrib; total.activity += tIOB.activityContrib; - if (t.date > total.lastBolusTime) + if (t.insulin > 0 && t.date > total.lastBolusTime) total.lastBolusTime = t.date; if (!t.isSMB) { // instead of dividing the DIA that only worked on the bilinear curves, From b5a6ef2ecca1228f27f8010cb1d8d7d20d5dbc5c Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 12:15:29 +0200 Subject: [PATCH 048/152] make now part of the past --- .../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 fe7aded027..b6620b4e7c 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 @@ -415,7 +415,7 @@ public class IobCobCalculatorPlugin extends PluginBase { displayCob = autosensData.cob; for (Treatment treatment : treatments) { if (IobCobCalculatorPlugin.roundUpTime(treatment.date) > IobCobCalculatorPlugin.roundUpTime(autosensData.time) - && treatment.date < now && treatment.carbs > 0) { + && treatment.date <= now && treatment.carbs > 0) { displayCob += treatment.carbs; } } From 85bb085188b9bd4b867fc871b5d9d2cb9291ee47 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 12:51:27 +0200 Subject: [PATCH 049/152] rename safety to tempBasalFallback --- .../nightscout/androidaps/interfaces/APSInterface.java | 2 +- .../nightscout/androidaps/plugins/Loop/LoopPlugin.java | 8 ++++---- .../androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 4 ++-- .../androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java | 4 ++-- .../androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java | 8 ++++---- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java index 6c47dd9d6e..0b965d48af 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java @@ -11,5 +11,5 @@ public interface APSInterface { public APSResult getLastAPSResult(); public Date getLastAPSRun(); - public void invoke(String initiator, boolean safety); + public void invoke(String initiator, boolean tempBasalFallback); } 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 9806df37a0..694c5c841b 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 { invoke(initiator, allowNotification, false); } - public void invoke(String initiator, boolean allowNotification, boolean safety) { + public void invoke(String initiator, boolean allowNotification, boolean tempBasalFallback) { try { if (Config.logFunctionCalls) log.debug("invoke from " + initiator); @@ -289,7 +289,7 @@ public class LoopPlugin extends PluginBase { APSInterface usedAPS = ConfigBuilderPlugin.getActiveAPS(); if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginType.APS)) { - usedAPS.invoke(initiator, safety); + usedAPS.invoke(initiator, tempBasalFallback); result = usedAPS.getLastAPSResult(); } @@ -364,9 +364,9 @@ public class LoopPlugin extends PluginBase { } else { new Thread(() -> { SystemClock.sleep(1000); - LoopPlugin.getPlugin().invoke("safety", allowNotification, true); + LoopPlugin.getPlugin().invoke("tempBasalFallback", allowNotification, true); }).start(); - FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run_Safety")); + FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run_TempBasalFallback")); } MainApp.bus().post(new EventLoopUpdateGui()); } 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 49973d6cd5..d31825cc4b 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 @@ -88,8 +88,8 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator, boolean safety) { - log.debug("invoke from " + initiator + " safety: " + safety); + public void invoke(String initiator, boolean tempBasalFallback) { + log.debug("invoke from " + initiator + " safety: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS; try { 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 45a8ea470d..36e83e36e1 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 @@ -88,8 +88,8 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator, boolean safety) { - log.debug("invoke from " + initiator + " safety: " + safety); + public void invoke(String initiator, boolean tempBasalFallback) { + log.debug("invoke from " + initiator + " safety: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterMAJS determineBasalAdapterMAJS = null; try { 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 11fe65a082..c6edf60866 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 @@ -91,8 +91,8 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator, boolean safety) { - log.debug("invoke from " + initiator + " safety: " + safety); + public void invoke(String initiator, boolean tempBasalFallback) { + log.debug("invoke from " + initiator + " safety: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = null; try { @@ -184,11 +184,11 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { lastAutosensResult = new AutosensResult(); } - Constraint smbAllowed = new Constraint<>(!safety); + Constraint smbAllowed = new Constraint<>(!tempBasalFallback); MainApp.getConstraintChecker().isSMBModeEnabled(smbAllowed); inputConstraints.copyReasons(smbAllowed); - Constraint advancedFiltering = new Constraint<>(!safety); + Constraint advancedFiltering = new Constraint<>(!tempBasalFallback); MainApp.getConstraintChecker().isAdvancedFilteringEnabled(advancedFiltering); inputConstraints.copyReasons(advancedFiltering); From a14345bb1aeb7ff086206bbafb7716724b3c0f04 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 16:14:21 +0200 Subject: [PATCH 050/152] synchronized loop invoke --- .../info/nightscout/androidaps/plugins/Loop/LoopPlugin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b11634c6c9..b58a0d48a4 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 @@ -254,11 +254,11 @@ public class LoopPlugin extends PluginBase { return isDisconnected; } - public void invoke(String initiator, boolean allowNotification){ + public synchronized void invoke(String initiator, boolean allowNotification){ invoke(initiator, allowNotification, false); } - public void invoke(String initiator, boolean allowNotification, boolean tempBasalFallback) { + public synchronized void invoke(String initiator, boolean allowNotification, boolean tempBasalFallback) { try { if (Config.logFunctionCalls) log.debug("invoke from " + initiator); From e79ef7f0186c759d99b5eedc2931c4da7f0e3feb Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 16:28:54 +0200 Subject: [PATCH 051/152] always call callback on TBR-Request --- .../androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java | 3 +++ 1 file changed, 3 insertions(+) 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 06ddbef86f..df5b727749 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 @@ -417,6 +417,9 @@ public class ConfigBuilderPlugin extends PluginBase { */ public void applyTBRRequest(APSResult request, Profile profile, Callback callback) { if (!request.tempBasalRequested) { + if (callback != null) { + callback.result(new PumpEnactResult().enacted(false).success(true).comment(MainApp.gs(R.string.nochangerequested))).run(); + } return; } From 5a7408763294e1edf4bf2b11a8c2cbe14a772bf0 Mon Sep 17 00:00:00 2001 From: osodebailar Date: Wed, 25 Apr 2018 16:51:49 +0200 Subject: [PATCH 052/152] Change iob and cob color for a better uniform look. Insulin , iob etc. always in different blue colors, Cob in orange (ocher) like color --- app/src/main/res/values/colors.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 4aa21abf19..e5b645dcc6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,9 +2,9 @@ #ff00ff #00ffff - #FFFB8C00 + #1e88e5 #FFFFCC03 - #8BC34A + #FFFB8C00 #ffea00 #ff9500 #FFFFFF From 3fb17e686957190d4b007ca0fb5abff0f4b7a860 Mon Sep 17 00:00:00 2001 From: "Markus M. May" Date: Wed, 25 Apr 2018 20:49:03 +0200 Subject: [PATCH 053/152] 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 054/152] 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 b6cd56b90a5d674623b455e3d43106e466646ef1 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 23:31:15 +0200 Subject: [PATCH 055/152] cleanup logs --- .../androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 2 +- .../androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java | 2 +- .../androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 d31825cc4b..17e1dd77e9 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 @@ -89,7 +89,7 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface { @Override public void invoke(String initiator, boolean tempBasalFallback) { - log.debug("invoke from " + initiator + " safety: " + tempBasalFallback); + log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS; try { 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 36e83e36e1..00f1888851 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 @@ -89,7 +89,7 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface { @Override public void invoke(String initiator, boolean tempBasalFallback) { - log.debug("invoke from " + initiator + " safety: " + tempBasalFallback); + log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterMAJS determineBasalAdapterMAJS = null; try { 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 c6edf60866..cd7872ecb1 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 @@ -92,7 +92,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { @Override public void invoke(String initiator, boolean tempBasalFallback) { - log.debug("invoke from " + initiator + " safety: " + tempBasalFallback); + log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = null; try { From 3ec5eaea63481b4f96edf13dfad57810e69bed74 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 26 Apr 2018 00:14:51 +0200 Subject: [PATCH 056/152] don't trigger loop on treatment --- .../nightscout/androidaps/plugins/Loop/LoopPlugin.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) 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 b58a0d48a4..43d00b24af 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 @@ -130,14 +130,7 @@ public class LoopPlugin extends PluginBase { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); return pump == null || pump.getPumpDescription().isTempBasalCapable; } - - @Subscribe - public void onStatusEvent(final EventTreatmentChange ev) { - if (ev.treatment == null || !ev.treatment.isSMB) { - invoke("EventTreatmentChange", true); - } - } - + /** * This method is triggered once autosens calculation has completed, so the LoopPlugin * has current data to work with. However, autosens calculation can be triggered by multiple From 1eb2e59043deb2c62edc5f77d7cafa2101b34cd2 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Wed, 25 Apr 2018 11:52:01 +0200 Subject: [PATCH 057/152] lastBolusTime - only treatments with insulin --- .../androidaps/plugins/Treatments/TreatmentsPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 209fee9c57..e50c88456c 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 @@ -175,7 +175,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface Iob tIOB = t.iobCalc(time, dia); total.iob += tIOB.iobContrib; total.activity += tIOB.activityContrib; - if (t.date > total.lastBolusTime) + if (t.insulin > 0 && t.date > total.lastBolusTime) total.lastBolusTime = t.date; if (!t.isSMB) { // instead of dividing the DIA that only worked on the bilinear curves, From 2f846bc4171dfad0c220e7ea9d2fd234d392a6f8 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Thu, 26 Apr 2018 01:04:27 +0200 Subject: [PATCH 058/152] WatchUpdaterService: use IobCob.getCobInfo(). --- .../plugins/Wear/wearintegration/WatchUpdaterService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 a92738d336..171f37959d 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 @@ -37,6 +37,7 @@ import info.nightscout.androidaps.data.Profile; 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.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; @@ -718,9 +719,9 @@ public class WatchUpdaterService extends WearableListenerService implements private String generateCOBString() { String cobStringResult = "--"; - AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("WatcherUpdaterService"); - if (autosensData != null) { - cobStringResult = (int) autosensData.cob + "g"; + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); + if (cobInfo.displayCob != null) { + cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob) + "g"; } return cobStringResult; } From 8d4e9f00437a8e2cae78b2e3cb17b19677281eca Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Thu, 26 Apr 2018 01:16:31 +0200 Subject: [PATCH 059/152] Add future carbs on watch. --- .../plugins/Wear/wearintegration/WatchUpdaterService.java | 3 +++ 1 file changed, 3 insertions(+) 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 171f37959d..35a224c5f3 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 @@ -722,6 +722,9 @@ public class WatchUpdaterService extends WearableListenerService implements CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); if (cobInfo.displayCob != null) { cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob) + "g"; + if (cobInfo.futureCarbs > 0) { + cobStringResult += " (" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; + } } return cobStringResult; } From f3bc59003e487aad65cfd5e868e66c7d6dce9d9f Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Thu, 26 Apr 2018 01:33:09 +0200 Subject: [PATCH 060/152] Space-optimize COB on watch. --- .../plugins/Wear/wearintegration/WatchUpdaterService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 35a224c5f3..0d809a7bab 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 @@ -721,10 +721,11 @@ public class WatchUpdaterService extends WearableListenerService implements String cobStringResult = "--"; CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService"); if (cobInfo.displayCob != null) { - cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob) + "g"; + cobStringResult = DecimalFormatter.to0Decimal(cobInfo.displayCob); if (cobInfo.futureCarbs > 0) { - cobStringResult += " (" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; + cobStringResult += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; } + cobStringResult += "g"; } return cobStringResult; } From c045a0a41e79eb9ec361e142a0108aa19d88efe3 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 26 Apr 2018 03:13:17 +0200 Subject: [PATCH 061/152] align failoverToMinAbsorbtionRate to cobtime --- .../androidaps/plugins/IobCobCalculator/AutosensData.java | 7 ++++++- .../androidaps/plugins/Overview/graphData/GraphData.java | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) 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 ea0ce7d4cb..6a651a5a79 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 @@ -28,6 +28,10 @@ import info.nightscout.utils.SP; public class AutosensData implements DataPointWithLabelInterface { private static Logger log = LoggerFactory.getLogger(AutosensData.class); + public void setChartTime(long chartTime) { + this.chartTime = chartTime; + } + static class CarbsInPast { long time = 0L; double carbs = 0d; @@ -52,6 +56,7 @@ public class AutosensData implements DataPointWithLabelInterface { } public long time = 0L; + long chartTime; public String pastSensitivity = ""; public double deviation = 0d; boolean nonCarbsDeviation = false; @@ -121,7 +126,7 @@ public class AutosensData implements DataPointWithLabelInterface { @Override public double getX() { - return time; + return chartTime; } @Override 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 1bf59db4de..e3752a3861 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 @@ -385,6 +385,7 @@ public class GraphData { } if (autosensData.failoverToMinAbsorbtionRate) { autosensData.setScale(cobScale); + autosensData.setChartTime(time); minFailoverActiveList.add(autosensData); } } From 3356004065b8fe2b82e12a1aba7bd9c3f13f517d Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 26 Apr 2018 03:43:43 +0200 Subject: [PATCH 062/152] don't hide IOB behind COB --- .../androidaps/plugins/IobCobCalculator/AutosensData.java | 2 +- .../androidaps/plugins/Overview/graphData/GraphData.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 6a651a5a79..693a6fad55 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 @@ -156,7 +156,7 @@ public class AutosensData implements DataPointWithLabelInterface { @Override public float getSize() { - return 1f; + return 0.5f; } @Override 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 e3752a3861..25e7cb4af8 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 @@ -396,7 +396,7 @@ public class GraphData { cobData = cobArray.toArray(cobData); cobSeries = new FixedLineGraphSeries<>(cobData); cobSeries.setDrawBackground(true); - cobSeries.setBackgroundColor(0xB0FFFFFF & MainApp.gc(R.color.cob)); //50% + cobSeries.setBackgroundColor(0x80FFFFFF & MainApp.gc(R.color.cob)); //50% cobSeries.setColor(MainApp.gc(R.color.cob)); cobSeries.setThickness(3); From 9889d34512c3d5d418a9753992632d95371dace7 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 26 Apr 2018 23:59:04 +0200 Subject: [PATCH 063/152] Treat future IOB as if the current TBR was cancelled --- .../IobCobCalculatorPlugin.java | 2 +- .../plugins/Treatments/TreatmentsPlugin.java | 25 +++++++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) 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 b6620b4e7c..2081e43929 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 @@ -312,7 +312,7 @@ public class IobCobCalculatorPlugin extends PluginBase { //log.debug(">>> calculateFromTreatmentsAndTemps Cache miss " + new Date(time).toLocaleString()); } IobTotal bolusIob = TreatmentsPlugin.getPlugin().getCalculationToTimeTreatments(time).round(); - IobTotal basalIob = TreatmentsPlugin.getPlugin().getCalculationToTimeTempBasals(time, profile).round(); + IobTotal basalIob = TreatmentsPlugin.getPlugin().getCalculationToTimeTempBasals(time, profile, true, now).round(); if (OpenAPSSMBPlugin.getPlugin().isEnabled(PluginType.APS)) { // Add expected zero temp basal for next 240 mins IobTotal basalIobWithZeroTemp = basalIob.copy(); 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 e50c88456c..91d8f16b44 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 @@ -338,12 +338,24 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface @Override public IobTotal getCalculationToTimeTempBasals(long time, Profile profile) { + return getCalculationToTimeTempBasals(time, profile, false, 0); + } + + public IobTotal getCalculationToTimeTempBasals(long time, Profile profile, boolean truncate, long truncateTime) { IobTotal total = new IobTotal(time); synchronized (tempBasals) { for (Integer pos = 0; pos < tempBasals.size(); pos++) { TemporaryBasal t = tempBasals.get(pos); if (t.date > time) continue; - IobTotal calc = t.iobCalc(time, profile); + IobTotal calc; + if(truncate && t.end() > truncateTime){ + TemporaryBasal dummyTemp = new TemporaryBasal(); + dummyTemp.copyFrom(t); + dummyTemp.cutEndTo(truncateTime); + calc = dummyTemp.iobCalc(time, profile); + } else { + calc = t.iobCalc(time, profile); + } //log.debug("BasalIOB " + new Date(time) + " >>> " + calc.basaliob); total.plus(calc); } @@ -354,7 +366,16 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { ExtendedBolus e = extendedBoluses.get(pos); if (e.date > time) continue; - IobTotal calc = e.iobCalc(time); + + IobTotal calc; + if(truncate && e.end() > truncateTime){ + ExtendedBolus dummyExt = new ExtendedBolus(); + dummyExt.copyFrom(e); + dummyExt.cutEndTo(truncateTime); + calc = dummyExt.iobCalc(time); + } else { + calc = e.iobCalc(time); + } totalExt.plus(calc); } } From 3631f685e2432b7a29f76b3b492aa04e3b675253 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Fri, 27 Apr 2018 00:03:08 +0200 Subject: [PATCH 064/152] cleanup --- .../androidaps/plugins/Treatments/TreatmentsPlugin.java | 1 - 1 file changed, 1 deletion(-) 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 91d8f16b44..55129cdc7b 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 @@ -366,7 +366,6 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { ExtendedBolus e = extendedBoluses.get(pos); if (e.date > time) continue; - IobTotal calc; if(truncate && e.end() > truncateTime){ ExtendedBolus dummyExt = new ExtendedBolus(); From 21f231e2b3fd38f445191895877e84f4fad5e87e Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Fri, 27 Apr 2018 16:22:26 +0200 Subject: [PATCH 065/152] Calculator: carb-only handling. If only carbs where entered/calculated, send them to the pump only if the pump supports it, otherwise just add it to the DB. --- .../plugins/Overview/OverviewFragment.java | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 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 93dfc9870e..2536e8bf5c 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 @@ -801,19 +801,23 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, detailedBolusInfo.context = context; detailedBolusInfo.boluscalc = boluscalcJSON; detailedBolusInfo.source = Source.USER; - ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, 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); + if (finalInsulinAfterConstraints > 0 || ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo) { + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, 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(detailedBolusInfo); + } FabricPrivacy.getInstance().logCustom(new CustomEvent("QuickWizard")); } } From 5746e375535082131e820b984907cf7527f34a90 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Thu, 26 Apr 2018 01:43:24 +0200 Subject: [PATCH 066/152] Enable Combo & extended carbs without engineering mode as well. --- app/src/main/java/info/nightscout/androidaps/MainApp.java | 3 +-- .../androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index b5a1878160..5456da1805 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -155,8 +155,7 @@ public class MainApp extends Application { pluginsList.add(CareportalPlugin.getPlugin()); if (Config.HWPUMPS && engineeringMode) pluginsList.add(InsightPlugin.getPlugin()); // <-- Enable Insight plugin here - if (Config.HWPUMPS && engineeringMode) - pluginsList.add(ComboPlugin.getPlugin()); // <-- Enable Combo plugin here + if (Config.HWPUMPS) pluginsList.add(ComboPlugin.getPlugin()); if (Config.MDI) pluginsList.add(MDIPlugin.getPlugin()); pluginsList.add(VirtualPumpPlugin.getPlugin()); if (Config.APS) pluginsList.add(LoopPlugin.getPlugin()); 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 d3e5986f77..5939ab5aa3 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 @@ -133,9 +133,6 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C editTime = view.findViewById(R.id.newcarbs_time); editTime.setParams(0d, -12 * 60d, 12 * 60d, 5d, new DecimalFormat("0"), false, textWatcher); - LinearLayout durationLayout = view.findViewById(R.id.newcarbs_duration_layout); - durationLayout.setVisibility(MainApp.engineeringMode ? View.VISIBLE : View.GONE); - editDuration = view.findViewById(R.id.new_carbs_duration); editDuration.setParams(0d, 0d, 10d, 1d, new DecimalFormat("0"), false, textWatcher); From 4813c9c163c26f75a6ac71a5c55fb605074515a1 Mon Sep 17 00:00:00 2001 From: Johannes Mockenhaupt Date: Fri, 27 Apr 2018 16:36:21 +0200 Subject: [PATCH 067/152] Combo: minor cleanup. --- .../androidaps/plugins/PumpCombo/ComboPlugin.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 2ba3ba782a..68db1658f6 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 @@ -151,7 +151,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint /** * Cache of the last <=2 boluses on the pump. Used to detect changes in pump history, - * requiring reading pump more history. This is read/set in {@link #checkHistory()} when changed + * requiring reading more pump history. This is read/set in {@link #checkHistory()} when changed * pump history was detected and was read, as well as in {@link #deliverBolus(DetailedBolusInfo)} * after bolus delivery. Newest record is the first one. */ @@ -326,7 +326,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint } /** - * Runs pump initializing if needed and reads the pump state from the main screen. + * Runs pump initialization if needed and reads the pump state from the main screen. */ @Override public synchronized void getPumpStatus() { @@ -442,8 +442,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint case STOPPED: event.status = MainApp.gs(R.string.bolusstopped); break; - case RECOVERING: - event.status = MainApp.gs(R.string.combo_error_bolus_recovery_progress); } event.percent = percent; MainApp.bus().post(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 068/152] 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 069/152] 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 070/152] 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 071/152] 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 072/152] 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 073/152] 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 074/152] 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 075/152] 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 076/152] 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 077/152] 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 078/152] 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 079/152] 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 080/152] 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 081/152] 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 082/152] 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 083/152] 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 084/152] 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 085/152] 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 086/152] 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 087/152] 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 088/152] 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 089/152] 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 090/152] 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 091/152] 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 092/152] 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 093/152] 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 094/152] 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 095/152] 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 096/152] 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 097/152] 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 098/152] 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 099/152] 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 100/152] 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 101/152] 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 102/152] 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 103/152] 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 104/152] 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 105/152] 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 106/152] 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 107/152] 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 108/152] 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 109/152] 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 110/152] 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 111/152] 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 112/152] 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 113/152] 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 114/152] 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 115/152] 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 116/152] 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 117/152] 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 118/152] 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 119/152] 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 120/152] 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 121/152] 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 122/152] 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 123/152] 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 124/152] 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 125/152] 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 126/152] 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 127/152] 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 128/152] 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 129/152] 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 130/152] 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 131/152] 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 132/152] 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 133/152] 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 134/152] 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 135/152] 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 136/152] 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 137/152] 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 138/152] 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 139/152] 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 36265ab1c6d413612d359c303ce9bb269659a1f4 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 3 May 2018 18:41:47 +0200 Subject: [PATCH 140/152] SWPlugin --- .../ConfigBuilder/ConfigBuilderFragment.java | 10 +- .../startupwizard/SWDefinition.java | 118 +++--------------- .../androidaps/startupwizard/SWItem.java | 3 +- .../androidaps/startupwizard/SWPlugin.java | 71 +++++++++++ .../startupwizard/SWRadioButton.java | 26 ++-- app/src/main/res/values/arrays.xml | 34 ----- 6 files changed, 106 insertions(+), 156 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java index 829a0fa4ad..fb152a4cb0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderFragment.java @@ -285,7 +285,7 @@ public class ConfigBuilderFragment extends SubscriberFragment { holder.checkboxEnabled.setEnabled(false); } - if (plugin.pluginDescription.alwayVisible) { + if (plugin.pluginDescription.alwayVisible) { holder.checkboxEnabled.setEnabled(false); } @@ -339,7 +339,7 @@ public class ConfigBuilderFragment extends SubscriberFragment { } - void onEnabledCategoryChanged(PluginBase changedPlugin, PluginType type) { + public static void processOnEnabledCategoryChanged(PluginBase changedPlugin, PluginType type) { ArrayList pluginsInCategory = null; switch (type) { // Multiple selection allowed @@ -391,10 +391,14 @@ public class ConfigBuilderFragment extends SubscriberFragment { else pluginsInCategory.get(0).setPluginEnabled(type, true); } - updateGUI(); } } + void onEnabledCategoryChanged(PluginBase changedPlugin, PluginType type) { + processOnEnabledCategoryChanged(changedPlugin, type); + updateGUI(); + } + /**** * Method for Setting the Height of the ListView dynamically. * *** Hack to fix the issue of not showing all the items of the ListView diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java index 9066361996..2d44389180 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java @@ -57,8 +57,6 @@ public class SWDefinition { if(!SP.getString(R.string.key_language, "en").equals(LocaleHelper.getLanguage(context))) { Intent intent = new Intent(MainApp.instance().getApplicationContext(), SetupWizardActivity.class); intent.putExtra("WIZZARDPAGE", 0); -// SetupWizardActivity.instance().finish(); -// SetupWizardActivity.instance().startActivity(intent); } return SP.contains(R.string.key_language);} )) @@ -79,111 +77,27 @@ public class SWDefinition { ) .add(new SWScreen(R.string.configbuilder_insulin) .skippable(false) - .add(new SWRadioButton().option(R.array.insulinArray, R.array.insulinValues).preferenceId(R.string.configbuilder_insulin).label(R.string.configbuilder_insulin).comment(R.string.configbuilder_insulin)) + .add(new SWPlugin().option(PluginType.INSULIN).label(R.string.configbuilder_insulin).comment(R.string.configbuilder_insulin)) .validator(() -> { ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.INSULIN); - ConfigBuilderPlugin configBuilder = ConfigBuilderPlugin.getPlugin(); - BgSourceInterface activeSource = configBuilder.getActiveBgSource(); - if (activeSource == null) { - activeSource = SourceNSClientPlugin.getPlugin(); - configBuilder.setPluginEnabled(PluginType.INSULIN, true); - } - // new plugin selected -> disable others - for (PluginBase p : pluginsInCategory) { - log.debug("Name is: "+ p.getClass().getSimpleName() + " setting is: "+SP.getString(R.string.configbuilder_insulin, "InsulinOrefRapidActingPlugin")); - if (p.getClass().getSimpleName().equals(SP.getString(R.string.configbuilder_insulin, "InsulinOrefRapidActingPlugin"))) { - // this is new selected - p.setPluginEnabled(PluginType.INSULIN, true); - p.setFragmentVisible(PluginType.INSULIN, true); - String settingVisible = "ConfigBuilder_" + PluginType.INSULIN.name() + "_" + p.getClass().getSimpleName() + "_Visible"; - String settingEnabled = "ConfigBuilder_" + PluginType.INSULIN.name() + "_" + p.getClass().getSimpleName() + "_Enabled"; - log.debug("Setting to: "+settingEnabled); - SP.putBoolean(settingEnabled, true); - SP.putBoolean(settingVisible, true); - } else { - String settingEnabled = "ConfigBuilder_" + PluginType.INSULIN.name() + "_" + p.getName() + "_Enabled"; - log.debug("Disable: "+settingEnabled); - p.setPluginEnabled(PluginType.INSULIN, false); - p.setFragmentVisible(PluginType.INSULIN, false); - } - } - - String settingVisible = "ConfigBuilder_" + PluginType.INSULIN.name() + "_" + SP.getString(R.string.configbuilder_insulin,"InsulinOrefRapidActingPlugin") + "_Visible"; - SP.putBoolean(settingVisible, true); - return SP.contains(R.string.configbuilder_insulin); + return pluginsInCategory != null; }) ) - .add(new SWScreen(R.string.configbuilder_aps) - .skippable(false) - .add(new SWRadioButton().option(R.array.apsArray, R.array.apsValues).preferenceId(R.string.configbuilder_aps).label(R.string.configbuilder_aps).comment(R.string.configbuilder_aps)) - .validator(() -> { - ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.APS); - ConfigBuilderPlugin configBuilder = ConfigBuilderPlugin.getPlugin(); - BgSourceInterface activeSource = configBuilder.getActiveBgSource(); - if (activeSource == null) { - activeSource = SourceNSClientPlugin.getPlugin(); - configBuilder.setPluginEnabled(PluginType.APS, true); - } - // new plugin selected -> disable others - for (PluginBase p : pluginsInCategory) { - log.debug("Name is: "+ p.getClass().getSimpleName() + " setting is: "+SP.getString(R.string.configbuilder_aps, "OpenAPSMA")); - if (p.getClass().getSimpleName().equals(SP.getString(R.string.configbuilder_aps, "OpenAPSMA"))) { - // this is new selected - p.setPluginEnabled(PluginType.APS, true); - p.setFragmentVisible(PluginType.APS, true); - String settingVisible = "ConfigBuilder_" + PluginType.APS.name() + "_" + p.getClass().getSimpleName() + "_Visible"; - String settingEnabled = "ConfigBuilder_" + PluginType.APS.name() + "_" + p.getClass().getSimpleName() + "_Enabled"; - log.debug("Setting to: "+settingEnabled); - SP.putBoolean(settingEnabled, true); - SP.putBoolean(settingVisible, true); - } else { - String settingEnabled = "ConfigBuilder_" + PluginType.APS.name() + "_" + p.getName() + "_Enabled"; - log.debug("Disable: "+settingEnabled); - p.setPluginEnabled(PluginType.APS, false); - p.setFragmentVisible(PluginType.APS, false); - } - } - - String settingVisible = "ConfigBuilder_" + PluginType.APS.name() + "_" + SP.getString(R.string.configbuilder_aps,"OpenAPSMA") + "_Visible"; - SP.putBoolean(settingVisible, true); - return SP.contains(settingVisible); - }) - ) .add(new SWScreen(R.string.configbuilder_bgsource) - .skippable(false) - .add(new SWRadioButton().option(R.array.BGSourceArray, R.array.BGSourceValues).preferenceId(R.string.configbuilder_bgsource).label(R.string.configbuilder_bgsource).comment(R.string.configbuilder_bgsource)) - .validator(() -> { - ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.BGSOURCE); - ConfigBuilderPlugin configBuilder = ConfigBuilderPlugin.getPlugin(); - BgSourceInterface activeSource = configBuilder.getActiveBgSource(); - if (activeSource == null) { - activeSource = SourceNSClientPlugin.getPlugin(); - configBuilder.setPluginEnabled(PluginType.BGSOURCE, true); - } - // new plugin selected -> disable others - for (PluginBase p : pluginsInCategory) { - log.debug("Name is: "+ p.getClass().getSimpleName() + " setting is: "+SP.getString(R.string.configbuilder_bgsource, "SourceNSClient")); - if (p.getClass().getSimpleName().equals(SP.getString(R.string.configbuilder_bgsource, "SourceNSClient"))) { - // this is new selected - p.setPluginEnabled(PluginType.BGSOURCE, true); - p.setFragmentVisible(PluginType.BGSOURCE, true); - String settingVisible = "ConfigBuilder_" + PluginType.BGSOURCE.name() + "_" + p.getClass().getSimpleName() + "_Visible"; - String settingEnabled = "ConfigBuilder_" + PluginType.BGSOURCE.name() + "_" + p.getClass().getSimpleName() + "_Enabled"; - log.debug("Setting to: "+settingEnabled); - SP.putBoolean(settingEnabled, true); - SP.putBoolean(settingVisible, true); - } else { - String settingEnabled = "ConfigBuilder_" + PluginType.BGSOURCE.name() + "_" + p.getName() + "_Enabled"; - log.debug("Disable: "+settingEnabled); - p.setPluginEnabled(PluginType.BGSOURCE, false); - p.setFragmentVisible(PluginType.BGSOURCE, false); - } - } - - String settingVisible = "ConfigBuilder_" + PluginType.BGSOURCE.name() + "_" + SP.getString(R.string.configbuilder_bgsource,"SourceNSClientPlugin") + "_Visible"; - SP.putBoolean(settingVisible, true); - return SP.contains(R.string.configbuilder_bgsource); - }) + .skippable(false) + .add(new SWPlugin().option(PluginType.BGSOURCE).label(R.string.configbuilder_bgsource).comment(R.string.configbuilder_bgsource)) + .validator(() -> { + ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.BGSOURCE); + return pluginsInCategory != null; + }) + ) + .add(new SWScreen(R.string.configbuilder_aps) + .skippable(false) + .add(new SWPlugin().option(PluginType.APS).label(R.string.configbuilder_aps).comment(R.string.configbuilder_aps)) + .validator(() -> { + ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.APS); + return pluginsInCategory != null; + }) ) ; } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java index d0bccd11e0..fb5d1dc34e 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java @@ -22,7 +22,8 @@ public class SWItem { NUMBER, DECIMALNUMBER, CHECKBOX, - RADIOBUTTON + RADIOBUTTON, + PLUGIN } Type type; diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java new file mode 100644 index 0000000000..50ecfa5197 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java @@ -0,0 +1,71 @@ +package info.nightscout.androidaps.startupwizard; + +import android.content.Context; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.events.EventConfigBuilderChange; +import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; + +public class SWPlugin extends SWItem { + private static Logger log = LoggerFactory.getLogger(SWPlugin.class); + + private PluginType pType; + private RadioGroup radioGroup; + + public SWPlugin() { + super(Type.PLUGIN); + } + + public SWPlugin option(PluginType pType) { + this.pType = pType; + return this; + } + + @Override + public void generateDialog(View view, LinearLayout layout) { + Context context = view.getContext(); + radioGroup = new RadioGroup(context); + radioGroup.clearCheck(); + + ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(pType); + + for (int row = 0; row < 1; row++) { + radioGroup.setOrientation(LinearLayout.VERTICAL); + radioGroup.setVisibility(View.VISIBLE); + + for (int i = 0; i < pluginsInCategory.size(); i++) { + RadioButton rdbtn = new RadioButton(context); + PluginBase p = pluginsInCategory.get(i); + rdbtn.setId(View.generateViewId()); + rdbtn.setText(p.getName()); + if (p.isEnabled(pType)) + rdbtn.setChecked(true); + rdbtn.setTag(p); + radioGroup.addView(rdbtn); + } + } + + radioGroup.setOnCheckedChangeListener((group, checkedId) -> { + RadioButton rb = group.findViewById(checkedId); + PluginBase plugin1 = (PluginBase) rb.getTag(); + plugin1.setPluginEnabled(pType, rb.isChecked()); + plugin1.setFragmentVisible(pType, rb.isChecked()); + ConfigBuilderFragment.processOnEnabledCategoryChanged(plugin1, pType); + ConfigBuilderPlugin.getPlugin().storeSettings("SetupWizard"); + MainApp.bus().post(new EventConfigBuilderChange()); + }); + layout.addView(radioGroup); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java index 44beaf82f7..3329d0bbbe 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java @@ -1,7 +1,6 @@ package info.nightscout.androidaps.startupwizard; import android.content.Context; -import android.content.Intent; import android.view.View; import android.widget.LinearLayout; import android.widget.RadioButton; @@ -10,13 +9,9 @@ import android.widget.RadioGroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; - -import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventRefreshGui; -import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.utils.SP; public class SWRadioButton extends SWItem { @@ -32,7 +27,6 @@ public class SWRadioButton extends SWItem { } public SWRadioButton option(int labels, int values) { - this.labelsArray = labels; this.valuesArray = values; return this; @@ -47,7 +41,7 @@ public class SWRadioButton extends SWItem { } @Override - public void generateDialog(View view, LinearLayout layout){ + public void generateDialog(View view, LinearLayout layout) { Context context = view.getContext(); String[] labels = context.getResources().getStringArray(labelsArray); String[] values = context.getResources().getStringArray(valuesArray); @@ -66,13 +60,13 @@ public class SWRadioButton extends SWItem { RadioButton rdbtn = new RadioButton(context); rdbtn.setId((row * 2) + i); rdbtn.setText(labels[i]); - if(previousValue.equals(values[i])) + if (previousValue.equals(values[i])) rdbtn.setChecked(true); radioGroup.addView(rdbtn); } } - radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { save(); @@ -84,12 +78,12 @@ public class SWRadioButton extends SWItem { } - public RadioGroup getRadioGroup(){ + public RadioGroup getRadioGroup() { return this.radioGroup; } - public String getCheckedValue(){ - if(radioGroup != null && radioGroup.getCheckedRadioButtonId() > -1){ + public String getCheckedValue() { + if (radioGroup != null && radioGroup.getCheckedRadioButtonId() > -1) { Context context = radioGroup.getRootView().getContext(); String[] values = context.getResources().getStringArray(valuesArray); return values[radioGroup.getCheckedRadioButtonId()]; @@ -98,18 +92,18 @@ public class SWRadioButton extends SWItem { } } - public boolean isSomethingChecked(){ + public boolean isSomethingChecked() { return this.somethingChecked; } - public void save(){ - if(!getCheckedValue().equals("none")) { + public void save() { + if (!getCheckedValue().equals("none")) { SP.putString(preferenceId, getCheckedValue()); MainApp.bus().post(new EventPreferenceChange(preferenceId)); } } - public String preferenceSet(){ + public String preferenceSet() { return SP.getString(preferenceId, "none"); } diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index da63f0566f..12492d4a50 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -105,38 +105,4 @@ @string/no @string/yes - - @string/xdrip - @string/DexcomG5 - @string/nsclientbg - @string/MM640g - @string/Glimp - - - SourceXdripPlugin - SourceDexcomG5Plugin - SourceNSClientPlugin - SourceMM640gPlugin - SourceGlimpPlugin - - - @string/fastactinginsulincomment - @string/ultrafastactinginsulincomment - @string/free_peak_oref - - - InsulinOrefRapidActingPlugin - InsulinOrefUltraRapidActingPlugin - InsulinOrefFreePeakPlugin - - - @string/openapsma - @string/openapsama - @string/openapssmb - - - OpenAPSMAPlugin - OpenAPSAMAPlugin - OpenAPSSMBPlugin - \ No newline at end of file From 94db444acb1aa45d70fe00e6e1a0846d46b77191 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 3 May 2018 20:06:13 +0200 Subject: [PATCH 141/152] SW validator, language, cleanup --- .../startupwizard/SWDefinition.java | 67 ++++--------- .../androidaps/startupwizard/SWPlugin.java | 2 + .../startupwizard/SWRadioButton.java | 22 +---- .../androidaps/startupwizard/SWString.java | 62 +++++++----- .../androidaps/startupwizard/SWUrl.java | 63 +++++++----- .../startupwizard/SetupWizardActivity.java | 95 ++++++++++--------- .../startupwizard/events/EventSWUpdate.java | 6 ++ .../main/res/layout/activity_setupwizard.xml | 7 +- 8 files changed, 159 insertions(+), 165 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java index 2d44389180..98b6d7a180 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java @@ -1,9 +1,5 @@ package info.nightscout.androidaps.startupwizard; -import android.content.Context; -import android.content.Intent; -import android.widget.RadioButton; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,25 +8,20 @@ import java.util.List; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.events.EventRefreshGui; -import info.nightscout.androidaps.interfaces.BgSourceInterface; -import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginType; -import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin; -import info.nightscout.androidaps.plugins.Source.SourceNSClientPlugin; import info.nightscout.utils.LocaleHelper; import info.nightscout.utils.SP; public class SWDefinition { private static Logger log = LoggerFactory.getLogger(SWDefinition.class); private static SWDefinition swDefinition = null; + public static SWDefinition getInstance() { if (swDefinition == null) swDefinition = new SWDefinition(); return swDefinition; } - android.content.Context context = MainApp.instance().getApplicationContext(); static List screens = new ArrayList<>(); @@ -44,60 +35,42 @@ public class SWDefinition { } - SWDefinition() { // List all the screens here - // todo: SWValidator ?!? add(new SWScreen(R.string.language) - .skippable(false) - .add(new SWRadioButton().option(R.array.languagesArray, R.array.languagesValues).preferenceId(R.string.key_language).label(R.string.language).comment(R.string.setupwizard_language_prompt)) - .validator(() -> { - LocaleHelper.setLocale(context, SP.getString(R.string.key_language, "en")); - MainApp.bus().post(new EventRefreshGui(true)); - if(!SP.getString(R.string.key_language, "en").equals(LocaleHelper.getLanguage(context))) { - Intent intent = new Intent(MainApp.instance().getApplicationContext(), SetupWizardActivity.class); - intent.putExtra("WIZZARDPAGE", 0); - } - return SP.contains(R.string.key_language);} - )) + .skippable(false) + .add(new SWRadioButton().option(R.array.languagesArray, R.array.languagesValues).preferenceId(R.string.key_language).label(R.string.language).comment(R.string.setupwizard_language_prompt)) + .validator(() -> { + String lang = SP.getString("language", "en"); + LocaleHelper.setLocale(MainApp.instance().getApplicationContext(), lang); + return SP.contains(R.string.key_language); + }) + ) .add(new SWScreen(R.string.nsclientinternal_title) .skippable(true) .add(new SWUrl().preferenceId(R.string.key_nsclientinternal_url).label(R.string.nsclientinternal_url_title).comment(R.string.nsclientinternal_url_dialogmessage)) .add(new SWString().preferenceId(R.string.key_nsclientinternal_api_secret).label(R.string.nsclientinternal_secret_dialogtitle).comment(R.string.nsclientinternal_secret_dialogmessage)) - .validator(() -> { - return NSClientPlugin.getPlugin().nsClientService.isConnected && NSClientPlugin.getPlugin().nsClientService.hasWriteAuth; - }) + .validator(() -> NSClientPlugin.getPlugin().nsClientService != null && NSClientPlugin.getPlugin().nsClientService.isConnected && NSClientPlugin.getPlugin().nsClientService.hasWriteAuth) ) .add(new SWScreen(R.string.patientage) .skippable(false) .add(new SWRadioButton().option(R.array.ageArray, R.array.ageValues).preferenceId(R.string.key_age).label(R.string.patientage).comment(R.string.patientage_summary)) - .validator(() -> { - return SP.contains(R.string.key_age); - }) + .validator(() -> SP.contains(R.string.key_age)) ) .add(new SWScreen(R.string.configbuilder_insulin) .skippable(false) .add(new SWPlugin().option(PluginType.INSULIN).label(R.string.configbuilder_insulin).comment(R.string.configbuilder_insulin)) - .validator(() -> { - ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.INSULIN); - return pluginsInCategory != null; - }) - ) + .validator(() -> MainApp.getSpecificPluginsList(PluginType.INSULIN) != null) + ) .add(new SWScreen(R.string.configbuilder_bgsource) - .skippable(false) - .add(new SWPlugin().option(PluginType.BGSOURCE).label(R.string.configbuilder_bgsource).comment(R.string.configbuilder_bgsource)) - .validator(() -> { - ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.BGSOURCE); - return pluginsInCategory != null; - }) - ) + .skippable(false) + .add(new SWPlugin().option(PluginType.BGSOURCE).label(R.string.configbuilder_bgsource).comment(R.string.configbuilder_bgsource)) + .validator(() -> MainApp.getSpecificPluginsList(PluginType.BGSOURCE) != null) + ) .add(new SWScreen(R.string.configbuilder_aps) - .skippable(false) - .add(new SWPlugin().option(PluginType.APS).label(R.string.configbuilder_aps).comment(R.string.configbuilder_aps)) - .validator(() -> { - ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(PluginType.APS); - return pluginsInCategory != null; - }) + .skippable(false) + .add(new SWPlugin().option(PluginType.APS).label(R.string.configbuilder_aps).comment(R.string.configbuilder_aps)) + .validator(() -> MainApp.getSpecificPluginsList(PluginType.APS) != null) ) ; } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java index 50ecfa5197..dc6ce4e71a 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java @@ -17,6 +17,7 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; public class SWPlugin extends SWItem { private static Logger log = LoggerFactory.getLogger(SWPlugin.class); @@ -65,6 +66,7 @@ public class SWPlugin extends SWItem { ConfigBuilderFragment.processOnEnabledCategoryChanged(plugin1, pType); ConfigBuilderPlugin.getPlugin().storeSettings("SetupWizard"); MainApp.bus().post(new EventConfigBuilderChange()); + MainApp.bus().post(new EventSWUpdate()); }); layout.addView(radioGroup); } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java index 3329d0bbbe..882f361a32 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventRefreshGui; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; import info.nightscout.utils.SP; public class SWRadioButton extends SWItem { @@ -46,7 +47,7 @@ public class SWRadioButton extends SWItem { String[] labels = context.getResources().getStringArray(labelsArray); String[] values = context.getResources().getStringArray(valuesArray); // Get if there is already value in SP - String previousValue = SP.getString(preferenceId, "unset"); + String previousValue = SP.getString(preferenceId, "none"); // log.debug("Value for "+view.getContext().getString(preferenceId)+" is "+previousValue); radioGroup = new RadioGroup(context); radioGroup.clearCheck(); @@ -66,13 +67,8 @@ public class SWRadioButton extends SWItem { } } - radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(RadioGroup group, int checkedId) { - save(); - MainApp.bus().post(new EventRefreshGui(true)); - } - + radioGroup.setOnCheckedChangeListener((group, checkedId) -> { + save(); }); layout.addView(radioGroup); @@ -92,20 +88,12 @@ public class SWRadioButton extends SWItem { } } - public boolean isSomethingChecked() { - return this.somethingChecked; - } - public void save() { if (!getCheckedValue().equals("none")) { SP.putString(preferenceId, getCheckedValue()); MainApp.bus().post(new EventPreferenceChange(preferenceId)); + MainApp.bus().post(new EventSWUpdate()); } } - public String preferenceSet() { - return SP.getString(preferenceId, "none"); - } - - } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java index 202a3ccc06..b9dde66688 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java @@ -1,7 +1,9 @@ package info.nightscout.androidaps.startupwizard; import android.content.Context; +import android.text.Editable; import android.text.InputType; +import android.text.TextWatcher; import android.view.View; import android.widget.EditText; import android.widget.LinearLayout; @@ -10,47 +12,55 @@ import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; +import info.nightscout.utils.SP; public class SWString extends SWItem { private static Logger log = LoggerFactory.getLogger(SWString.class); - private List labels; - private List values; - private String groupName; public SWString() { super(Type.STRING); } - public void setName(String name){ - this.groupName = name; - } - - public void setOptions(List labels, List values){ - this.labels = labels; - this.values = values; - } - @Override public void generateDialog(View view, LinearLayout layout) { Context context = view.getContext(); -// LinearLayout layout = (LinearLayout) view.findViewById(view.getId()); -// layout.removeAllViews(); - TextView textlabel = new TextView(context); - textlabel.setText(groupName); + TextView l = new TextView(context); + l.setId(view.generateViewId()); + l.setText(label); + layout.addView(l); - layout.addView(textlabel); + TextView c = new TextView(context); + c.setId(view.generateViewId()); + c.setText(label); + layout.addView(c); - if(values.get(values.size()-1) != "" && values.get(values.size()-1) != null) { - EditText editText = new EditText(context); - editText.setId(view.generateViewId()); - editText.setText(values.get(values.size()-1)); - editText.setInputType(InputType.TYPE_CLASS_TEXT); - editText.setMaxLines(1); - layout.addView(editText); - } + EditText editText = new EditText(context); + editText.setId(view.generateViewId()); + editText.setInputType(InputType.TYPE_CLASS_TEXT); + editText.setMaxLines(1); + layout.addView(editText); + + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + SP.putString(preferenceId, s.toString()); + MainApp.bus().post(new EventPreferenceChange(preferenceId)); + MainApp.bus().post(new EventSWUpdate()); + } + + @Override + public void afterTextChanged(Editable s) { + } + }); } } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java index 02b6f1bd79..a9485bb1f1 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java @@ -1,49 +1,64 @@ package info.nightscout.androidaps.startupwizard; import android.content.Context; +import android.text.Editable; import android.text.InputType; +import android.text.TextWatcher; import android.view.View; import android.widget.EditText; import android.widget.LinearLayout; +import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; +import info.nightscout.utils.SP; public class SWUrl extends SWItem { private static Logger log = LoggerFactory.getLogger(SWUrl.class); - private List labels; - private List values; - private String groupName; + public SWUrl() { super(Type.URL); } - public void setName(String name){ - this.groupName = name; - } - - public void setOptions(List labels, List values){ - this.labels = labels; - this.values = values; - } - @Override public void generateDialog(View view, LinearLayout layout) { Context context = view.getContext(); + TextView l = new TextView(context); + l.setId(View.generateViewId()); + l.setText(label); + layout.addView(l); - if(values.get(values.size()-1) != "" && values.get(values.size()-1) != null) { - EditText editText = new EditText(context); - editText.setId(View.generateViewId()); - // get the last value in list - editText.setText(values.get(values.size()-1)); - editText.setInputType(InputType.TYPE_CLASS_TEXT); - editText.setMaxLines(1); - layout.addView(editText); - } + TextView c = new TextView(context); + c.setId(View.generateViewId()); + c.setText(comment); + layout.addView(c); + + EditText editText = new EditText(context); + editText.setId(View.generateViewId()); + editText.setInputType(InputType.TYPE_CLASS_TEXT); + editText.setMaxLines(1); + layout.addView(editText); + + editText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + SP.putString(preferenceId, s.toString()); + MainApp.bus().post(new EventPreferenceChange(preferenceId)); + MainApp.bus().post(new EventSWUpdate()); + } + + @Override + public void afterTextChanged(Editable s) { + } + }); } - - } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java index 09fe839aa0..958eea28b3 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java @@ -4,106 +4,111 @@ import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; -import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; +import com.squareup.otto.Subscribe; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; import java.util.List; import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.events.EventRefreshGui; +import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientStatus; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; import info.nightscout.utils.LocaleHelper; -import info.nightscout.utils.SP; public class SetupWizardActivity extends AppCompatActivity { - private List labels = new ArrayList<>(); - private List comments = new ArrayList<>(); - - private TextView screenName; - //logging private static Logger log = LoggerFactory.getLogger(SetupWizardActivity.class); + private TextView screenName; + + SWDefinition swDefinition = SWDefinition.getInstance(); + List screens = swDefinition.getScreens(); private int currentWizardPage = 0; public static final String INTENT_MESSAGE = "WIZZARDPAGE"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + LocaleHelper.onCreate(this, "en"); setContentView(R.layout.activity_setupwizard); Intent intent = getIntent(); - int showPage = intent.getIntExtra(SetupWizardActivity.INTENT_MESSAGE, 0); - SWDefinition swDefinition = SWDefinition.getInstance(); - List screens = swDefinition.getScreens(); - if (screens.size() > 0 && showPage < screens.size()) { - SWScreen currentScreen = screens.get(showPage); - currentWizardPage = showPage; - // show/hide prev/next buttons if we are at the beninning/end - //showNextButton(showPage, screens.size()-1); + currentWizardPage = intent.getIntExtra(SetupWizardActivity.INTENT_MESSAGE, 0); + if (screens.size() > 0 && currentWizardPage < screens.size()) { + SWScreen currentScreen = screens.get(currentWizardPage); - if (showPage == 0) - ((Button) findViewById(R.id.previous_button)).setVisibility(View.GONE); //Set screen name screenName = (TextView) findViewById(R.id.fullscreen_content); screenName.setText(currentScreen.getHeader()); //Generate layout first - LinearLayout layout = info.nightscout.androidaps.startupwizard.SWItem.generateLayout(this.findViewById(R.id.fullscreen_content_fields)); + LinearLayout layout = SWItem.generateLayout(this.findViewById(R.id.fullscreen_content_fields)); for (int i = 0; i < currentScreen.items.size(); i++) { SWItem currentItem = currentScreen.items.get(i); - labels.add(i, currentItem.getLabel()); - comments.add(i, currentItem.getComment()); - currentItem.setOptions(labels, comments); currentItem.generateDialog(this.findViewById(R.id.fullscreen_content_fields), layout); } - // Check if input isValid or screen is sckippable - if (currentScreen.validator.isValid() || currentScreen.skippable) { - showNextButton(showPage, screens.size() - 1); - } + updateButtons(); } + } + @Override + public void onPause() { + super.onPause(); + MainApp.bus().unregister(this); } @Override protected void onResume() { - super.onResume(); - // check is current locale is different from the one in preferences -// log.debug("Current: "+LocaleHelper.getLanguage(this)+" preferences: "+SP.getString("language", "en")); - if (!LocaleHelper.getLanguage(this).equals(SP.getString("language", "en"))) { - // it is so change it in locale and restart SetupWizard -// log.debug("Setting locale to: "+SP.getString("language", "en")+" and restarting"); - LocaleHelper.setLocale(this, SP.getString(R.string.key_language, "en")); - MainApp.bus().post(new EventRefreshGui(true)); - Intent intent = getIntent(); - this.finish(); - startActivity(intent); - } + MainApp.bus().register(this); } - private void showNextButton(int currentPage, int maxPages) { - if (currentPage == maxPages) { - ((Button) findViewById(R.id.finish_button)).setVisibility(View.VISIBLE); - ((Button) findViewById(R.id.next_button)).setVisibility(View.GONE); - } else - ((Button) findViewById(R.id.next_button)).setVisibility(View.VISIBLE); + @Subscribe + public void onContentUpdate(EventSWUpdate ev) { + updateButtons(); + } + + @Subscribe + public void onContentUpdate(EventNSClientStatus ev) { + updateButtons(); + } + + private void updateButtons() { + SWScreen currentScreen = screens.get(currentWizardPage); + if (currentScreen.validator.isValid() || currentScreen.skippable) { + if (currentWizardPage == screens.size() - 1) { + findViewById(R.id.finish_button).setVisibility(View.VISIBLE); + findViewById(R.id.next_button).setVisibility(View.GONE); + } else { + findViewById(R.id.finish_button).setVisibility(View.GONE); + findViewById(R.id.next_button).setVisibility(View.VISIBLE); + } + } else { + findViewById(R.id.finish_button).setVisibility(View.GONE); + findViewById(R.id.next_button).setVisibility(View.GONE); + } + if (currentWizardPage == 0) + findViewById(R.id.previous_button).setVisibility(View.GONE); + else + findViewById(R.id.previous_button).setVisibility(View.VISIBLE); } public void showNextPage(View view) { + this.finish(); Intent intent = new Intent(this, SetupWizardActivity.class); intent.putExtra(INTENT_MESSAGE, currentWizardPage + 1); startActivity(intent); } public void showPreviousPage(View view) { + this.finish(); Intent intent = new Intent(this, SetupWizardActivity.class); if (currentWizardPage > 0) intent.putExtra(INTENT_MESSAGE, currentWizardPage - 1); diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java new file mode 100644 index 0000000000..0c20cdde78 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java @@ -0,0 +1,6 @@ +package info.nightscout.androidaps.startupwizard.events; + +import info.nightscout.androidaps.events.Event; + +public class EventSWUpdate extends Event { +} diff --git a/app/src/main/res/layout/activity_setupwizard.xml b/app/src/main/res/layout/activity_setupwizard.xml index 025d85f335..9422f76d76 100644 --- a/app/src/main/res/layout/activity_setupwizard.xml +++ b/app/src/main/res/layout/activity_setupwizard.xml @@ -6,9 +6,6 @@ android:background="#0099cc" tools:context=".startupwizard.SetupWizardActivity"> - - From cc532b9107f483bdb1c7e5dacfdaee39fbeb8c1c Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 3 May 2018 20:13:27 +0200 Subject: [PATCH 142/152] SWRadioButton cleanup --- .../startupwizard/SWRadioButton.java | 59 ++++++------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java index 882f361a32..461dfa1298 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java @@ -11,17 +11,15 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; import info.nightscout.utils.SP; public class SWRadioButton extends SWItem { - private static Logger log = LoggerFactory.getLogger(SWRadioButton.class); + int labelsArray; int valuesArray; private RadioGroup radioGroup; - public boolean somethingChecked = false; public SWRadioButton() { super(Type.RADIOBUTTON); @@ -44,56 +42,33 @@ public class SWRadioButton extends SWItem { @Override public void generateDialog(View view, LinearLayout layout) { Context context = view.getContext(); - String[] labels = context.getResources().getStringArray(labelsArray); - String[] values = context.getResources().getStringArray(valuesArray); // Get if there is already value in SP String previousValue = SP.getString(preferenceId, "none"); -// log.debug("Value for "+view.getContext().getString(preferenceId)+" is "+previousValue); radioGroup = new RadioGroup(context); radioGroup.clearCheck(); + radioGroup.setOrientation(LinearLayout.VERTICAL); + radioGroup.setVisibility(View.VISIBLE); - for (int row = 0; row < 1; row++) { - - radioGroup.setOrientation(LinearLayout.VERTICAL); - radioGroup.setVisibility(View.VISIBLE); - - for (int i = 0; i < labels.length; i++) { - RadioButton rdbtn = new RadioButton(context); - rdbtn.setId((row * 2) + i); - rdbtn.setText(labels[i]); - if (previousValue.equals(values[i])) - rdbtn.setChecked(true); - radioGroup.addView(rdbtn); - } + for (int i = 0; i < labels().length; i++) { + RadioButton rdbtn = new RadioButton(context); + rdbtn.setId(View.generateViewId()); + rdbtn.setText(labels()[i]); + if (previousValue.equals(values()[i])) + rdbtn.setChecked(true); + rdbtn.setTag(i); + radioGroup.addView(rdbtn); } radioGroup.setOnCheckedChangeListener((group, checkedId) -> { - save(); + int i = (int) group.findViewById(checkedId).getTag(); + save(i); }); layout.addView(radioGroup); - } - public RadioGroup getRadioGroup() { - return this.radioGroup; + public void save(int i) { + SP.putString(preferenceId, values()[i]); + MainApp.bus().post(new EventPreferenceChange(preferenceId)); + MainApp.bus().post(new EventSWUpdate()); } - - public String getCheckedValue() { - if (radioGroup != null && radioGroup.getCheckedRadioButtonId() > -1) { - Context context = radioGroup.getRootView().getContext(); - String[] values = context.getResources().getStringArray(valuesArray); - return values[radioGroup.getCheckedRadioButtonId()]; - } else { - return "none"; - } - } - - public void save() { - if (!getCheckedValue().equals("none")) { - SP.putString(preferenceId, getCheckedValue()); - MainApp.bus().post(new EventPreferenceChange(preferenceId)); - MainApp.bus().post(new EventSWUpdate()); - } - } - } From 39e9448c67828783959cae72af5562f7a186246a Mon Sep 17 00:00:00 2001 From: McHoffi Date: Thu, 3 May 2018 21:20:54 +0200 Subject: [PATCH 143/152] 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 02590ddd729c7ba8a30dc1484e2ea314e436dc9d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Thu, 3 May 2018 21:29:34 +0200 Subject: [PATCH 144/152] SW remove unneeded code --- .../androidaps/startupwizard/SWPlugin.java | 24 +++++++++---------- .../startupwizard/SetupWizardActivity.java | 6 ++--- .../main/res/layout/activity_setupwizard.xml | 6 ++--- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java index dc6ce4e71a..57a397c88f 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java @@ -42,20 +42,18 @@ public class SWPlugin extends SWItem { ArrayList pluginsInCategory = MainApp.getSpecificPluginsList(pType); - for (int row = 0; row < 1; row++) { - radioGroup.setOrientation(LinearLayout.VERTICAL); - radioGroup.setVisibility(View.VISIBLE); + radioGroup.setOrientation(LinearLayout.VERTICAL); + radioGroup.setVisibility(View.VISIBLE); - for (int i = 0; i < pluginsInCategory.size(); i++) { - RadioButton rdbtn = new RadioButton(context); - PluginBase p = pluginsInCategory.get(i); - rdbtn.setId(View.generateViewId()); - rdbtn.setText(p.getName()); - if (p.isEnabled(pType)) - rdbtn.setChecked(true); - rdbtn.setTag(p); - radioGroup.addView(rdbtn); - } + for (int i = 0; i < pluginsInCategory.size(); i++) { + RadioButton rdbtn = new RadioButton(context); + PluginBase p = pluginsInCategory.get(i); + rdbtn.setId(View.generateViewId()); + rdbtn.setText(p.getName()); + if (p.isEnabled(pType)) + rdbtn.setChecked(true); + rdbtn.setTag(p); + radioGroup.addView(rdbtn); } radioGroup.setOnCheckedChangeListener((group, checkedId) -> { diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java index 958eea28b3..d733b96ea2 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java @@ -44,14 +44,14 @@ public class SetupWizardActivity extends AppCompatActivity { SWScreen currentScreen = screens.get(currentWizardPage); //Set screen name - screenName = (TextView) findViewById(R.id.fullscreen_content); + screenName = (TextView) findViewById(R.id.sw_content); screenName.setText(currentScreen.getHeader()); //Generate layout first - LinearLayout layout = SWItem.generateLayout(this.findViewById(R.id.fullscreen_content_fields)); + LinearLayout layout = SWItem.generateLayout(this.findViewById(R.id.sw_content_fields)); for (int i = 0; i < currentScreen.items.size(); i++) { SWItem currentItem = currentScreen.items.get(i); - currentItem.generateDialog(this.findViewById(R.id.fullscreen_content_fields), layout); + currentItem.generateDialog(this.findViewById(R.id.sw_content_fields), layout); } updateButtons(); diff --git a/app/src/main/res/layout/activity_setupwizard.xml b/app/src/main/res/layout/activity_setupwizard.xml index 9422f76d76..71404c12d4 100644 --- a/app/src/main/res/layout/activity_setupwizard.xml +++ b/app/src/main/res/layout/activity_setupwizard.xml @@ -7,7 +7,7 @@ tools:context=".startupwizard.SetupWizardActivity"> Date: Thu, 3 May 2018 22:01:59 +0200 Subject: [PATCH 145/152] styles cleanup --- app/build.gradle | 1 - app/src/main/AndroidManifest.xml | 3 +-- app/src/main/res/values/attrs.xml | 12 ------------ app/src/main/res/values/styles.xml | 14 +------------- 4 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 app/src/main/res/values/attrs.xml diff --git a/app/build.gradle b/app/build.gradle index 596ca090e6..94e1318389 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -172,7 +172,6 @@ configurations { } dependencies { - implementation 'com.android.support:support-v4:27.1.1' wearApp project(':wear') implementation fileTree(include: ['*.jar'], dir: 'libs') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a65f92d7b3..1b372a0cf9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -160,8 +160,7 @@ + android:label="@string/title_activity_setup_wizard"> \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml deleted file mode 100644 index 7ce840eb60..0000000000 --- a/app/src/main/res/values/attrs.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c6859e3d2c..2ffdad85c2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -24,17 +24,5 @@ 10sp - - - - - + From 52411f7afe6687775731fc8575ffc7fa9f31f9d4 Mon Sep 17 00:00:00 2001 From: Radoslav Radev Date: Thu, 3 May 2018 23:34:50 +0300 Subject: [PATCH 146/152] 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 88d964f1350973d45e382132963697fd90ffc8e9 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 4 May 2018 09:35:57 +0200 Subject: [PATCH 147/152] SW reuse save, cleanup --- .../androidaps/startupwizard/SWItem.java | 15 ++++----------- .../androidaps/startupwizard/SWRadioButton.java | 10 +--------- .../androidaps/startupwizard/SWScreen.java | 17 ----------------- .../androidaps/startupwizard/SWString.java | 9 +-------- .../androidaps/startupwizard/SWUrl.java | 9 +-------- 5 files changed, 7 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java index fb5d1dc34e..3a1100c46a 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java @@ -1,20 +1,19 @@ package info.nightscout.androidaps.startupwizard; -import android.content.Context; import android.view.View; import android.widget.LinearLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; - import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; import info.nightscout.utils.SP; public class SWItem { private static Logger log = LoggerFactory.getLogger(SWItem.class); + enum Type { NONE, URL, @@ -30,8 +29,6 @@ public class SWItem { Integer label; Integer comment; int preferenceId; - private List labels; - private List values; public SWItem(Type type) { @@ -71,11 +68,7 @@ public class SWItem { public void save(String value) { SP.putString(preferenceId, value); MainApp.bus().post(new EventPreferenceChange(preferenceId)); - } - - public void setOptions(List labels, List values){ - this.labels = labels; - this.values = values; + MainApp.bus().post(new EventSWUpdate()); } public static LinearLayout generateLayout(View view) { @@ -84,6 +77,6 @@ public class SWItem { return layout; } - public void generateDialog(View view, LinearLayout layout){ + public void generateDialog(View view, LinearLayout layout) { } } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java index 461dfa1298..05345c6887 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java @@ -10,8 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; import info.nightscout.utils.SP; public class SWRadioButton extends SWItem { @@ -61,14 +59,8 @@ public class SWRadioButton extends SWItem { radioGroup.setOnCheckedChangeListener((group, checkedId) -> { int i = (int) group.findViewById(checkedId).getTag(); - save(i); + save(values()[i]); }); layout.addView(radioGroup); } - - public void save(int i) { - SP.putString(preferenceId, values()[i]); - MainApp.bus().post(new EventPreferenceChange(preferenceId)); - MainApp.bus().post(new EventSWUpdate()); - } } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWScreen.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWScreen.java index 44fabf468d..61fed74ffa 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWScreen.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWScreen.java @@ -1,19 +1,9 @@ package info.nightscout.androidaps.startupwizard; -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.support.v4.app.ActivityCompat; - import java.util.ArrayList; import java.util.List; -import info.nightscout.androidaps.MainActivity; import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.events.EventRefreshGui; -import info.nightscout.utils.LocaleHelper; -import info.nightscout.utils.SP; public class SWScreen { @@ -44,11 +34,4 @@ public class SWScreen { this.validator = validator; return this; } - - boolean isValid() { - if (validator != null) - return validator.isValid(); - return true; - } - } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java index b9dde66688..f9d7a5146e 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java @@ -12,11 +12,6 @@ import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; -import info.nightscout.utils.SP; - public class SWString extends SWItem { private static Logger log = LoggerFactory.getLogger(SWString.class); @@ -52,9 +47,7 @@ public class SWString extends SWItem { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - SP.putString(preferenceId, s.toString()); - MainApp.bus().post(new EventPreferenceChange(preferenceId)); - MainApp.bus().post(new EventSWUpdate()); + save(s.toString()); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java index a9485bb1f1..83ff6127c5 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java @@ -12,11 +12,6 @@ import android.widget.TextView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; -import info.nightscout.utils.SP; - public class SWUrl extends SWItem { private static Logger log = LoggerFactory.getLogger(SWUrl.class); @@ -51,9 +46,7 @@ public class SWUrl extends SWItem { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - SP.putString(preferenceId, s.toString()); - MainApp.bus().post(new EventPreferenceChange(preferenceId)); - MainApp.bus().post(new EventSWUpdate()); + save(s.toString()); } @Override From 010a2f3fd836834533e32a2ad8b1021b93a3ba0b Mon Sep 17 00:00:00 2001 From: swissalpine Date: Fri, 4 May 2018 10:04:45 +0200 Subject: [PATCH 148/152] 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 55661ca7a0fe6d4de2e384ecdd3f255e2ba87ee5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 4 May 2018 10:17:50 +0200 Subject: [PATCH 149/152] SWButton --- .../androidaps/startupwizard/SWButton.java | 52 +++++++++++++++++++ .../startupwizard/SWDefinition.java | 52 ++++++++++++++++--- .../androidaps/startupwizard/SWItem.java | 4 +- .../androidaps/startupwizard/SWPlugin.java | 1 + .../startupwizard/SWRadioButton.java | 1 + .../androidaps/startupwizard/SWString.java | 1 + .../androidaps/startupwizard/SWUrl.java | 1 + .../startupwizard/SetupWizardActivity.java | 18 ++++--- .../startupwizard/events/EventSWUpdate.java | 8 +++ app/src/main/res/values/strings.xml | 1 + 10 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java new file mode 100644 index 0000000000..e14723cbfb --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java @@ -0,0 +1,52 @@ +package info.nightscout.androidaps.startupwizard; + +import android.content.Context; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SWButton extends SWItem { + private static Logger log = LoggerFactory.getLogger(SWButton.class); + + Runnable buttonRunnable; + int buttonText; + SWValidator buttonValidator; + + public SWButton() { + super(Type.BUTTON); + } + + public SWButton option(int buttonText) { + this.buttonText = buttonText; + return this; + } + + public SWButton action(Runnable buttonRunnable) { + this.buttonRunnable = buttonRunnable; + return this; + } + + public SWButton visibility(SWValidator buttonValidator) { + this.buttonValidator = buttonValidator; + return this; + } + + @Override + public void generateDialog(View view, LinearLayout layout) { + Context context = view.getContext(); + + Button button = new Button(context); + button.setText(buttonText); + button.setOnClickListener((v) -> { + if (buttonRunnable != null) + buttonRunnable.run(); + }); + if (buttonValidator != null && !buttonValidator.isValid()) + return; + layout.addView(button); + super.generateDialog(view, layout); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java index 98b6d7a180..d52070387b 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java @@ -8,8 +8,13 @@ import java.util.List; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventConfigBuilderChange; +import info.nightscout.androidaps.events.EventRefreshGui; import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; +import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin; +import info.nightscout.androidaps.startupwizard.events.EventSWUpdate; import info.nightscout.utils.LocaleHelper; import info.nightscout.utils.SP; @@ -39,7 +44,10 @@ public class SWDefinition { // List all the screens here add(new SWScreen(R.string.language) .skippable(false) - .add(new SWRadioButton().option(R.array.languagesArray, R.array.languagesValues).preferenceId(R.string.key_language).label(R.string.language).comment(R.string.setupwizard_language_prompt)) + .add(new SWRadioButton() + .option(R.array.languagesArray, R.array.languagesValues) + .preferenceId(R.string.key_language).label(R.string.language) + .comment(R.string.setupwizard_language_prompt)) .validator(() -> { String lang = SP.getString("language", "en"); LocaleHelper.setLocale(MainApp.instance().getApplicationContext(), lang); @@ -48,28 +56,58 @@ public class SWDefinition { ) .add(new SWScreen(R.string.nsclientinternal_title) .skippable(true) - .add(new SWUrl().preferenceId(R.string.key_nsclientinternal_url).label(R.string.nsclientinternal_url_title).comment(R.string.nsclientinternal_url_dialogmessage)) - .add(new SWString().preferenceId(R.string.key_nsclientinternal_api_secret).label(R.string.nsclientinternal_secret_dialogtitle).comment(R.string.nsclientinternal_secret_dialogmessage)) + .add(new SWUrl() + .preferenceId(R.string.key_nsclientinternal_url) + .label(R.string.nsclientinternal_url_title) + .comment(R.string.nsclientinternal_url_dialogmessage)) + .add(new SWString() + .preferenceId(R.string.key_nsclientinternal_api_secret) + .label(R.string.nsclientinternal_secret_dialogtitle) + .comment(R.string.nsclientinternal_secret_dialogmessage)) + .add(new SWButton() + .option(R.string.enable_nsclient) + .action(() -> { + NSClientPlugin.getPlugin().setPluginEnabled(PluginType.GENERAL, true); + NSClientPlugin.getPlugin().setFragmentVisible(PluginType.GENERAL, true); + ConfigBuilderFragment.processOnEnabledCategoryChanged(NSClientPlugin.getPlugin(), PluginType.GENERAL); + ConfigBuilderPlugin.getPlugin().storeSettings("SetupWizard"); + MainApp.bus().post(new EventConfigBuilderChange()); + MainApp.bus().post(new EventSWUpdate(true)); + }) + .visibility(() -> !NSClientPlugin.getPlugin().isEnabled(PluginType.GENERAL))) .validator(() -> NSClientPlugin.getPlugin().nsClientService != null && NSClientPlugin.getPlugin().nsClientService.isConnected && NSClientPlugin.getPlugin().nsClientService.hasWriteAuth) ) .add(new SWScreen(R.string.patientage) .skippable(false) - .add(new SWRadioButton().option(R.array.ageArray, R.array.ageValues).preferenceId(R.string.key_age).label(R.string.patientage).comment(R.string.patientage_summary)) + .add(new SWRadioButton() + .option(R.array.ageArray, R.array.ageValues) + .preferenceId(R.string.key_age) + .label(R.string.patientage) + .comment(R.string.patientage_summary)) .validator(() -> SP.contains(R.string.key_age)) ) .add(new SWScreen(R.string.configbuilder_insulin) .skippable(false) - .add(new SWPlugin().option(PluginType.INSULIN).label(R.string.configbuilder_insulin).comment(R.string.configbuilder_insulin)) + .add(new SWPlugin() + .option(PluginType.INSULIN) + .label(R.string.configbuilder_insulin) + .comment(R.string.configbuilder_insulin)) .validator(() -> MainApp.getSpecificPluginsList(PluginType.INSULIN) != null) ) .add(new SWScreen(R.string.configbuilder_bgsource) .skippable(false) - .add(new SWPlugin().option(PluginType.BGSOURCE).label(R.string.configbuilder_bgsource).comment(R.string.configbuilder_bgsource)) + .add(new SWPlugin() + .option(PluginType.BGSOURCE) + .label(R.string.configbuilder_bgsource) + .comment(R.string.configbuilder_bgsource)) .validator(() -> MainApp.getSpecificPluginsList(PluginType.BGSOURCE) != null) ) .add(new SWScreen(R.string.configbuilder_aps) .skippable(false) - .add(new SWPlugin().option(PluginType.APS).label(R.string.configbuilder_aps).comment(R.string.configbuilder_aps)) + .add(new SWPlugin() + .option(PluginType.APS) + .label(R.string.configbuilder_aps) + .comment(R.string.configbuilder_aps)) .validator(() -> MainApp.getSpecificPluginsList(PluginType.APS) != null) ) ; diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java index 3a1100c46a..0eb6c60495 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWItem.java @@ -22,7 +22,8 @@ public class SWItem { DECIMALNUMBER, CHECKBOX, RADIOBUTTON, - PLUGIN + PLUGIN, + BUTTON } Type type; @@ -79,4 +80,5 @@ public class SWItem { public void generateDialog(View view, LinearLayout layout) { } + } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java index 57a397c88f..eefce456a2 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWPlugin.java @@ -67,5 +67,6 @@ public class SWPlugin extends SWItem { MainApp.bus().post(new EventSWUpdate()); }); layout.addView(radioGroup); + super.generateDialog(view, layout); } } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java index 05345c6887..7cdbee3d71 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWRadioButton.java @@ -62,5 +62,6 @@ public class SWRadioButton extends SWItem { save(values()[i]); }); layout.addView(radioGroup); + super.generateDialog(view, layout); } } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java index f9d7a5146e..287b1e5909 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWString.java @@ -39,6 +39,7 @@ public class SWString extends SWItem { editText.setInputType(InputType.TYPE_CLASS_TEXT); editText.setMaxLines(1); layout.addView(editText); + super.generateDialog(view, layout); editText.addTextChangedListener(new TextWatcher() { @Override diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java index 83ff6127c5..a9cdd1fe67 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWUrl.java @@ -38,6 +38,7 @@ public class SWUrl extends SWItem { editText.setInputType(InputType.TYPE_CLASS_TEXT); editText.setMaxLines(1); layout.addView(editText); + super.generateDialog(view, layout); editText.addTextChangedListener(new TextWatcher() { @Override diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java index d733b96ea2..3da44618ab 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SetupWizardActivity.java @@ -48,12 +48,7 @@ public class SetupWizardActivity extends AppCompatActivity { screenName.setText(currentScreen.getHeader()); //Generate layout first - LinearLayout layout = SWItem.generateLayout(this.findViewById(R.id.sw_content_fields)); - for (int i = 0; i < currentScreen.items.size(); i++) { - SWItem currentItem = currentScreen.items.get(i); - currentItem.generateDialog(this.findViewById(R.id.sw_content_fields), layout); - } - + generateLayout(); updateButtons(); } } @@ -72,6 +67,8 @@ public class SetupWizardActivity extends AppCompatActivity { @Subscribe public void onContentUpdate(EventSWUpdate ev) { + if (ev.redraw) + generateLayout(); updateButtons(); } @@ -80,6 +77,15 @@ public class SetupWizardActivity extends AppCompatActivity { updateButtons(); } + private void generateLayout() { + SWScreen currentScreen = screens.get(currentWizardPage); + LinearLayout layout = SWItem.generateLayout(this.findViewById(R.id.sw_content_fields)); + for (int i = 0; i < currentScreen.items.size(); i++) { + SWItem currentItem = currentScreen.items.get(i); + currentItem.generateDialog(this.findViewById(R.id.sw_content_fields), layout); + } + } + private void updateButtons() { SWScreen currentScreen = screens.get(currentWizardPage); if (currentScreen.validator.isValid() || currentScreen.skippable) { diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java index 0c20cdde78..0cae3d618c 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/events/EventSWUpdate.java @@ -3,4 +3,12 @@ package info.nightscout.androidaps.startupwizard.events; import info.nightscout.androidaps.events.Event; public class EventSWUpdate extends Event { + public boolean redraw = false; + + public EventSWUpdate() { + } + + public EventSWUpdate(boolean redraw) { + this.redraw = redraw; + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 08b6d042a4..af30252d7c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1057,5 +1057,6 @@ General Settings DUMMY\nCONTENT + Enable NSClient From 91f3db782d38606397407a6f6d3e59f9b039b94e Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 4 May 2018 10:20:22 +0200 Subject: [PATCH 150/152] SWButton rename option to text --- .../java/info/nightscout/androidaps/startupwizard/SWButton.java | 2 +- .../info/nightscout/androidaps/startupwizard/SWDefinition.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java index e14723cbfb..f781a9a3c6 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWButton.java @@ -19,7 +19,7 @@ public class SWButton extends SWItem { super(Type.BUTTON); } - public SWButton option(int buttonText) { + public SWButton text(int buttonText) { this.buttonText = buttonText; return this; } diff --git a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java index d52070387b..6e4cd42f2f 100644 --- a/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java +++ b/app/src/main/java/info/nightscout/androidaps/startupwizard/SWDefinition.java @@ -65,7 +65,7 @@ public class SWDefinition { .label(R.string.nsclientinternal_secret_dialogtitle) .comment(R.string.nsclientinternal_secret_dialogmessage)) .add(new SWButton() - .option(R.string.enable_nsclient) + .text(R.string.enable_nsclient) .action(() -> { NSClientPlugin.getPlugin().setPluginEnabled(PluginType.GENERAL, true); NSClientPlugin.getPlugin().setFragmentVisible(PluginType.GENERAL, true); From 7312bf061adf5cb975f30703a24143a19f57f0e4 Mon Sep 17 00:00:00 2001 From: swissalpine Date: Fri, 4 May 2018 12:30:28 +0200 Subject: [PATCH 151/152] 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 152/152] 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);