From abdc1022bf081a8d53c822d7ba47906ddce3bf46 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 12 May 2017 16:27:33 +0200 Subject: [PATCH] merge bolus & basal into one plugin --- .../info/nightscout/androidaps/MainApp.java | 3 - .../androidaps/interfaces/PluginBase.java | 2 +- .../interfaces/TempBasalsInterface.java | 20 -- .../interfaces/TreatmentsInterface.java | 14 + .../ConfigBuilder/ConfigBuilderFragment.java | 13 +- .../ConfigBuilder/ConfigBuilderPlugin.java | 23 +- .../IobCobCalculatorPlugin.java | 2 +- .../plugins/OpenAPSAMA/OpenAPSAMAPlugin.java | 2 +- .../plugins/OpenAPSMA/OpenAPSMAPlugin.java | 6 +- .../Overview/Dialogs/WizardDialog.java | 8 +- .../plugins/Overview/OverviewFragment.java | 13 +- .../PersistentNotificationPlugin.java | 8 +- .../plugins/PumpDanaR/DanaRPlugin.java | 8 +- .../PumpDanaRKorean/DanaRKoreanPlugin.java | 8 +- .../plugins/PumpDanaRv2/DanaRv2Plugin.java | 10 +- .../PumpVirtual/VirtualPumpPlugin.java | 6 +- .../SmsCommunicatorPlugin.java | 4 +- .../plugins/TempBasals/TempBasalsPlugin.java | 279 ------------------ .../Treatments/TreatmentsFragment.java | 7 +- .../plugins/Treatments/TreatmentsPlugin.java | 187 +++++++++++- .../fragments/TreatmentsBolusFragment.java | 18 +- .../TreatmentsTempBasalsFragment.java} | 23 +- .../wearintegration/WatchUpdaterService.java | 4 +- .../XDripStatusline/StatuslinePlugin.java | 4 +- .../info/nightscout/utils/BolusWizard.java | 11 +- .../res/layout/configbuilder_fragment.xml | 18 -- .../main/res/layout/tempbasals_fragment.xml | 2 +- .../res/layout/temptargetrange_fragment.xml | 2 +- 28 files changed, 256 insertions(+), 449 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/interfaces/TempBasalsInterface.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsPlugin.java rename app/src/main/java/info/nightscout/androidaps/plugins/{TempBasals/TempBasalsFragment.java => Treatments/fragments/TreatmentsTempBasalsFragment.java} (93%) diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 3b0826e988..5553a92ec1 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -50,14 +50,12 @@ import info.nightscout.androidaps.plugins.SourceGlimp.SourceGlimpFragment; import info.nightscout.androidaps.plugins.SourceMM640g.SourceMM640gFragment; import info.nightscout.androidaps.plugins.SourceNSClient.SourceNSClientFragment; import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripFragment; -import info.nightscout.androidaps.plugins.TempBasals.TempBasalsFragment; import info.nightscout.androidaps.plugins.TempTargetRange.TempTargetRangeFragment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpFragment; import info.nightscout.androidaps.plugins.Wear.WearFragment; import info.nightscout.androidaps.plugins.Persistentnotification.PersistentNotificationPlugin; import info.nightscout.androidaps.plugins.XDripStatusline.StatuslineFragment; -import info.nightscout.androidaps.plugins.XDripStatusline.StatuslinePlugin; import info.nightscout.androidaps.receivers.KeepAliveReceiver; import io.fabric.sdk.android.Fabric; @@ -114,7 +112,6 @@ public class MainApp extends Application { pluginsList.add(CircadianPercentageProfileFragment.getPlugin()); if (Config.APS) pluginsList.add(TempTargetRangeFragment.getPlugin()); pluginsList.add(TreatmentsFragment.getPlugin()); - if (Config.TEMPBASALS) pluginsList.add(TempBasalsFragment.getPlugin()); if (Config.SAFETY) pluginsList.add(SafetyFragment.getPlugin()); if (Config.APS) pluginsList.add(ObjectivesFragment.getPlugin()); pluginsList.add(SourceXdripFragment.getPlugin()); diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java index efbd51ea72..ba4faf4ba6 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PluginBase.java @@ -8,7 +8,7 @@ import java.util.Date; public interface PluginBase { int GENERAL = 1; int TREATMENT = 2; - int TEMPBASAL = 3; + //int TEMPBASAL = 3; int PROFILE = 4; int APS = 5; int PUMP = 6; diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/TempBasalsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/TempBasalsInterface.java deleted file mode 100644 index 7d455566fe..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/TempBasalsInterface.java +++ /dev/null @@ -1,20 +0,0 @@ -package info.nightscout.androidaps.interfaces; - -import java.util.Date; - -import info.nightscout.androidaps.db.TempBasal; -import info.nightscout.androidaps.data.IobTotal; - -/** - * Created by mike on 14.06.2016. - */ -public interface TempBasalsInterface { - void updateTotalIOBTempBasals(); - IobTotal getLastCalculationTempBasals(); - IobTotal getCalculationToTimeTempBasals(long time); - - TempBasal getTempBasal (Date time); - TempBasal getExtendedBolus (Date time); - - long oldestDataAvaialable(); -} diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java index fad29949b8..0eca9595f6 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java @@ -1,8 +1,10 @@ package info.nightscout.androidaps.interfaces; +import java.util.Date; import java.util.List; import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.db.TempBasal; import info.nightscout.androidaps.db.Treatment; import info.nightscout.androidaps.data.IobTotal; @@ -12,9 +14,21 @@ import info.nightscout.androidaps.data.IobTotal; public interface TreatmentsInterface { void updateTotalIOBTreatments(); + void updateTotalIOBTempBasals(); + IobTotal getLastCalculationTreatments(); IobTotal getCalculationToTimeTreatments(long time); + IobTotal getLastCalculationTempBasals(); + IobTotal getCalculationToTimeTempBasals(long time); + MealData getMealData(); + List getTreatments(); List getTreatments5MinBack(long time); + + TempBasal getTempBasal (Date time); + TempBasal getExtendedBolus (Date time); + + long oldestDataAvaialable(); + } 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 ff6f69ca9f..faf4a8d189 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 @@ -55,8 +55,6 @@ public class ConfigBuilderFragment extends Fragment { ListView loopListView; TextView loopLabel; ListView treatmentsListView; - ListView tempsListView; - TextView tempsLabel; ListView profileListView; ListView apsListView; TextView apsLabel; @@ -74,7 +72,6 @@ public class ConfigBuilderFragment extends Fragment { PluginCustomAdapter pumpDataAdapter = null; PluginCustomAdapter loopDataAdapter = null; PluginCustomAdapter treatmentsDataAdapter = null; - PluginCustomAdapter tempsDataAdapter = null; PluginCustomAdapter profileDataAdapter = null; PluginCustomAdapter apsDataAdapter = null; PluginCustomAdapter constraintsDataAdapter = null; @@ -102,8 +99,6 @@ public class ConfigBuilderFragment extends Fragment { loopListView = (ListView) view.findViewById(R.id.configbuilder_looplistview); loopLabel = (TextView) view.findViewById(R.id.configbuilder_looplabel); treatmentsListView = (ListView) view.findViewById(R.id.configbuilder_treatmentslistview); - tempsListView = (ListView) view.findViewById(R.id.configbuilder_tempslistview); - tempsLabel = (TextView) view.findViewById(R.id.configbuilder_tempslabel); profileListView = (ListView) view.findViewById(R.id.configbuilder_profilelistview); apsListView = (ListView) view.findViewById(R.id.configbuilder_apslistview); apsLabel = (TextView) view.findViewById(R.id.configbuilder_apslabel); @@ -163,11 +158,6 @@ public class ConfigBuilderFragment extends Fragment { treatmentsDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.TREATMENT), PluginBase.TREATMENT); treatmentsListView.setAdapter(treatmentsDataAdapter); setListViewHeightBasedOnChildren(treatmentsListView); - tempsDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInList(PluginBase.TEMPBASAL), PluginBase.TEMPBASAL); - tempsListView.setAdapter(tempsDataAdapter); - setListViewHeightBasedOnChildren(tempsListView); - if (MainApp.getSpecificPluginsVisibleInList(PluginBase.TEMPBASAL).size() == 0) - tempsLabel.setVisibility(View.GONE); profileDataAdapter = new PluginCustomAdapter(getContext(), smallWidth?R.layout.configbuilder_smallitem :R.layout.configbuilder_simpleitem, MainApp.getSpecificPluginsVisibleInListByInterface(ProfileInterface.class, PluginBase.BGSOURCE), PluginBase.PROFILE); profileListView.setAdapter(profileDataAdapter); setListViewHeightBasedOnChildren(profileListView); @@ -275,7 +265,7 @@ public class ConfigBuilderFragment extends Fragment { } // Hide enabled control and force enabled plugin if there is only one plugin available - if (type == PluginBase.INSULIN || type == PluginBase.PUMP || type == PluginBase.TREATMENT || type == PluginBase.TEMPBASAL || type == PluginBase.PROFILE) + if (type == PluginBase.INSULIN || type == PluginBase.PUMP || type == PluginBase.TREATMENT || type == PluginBase.PROFILE) if (pluginList.size() < 2) { holder.checkboxEnabled.setEnabled(false); plugin.setFragmentEnabled(type, true); @@ -333,7 +323,6 @@ public class ConfigBuilderFragment extends Fragment { case PluginBase.BGSOURCE: pluginsInCategory = MainApp.getSpecificPluginsListByInterface(BgSourceInterface.class); break; - case PluginBase.TEMPBASAL: case PluginBase.TREATMENT: case PluginBase.PUMP: pluginsInCategory = MainApp.getSpecificPluginsListByInterface(PumpInterface.class); 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 eaea986d19..15d0cd815b 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 @@ -35,12 +35,12 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; -import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgError; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.DeviceStatus; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.data.DbLogger; +import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.androidaps.plugins.OpenAPSAMA.DetermineBasalResultAMA; import info.nightscout.androidaps.plugins.OpenAPSMA.DetermineBasalResultMA; import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; @@ -49,8 +49,7 @@ import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; -import info.nightscout.androidaps.plugins.NSClientInternal.data.DbLogger; -import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgError; import info.nightscout.utils.BatteryLevel; import info.nightscout.utils.DateUtil; import info.nightscout.utils.SP; @@ -65,7 +64,6 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain static PumpInterface activePump; static ProfileInterface activeProfile; static TreatmentsInterface activeTreatments; - static TempBasalsInterface activeTempBasals; static APSInterface activeAPS; static LoopPlugin activeLoop; static InsulinInterface activeInsulin; @@ -206,10 +204,6 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain return activeTreatments; } - public static TempBasalsInterface getActiveTempBasals() { - return activeTempBasals; - } - public static InsulinInterface getActiveInsulin() { return activeInsulin; } @@ -312,17 +306,6 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } } - // PluginBase.TEMPBASAL - pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.TEMPBASAL); - activeTempBasals = (TempBasalsInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.TEMPBASAL); - if (Config.logConfigBuilder && activeTempBasals != null) - log.debug("Selected tempbasal interface: " + ((PluginBase) activeTempBasals).getName()); - for (PluginBase p : pluginsInCategory) { - if (!p.getName().equals(((PluginBase) activeTempBasals).getName())) { - p.setFragmentVisible(PluginBase.TEMPBASAL, false); - } - } - // PluginBase.TREATMENT pluginsInCategory = MainApp.getSpecificPluginsList(PluginBase.TREATMENT); activeTreatments = (TreatmentsInterface) getTheOneEnabledInArray(pluginsInCategory, PluginBase.TREATMENT); 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 024a9f1e47..4b862650e1 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 @@ -339,7 +339,7 @@ public class IobCobCalculatorPlugin implements PluginBase { //log.debug(">>> Cache miss " + new Date(time).toLocaleString()); } IobTotal bolusIob = ConfigBuilderPlugin.getActiveTreatments().getCalculationToTimeTreatments(time).round(); - IobTotal basalIob = ConfigBuilderPlugin.getActiveTempBasals().getCalculationToTimeTempBasals(time).round(); + IobTotal basalIob = ConfigBuilderPlugin.getActiveTreatments().getCalculationToTimeTempBasals(time).round(); /* if (basalIob.basaliob > 0) { log.debug(new Date(time).toLocaleString() + " basaliob: " + basalIob.basaliob ); 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 ee8caea6b4..fc0355fdab 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 @@ -222,7 +222,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface { if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, 10)) return; if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, 5)) return; - long oldestDataAvailable = MainApp.getConfigBuilder().getActiveTempBasals().oldestDataAvaialable(); + long oldestDataAvailable = MainApp.getConfigBuilder().getActiveTreatments().oldestDataAvaialable(); long getBGDataFrom = Math.max(oldestDataAvailable, (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + profile.getDia()))); log.debug("Limiting data to oldest available temps: " + new Date(oldestDataAvailable).toString()); 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 e2b15acab1..44bced35d7 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 @@ -18,7 +18,6 @@ import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.ScriptReader; @@ -188,11 +187,10 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface { Date start = new Date(); TreatmentsInterface treatments = MainApp.getConfigBuilder().getActiveTreatments(); - TempBasalsInterface tempBasals = MainApp.getConfigBuilder().getActiveTempBasals(); treatments.updateTotalIOBTreatments(); - tempBasals.updateTotalIOBTempBasals(); + treatments.updateTotalIOBTempBasals(); IobTotal bolusIob = treatments.getLastCalculationTreatments(); - IobTotal basalIob = tempBasals.getLastCalculationTempBasals(); + IobTotal basalIob = treatments.getLastCalculationTempBasals(); IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round(); 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 2ccb2eaf2b..aa51b14fca 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 @@ -47,7 +47,6 @@ import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventRefreshGui; -import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.data.IobTotal; @@ -413,11 +412,10 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Co TreatmentsInterface treatments = ConfigBuilderPlugin.getActiveTreatments(); treatments.updateTotalIOBTreatments(); IobTotal bolusIob = treatments.getLastCalculationTreatments(); - TempBasalsInterface tempBasals = ConfigBuilderPlugin.getActiveTempBasals(); IobTotal basalIob = new IobTotal(new Date().getTime()); - if (tempBasals != null) { - tempBasals.updateTotalIOBTempBasals(); - basalIob = tempBasals.getLastCalculationTempBasals().round(); + if (treatments != null) { + treatments.updateTotalIOBTempBasals(); + basalIob = treatments.getLastCalculationTempBasals().round(); } bolusIobInsulin.setText(DecimalFormatter.to2Decimal(-bolusIob.iob) + "U"); 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 496562ab1c..bcb3a4c473 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 @@ -192,7 +192,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, bgView = (TextView) view.findViewById(R.id.overview_bg); arrowView = (TextView) view.findViewById(R.id.overview_arrow); - if(smallWidth){ + if (smallWidth) { arrowView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 35); } timeAgoView = (TextView) view.findViewById(R.id.overview_timeago); @@ -997,12 +997,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // iob ConfigBuilderPlugin.getActiveTreatments().updateTotalIOBTreatments(); + ConfigBuilderPlugin.getActiveTreatments().updateTotalIOBTempBasals(); IobTotal bolusIob = ConfigBuilderPlugin.getActiveTreatments().getLastCalculationTreatments().round(); - IobTotal basalIob = new IobTotal(new Date().getTime()); - if (ConfigBuilderPlugin.getActiveTempBasals() != null) { - ConfigBuilderPlugin.getActiveTempBasals().updateTotalIOBTempBasals(); - basalIob = ConfigBuilderPlugin.getActiveTempBasals().getLastCalculationTempBasals().round(); - } + IobTotal basalIob = ConfigBuilderPlugin.getActiveTreatments().getLastCalculationTempBasals().round(); String iobtext = getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " @@ -1015,7 +1012,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, getActivity().findViewById(R.id.overview_showprediction_label).setVisibility(View.VISIBLE); } else { showPredictionView.setVisibility(View.GONE); - getActivity().findViewById(R.id.overview_showprediction_label).setVisibility(View.GONE); } + getActivity().findViewById(R.id.overview_showprediction_label).setVisibility(View.GONE); + } // ****** GRAPH ******* @@ -1138,6 +1136,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // **** IOB COB DEV graph **** class DeviationDataPoint extends DataPoint { public int color; + public DeviationDataPoint(double x, double y, int color) { super(x, y); this.color = color; 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 0bc56b7aad..ec3c258bbb 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 @@ -145,12 +145,10 @@ public class PersistentNotificationPlugin implements PluginBase{ //IOB ConfigBuilderPlugin.getActiveTreatments().updateTotalIOBTreatments(); + ConfigBuilderPlugin.getActiveTreatments().updateTotalIOBTempBasals(); IobTotal bolusIob = ConfigBuilderPlugin.getActiveTreatments().getLastCalculationTreatments().round(); - IobTotal basalIob = new IobTotal(new Date().getTime()); - if (ConfigBuilderPlugin.getActiveTempBasals() != null) { - ConfigBuilderPlugin.getActiveTempBasals().updateTotalIOBTempBasals(); - basalIob = ConfigBuilderPlugin.getActiveTempBasals().getLastCalculationTempBasals().round(); - } + IobTotal basalIob = ConfigBuilderPlugin.getActiveTreatments().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)"; 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 14903f0e43..b36b0398bf 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 @@ -351,20 +351,20 @@ public class DanaRPlugin implements PluginBase, PumpInterface, ConstraintsInterf } public TempBasal getTempBasal(Date time) { - TempBasal temp = MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time); + TempBasal temp = MainApp.getConfigBuilder().getActiveTreatments().getTempBasal(time); if (temp != null) return temp; if (useExtendedBoluses) - return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(time); + return MainApp.getConfigBuilder().getActiveTreatments().getExtendedBolus(time); return null; } public TempBasal getRealTempBasal() { - return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date()); + return MainApp.getConfigBuilder().getActiveTreatments().getTempBasal(new Date()); } @Override public TempBasal getExtendedBolus() { - return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date()); + return MainApp.getConfigBuilder().getActiveTreatments().getExtendedBolus(new Date()); } @Override 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 84dfa7fd71..9ea8cb2258 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 @@ -352,20 +352,20 @@ public class DanaRKoreanPlugin implements PluginBase, PumpInterface, Constraints } public TempBasal getTempBasal(Date time) { - TempBasal temp = MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time); + TempBasal temp = MainApp.getConfigBuilder().getActiveTreatments().getTempBasal(time); if (temp != null) return temp; if (useExtendedBoluses) - return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(time); + return MainApp.getConfigBuilder().getActiveTreatments().getExtendedBolus(time); return null; } public TempBasal getRealTempBasal() { - return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date()); + return MainApp.getConfigBuilder().getActiveTreatments().getTempBasal(new Date()); } @Override public TempBasal getExtendedBolus() { - return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date()); + return MainApp.getConfigBuilder().getActiveTreatments().getExtendedBolus(new Date()); } @Override 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 e41c407537..57a8f8b288 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 @@ -35,12 +35,12 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; -import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin; import info.nightscout.androidaps.plugins.Overview.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; +import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; @@ -309,17 +309,17 @@ public class DanaRv2Plugin implements PluginBase, PumpInterface, ConstraintsInte } public TempBasal getTempBasal(Date time) { - return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(time); + return MainApp.getConfigBuilder().getActiveTreatments().getTempBasal(time); } @Override public TempBasal getTempBasal() { - return MainApp.getConfigBuilder().getActiveTempBasals().getTempBasal(new Date()); + return MainApp.getConfigBuilder().getActiveTreatments().getTempBasal(new Date()); } @Override public TempBasal getExtendedBolus() { - return MainApp.getConfigBuilder().getActiveTempBasals().getExtendedBolus(new Date()); + return MainApp.getConfigBuilder().getActiveTreatments().getExtendedBolus(new Date()); } @Override 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 2a1221e88d..ce91fd4156 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 @@ -209,12 +209,12 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public TempBasal getTempBasal() { - return ConfigBuilderPlugin.getActiveTempBasals().getTempBasal(new Date()); + return ConfigBuilderPlugin.getActiveTreatments().getTempBasal(new Date()); } @Override public TempBasal getExtendedBolus() { - return ConfigBuilderPlugin.getActiveTempBasals().getExtendedBolus(new Date()); + return ConfigBuilderPlugin.getActiveTreatments().getExtendedBolus(new Date()); } @Override @@ -226,7 +226,7 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface { @Override public TempBasal getTempBasal(Date time) { - return ConfigBuilderPlugin.getActiveTempBasals().getTempBasal(time); + return ConfigBuilderPlugin.getActiveTreatments().getTempBasal(time); } @Override 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 471909394d..a21a9b0a6c 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 @@ -256,8 +256,8 @@ public class SmsCommunicatorPlugin implements PluginBase { ConfigBuilderPlugin.getActiveTreatments().updateTotalIOBTreatments(); IobTotal bolusIob = ConfigBuilderPlugin.getActiveTreatments().getLastCalculationTreatments().round(); - ConfigBuilderPlugin.getActiveTempBasals().updateTotalIOBTempBasals(); - IobTotal basalIob = ConfigBuilderPlugin.getActiveTempBasals().getLastCalculationTempBasals().round(); + ConfigBuilderPlugin.getActiveTreatments().updateTotalIOBTempBasals(); + IobTotal basalIob = ConfigBuilderPlugin.getActiveTreatments().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 " diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsPlugin.java deleted file mode 100644 index 0558a2f5a9..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsPlugin.java +++ /dev/null @@ -1,279 +0,0 @@ -package info.nightscout.androidaps.plugins.TempBasals; - -import android.support.annotation.Nullable; - -import com.j256.ormlite.dao.Dao; -import com.squareup.otto.Subscribe; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.List; - -import info.nightscout.androidaps.Config; -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.data.IobTotal; -import info.nightscout.androidaps.db.TempBasal; -import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.events.EventTempBasalChange; -import info.nightscout.androidaps.interfaces.PluginBase; -import info.nightscout.androidaps.interfaces.TempBasalsInterface; -import info.nightscout.utils.SP; - -/** - * Created by mike on 05.08.2016. - */ -public class TempBasalsPlugin implements PluginBase, TempBasalsInterface { - private static Logger log = LoggerFactory.getLogger(TempBasalsPlugin.class); - - public static long lastCalculationTimestamp = 0; - public static IobTotal lastCalculation; - - private static List tempBasals; - private static List extendedBoluses; - - private static boolean useExtendedBoluses = false; - - private static boolean fragmentEnabled = true; - private static boolean fragmentVisible = true; - - public TempBasalsPlugin() { - useExtendedBoluses = SP.getBoolean("danar_useextended", false); - initializeData(); - MainApp.bus().register(this); - } - - @Override - public String getFragmentClass() { - return TempBasalsFragment.class.getName(); - } - - @Override - public String getName() { - return MainApp.instance().getString(R.string.tempbasals); - } - - @Override - public String getNameShort() { - String name = MainApp.sResources.getString(R.string.tempbasals_shortname); - if (!name.trim().isEmpty()){ - //only if translation exists - return name; - } - // use long name as fallback - return getName(); - } - - @Override - public boolean isEnabled(int type) { - return type == TEMPBASAL && fragmentEnabled && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; - } - - @Override - public boolean isVisibleInTabs(int type) { - return type == TEMPBASAL && fragmentVisible && MainApp.getConfigBuilder().getPumpDescription().isTempBasalCapable; - } - - @Override - public boolean canBeHidden(int type) { - return true; - } - - @Override - public boolean hasFragment() { - return true; - } - - @Override - public boolean showInList(int type) { - return true; - } - - @Override - public void setFragmentEnabled(int type, boolean fragmentEnabled) { - if (type == TEMPBASAL) this.fragmentEnabled = fragmentEnabled; - } - - @Override - public void setFragmentVisible(int type, boolean fragmentVisible) { - if (type == TEMPBASAL) this.fragmentVisible = fragmentVisible; - } - - @Override - public int getType() { - return PluginBase.TEMPBASAL; - } - - public void initializeData() { - double dia = 3; - if (MainApp.getConfigBuilder().getActiveProfile() != null && MainApp.getConfigBuilder().getActiveProfile().getProfile() != null) - dia = MainApp.getConfigBuilder().getActiveProfile().getProfile().getDia(); - long fromMills = (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)); - tempBasals = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, false); - extendedBoluses = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, true); - - // Update ended - checkForExpiredExtended(); - checkForExpiredTemps(); - } - - public void checkForExpiredTemps() { - checkForExpired(tempBasals); - } - - public void checkForExpiredExtended() { - checkForExpired(extendedBoluses); - } - - private void checkForExpired(List list) { - long now = new Date().getTime(); - for (int position = list.size() - 1; position >= 0; position--) { - TempBasal t = list.get(position); - boolean update = false; - if (t.timeEnd == null && t.getPlannedTimeEnd() < now) { - t.timeEnd = new Date(t.getPlannedTimeEnd()); - if (Config.logTempBasalsCut) - log.debug("Add timeEnd to old record"); - update = true; - } - if (position > 0) { - Date startofnewer = list.get(position - 1).timeStart; - if (t.timeEnd == null) { - t.timeEnd = new Date(Math.min(startofnewer.getTime(), t.getPlannedTimeEnd())); - if (Config.logTempBasalsCut) - log.debug("Add timeEnd to old record"); - update = true; - } else if (t.timeEnd.getTime() > startofnewer.getTime()) { - t.timeEnd = startofnewer; - update = true; - } - } - if (update) { - try { - Dao dao = MainApp.getDbHelper().getDaoTempBasals(); - dao.update(t); - } catch (SQLException e) { - e.printStackTrace(); - } - if (Config.logTempBasalsCut) { - log.debug("Fixing unfinished temp end: " + t.log()); - if (position > 0) - log.debug("Previous: " + list.get(position - 1).log()); - } - } - } - } - - /* - * Recalculate IOB if value is older than 1 minute - */ - public void updateTotalIOBIfNeeded() { - if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000) - return; - updateTotalIOBTempBasals(); - } - - @Override - public IobTotal getLastCalculationTempBasals() { - return lastCalculation; - } - - @Override - public IobTotal getCalculationToTimeTempBasals(long time) { - checkForExpired(tempBasals); - checkForExpired(extendedBoluses); - IobTotal total = new IobTotal(time); - for (Integer pos = 0; pos < tempBasals.size(); pos++) { - TempBasal t = tempBasals.get(pos); - if (t.timeStart.getTime() > time) continue; - IobTotal calc = t.iobCalc(time); - //log.debug("BasalIOB " + new Date(time) + " >>> " + calc.basaliob); - total.plus(calc); - } - if (useExtendedBoluses) { - for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { - TempBasal t = extendedBoluses.get(pos); - if (t.timeStart.getTime() > time) continue; - IobTotal calc = t.iobCalc(time); - total.plus(calc); - } - } - return total; - } - - @Override - public void updateTotalIOBTempBasals() { - IobTotal total = getCalculationToTimeTempBasals(new Date().getTime()); - - lastCalculationTimestamp = new Date().getTime(); - lastCalculation = total; - } - - @Nullable - @Override - public TempBasal getTempBasal(Date time) { - checkForExpired(tempBasals); - for (TempBasal t : tempBasals) { - if (t.isInProgress(time)) return t; - } - return null; - } - - @Override - public TempBasal getExtendedBolus(Date time) { - checkForExpired(extendedBoluses); - for (TempBasal t : extendedBoluses) { - if (t.isInProgress(time)) return t; - } - return null; - } - - @Override - public long oldestDataAvaialable() { - long oldestTemp = new Date().getTime(); - if (tempBasals.size() > 0) - oldestTemp = Math.min(oldestTemp, tempBasals.get(tempBasals.size() - 1).timeStart.getTime()); - if (extendedBoluses.size() > 0) - oldestTemp = Math.min(oldestTemp, extendedBoluses.get(extendedBoluses.size() - 1).timeStart.getTime()); - oldestTemp -= 15 * 60 * 1000L; // allow 15 min before - return oldestTemp; - } - - List getMergedList() { - if (useExtendedBoluses) { - List merged = new ArrayList(); - merged.addAll(tempBasals); - merged.addAll(extendedBoluses); - - class CustomComparator implements Comparator { - public int compare(TempBasal object1, TempBasal object2) { - return (int) (object2.timeIndex - object1.timeIndex); - } - } - Collections.sort(merged, new CustomComparator()); - return merged; - } else { - return tempBasals; - } - } - - @Subscribe - public void onStatusEvent(final EventTempBasalChange ev) { - initializeData(); - } - - public void onStatusEvent(final EventPreferenceChange s) { - if (s.isChanged("danar_useextended")) { - useExtendedBoluses = SP.getBoolean("danar_useextended", false); - initializeData(); - } - } - - -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java index 4d436626ab..c2043b6474 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java @@ -16,6 +16,7 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsBolusFragment; +import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempBasalsFragment; public class TreatmentsFragment extends Fragment { private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class); @@ -32,6 +33,7 @@ public class TreatmentsFragment extends Fragment { Context context; Fragment bolusFragment; + Fragment tempBasalsFragment; public class SectionsPagerAdapter extends FragmentPagerAdapter { @@ -46,7 +48,7 @@ public class TreatmentsFragment extends Fragment { case 0: return bolusFragment; case 1: - return new Fragment(); + return tempBasalsFragment; /* case 2: return iobcobActiveFragmentObject; @@ -70,7 +72,7 @@ public class TreatmentsFragment extends Fragment { case 0: return getString(R.string.bolus); case 1: - return "Empty"; + return getString(R.string.tempbasals); } return null; } @@ -82,6 +84,7 @@ public class TreatmentsFragment extends Fragment { View view = inflater.inflate(R.layout.treatments_fragment, container, false); bolusFragment = new TreatmentsBolusFragment(); + tempBasalsFragment = new TreatmentsTempBasalsFragment(); sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); viewPager = (ViewPager) view.findViewById(R.id.treatments_pager); 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 4ff92af182..324708ce90 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 @@ -1,21 +1,31 @@ package info.nightscout.androidaps.plugins.Treatments; +import android.support.annotation.Nullable; + +import com.j256.ormlite.dao.Dao; import com.squareup.otto.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; import java.util.List; +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.Iob; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.db.TempBasal; import info.nightscout.androidaps.db.Treatment; +import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.InsulinInterface; import info.nightscout.androidaps.interfaces.PluginBase; @@ -32,14 +42,24 @@ import info.nightscout.utils.SP; public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { private static Logger log = LoggerFactory.getLogger(TreatmentsPlugin.class); - public static long lastCalculationTimestamp = 0; - public static IobTotal lastCalculation; + public static IobTotal lastTreatmentCalculation; + public static IobTotal lastTempBasalsCalculation; public static List treatments; + private static List tempBasals; + private static List extendedBoluses; + + private static boolean useExtendedBoluses = false; private static boolean fragmentEnabled = true; private static boolean fragmentVisible = true; + private static TreatmentsPlugin treatmentsPlugin = new TreatmentsPlugin(); + + public static TreatmentsPlugin getPlugin() { + return treatmentsPlugin; + } + @Override public String getFragmentClass() { return TreatmentsFragment.class.getName(); @@ -102,30 +122,78 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { } public TreatmentsPlugin() { + useExtendedBoluses = SP.getBoolean("danar_useextended", false); MainApp.bus().register(this); initializeData(); } - public void initializeData() { + public static void initializeData() { + // Treatments double dia = Constants.defaultDIA; if (MainApp.getConfigBuilder().getActiveProfile() != null && MainApp.getConfigBuilder().getActiveProfile().getProfile() != null) dia = MainApp.getConfigBuilder().getActiveProfile().getProfile().getDia(); long fromMills = (long) (new Date().getTime() - 60 * 60 * 1000L * (24 + dia)); treatments = MainApp.getDbHelper().getTreatmentDataFromTime(fromMills, false); + + // Temp basals + tempBasals = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, false); + extendedBoluses = MainApp.getDbHelper().getTempbasalsDataFromTime(fromMills, false, true); + + // Update ended + checkForExpiredExtended(); + checkForExpiredTemps(); } - /* - * Recalculate IOB if value is older than 1 minute - */ - public void updateTotalIOBIfNeeded() { - if (lastCalculationTimestamp > new Date().getTime() - 60 * 1000) - return; - updateTotalIOBTreatments(); + public static void checkForExpiredTemps() { + checkForExpired(tempBasals); + } + + public static void checkForExpiredExtended() { + checkForExpired(extendedBoluses); + } + + private static void checkForExpired(List list) { + long now = new Date().getTime(); + for (int position = list.size() - 1; position >= 0; position--) { + TempBasal t = list.get(position); + boolean update = false; + if (t.timeEnd == null && t.getPlannedTimeEnd() < now) { + t.timeEnd = new Date(t.getPlannedTimeEnd()); + if (Config.logTempBasalsCut) + log.debug("Add timeEnd to old record"); + update = true; + } + if (position > 0) { + Date startofnewer = list.get(position - 1).timeStart; + if (t.timeEnd == null) { + t.timeEnd = new Date(Math.min(startofnewer.getTime(), t.getPlannedTimeEnd())); + if (Config.logTempBasalsCut) + log.debug("Add timeEnd to old record"); + update = true; + } else if (t.timeEnd.getTime() > startofnewer.getTime()) { + t.timeEnd = startofnewer; + update = true; + } + } + if (update) { + try { + Dao dao = MainApp.getDbHelper().getDaoTempBasals(); + dao.update(t); + } catch (SQLException e) { + e.printStackTrace(); + } + if (Config.logTempBasalsCut) { + log.debug("Fixing unfinished temp end: " + t.log()); + if (position > 0) + log.debug("Previous: " + list.get(position - 1).log()); + } + } + } } @Override public IobTotal getLastCalculationTreatments() { - return lastCalculation; + return lastTreatmentCalculation; } @Override @@ -157,8 +225,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { public void updateTotalIOBTreatments() { IobTotal total = getCalculationToTimeTreatments(new Date().getTime()); - lastCalculationTimestamp = new Date().getTime(); - lastCalculation = total; + lastTreatmentCalculation = total; } @Override @@ -212,4 +279,98 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { updateTotalIOBTreatments(); } + @Override + public IobTotal getLastCalculationTempBasals() { + return lastTempBasalsCalculation; + } + + @Override + public IobTotal getCalculationToTimeTempBasals(long time) { + checkForExpired(tempBasals); + checkForExpired(extendedBoluses); + IobTotal total = new IobTotal(time); + for (Integer pos = 0; pos < tempBasals.size(); pos++) { + TempBasal t = tempBasals.get(pos); + if (t.timeStart.getTime() > time) continue; + IobTotal calc = t.iobCalc(time); + //log.debug("BasalIOB " + new Date(time) + " >>> " + calc.basaliob); + total.plus(calc); + } + if (useExtendedBoluses) { + for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { + TempBasal t = extendedBoluses.get(pos); + if (t.timeStart.getTime() > time) continue; + IobTotal calc = t.iobCalc(time); + total.plus(calc); + } + } + return total; + } + + @Override + public void updateTotalIOBTempBasals() { + IobTotal total = getCalculationToTimeTempBasals(new Date().getTime()); + + lastTempBasalsCalculation = total; + } + + @Nullable + @Override + public TempBasal getTempBasal(Date time) { + checkForExpired(tempBasals); + for (TempBasal t : tempBasals) { + if (t.isInProgress(time)) return t; + } + return null; + } + + @Override + public TempBasal getExtendedBolus(Date time) { + checkForExpired(extendedBoluses); + for (TempBasal t : extendedBoluses) { + if (t.isInProgress(time)) return t; + } + return null; + } + + @Override + public long oldestDataAvaialable() { + long oldestTemp = new Date().getTime(); + if (tempBasals.size() > 0) + oldestTemp = Math.min(oldestTemp, tempBasals.get(tempBasals.size() - 1).timeStart.getTime()); + if (extendedBoluses.size() > 0) + oldestTemp = Math.min(oldestTemp, extendedBoluses.get(extendedBoluses.size() - 1).timeStart.getTime()); + oldestTemp -= 15 * 60 * 1000L; // allow 15 min before + return oldestTemp; + } + + public static List getMergedList() { + if (useExtendedBoluses) { + List merged = new ArrayList(); + merged.addAll(tempBasals); + merged.addAll(extendedBoluses); + + class CustomComparator implements Comparator { + public int compare(TempBasal object1, TempBasal object2) { + return (int) (object2.timeIndex - object1.timeIndex); + } + } + Collections.sort(merged, new CustomComparator()); + return merged; + } else { + return tempBasals; + } + } + + @Subscribe + public void onStatusEvent(final EventTempBasalChange ev) { + initializeData(); + } + + public void onStatusEvent(final EventPreferenceChange s) { + if (s.isChanged("danar_useextended")) { + useExtendedBoluses = SP.getBoolean("danar_useextended", false); + initializeData(); + } + } } 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 d356912cb0..5fa82b30b0 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 @@ -47,12 +47,6 @@ import info.nightscout.utils.ToastUtils; public class TreatmentsBolusFragment extends Fragment implements View.OnClickListener { private static Logger log = LoggerFactory.getLogger(TreatmentsBolusFragment.class); - private static TreatmentsPlugin treatmentsPlugin = new TreatmentsPlugin(); - - public static TreatmentsPlugin getPlugin() { - return treatmentsPlugin; - } - RecyclerView recyclerView; LinearLayoutManager llm; @@ -149,7 +143,7 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis MainApp.getConfigBuilder().removeCareportalEntryFromNS(_id); } MainApp.getDbHelper().delete(treatment); - treatmentsPlugin.initializeData(); + TreatmentsPlugin.initializeData(); updateGUI(); Answers.getInstance().logCustom(new CustomEvent("RemoveTreatment")); } @@ -201,7 +195,7 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetTreatments(); - treatmentsPlugin.initializeData(); + TreatmentsPlugin.initializeData(); updateGUI(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); @@ -242,10 +236,10 @@ public class TreatmentsBolusFragment extends Fragment implements View.OnClickLis @Override public void run() { recyclerView.swapAdapter(new RecyclerViewAdapter(TreatmentsPlugin.treatments), false); - if (TreatmentsPlugin.lastCalculation != null) - iobTotal.setText(DecimalFormatter.to2Decimal(TreatmentsPlugin.lastCalculation.iob) + " U"); - if (TreatmentsPlugin.lastCalculation != null) - activityTotal.setText(DecimalFormatter.to3Decimal(TreatmentsPlugin.lastCalculation.activity) + " U"); + if (TreatmentsPlugin.lastTreatmentCalculation != null) + iobTotal.setText(DecimalFormatter.to2Decimal(TreatmentsPlugin.lastTreatmentCalculation.iob) + " U"); + if (TreatmentsPlugin.lastTreatmentCalculation != null) + activityTotal.setText(DecimalFormatter.to3Decimal(TreatmentsPlugin.lastTreatmentCalculation.activity) + " U"); } }); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempBasalsFragment.java similarity index 93% rename from app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java rename to app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempBasalsFragment.java index 1bd43719de..d54b7e83ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/TempBasals/TempBasalsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempBasalsFragment.java @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.TempBasals; +package info.nightscout.androidaps.plugins.Treatments.fragments; import android.app.Activity; import android.content.Context; @@ -32,18 +32,13 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.db.TempBasal; import info.nightscout.androidaps.events.EventTempBasalChange; +import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; -public class TempBasalsFragment extends Fragment { - private static Logger log = LoggerFactory.getLogger(TempBasalsFragment.class); - - private static TempBasalsPlugin tempBasalsPlugin = new TempBasalsPlugin(); - - public static TempBasalsPlugin getPlugin() { - return tempBasalsPlugin; - } +public class TreatmentsTempBasalsFragment extends Fragment { + private static Logger log = LoggerFactory.getLogger(TreatmentsTempBasalsFragment.class); RecyclerView recyclerView; LinearLayoutManager llm; @@ -157,7 +152,7 @@ public class TempBasalsFragment extends Fragment { // MainApp.getConfigBuilder().removeCareportalEntryFromNS(_id); //} MainApp.getDbHelper().delete(tempBasal); - tempBasalsPlugin.initializeData(); + TreatmentsPlugin.initializeData(); updateGUI(); Answers.getInstance().logCustom(new CustomEvent("RemoveTempBasal")); } @@ -180,7 +175,7 @@ public class TempBasalsFragment extends Fragment { llm = new LinearLayoutManager(view.getContext()); recyclerView.setLayoutManager(llm); - RecyclerViewAdapter adapter = new RecyclerViewAdapter(tempBasalsPlugin.getMergedList()); + RecyclerViewAdapter adapter = new RecyclerViewAdapter(TreatmentsPlugin.getMergedList()); recyclerView.setAdapter(adapter); tempBasalTotalView = (TextView) view.findViewById(R.id.tempbasals_totaltempiob); @@ -214,9 +209,9 @@ public class TempBasalsFragment extends Fragment { activity.runOnUiThread(new Runnable() { @Override public void run() { - recyclerView.swapAdapter(new RecyclerViewAdapter(tempBasalsPlugin.getMergedList()), false); - if (tempBasalsPlugin.lastCalculation != null) { - String totalText = DecimalFormatter.to2Decimal(tempBasalsPlugin.lastCalculation.basaliob) + " U"; + recyclerView.swapAdapter(new RecyclerViewAdapter(TreatmentsPlugin.getMergedList()), false); + if (TreatmentsPlugin.lastTempBasalsCalculation != null) { + String totalText = DecimalFormatter.to2Decimal(TreatmentsPlugin.lastTempBasalsCalculation.basaliob) + " U"; tempBasalTotalView.setText(totalText); } } 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 8d1da0dd2d..f9124e00c0 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 @@ -546,8 +546,8 @@ public class WatchUpdaterService extends WearableListenerService implements //IOB MainApp.getConfigBuilder().getActiveTreatments().updateTotalIOBTreatments(); IobTotal bolusIob = MainApp.getConfigBuilder().getActiveTreatments().getLastCalculationTreatments().round(); - MainApp.getConfigBuilder().getActiveTempBasals().updateTotalIOBTempBasals(); - IobTotal basalIob = MainApp.getConfigBuilder().getActiveTempBasals().getLastCalculationTempBasals().round(); + MainApp.getConfigBuilder().getActiveTreatments().updateTotalIOBTempBasals(); + IobTotal basalIob = MainApp.getConfigBuilder().getActiveTreatments().getLastCalculationTempBasals().round(); status += (shortString?"":(getString(R.string.treatments_iob_label_string) + " ")) + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); if (mPrefs.getBoolean("wear_detailediob", true)) { 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 a2c3d8ec42..52ef384573 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 @@ -172,8 +172,8 @@ public class StatuslinePlugin implements PluginBase { //IOB MainApp.getConfigBuilder().getActiveTreatments().updateTotalIOBTreatments(); IobTotal bolusIob = MainApp.getConfigBuilder().getActiveTreatments().getLastCalculationTreatments().round(); - MainApp.getConfigBuilder().getActiveTempBasals().updateTotalIOBTempBasals(); - IobTotal basalIob = MainApp.getConfigBuilder().getActiveTempBasals().getLastCalculationTempBasals().round(); + MainApp.getConfigBuilder().getActiveTreatments().updateTotalIOBTempBasals(); + IobTotal basalIob = MainApp.getConfigBuilder().getActiveTreatments().getLastCalculationTempBasals().round(); status += (shortString ? "" : (ctx.getString(R.string.treatments_iob_label_string) + " ")) + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); diff --git a/app/src/main/java/info/nightscout/utils/BolusWizard.java b/app/src/main/java/info/nightscout/utils/BolusWizard.java index c8aeeff41e..64e6692e25 100644 --- a/app/src/main/java/info/nightscout/utils/BolusWizard.java +++ b/app/src/main/java/info/nightscout/utils/BolusWizard.java @@ -5,7 +5,6 @@ import org.json.JSONObject; import java.util.Date; import info.nightscout.androidaps.data.GlucoseStatus; -import info.nightscout.androidaps.interfaces.TempBasalsInterface; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; @@ -88,13 +87,9 @@ public class BolusWizard { // IOB calculation TreatmentsInterface treatments = ConfigBuilderPlugin.getActiveTreatments(); treatments.updateTotalIOBTreatments(); - IobTotal bolusIob = treatments.getLastCalculationTreatments(); - TempBasalsInterface tempBasals = ConfigBuilderPlugin.getActiveTempBasals(); - IobTotal basalIob = new IobTotal(new Date().getTime()); - if (tempBasals != null) { - tempBasals.updateTotalIOBTempBasals(); - basalIob = tempBasals.getLastCalculationTempBasals().round(); - } + IobTotal bolusIob = treatments.getLastCalculationTreatments().round(); + treatments.updateTotalIOBTempBasals(); + IobTotal basalIob = treatments.getLastCalculationTempBasals().round(); insulingFromBolusIOB = includeBolusIOB ? -bolusIob.iob : 0d; insulingFromBasalsIOB = includeBasalIOB ? -basalIob.basaliob : 0d; diff --git a/app/src/main/res/layout/configbuilder_fragment.xml b/app/src/main/res/layout/configbuilder_fragment.xml index 7e7aaea0a1..9eccd9af05 100644 --- a/app/src/main/res/layout/configbuilder_fragment.xml +++ b/app/src/main/res/layout/configbuilder_fragment.xml @@ -144,24 +144,6 @@ android:layout_marginRight="10dp" android:background="@color/cardColorBackground" /> - - - - - + tools:context="info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempBasalsFragment"> + tools:context="info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempBasalsFragment">