diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java index 90728994c0..6dbec3d1ab 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java @@ -90,7 +90,7 @@ import info.nightscout.androidaps.plugins.general.overview.activities.QuickWizar import info.nightscout.androidaps.plugins.general.overview.dialogs.CalibrationDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.CarbsDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.InsulinDialog; -import info.nightscout.androidaps.plugins.general.overview.dialogs.NewTreatmentDialog; +import info.nightscout.androidaps.plugins.general.overview.dialogs.TreatmentDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.ProfileSwitchDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.TempTargetDialog; import info.nightscout.androidaps.plugins.general.overview.dialogs.WizardDialog; @@ -856,8 +856,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } break; case R.id.overview_treatmentbutton: - NewTreatmentDialog treatmentDialogFragment = new NewTreatmentDialog(); - treatmentDialogFragment.show(manager, "TreatmentDialog"); + new TreatmentDialog().show(manager, "Overview"); break; case R.id.overview_insulinbutton: new InsulinDialog().show(manager, "Overview"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/CarbsDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/CarbsDialog.kt index f164a0e97a..b516e84b8f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/CarbsDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/CarbsDialog.kt @@ -30,7 +30,6 @@ import java.util.* import kotlin.math.max class CarbsDialog : DialogFragmentWithDate() { - private val log = LoggerFactory.getLogger(CarbsDialog::class.java) companion object { private const val FAV1_DEFAULT = 5 @@ -163,10 +162,11 @@ class CarbsDialog : DialogFragmentWithDate() { val duration = overview_carbs_duration.value.toInt() if (duration > 0) actions.add(MainApp.gs(R.string.duration) + ": " + duration + MainApp.gs(R.string.shorthour)) - if (carbs > 0) + if (carbsAfterConstraints > 0) { actions.add(MainApp.gs(R.string.carbs) + ": " + "" + MainApp.gs(R.string.format_carbs, carbsAfterConstraints) + "") - if (carbsAfterConstraints != carbs) - actions.add("" + MainApp.gs(R.string.carbsconstraintapplied) + "") + if (carbsAfterConstraints != carbs) + actions.add("" + MainApp.gs(R.string.carbsconstraintapplied) + "") + } val notes = notes.text.toString() if (notes.isNotEmpty()) actions.add(MainApp.gs(R.string.careportal_newnstreatment_notes_label) + ": " + notes) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/InsulinDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/InsulinDialog.kt index 8a6b66ac5b..d3d84c99b1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/InsulinDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/InsulinDialog.kt @@ -32,7 +32,6 @@ import kotlin.math.abs import kotlin.math.max class InsulinDialog : DialogFragmentWithDate() { - private val log = LoggerFactory.getLogger(InsulinDialog::class.java) companion object { private const val PLUS1_DEFAULT = 0.5 @@ -122,13 +121,13 @@ class InsulinDialog : DialogFragmentWithDate() { val recordOnlyChecked = overview_insulin_record_only.isChecked val eatingSoonChecked = overview_insulin_start_eating_soon_tt.isChecked - if (insulin > 0) { + if (insulinAfterConstraints > 0) { actions.add(MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + MainApp.gs(R.string.insulin_unit_shortname) + "") if (recordOnlyChecked) actions.add("" + MainApp.gs(R.string.bolusrecordedonly) + "") + if (abs(insulinAfterConstraints - insulin) > pumpDescription.pumpType.determineCorrectBolusStepSize(insulinAfterConstraints)) + actions.add(MainApp.gs(R.string.bolusconstraintappliedwarning, MainApp.gc(R.color.warning), insulin, insulinAfterConstraints)) } - if (abs(insulinAfterConstraints - insulin) > pumpDescription.pumpType.determineCorrectBolusStepSize(insulinAfterConstraints)) - actions.add(MainApp.gs(R.string.bolusconstraintappliedwarning, MainApp.gc(R.color.warning), insulin, insulinAfterConstraints)) val eatingSoonTTDuration = DefaultValueHelper.determineEatingSoonTTDuration() val eatingSoonTT = DefaultValueHelper.determineEatingSoonTT() if (eatingSoonChecked) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java deleted file mode 100644 index 9f2f42b2d9..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java +++ /dev/null @@ -1,213 +0,0 @@ -package info.nightscout.androidaps.plugins.general.overview.dialogs; - -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import androidx.fragment.app.DialogFragment; -import androidx.appcompat.app.AlertDialog; -import android.text.Editable; -import android.text.Html; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.CheckBox; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.text.DecimalFormat; -import java.util.Objects; - -import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.data.DetailedBolusInfo; -import info.nightscout.androidaps.db.CareportalEvent; -import info.nightscout.androidaps.db.Source; -import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.androidaps.interfaces.PumpInterface; -import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; -import info.nightscout.androidaps.queue.Callback; -import info.nightscout.androidaps.utils.DecimalFormatter; -import info.nightscout.androidaps.utils.NumberPicker; -import info.nightscout.androidaps.utils.SafeParse; -import info.nightscout.androidaps.utils.ToastUtils; - -public class NewTreatmentDialog extends DialogFragment implements OnClickListener { - private static Logger log = LoggerFactory.getLogger(NewTreatmentDialog.class); - - private NumberPicker editCarbs; - private NumberPicker editInsulin; - - private Integer maxCarbs; - private Double maxInsulin; - - //one shot guards - private boolean accepted; - private boolean okClicked; - - private CheckBox recordOnlyCheckbox; - - public NewTreatmentDialog() { - } - - final private TextWatcher textWatcher = new TextWatcher() { - @Override - public void afterTextChanged(Editable s) { - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - validateInputs(); - } - }; - - private void validateInputs() { - Integer carbs = SafeParse.stringToInt(editCarbs.getText()); - if (carbs > maxCarbs) { - editCarbs.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.carbsconstraintapplied)); - } - Double insulin = SafeParse.stringToDouble(editInsulin.getText()); - if (insulin > maxInsulin) { - editInsulin.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.bolusconstraintapplied)); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.overview_newtreatment_dialog, container, false); - - view.findViewById(R.id.ok).setOnClickListener(this); - view.findViewById(R.id.cancel).setOnClickListener(this); - - getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); - getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); - - maxCarbs = MainApp.getConstraintChecker().getMaxCarbsAllowed().value(); - maxInsulin = MainApp.getConstraintChecker().getMaxBolusAllowed().value(); - - editCarbs = (NumberPicker) view.findViewById(R.id.treatments_newtreatment_carbsamount); - editInsulin = (NumberPicker) view.findViewById(R.id.treatments_newtreatment_insulinamount); - - editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, view.findViewById(R.id.ok), textWatcher); - editInsulin.setParams(0d, 0d, maxInsulin, ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().bolusStep, DecimalFormatter.pumpSupportedBolusFormat(), false, view.findViewById(R.id.ok), textWatcher); - - recordOnlyCheckbox = (CheckBox) view.findViewById(R.id.newtreatment_record_only); - - setCancelable(true); - getDialog().setCanceledOnTouchOutside(false); - return view; - } - - @Override - public synchronized void onClick(View view) { - switch (view.getId()) { - case R.id.ok: - if (okClicked) { - log.debug("guarding: ok already clicked"); - dismiss(); - return; - } - okClicked = true; - - try { - final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump(); - - if (pump == null) - return; - - Double insulin = SafeParse.stringToDouble(editInsulin.getText()); - final Integer carbs = SafeParse.stringToInt(editCarbs.getText()); - - String confirmMessage = MainApp.gs(R.string.entertreatmentquestion) + "
"; - - Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value(); - Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbs)).value(); - - if (insulin > 0) { - confirmMessage += MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + ""; - if (recordOnlyCheckbox.isChecked()) { - confirmMessage += "
" + MainApp.gs(R.string.bolusrecordedonly) + ""; - } - if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(insulinAfterConstraints) || !Objects.equals(carbsAfterConstraints, carbs)) - confirmMessage += "
" + MainApp.gs(R.string.bolusconstraintappliedwarning, MainApp.gc(R.color.warning), insulin, insulinAfterConstraints); - } - if (carbsAfterConstraints > 0) - confirmMessage += "
" + MainApp.gs(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + ""; - - - final double finalInsulinAfterConstraints = insulinAfterConstraints; - final int finalCarbsAfterConstraints = carbsAfterConstraints; - - final Context context = getContext(); - final AlertDialog.Builder builder = new AlertDialog.Builder(context); - - builder.setTitle(MainApp.gs(R.string.confirmation)); - builder.setMessage(Html.fromHtml(confirmMessage)); - builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - synchronized (builder) { - if (accepted) { - log.debug("guarding: already accepted"); - return; - } - accepted = true; - if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) { - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - if (finalInsulinAfterConstraints == 0) - detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION; - if (finalCarbsAfterConstraints == 0) - detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS; - detailedBolusInfo.insulin = finalInsulinAfterConstraints; - detailedBolusInfo.carbs = finalCarbsAfterConstraints; - detailedBolusInfo.context = context; - detailedBolusInfo.source = Source.USER; - if (!(recordOnlyCheckbox.isChecked() && (detailedBolusInfo.insulin > 0 || ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo))) { - ConfigBuilderPlugin.getPlugin().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, false); - } - } - } - } - }); - builder.setNegativeButton(MainApp.gs(R.string.cancel), null); - builder.show(); - - dismiss(); - } catch (Exception e) { - log.error("Unhandled exception", e); - } - break; - case R.id.cancel: - dismiss(); - break; - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TreatmentDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TreatmentDialog.kt new file mode 100644 index 0000000000..767e9cef55 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/TreatmentDialog.kt @@ -0,0 +1,124 @@ +package info.nightscout.androidaps.plugins.general.overview.dialogs + +import android.content.Intent +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.google.common.base.Joiner +import info.nightscout.androidaps.MainApp +import info.nightscout.androidaps.R +import info.nightscout.androidaps.data.DetailedBolusInfo +import info.nightscout.androidaps.db.CareportalEvent +import info.nightscout.androidaps.db.Source +import info.nightscout.androidaps.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.androidaps.utils.* +import kotlinx.android.synthetic.main.okcancel.* +import kotlinx.android.synthetic.main.overview_treatment_dialog.* +import java.text.DecimalFormat +import java.util.* +import kotlin.math.abs + +class TreatmentDialog : DialogFragmentWithDate() { + private var maxCarbs = MainApp.getConstraintChecker().maxCarbsAllowed.value().toDouble() + private var maxInsulin = MainApp.getConstraintChecker().maxBolusAllowed.value() + + private val textWatcher: TextWatcher = object : TextWatcher { + override fun afterTextChanged(s: Editable) {} + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + validateInputs() + } + } + + private fun validateInputs() { + if (SafeParse.stringToInt(overview_treatment_carbs.text) > maxCarbs) { + overview_treatment_carbs.value = 0.0 + ToastUtils.showToastInUiThread(MainApp.instance().applicationContext, MainApp.gs(R.string.carbsconstraintapplied)) + } + if (SafeParse.stringToDouble(overview_treatment_insulin.text) > maxInsulin) { + overview_treatment_insulin.value = 0.0 + ToastUtils.showToastInUiThread(MainApp.instance().applicationContext, MainApp.gs(R.string.bolusconstraintapplied)) + } + } + + override fun onSaveInstanceState(savedInstanceState: Bundle) { + super.onSaveInstanceState(savedInstanceState) + savedInstanceState.putDouble("overview_treatment_carbs", overview_treatment_carbs.value) + savedInstanceState.putDouble("overview_treatment_insulin", overview_treatment_insulin.value) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + onCreateView() + return inflater.inflate(R.layout.overview_treatment_dialog, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val pumpDescription = ConfigBuilderPlugin.getPlugin().activePump?.pumpDescription ?: return + overview_treatment_carbs.setParams(savedInstanceState?.getDouble("overview_treatment_carbs") + ?: 0.0, 0.0, maxCarbs, 1.0, DecimalFormat("0"), false, ok, textWatcher) + overview_treatment_insulin.setParams(savedInstanceState?.getDouble("overview_treatment_insulin") + ?: 0.0, 0.0, maxInsulin, pumpDescription.bolusStep, DecimalFormatter.pumpSupportedBolusFormat(), false, ok, textWatcher) + } + + override fun submit() { + val pumpDescription = ConfigBuilderPlugin.getPlugin().activePump?.pumpDescription ?: return + val insulin = SafeParse.stringToDouble(overview_treatment_insulin.text) + val carbs = SafeParse.stringToInt(overview_treatment_carbs.text) + val recordOnlyChecked = overview_treatment_record_only.isChecked + val actions: LinkedList = LinkedList() + val insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(Constraint(insulin)).value() + val carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(Constraint(carbs)).value() + + actions.add("" + MainApp.gs(R.string.entertreatmentquestion) + "") + if (insulinAfterConstraints > 0) { + actions.add(MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + MainApp.gs(R.string.insulin_unit_shortname) + "") + if (recordOnlyChecked) + actions.add("" + MainApp.gs(R.string.bolusrecordedonly) + "") + if (abs(insulinAfterConstraints - insulin) > pumpDescription.pumpType.determineCorrectBolusStepSize(insulinAfterConstraints)) + actions.add(MainApp.gs(R.string.bolusconstraintappliedwarning, MainApp.gc(R.color.warning), insulin, insulinAfterConstraints)) + } + if (carbsAfterConstraints > 0) { + actions.add(MainApp.gs(R.string.carbs) + ": " + "" + MainApp.gs(R.string.format_carbs, carbsAfterConstraints) + "") + if (carbsAfterConstraints != carbs) + actions.add("" + MainApp.gs(R.string.carbsconstraintapplied) + "") + } + if (insulinAfterConstraints > 0 || carbsAfterConstraints > 0) { + activity?.let { activity -> + OKDialog.showConfirmation(activity, HtmlHelper.fromHtml(Joiner.on("
").join(actions))) { + val detailedBolusInfo = DetailedBolusInfo() + if (insulinAfterConstraints == 0.0) detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION + if (carbsAfterConstraints == 0) detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS + detailedBolusInfo.insulin = insulinAfterConstraints + detailedBolusInfo.carbs = carbsAfterConstraints.toDouble() + detailedBolusInfo.context = context + detailedBolusInfo.source = Source.USER + if (!(recordOnlyChecked && (detailedBolusInfo.insulin > 0 || pumpDescription.storesCarbInfo))) { + ConfigBuilderPlugin.getPlugin().commandQueue.bolus(detailedBolusInfo, object : Callback() { + override fun run() { + if (!result.success) { + val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java) + 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, false) + } + } + } else + OKDialog.show(activity, "", MainApp.gs(R.string.no_action_selected), null) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/actions_extendedbolus_dialog.xml b/app/src/main/res/layout/actions_extendedbolus_dialog.xml index 1ae30dec5c..8eb4c03b86 100644 --- a/app/src/main/res/layout/actions_extendedbolus_dialog.xml +++ b/app/src/main/res/layout/actions_extendedbolus_dialog.xml @@ -50,7 +50,7 @@ android:layout_gravity="center_horizontal" android:width="120dp" android:padding="10dp" - android:text="@string/treatments_newtreatment_insulinamount_label" + android:text="@string/overview_insulin_label" android:textAppearance="@android:style/TextAppearance.Material.Small" android:textStyle="bold" /> diff --git a/app/src/main/res/layout/overview_newtreatment_dialog.xml b/app/src/main/res/layout/overview_newtreatment_dialog.xml deleted file mode 100644 index 9aec3699e9..0000000000 --- a/app/src/main/res/layout/overview_newtreatment_dialog.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/overview_treatment_dialog.xml b/app/src/main/res/layout/overview_treatment_dialog.xml new file mode 100644 index 0000000000..9ee1ae5ea6 --- /dev/null +++ b/app/src/main/res/layout/overview_treatment_dialog.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 fd36282e5c..e41f398ed8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,8 +97,6 @@ Ins: IOB: Total IOB: - Insulin - Carbs BG TT Carbs