diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java index e0549ab9bb..d933018790 100644 --- a/app/src/main/java/info/nightscout/androidaps/Constants.java +++ b/app/src/main/java/info/nightscout/androidaps/Constants.java @@ -38,6 +38,14 @@ public class Constants { //DanaR public static final double dailyLimitWarning = 0.95d; + // Temp targets + public static final int defaultActivityTTDuration = 90; // min + public static final double defaultActivityTTmgdl = 90d; + public static final double defaultActivityTTmmol = 5d; + public static final int defaultEatingSoonTTDuration = 45; // min + public static final double defaultEatingSoonTTmgdl = 140d; + public static final double defaultEatingSoonTTmmol = 8d; + //NSClientInternal public static final int MAX_LOG_LINES = 100; diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 412383c6e1..2069ea557b 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -247,6 +247,10 @@ public class MainApp extends Application { return sResources.getString(id, args); } + public static int gc(int id) { + return sResources.getColor(id); + } + public static MainApp instance() { return sInstance; } 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 15e93816bd..6f46a5db8a 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 @@ -36,15 +36,15 @@ import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; +import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.CareportalEvent; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; -import info.nightscout.androidaps.plugins.OpenAPSSMB.DetermineBasalResultSMB; import info.nightscout.androidaps.queue.Callback; import info.nightscout.utils.DateUtil; +import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; @@ -69,9 +69,9 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D private static final double FAV1_DEFAULT = 5; private static final double FAV2_DEFAULT = 10; private static final double FAV3_DEFAULT = 20; - private CheckBox suspendLoopCheckbox; private CheckBox startActivityTTCheckbox; + private CheckBox startEatingSoonTTCheckbox; private Integer maxCarbs; @@ -103,7 +103,7 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D Integer carbs = SafeParse.stringToInt(editCarbs.getText()); if (carbs > maxCarbs) { editCarbs.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.carbsconstraintapplied)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.carbsconstraintapplied)); } } @@ -127,6 +127,7 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, textWatcher); startActivityTTCheckbox = view.findViewById(R.id.newcarbs_activity_tt); + startEatingSoonTTCheckbox = view.findViewById(R.id.carbs_eating_soon_tt); dateButton = view.findViewById(R.id.newcarbs_eventdate); timeButton = view.findViewById(R.id.newcarb_eventtime); @@ -138,6 +139,10 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D dateButton.setOnClickListener(this); timeButton.setOnClickListener(this); + //To be able to select only one TT at a time + startEatingSoonTTCheckbox.setOnClickListener(this); + startActivityTTCheckbox.setOnClickListener(this); + // TODO prefilling carbs, maybe // TODO maybe update suggested carbs to target TT when checked // APSResult lastAPSResult = ConfigBuilderPlugin.getActiveAPS().getLastAPSResult(); @@ -147,13 +152,13 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D fav1Button = view.findViewById(R.id.newcarbs_plus1); fav1Button.setOnClickListener(this); - fav1Button.setText("+" + SP.getString(MainApp.gs(R.string.key_carbs_button_increment_1), String.valueOf(FAV1_DEFAULT))); + fav1Button.setText("+" + SP.getString(R.string.key_carbs_button_increment_1, String.valueOf(FAV1_DEFAULT))); fav2Button = view.findViewById(R.id.newcarbs_plus2); fav2Button.setOnClickListener(this); - fav2Button.setText("+" + SP.getString(MainApp.gs(R.string.key_carbs_button_increment_2), String.valueOf(FAV2_DEFAULT))); + fav2Button.setText("+" + SP.getString(R.string.key_carbs_button_increment_2, String.valueOf(FAV2_DEFAULT))); fav3Button = view.findViewById(R.id.newcarbs_plus3); fav3Button.setOnClickListener(this); - fav3Button.setText("+" + SP.getString(MainApp.gs(R.string.key_carbs_button_increment_3), String.valueOf(FAV3_DEFAULT))); + fav3Button.setText("+" + SP.getString(R.string.key_carbs_button_increment_3, String.valueOf(FAV3_DEFAULT))); suspendLoopCheckbox = view.findViewById(R.id.newcarbs_suspend_loop); @@ -197,19 +202,26 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D break; case R.id.newcarbs_plus1: editCarbs.setValue(editCarbs.getValue() - + SP.getDouble(MainApp.gs(R.string.key_carbs_button_increment_1), FAV1_DEFAULT)); + + SP.getDouble(R.string.key_carbs_button_increment_1, FAV1_DEFAULT)); validateInputs(); break; case R.id.newcarbs_plus2: editCarbs.setValue(editCarbs.getValue() - + SP.getDouble(MainApp.gs(R.string.key_carbs_button_increment_2), FAV2_DEFAULT)); + + SP.getDouble(R.string.key_carbs_button_increment_2, FAV2_DEFAULT)); validateInputs(); break; case R.id.newcarbs_plus3: editCarbs.setValue(editCarbs.getValue() - + SP.getDouble(MainApp.gs(R.string.key_carbs_button_increment_3), FAV3_DEFAULT)); + + SP.getDouble(R.string.key_carbs_button_increment_3, FAV3_DEFAULT)); validateInputs(); break; + case R.id.newcarbs_activity_tt: + startEatingSoonTTCheckbox.setChecked(false); + break; + case R.id.carbs_eating_soon_tt: + startActivityTTCheckbox.setChecked(false); + break; + } } @@ -227,20 +239,46 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D String confirmMessage = ""; if (carbs > 0) - confirmMessage += getString(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + ""; + confirmMessage += MainApp.gs(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + ""; if (!carbsAfterConstraints.equals(carbs)) - confirmMessage += "
" + getString(R.string.carbsconstraintapplied) + ""; + confirmMessage += "
" + MainApp.gs(R.string.carbsconstraintapplied) + ""; if (suspendLoopCheckbox.isChecked()) { - confirmMessage += "
" + "Loop: " + "" + "Suspend for 30 min"; + confirmMessage += "
" + MainApp.gs(R.string.loop) + ": " + "" + MainApp.gs(R.string.suspendloopfor30min) + ""; } - double prefTTDuration = SP.getDouble(R.string.key_activity_duration, 90d); - double ttDuration = prefTTDuration > 0 ? prefTTDuration : 90d; - double prefTT = SP.getDouble(R.string.key_activity_target, 140d); - double tt = prefTT > 0 ? prefTT : 140d; + final Profile currentProfile = MainApp.getConfigBuilder().getProfile(); + if (currentProfile == null) + return; + + int activityTTDuration = SP.getInt(R.string.key_activity_duration, Constants.defaultActivityTTDuration); + activityTTDuration = activityTTDuration > 0 ? activityTTDuration : Constants.defaultActivityTTDuration; + double activityTT = SP.getDouble(R.string.key_activity_target, currentProfile.getUnits().equals(Constants.MMOL) ? Constants.defaultActivityTTmmol : Constants.defaultActivityTTmgdl); + activityTT = activityTT > 0 ? activityTT : currentProfile.getUnits().equals(Constants.MMOL) ? Constants.defaultActivityTTmmol : Constants.defaultActivityTTmgdl; + + int eatingSoonTTDuration = SP.getInt(R.string.key_eatingsoon_duration, Constants.defaultEatingSoonTTDuration); + eatingSoonTTDuration = eatingSoonTTDuration > 0 ? eatingSoonTTDuration : Constants.defaultEatingSoonTTDuration; + double eatingSoonTT = SP.getDouble(R.string.key_eatingsoon_target, currentProfile.getUnits().equals(Constants.MMOL) ? Constants.defaultEatingSoonTTmmol : Constants.defaultEatingSoonTTmgdl); + eatingSoonTT = eatingSoonTT > 0 ? Profile.toMgdl(eatingSoonTT, currentProfile.getUnits()) : currentProfile.getUnits().equals(Constants.MMOL) ? Constants.defaultEatingSoonTTmmol : Constants.defaultEatingSoonTTmgdl; + + if (startActivityTTCheckbox.isChecked()) { - confirmMessage += "
" + "TT: " + "" + ((int) tt) + "mg/dl for " + ((int) ttDuration) + " min "; + if (currentProfile.getUnits().equals(Constants.MMOL)) { + confirmMessage += "
" + MainApp.gs(R.string.temptargetshort) + ": " + "" + DecimalFormatter.to1Decimal(activityTT) + " mmol/l (" + ((int) activityTTDuration) + " min)"; + } else + confirmMessage += "
" + MainApp.gs(R.string.temptargetshort) + ": " + "" + DecimalFormatter.to0Decimal(activityTT) + " mg/dl (" + ((int) activityTTDuration) + " min)"; + } + if (startEatingSoonTTCheckbox.isChecked() && !startActivityTTCheckbox.isChecked()) { + if (currentProfile.getUnits().equals(Constants.MMOL)) { + confirmMessage += "
" + MainApp.gs(R.string.temptargetshort) + ": " + "" + DecimalFormatter.to1Decimal(eatingSoonTT) + " mmol/l (" + eatingSoonTTDuration + " min)"; + } else + confirmMessage += "
" + MainApp.gs(R.string.temptargetshort) + ": " + "" + DecimalFormatter.to0Decimal(eatingSoonTT) + " mg/dl (" + eatingSoonTTDuration + " min)"; + + } + final double finalActivityTT = activityTT; + final double finalEatigSoonTT = eatingSoonTT; + final int finalActivityTTDuration = activityTTDuration; + final int finalEatingSoonTTDuration = eatingSoonTTDuration; if (StringUtils.isNoneEmpty(food)) { confirmMessage += "
" + "Food: " + food; @@ -249,66 +287,80 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D if (!initialEventTime.equals(eventTime)) { confirmMessage += "
Time: " + DateUtil.dateAndTimeString(eventTime); } + if (confirmMessage.length() > 0) { - final int finalCarbsAfterConstraints = carbsAfterConstraints; + final int finalCarbsAfterConstraints = carbsAfterConstraints; - final Context context = getContext(); - final AlertDialog.Builder builder = new AlertDialog.Builder(context); + final Context context = getContext(); + final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - if (confirmMessage.startsWith("
")) - confirmMessage = confirmMessage.substring("
".length()); - builder.setMessage(Html.fromHtml(confirmMessage)); - builder.setPositiveButton(getString(R.string.ok), (dialog, id) -> { - synchronized (builder) { - if (accepted) { - log.debug("guarding: already accepted"); - return; - } - accepted = true; + builder.setTitle(MainApp.gs(R.string.confirmation)); + if (confirmMessage.startsWith("
")) + confirmMessage = confirmMessage.substring("
".length()); - if (suspendLoopCheckbox.isChecked()) { - final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); - activeloop.suspendTo(System.currentTimeMillis() + 30L * 60 * 1000); - ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { - @Override - public void run() { - if (!result.success) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + builder.setMessage(Html.fromHtml(confirmMessage)); + builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> { + synchronized (builder) { + if (accepted) { + log.debug("guarding: already accepted"); + return; + } + accepted = true; + + if (suspendLoopCheckbox.isChecked()) { + final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop(); + activeloop.suspendTo(System.currentTimeMillis() + 30L * 60 * 1000); + ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() { + @Override + public void run() { + if (!result.success) { + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror)); + } } - } - }); - } + }); + } - if (startActivityTTCheckbox.isChecked()) { - TempTarget tempTarget = new TempTarget(); - tempTarget.date = System.currentTimeMillis(); - tempTarget.durationInMinutes = (int) ttDuration; - tempTarget.reason = "Activity"; - tempTarget.source = Source.USER; - tempTarget.low = (int) tt; - tempTarget.high = (int) tt; - MainApp.getDbHelper().createOrUpdate(tempTarget); - } + if (startActivityTTCheckbox.isChecked()) { + TempTarget tempTarget = new TempTarget(); + tempTarget.date = System.currentTimeMillis(); + tempTarget.durationInMinutes = finalActivityTTDuration; + tempTarget.reason = MainApp.gs(R.string.activity); + tempTarget.source = Source.USER; + tempTarget.low = Profile.toMgdl(finalActivityTT, currentProfile.getUnits()); + tempTarget.high = Profile.toMgdl(finalActivityTT, currentProfile.getUnits()); + MainApp.getDbHelper().createOrUpdate(tempTarget); + } else if (startEatingSoonTTCheckbox.isChecked()) { + TempTarget tempTarget = new TempTarget(); + tempTarget.date = System.currentTimeMillis(); + tempTarget.durationInMinutes = finalEatingSoonTTDuration; + tempTarget.reason = MainApp.gs(R.string.eatingsoon); + tempTarget.source = Source.USER; + tempTarget.low = Profile.toMgdl(finalEatigSoonTT, currentProfile.getUnits()); + tempTarget.high = Profile.toMgdl(finalEatigSoonTT, currentProfile.getUnits()); + MainApp.getDbHelper().createOrUpdate(tempTarget); + } - if (finalCarbsAfterConstraints > 0 || food != null) { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.date = eventTime.getTime(); - detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION; - detailedBolusInfo.carbs = finalCarbsAfterConstraints; + if (finalCarbsAfterConstraints > 0 || food != null) { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.date = eventTime.getTime(); + detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION; + detailedBolusInfo.carbs = finalCarbsAfterConstraints; // detailedBolusInfo.food = food; - detailedBolusInfo.context = context; - detailedBolusInfo.source = Source.USER; - MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo); + detailedBolusInfo.context = context; + detailedBolusInfo.source = Source.USER; + MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo); + } } - } - }); - builder.setNegativeButton(getString(R.string.cancel), null); - builder.show(); - dismiss(); + }); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); + builder.show(); + dismiss(); + } else + dismiss(); } catch (Exception e) { log.error("Unhandled exception", e); } + } @Override @@ -326,4 +378,4 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, D eventTime.setSeconds(second); timeButton.setText(DateUtil.timeString(eventTime)); } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java index 7c86cde764..0b8b263262 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java @@ -246,8 +246,19 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener, double ttDuration = prefTTDuration > 0 ? prefTTDuration : 45d; double prefTT = SP.getDouble(R.string.key_eatingsoon_target, 80d); double tt = prefTT > 0 ? prefTT : 80d; + Profile currentProfile = MainApp.getConfigBuilder().getProfile(); + if(currentProfile == null) + return; + if(currentProfile.getUnits().equals(Constants.MMOL)) + tt = prefTT > 0 ? Profile.toMgdl(prefTT, Constants.MMOL) : 80d; + else + tt = prefTT > 0 ? prefTT : 80d; + final double finalTT = tt; if (startESMCheckbox.isChecked()) { - confirmMessage += "
" + "TT: " + "" + ((int) tt) + "mg/dl for " + ((int) ttDuration) + " min "; + if(currentProfile.getUnits().equals("mmol")){ + confirmMessage += "
" + "TT: " + "" + Profile.toMmol(tt, Constants.MGDL) + " mmol for " + ((int) ttDuration) + " min "; + } else + confirmMessage += "
" + "TT: " + "" + ((int) tt) + "mg/dl for " + ((int) ttDuration) + " min "; } if (!initialEventTime.equals(eventTime)) { @@ -277,8 +288,8 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener, tempTarget.durationInMinutes = (int) ttDuration; tempTarget.reason = "Eating soon"; tempTarget.source = Source.USER; - tempTarget.low = (int) tt; - tempTarget.high = (int) tt; + tempTarget.low = (int) finalTT; + tempTarget.high = (int) finalTT; MainApp.getDbHelper().createOrUpdate(tempTarget); } @@ -339,4 +350,4 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener, eventTime.setSeconds(second); timeButton.setText(DateUtil.timeString(eventTime)); } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/overview_newcarbs_dialog.xml b/app/src/main/res/layout/overview_newcarbs_dialog.xml index 1860078ddb..3be973c402 100644 --- a/app/src/main/res/layout/overview_newcarbs_dialog.xml +++ b/app/src/main/res/layout/overview_newcarbs_dialog.xml @@ -37,20 +37,27 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginTop="5dp" - android:text="Start activity TT" /> + android:text="@string/start_activity_tt" /> + + + android:text="@string/suspendloopfor30min" /> + android:layout_gravity="center_horizontal" + android:padding="5dp"> + android:visibility="gone" /> + android:layout_marginBottom="5dp" + android:orientation="horizontal">