2019-12-20 18:55:54 +01:00
|
|
|
package info.nightscout.androidaps.dialogs
|
2019-12-20 13:58:51 +01:00
|
|
|
|
|
|
|
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.Constants
|
|
|
|
import info.nightscout.androidaps.MainApp
|
|
|
|
import info.nightscout.androidaps.R
|
|
|
|
import info.nightscout.androidaps.data.Profile
|
|
|
|
import info.nightscout.androidaps.db.CareportalEvent
|
|
|
|
import info.nightscout.androidaps.db.DatabaseHelper
|
|
|
|
import info.nightscout.androidaps.db.Source
|
|
|
|
import info.nightscout.androidaps.db.TempTarget
|
|
|
|
import info.nightscout.androidaps.interfaces.Constraint
|
|
|
|
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions
|
|
|
|
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
|
|
|
|
import info.nightscout.androidaps.plugins.treatments.CarbsGenerator
|
|
|
|
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
|
|
|
|
import info.nightscout.androidaps.utils.*
|
2019-12-20 23:05:35 +01:00
|
|
|
import kotlinx.android.synthetic.main.dialog_carbs.*
|
2019-12-20 13:58:51 +01:00
|
|
|
import kotlinx.android.synthetic.main.notes.*
|
|
|
|
import kotlinx.android.synthetic.main.okcancel.*
|
|
|
|
import java.text.DecimalFormat
|
|
|
|
import java.util.*
|
|
|
|
import kotlin.math.max
|
|
|
|
|
|
|
|
class CarbsDialog : DialogFragmentWithDate() {
|
|
|
|
|
|
|
|
companion object {
|
|
|
|
private const val FAV1_DEFAULT = 5
|
|
|
|
private const val FAV2_DEFAULT = 10
|
|
|
|
private const val FAV3_DEFAULT = 20
|
|
|
|
}
|
|
|
|
|
2019-12-20 14:52:10 +01:00
|
|
|
private val maxCarbs = MainApp.getConstraintChecker().maxCarbsAllowed.value().toDouble()
|
2019-12-20 13:58:51 +01:00
|
|
|
|
|
|
|
private val textWatcher: TextWatcher = object : TextWatcher {
|
|
|
|
override fun afterTextChanged(s: Editable) {
|
|
|
|
validateInputs()
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
|
|
|
|
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun validateInputs() {
|
|
|
|
val time = overview_carbs_time.value.toInt()
|
|
|
|
if (time > 12 * 60 || time < -12 * 60) {
|
|
|
|
overview_carbs_time.value = 0.0
|
|
|
|
ToastUtils.showToastInUiThread(MainApp.instance().applicationContext, MainApp.gs(R.string.constraintapllied))
|
|
|
|
}
|
2019-12-20 14:52:10 +01:00
|
|
|
if (overview_carbs_duration.value > 10) {
|
2019-12-20 13:58:51 +01:00
|
|
|
overview_carbs_duration.value = 0.0
|
|
|
|
ToastUtils.showToastInUiThread(MainApp.instance().applicationContext, MainApp.gs(R.string.constraintapllied))
|
|
|
|
}
|
2019-12-20 14:52:10 +01:00
|
|
|
if (overview_carbs_carbs.value.toInt() > maxCarbs) {
|
2019-12-20 13:58:51 +01:00
|
|
|
overview_carbs_carbs.value = 0.0
|
|
|
|
ToastUtils.showToastInUiThread(MainApp.instance().applicationContext, MainApp.gs(R.string.carbsconstraintapplied))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onSaveInstanceState(savedInstanceState: Bundle) {
|
|
|
|
super.onSaveInstanceState(savedInstanceState)
|
|
|
|
savedInstanceState.putDouble("overview_carbs_time", overview_carbs_time.value)
|
|
|
|
savedInstanceState.putDouble("overview_carbs_duration", overview_carbs_duration.value)
|
|
|
|
savedInstanceState.putDouble("overview_carbs_carbs", overview_carbs_carbs.value)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
|
|
|
savedInstanceState: Bundle?): View? {
|
2019-12-20 23:05:35 +01:00
|
|
|
onCreateViewGeneral()
|
2019-12-20 18:55:54 +01:00
|
|
|
return inflater.inflate(R.layout.dialog_carbs, container, false)
|
2019-12-20 13:58:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
super.onViewCreated(view, savedInstanceState)
|
|
|
|
|
|
|
|
overview_carbs_time.setParams(savedInstanceState?.getDouble("overview_carbs_time")
|
2019-12-20 23:05:35 +01:00
|
|
|
?: 0.0, -12 * 60.0, 12 * 60.0, 5.0, DecimalFormat("0"), false, ok, textWatcher)
|
2019-12-20 13:58:51 +01:00
|
|
|
|
|
|
|
overview_carbs_duration.setParams(savedInstanceState?.getDouble("overview_carbs_duration")
|
2019-12-20 23:05:35 +01:00
|
|
|
?: 0.0, 0.0, 10.0, 1.0, DecimalFormat("0"), false, ok, textWatcher)
|
2019-12-20 13:58:51 +01:00
|
|
|
|
|
|
|
overview_carbs_carbs.setParams(savedInstanceState?.getDouble("overview_carbs_carbs")
|
2019-12-20 23:05:35 +01:00
|
|
|
?: 0.0, 0.0, maxCarbs, 1.0, DecimalFormat("0"), false, ok, textWatcher)
|
2019-12-20 13:58:51 +01:00
|
|
|
|
|
|
|
overview_carbs_plus1.text = toSignedString(SP.getInt(R.string.key_carbs_button_increment_1, FAV1_DEFAULT))
|
|
|
|
overview_carbs_plus1.setOnClickListener {
|
|
|
|
overview_carbs_carbs.value = max(0.0, overview_carbs_carbs.value
|
2019-12-20 23:05:35 +01:00
|
|
|
+ SP.getInt(R.string.key_carbs_button_increment_1, FAV1_DEFAULT))
|
2019-12-20 13:58:51 +01:00
|
|
|
validateInputs()
|
|
|
|
}
|
|
|
|
|
|
|
|
overview_carbs_plus2.text = toSignedString(SP.getInt(R.string.key_carbs_button_increment_2, FAV2_DEFAULT))
|
|
|
|
overview_carbs_plus2.setOnClickListener {
|
|
|
|
overview_carbs_carbs.value = max(0.0, overview_carbs_carbs.value
|
2019-12-20 23:05:35 +01:00
|
|
|
+ SP.getInt(R.string.key_carbs_button_increment_2, FAV2_DEFAULT))
|
2019-12-20 13:58:51 +01:00
|
|
|
validateInputs()
|
|
|
|
}
|
|
|
|
|
|
|
|
overview_carbs_plus3.text = toSignedString(SP.getInt(R.string.key_carbs_button_increment_3, FAV3_DEFAULT))
|
|
|
|
overview_carbs_plus3.setOnClickListener {
|
|
|
|
overview_carbs_carbs.value = max(0.0, overview_carbs_carbs.value
|
2019-12-20 23:05:35 +01:00
|
|
|
+ SP.getInt(R.string.key_carbs_button_increment_3, FAV3_DEFAULT))
|
2019-12-20 13:58:51 +01:00
|
|
|
validateInputs()
|
|
|
|
}
|
|
|
|
|
|
|
|
DatabaseHelper.actualBg()?.let { bgReading ->
|
|
|
|
if (bgReading.value < 72)
|
|
|
|
overview_carbs_hypo_tt.setChecked(true)
|
|
|
|
}
|
|
|
|
overview_carbs_hypo_tt.setOnClickListener {
|
|
|
|
overview_carbs_activity_tt.isChecked = false
|
|
|
|
overview_carbs_eating_soon_tt.isChecked = false
|
|
|
|
}
|
|
|
|
overview_carbs_activity_tt.setOnClickListener {
|
|
|
|
overview_carbs_hypo_tt.isChecked = false
|
|
|
|
overview_carbs_eating_soon_tt.isChecked = false
|
|
|
|
}
|
|
|
|
overview_carbs_eating_soon_tt.setOnClickListener {
|
|
|
|
overview_carbs_hypo_tt.isChecked = false
|
|
|
|
overview_carbs_activity_tt.isChecked = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun toSignedString(value: Int): String {
|
|
|
|
return if (value > 0) "+$value" else value.toString()
|
|
|
|
}
|
|
|
|
|
2019-12-21 23:17:20 +01:00
|
|
|
override fun submit(): Boolean {
|
2019-12-20 13:58:51 +01:00
|
|
|
val carbs = overview_carbs_carbs.value.toInt()
|
|
|
|
val carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(Constraint(carbs)).value()
|
|
|
|
val units = ProfileFunctions.getSystemUnits()
|
|
|
|
val activityTTDuration = DefaultValueHelper.determineActivityTTDuration()
|
|
|
|
val activityTT = DefaultValueHelper.determineActivityTT()
|
|
|
|
val eatingSoonTTDuration = DefaultValueHelper.determineEatingSoonTTDuration()
|
|
|
|
val eatingSoonTT = DefaultValueHelper.determineEatingSoonTT()
|
|
|
|
val hypoTTDuration = DefaultValueHelper.determineHypoTTDuration()
|
|
|
|
val hypoTT = DefaultValueHelper.determineHypoTT()
|
|
|
|
val actions: LinkedList<String?> = LinkedList()
|
|
|
|
val unitLabel = if (units == Constants.MMOL) MainApp.gs(R.string.mmol) else MainApp.gs(R.string.mgdl)
|
|
|
|
|
|
|
|
val activitySelected = overview_carbs_activity_tt.isChecked
|
|
|
|
if (activitySelected)
|
|
|
|
actions.add(MainApp.gs(R.string.temptargetshort) + ": " + "<font color='" + MainApp.gc(R.color.tempTargetConfirmation) + "'>" + DecimalFormatter.to1Decimal(activityTT) + " " + unitLabel + " (" + activityTTDuration + " " + MainApp.gs(R.string.unit_minute_short) + ")</font>")
|
|
|
|
val eatingSoonSelected = overview_carbs_eating_soon_tt.isChecked
|
|
|
|
if (eatingSoonSelected)
|
|
|
|
actions.add(MainApp.gs(R.string.temptargetshort) + ": " + "<font color='" + MainApp.gc(R.color.tempTargetConfirmation) + "'>" + DecimalFormatter.to1Decimal(eatingSoonTT) + " " + unitLabel + " (" + eatingSoonTTDuration + " " + MainApp.gs(R.string.unit_minute_short) + ")</font>")
|
|
|
|
val hypoSelected = overview_carbs_hypo_tt.isChecked
|
|
|
|
if (hypoSelected)
|
|
|
|
actions.add(MainApp.gs(R.string.temptargetshort) + ": " + "<font color='" + MainApp.gc(R.color.tempTargetConfirmation) + "'>" + DecimalFormatter.to1Decimal(hypoTT) + " " + unitLabel + " (" + hypoTTDuration + " " + MainApp.gs(R.string.unit_minute_short) + ")</font>")
|
|
|
|
|
|
|
|
val timeOffset = overview_carbs_time.value.toInt()
|
2020-01-02 00:40:03 +01:00
|
|
|
val time = eventTime + timeOffset * 1000 * 60
|
2019-12-20 13:58:51 +01:00
|
|
|
if (timeOffset != 0)
|
|
|
|
actions.add(MainApp.gs(R.string.time) + ": " + DateUtil.dateAndTimeString(time))
|
|
|
|
val duration = overview_carbs_duration.value.toInt()
|
|
|
|
if (duration > 0)
|
|
|
|
actions.add(MainApp.gs(R.string.duration) + ": " + duration + MainApp.gs(R.string.shorthour))
|
2019-12-20 15:36:27 +01:00
|
|
|
if (carbsAfterConstraints > 0) {
|
2019-12-20 13:58:51 +01:00
|
|
|
actions.add(MainApp.gs(R.string.carbs) + ": " + "<font color='" + MainApp.gc(R.color.carbs) + "'>" + MainApp.gs(R.string.format_carbs, carbsAfterConstraints) + "</font>")
|
2019-12-20 15:36:27 +01:00
|
|
|
if (carbsAfterConstraints != carbs)
|
|
|
|
actions.add("<font color='" + MainApp.gc(R.color.warning) + "'>" + MainApp.gs(R.string.carbsconstraintapplied) + "</font>")
|
|
|
|
}
|
2019-12-20 13:58:51 +01:00
|
|
|
val notes = notes.text.toString()
|
|
|
|
if (notes.isNotEmpty())
|
|
|
|
actions.add(MainApp.gs(R.string.careportal_newnstreatment_notes_label) + ": " + notes)
|
|
|
|
|
2020-01-02 00:40:03 +01:00
|
|
|
if (eventTimeChanged)
|
|
|
|
actions.add(MainApp.gs(R.string.time) + ": " + DateUtil.dateAndTimeString(eventTime))
|
|
|
|
|
2019-12-20 13:58:51 +01:00
|
|
|
if (carbsAfterConstraints > 0 || activitySelected || eatingSoonSelected || hypoSelected) {
|
|
|
|
activity?.let { activity ->
|
2019-12-22 21:37:26 +01:00
|
|
|
OKDialog.showConfirmation(activity, MainApp.gs(R.string.carbs), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), Runnable {
|
2019-12-20 13:58:51 +01:00
|
|
|
if (activitySelected) {
|
|
|
|
val tempTarget = TempTarget()
|
2020-01-02 00:40:03 +01:00
|
|
|
.date(eventTime)
|
2019-12-20 23:05:35 +01:00
|
|
|
.duration(activityTTDuration)
|
|
|
|
.reason(MainApp.gs(R.string.activity))
|
|
|
|
.source(Source.USER)
|
|
|
|
.low(Profile.toMgdl(activityTT, ProfileFunctions.getSystemUnits()))
|
|
|
|
.high(Profile.toMgdl(activityTT, ProfileFunctions.getSystemUnits()))
|
2019-12-20 13:58:51 +01:00
|
|
|
TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget)
|
|
|
|
} else if (eatingSoonSelected) {
|
|
|
|
val tempTarget = TempTarget()
|
2020-01-02 00:40:03 +01:00
|
|
|
.date(eventTime)
|
2019-12-20 23:05:35 +01:00
|
|
|
.duration(eatingSoonTTDuration)
|
|
|
|
.reason(MainApp.gs(R.string.eatingsoon))
|
|
|
|
.source(Source.USER)
|
|
|
|
.low(Profile.toMgdl(eatingSoonTT, ProfileFunctions.getSystemUnits()))
|
|
|
|
.high(Profile.toMgdl(eatingSoonTT, ProfileFunctions.getSystemUnits()))
|
2019-12-20 13:58:51 +01:00
|
|
|
TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget)
|
|
|
|
} else if (hypoSelected) {
|
|
|
|
val tempTarget = TempTarget()
|
2020-01-02 00:40:03 +01:00
|
|
|
.date(eventTime)
|
2019-12-20 23:05:35 +01:00
|
|
|
.duration(hypoTTDuration)
|
|
|
|
.reason(MainApp.gs(R.string.hypo))
|
|
|
|
.source(Source.USER)
|
|
|
|
.low(Profile.toMgdl(hypoTT, ProfileFunctions.getSystemUnits()))
|
|
|
|
.high(Profile.toMgdl(hypoTT, ProfileFunctions.getSystemUnits()))
|
2019-12-20 13:58:51 +01:00
|
|
|
TreatmentsPlugin.getPlugin().addToHistoryTempTarget(tempTarget)
|
|
|
|
}
|
|
|
|
if (carbsAfterConstraints > 0) {
|
|
|
|
if (duration == 0) {
|
|
|
|
CarbsGenerator.createCarb(carbsAfterConstraints, time, CareportalEvent.CARBCORRECTION, notes)
|
|
|
|
} else {
|
|
|
|
CarbsGenerator.generateCarbs(carbsAfterConstraints, time, duration, notes)
|
2020-01-02 00:40:03 +01:00
|
|
|
NSUpload.uploadEvent(CareportalEvent.NOTE, time - 2000, MainApp.gs(R.string.generated_ecarbs_note, carbsAfterConstraints, duration, timeOffset))
|
2019-12-20 13:58:51 +01:00
|
|
|
}
|
|
|
|
}
|
2019-12-22 21:37:26 +01:00
|
|
|
}, null)
|
2019-12-20 13:58:51 +01:00
|
|
|
}
|
|
|
|
} else
|
2019-12-22 21:37:26 +01:00
|
|
|
activity?.let { activity ->
|
|
|
|
OKDialog.show(activity, MainApp.gs(R.string.carbs), MainApp.gs(R.string.no_action_selected))
|
|
|
|
}
|
2019-12-21 23:17:20 +01:00
|
|
|
return true
|
2019-12-20 13:58:51 +01:00
|
|
|
}
|
|
|
|
}
|