diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt index b11d256efd..57c1689ada 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/TempTargetDialog.kt @@ -85,23 +85,11 @@ class TempTargetDialog : DialogFragmentWithDate() { val adapterReason = ArrayAdapter(context, R.layout.spinner_centered, reasonList) overview_temptarget_reason.adapter = adapterReason - overview_temptarget_custom?.setOnClickListener { - overview_temptarget_temptarget.value = savedInstanceState?.getDouble("overview_temptarget_temptarget") ?: if (profileFunction.getUnits() == Constants.MMOL) Constants.MIN_TT_MMOL else Constants.MIN_TT_MGDL - overview_temptarget_duration.value = savedInstanceState?.getDouble("overview_temptarget_duration") ?: 0.0 - overview_temptarget_reason.setSelection(reasonList.indexOf(resourceHelper.gs(R.string.manual))); - } - overview_temptarget_cancel?.setOnClickListener { shortClick(it) } overview_temptarget_eating_soon?.setOnClickListener { shortClick(it) } overview_temptarget_activity?.setOnClickListener { shortClick(it) } overview_temptarget_hypo?.setOnClickListener { shortClick(it) } - /* - overview_temptarget_cancel?.setOnLongClickListener { - longClick(it) - return@setOnLongClickListener true - } - */ overview_temptarget_eating_soon?.setOnLongClickListener { longClick(it) return@setOnLongClickListener true @@ -124,11 +112,6 @@ class TempTargetDialog : DialogFragmentWithDate() { private fun longClick(v:View) { when (v.id) { - R.id.overview_temptarget_cancel -> { - overview_temptarget_temptarget.value = 0.0 - overview_temptarget_duration.value = 0.0 - overview_temptarget_reason.setSelection(reasonList.indexOf(resourceHelper.gs(R.string.cancel))) - } R.id.overview_temptarget_eating_soon -> { overview_temptarget_temptarget.value = defaultValueHelper.determineEatingSoonTT() overview_temptarget_duration.value = defaultValueHelper.determineEatingSoonTTDuration().toDouble() diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt index 17ed64b96f..45eebec6f4 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/WizardDialog.kt @@ -146,7 +146,7 @@ class WizardDialog : DaggerDialogFragment() { treatments_wizard_bgtrendcheckbox.setOnCheckedChangeListener(::onCheckedChanged) treatments_wizard_sbcheckbox.setOnCheckedChangeListener(::onCheckedChanged) - val showCalc = sp.getBoolean(resourceHelper.gs(R.string.key_wizard_calculation_visible), false) + val showCalc = sp.getBoolean(R.string.key_wizard_calculation_visible, false) treatments_wizard_delimiter.visibility = showCalc.toVisibility() treatments_wizard_resulttable.visibility = showCalc.toVisibility() treatments_wizard_calculationcheckbox.isChecked = showCalc @@ -211,8 +211,8 @@ class WizardDialog : DaggerDialogFragment() { } private fun loadCheckedStates() { - treatments_wizard_bgtrendcheckbox.isChecked = sp.getBoolean(resourceHelper.gs(R.string.key_wizard_include_trend_bg), false) - treatments_wizard_cobcheckbox.isChecked = sp.getBoolean(resourceHelper.gs(R.string.key_wizard_include_cob), false) + treatments_wizard_bgtrendcheckbox.isChecked = sp.getBoolean(R.string.key_wizard_include_trend_bg, false) + treatments_wizard_cobcheckbox.isChecked = sp.getBoolean(R.string.key_wizard_include_cob, false) } private fun initDialog() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java index 1013434c95..a94581ca94 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.java @@ -267,8 +267,8 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("low_temptarget_lowers_sensitivity", false); - mProfile.put("sensitivity_raises_target", sp.getBoolean(resourceHelper.gs(R.string.key_sensitivity_raises_target),SMBDefaults.sensitivity_raises_target)); - mProfile.put("resistance_lowers_target", sp.getBoolean(resourceHelper.gs(R.string.key_resistance_lowers_target),SMBDefaults.resistance_lowers_target)); + mProfile.put("sensitivity_raises_target", sp.getBoolean(R.string.key_sensitivity_raises_target,SMBDefaults.sensitivity_raises_target)); + mProfile.put("resistance_lowers_target", sp.getBoolean(R.string.key_resistance_lowers_target,SMBDefaults.resistance_lowers_target)); mProfile.put("adv_target_adjustments", SMBDefaults.adv_target_adjustments); mProfile.put("exercise_mode", SMBDefaults.exercise_mode); mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target); @@ -284,7 +284,7 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("enableUAM", uamAllowed); mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable); - boolean smbEnabled = sp.getBoolean(resourceHelper.gs(R.string.key_use_smb), false); + boolean smbEnabled = sp.getBoolean(R.string.key_use_smb, false); mProfile.put("SMBInterval", sp.getInt(R.string.key_smbinterval, SMBDefaults.SMBInterval)); mProfile.put("enableSMB_with_COB", smbEnabled && sp.getBoolean(R.string.key_enableSMB_with_COB, false)); mProfile.put("enableSMB_with_temptarget", smbEnabled && sp.getBoolean(R.string.key_enableSMB_with_temptarget, false)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt index 6617200ec8..f8c71218b5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/maintenance/ImportExportPrefs.kt @@ -123,7 +123,7 @@ class ImportExportPrefs @Inject constructor( } private fun prefsEncryptionIsDisabled() = - buildHelper.isEngineeringMode() && !sp.getBoolean(resourceHelper.gs(R.string.key_maintenance_encrypt_exported_prefs), true) + buildHelper.isEngineeringMode() && !sp.getBoolean(R.string.key_maintenance_encrypt_exported_prefs, true) private fun askForMasterPass(activity: FragmentActivity, @StringRes canceledMsg: Int, then: ((password: String) -> Unit)) { passwordCheck.queryPassword(activity, R.string.master_password, R.string.key_master_password, { password -> diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index a843da2256..31ea77b280 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -31,11 +31,7 @@ import info.nightscout.androidaps.Config import info.nightscout.androidaps.Constants import info.nightscout.androidaps.R import info.nightscout.androidaps.data.Profile -import info.nightscout.androidaps.dialogs.CalibrationDialog -import info.nightscout.androidaps.dialogs.CarbsDialog -import info.nightscout.androidaps.dialogs.InsulinDialog -import info.nightscout.androidaps.dialogs.TreatmentDialog -import info.nightscout.androidaps.dialogs.WizardDialog +import info.nightscout.androidaps.dialogs.* import info.nightscout.androidaps.events.* import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.logging.AAPSLogger @@ -187,6 +183,12 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList overviewMenus.setupChartMenu(overview_chartMenuButton) prepareGraphs() + overviewMenus.setupPopupMenu(overview_apsmode, requireContext(), childFragmentManager) + //overviewMenus.setupPopupMenu(overview_activeprofile, requireContext(), childFragmentManager) + overview_activeprofile?.setOnClickListener(this) + overview_activeprofile?.setOnLongClickListener(this) + overview_temptarget?.setOnClickListener(this) + overview_temptarget?.setOnLongClickListener(this) overview_accepttempbutton?.setOnClickListener(this) overview_treatmentbutton?.setOnClickListener(this) overview_wizardbutton?.setOnClickListener(this) @@ -196,15 +198,14 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList overview_carbsbutton?.setOnClickListener(this) overview_quickwizardbutton?.setOnClickListener(this) overview_quickwizardbutton?.setOnLongClickListener(this) + overview_apsmode?.setOnLongClickListener(this) + overview_activeprofile?.setOnLongClickListener(this) } override fun onPause() { super.onPause() disposable.clear() loopHandler.removeCallbacksAndMessages(null) - overview_apsmode_llayout?.let { unregisterForContextMenu(it) } - overview_activeprofile?.let { unregisterForContextMenu(it) } - overview_temptarget?.let { unregisterForContextMenu(it) } } override fun onResume() { @@ -276,20 +277,9 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } loopHandler.postDelayed(refreshLoop, 60 * 1000L) - overview_apsmode_llayout?.let { registerForContextMenu(overview_apsmode) } - overview_activeprofile?.let { registerForContextMenu(it) } - overview_temptarget?.let { registerForContextMenu(it) } updateGUI("onResume") } - override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenuInfo?) { - super.onCreateContextMenu(menu, v, menuInfo) - overviewMenus.createContextMenu(menu, v) - } - - override fun onContextItemSelected(item: MenuItem): Boolean { - return if (overviewMenus.onContextItemSelected(item, childFragmentManager)) true else super.onContextItemSelected(item) - } override fun onClick(v: View) { // try to fix https://fabric.io/nightscout3/android/apps/info.nightscout.androidaps/issues/5aca7a1536c7b23527eb4be7?time=last-seven-days @@ -297,12 +287,20 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (childFragmentManager.isStateSaved) return activity?.let { activity -> when (v.id) { - R.id.overview_treatmentbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { TreatmentDialog().show(childFragmentManager, "Overview") }) - R.id.overview_wizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { WizardDialog().show(childFragmentManager, "Overview") }) - R.id.overview_insulinbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { InsulinDialog().show(childFragmentManager, "Overview") }) + R.id.overview_treatmentbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { TreatmentDialog().show(childFragmentManager, "Overview") }) + R.id.overview_wizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { WizardDialog().show(childFragmentManager, "Overview") }) + R.id.overview_insulinbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { InsulinDialog().show(childFragmentManager, "Overview") }) R.id.overview_quickwizardbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { onClickQuickWizard() }) - R.id.overview_carbsbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { CarbsDialog().show(childFragmentManager, "Overview") }) - + R.id.overview_carbsbutton -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { CarbsDialog().show(childFragmentManager, "Overview") }) + R.id.overview_temptarget -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { TempTargetDialog().show(childFragmentManager, "Overview") }) + R.id.overview_activeprofile -> { + val args = Bundle() + args.putLong("time", DateUtil.now()) + args.putInt("mode", ProfileViewerDialog.Mode.RUNNING_PROFILE.ordinal) + val pvd = ProfileViewerDialog() + pvd.arguments = args + pvd.show(childFragmentManager, "ProfileViewDialog") + } R.id.overview_cgmbutton -> { if (xdripPlugin.isEnabled(PluginType.BGSOURCE)) openCgmApp("com.eveningoutpost.dexdrip") @@ -370,6 +368,13 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList startActivity(Intent(v.context, QuickWizardListActivity::class.java)) return true } + R.id.overview_apsmode -> { + OverviewMenus.showOKCancel = false + v.performClick() + } + R.id.overview_temptarget -> v.performClick() + R.id.overview_activeprofile -> activity?.let { activity -> protectionCheck.queryProtection(activity, ProtectionCheck.Protection.BOLUS, UIRunnable { ProfileSwitchDialog().show(childFragmentManager, "Overview") })} + } return false } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt index 4e996717c8..0eab3699a5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewMenus.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.os.Bundle import android.text.SpannableString import android.text.style.ForegroundColorSpan -import android.view.ContextMenu import android.view.Menu import android.view.MenuItem import android.view.View @@ -38,6 +37,7 @@ import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DefaultValueHelper import info.nightscout.androidaps.utils.ToastUtils +import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.buildHelper.BuildHelper import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP @@ -75,6 +75,7 @@ class OverviewMenus @Inject constructor( companion object { const val MAX_GRAPHS = 5 // including main + var showOKCancel = true } fun enabledTypes(graph: Int): String { @@ -175,65 +176,83 @@ class OverviewMenus @Inject constructor( } } - fun createContextMenu(menu: ContextMenu, v: View) { - when (v.id) { - R.id.overview_apsmode -> { - val pumpDescription: PumpDescription = activePlugin.activePump.pumpDescription - if (!profileFunction.isProfileValid("ContextMenuCreation")) return - menu.setHeaderTitle(resourceHelper.gs(R.string.loop)) - if (loopPlugin.isEnabled(PluginType.LOOP)) { - menu.add(resourceHelper.gs(R.string.disableloop)) - if (!loopPlugin.isSuspended) { - menu.add(resourceHelper.gs(R.string.suspendloopfor1h)) - menu.add(resourceHelper.gs(R.string.suspendloopfor2h)) - menu.add(resourceHelper.gs(R.string.suspendloopfor3h)) - menu.add(resourceHelper.gs(R.string.suspendloopfor10h)) - } else { + fun setupPopupMenu(v: View, context: Context, manager: FragmentManager) { + v.setOnClickListener { + val popup = PopupMenu(v.context, v) + when (v.id) { + R.id.overview_apsmode -> { + val pumpDescription: PumpDescription = activePlugin.activePump.pumpDescription + if (profileFunction.isProfileValid("ContextMenuCreation")) { + val item = popup.menu.add(Menu.NONE,1,Menu.NONE,resourceHelper.gs(R.string.loop)) // title + val title = item.title + val s = SpannableString(title) + s.setSpan( ForegroundColorSpan(resourceHelper.gc(R.color.colorAccent)), 0, s.length, 0) + item.setTitle(s) + if (loopPlugin.isEnabled(PluginType.LOOP)) { + popup.menu.add(resourceHelper.gs(R.string.disableloop)) + if (!loopPlugin.isSuspended) { + popup.menu.add(resourceHelper.gs(R.string.suspendloopfor1h)) + popup.menu.add(resourceHelper.gs(R.string.suspendloopfor2h)) + popup.menu.add(resourceHelper.gs(R.string.suspendloopfor3h)) + popup.menu.add(resourceHelper.gs(R.string.suspendloopfor10h)) + } else { + if (!loopPlugin.isDisconnected) { + popup.menu.add(resourceHelper.gs(R.string.resume)) + } + } + } + if (!loopPlugin.isEnabled(PluginType.LOOP)) { + popup.menu.add(resourceHelper.gs(R.string.enableloop)) + } if (!loopPlugin.isDisconnected) { - menu.add(resourceHelper.gs(R.string.resume)) + if (pumpDescription.tempDurationStep15mAllowed) popup.menu.add(resourceHelper.gs(R.string.disconnectpumpfor15m)) + if (pumpDescription.tempDurationStep30mAllowed) popup.menu.add(resourceHelper.gs(R.string.disconnectpumpfor30m)) + popup.menu.add(resourceHelper.gs(R.string.disconnectpumpfor1h)) + popup.menu.add(resourceHelper.gs(R.string.disconnectpumpfor2h)) + popup.menu.add(resourceHelper.gs(R.string.disconnectpumpfor3h)) + } else { + popup.menu.add(resourceHelper.gs(R.string.reconnect)) } } } - if (!loopPlugin.isEnabled(PluginType.LOOP)) { - menu.add(resourceHelper.gs(R.string.enableloop)) - } - if (!loopPlugin.isDisconnected) { - showSuspendPump(menu, pumpDescription) - } else { - menu.add(resourceHelper.gs(R.string.reconnect)) + R.id.overview_activeprofile -> { + val item = popup.menu.add(Menu.NONE,1,Menu.NONE,resourceHelper.gs(R.string.profile)) // title + val title = item.title + val s = SpannableString(title) + s.setSpan(ForegroundColorSpan(resourceHelper.gc(R.color.colorAccent)), 0, s.length, 0) + item.setTitle(s) + popup.menu.add(resourceHelper.gs(R.string.viewprofile)) + if (activePlugin.activeProfileInterface.profile != null) { + popup.menu.add(resourceHelper.gs(R.string.careportal_profileswitch)) + } } } + popup.setOnMenuItemClickListener { + if (it.itemId != 1) { + if (showOKCancel) { + when (it.title) { + resourceHelper.gs(R.string.careportal_profileswitch), + resourceHelper.gs(R.string.viewprofile) -> onItemSelected(it, manager) - R.id.overview_activeprofile -> { - menu.setHeaderTitle(resourceHelper.gs(R.string.profile)) - menu.add(resourceHelper.gs(R.string.viewprofile)) - if (activePlugin.activeProfileInterface.profile != null) { - menu.add(resourceHelper.gs(R.string.careportal_profileswitch)) - } - } - - R.id.overview_temptarget -> { - menu.setHeaderTitle(resourceHelper.gs(R.string.careportal_temporarytarget)) - menu.add(resourceHelper.gs(R.string.custom)) - menu.add(resourceHelper.gs(R.string.eatingsoon)) - menu.add(resourceHelper.gs(R.string.activity)) - menu.add(resourceHelper.gs(R.string.hypo)) - if (activePlugin.activeTreatments.tempTargetFromHistory != null) { - menu.add(resourceHelper.gs(R.string.cancel)) + else -> { + OKDialog.showConfirmation(context, resourceHelper.gs(R.string.confirm), it.title.toString(), + Runnable { + onItemSelected(it, manager) + }) + } + } + } else { + onItemSelected(it, manager) + } } + return@setOnMenuItemClickListener true } + popup.setOnDismissListener { showOKCancel = true } + popup.show() } } - private fun showSuspendPump(menu: ContextMenu, pumpDescription: PumpDescription) { - if (pumpDescription.tempDurationStep15mAllowed) menu.add(resourceHelper.gs(R.string.disconnectpumpfor15m)) - if (pumpDescription.tempDurationStep30mAllowed) menu.add(resourceHelper.gs(R.string.disconnectpumpfor30m)) - menu.add(resourceHelper.gs(R.string.disconnectpumpfor1h)) - menu.add(resourceHelper.gs(R.string.disconnectpumpfor2h)) - menu.add(resourceHelper.gs(R.string.disconnectpumpfor3h)) - } - - fun onContextItemSelected(item: MenuItem, manager: FragmentManager): Boolean { + fun onItemSelected(item: MenuItem, manager: FragmentManager): Boolean { val profile = profileFunction.getProfile() ?: return true when (item.title) { resourceHelper.gs(R.string.disableloop) -> { @@ -360,60 +379,6 @@ class OverviewMenus @Inject constructor( pvd.arguments = args pvd.show(manager, "ProfileViewDialog") } - - resourceHelper.gs(R.string.eatingsoon) -> { - aapsLogger.debug("USER ENTRY: TEMP TARGET EATING SOON") - val target = Profile.toMgdl(defaultValueHelper.determineEatingSoonTT(), profileFunction.getUnits()) - val tempTarget = TempTarget() - .date(System.currentTimeMillis()) - .duration(defaultValueHelper.determineEatingSoonTTDuration()) - .reason(resourceHelper.gs(R.string.eatingsoon)) - .source(Source.USER) - .low(target) - .high(target) - activePlugin.activeTreatments.addToHistoryTempTarget(tempTarget) - } - - resourceHelper.gs(R.string.activity) -> { - aapsLogger.debug("USER ENTRY: TEMP TARGET ACTIVITY") - val target = Profile.toMgdl(defaultValueHelper.determineActivityTT(), profileFunction.getUnits()) - val tempTarget = TempTarget() - .date(DateUtil.now()) - .duration(defaultValueHelper.determineActivityTTDuration()) - .reason(resourceHelper.gs(R.string.activity)) - .source(Source.USER) - .low(target) - .high(target) - activePlugin.activeTreatments.addToHistoryTempTarget(tempTarget) - } - - resourceHelper.gs(R.string.hypo) -> { - aapsLogger.debug("USER ENTRY: TEMP TARGET HYPO") - val target = Profile.toMgdl(defaultValueHelper.determineHypoTT(), profileFunction.getUnits()) - val tempTarget = TempTarget() - .date(DateUtil.now()) - .duration(defaultValueHelper.determineHypoTTDuration()) - .reason(resourceHelper.gs(R.string.hypo)) - .source(Source.USER) - .low(target) - .high(target) - activePlugin.activeTreatments.addToHistoryTempTarget(tempTarget) - } - - resourceHelper.gs(R.string.custom) -> { - TempTargetDialog().show(manager, "Overview") - } - - resourceHelper.gs(R.string.cancel) -> { - aapsLogger.debug("USER ENTRY: TEMP TARGET CANCEL") - val tempTarget = TempTarget() - .source(Source.USER) - .date(DateUtil.now()) - .duration(0) - .low(0.0) - .high(0.0) - activePlugin.activeTreatments.addToHistoryTempTarget(tempTarget) - } } return false } diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt index bd532dc462..d97ab4f7a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt +++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.kt @@ -77,7 +77,7 @@ class KeepAliveReceiver : DaggerBroadcastReceiver() { aapsLogger.debug(LTag.CORE, "KeepAlive scheduled") SystemClock.sleep(5000) // wait for app initialization localAlertUtils.shortenSnoozeInterval() - localAlertUtils.presnoozeAlarms() + localAlertUtils.preSnoozeAlarms() val am = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager val i = Intent(context, KeepAliveReceiver::class.java) val pi = PendingIntent.getBroadcast(context, 0, i, 0) diff --git a/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt b/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt index bf5b5504e8..76589d3b7a 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt +++ b/app/src/main/java/info/nightscout/androidaps/utils/LocalAlertUtils.kt @@ -5,19 +5,21 @@ import info.nightscout.androidaps.Constants import info.nightscout.androidaps.R import info.nightscout.androidaps.db.BgReading import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.bus.RxBusWrapper -import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.plugins.general.nsclient.NSUpload import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification import info.nightscout.androidaps.plugins.general.overview.notifications.Notification +import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP import javax.inject.Inject import javax.inject.Singleton +import kotlin.math.min /** * Created by adrian on 17/12/17. @@ -31,48 +33,49 @@ class LocalAlertUtils @Inject constructor( private val activePlugin: ActivePluginProvider, private val profileFunction: ProfileFunction, private val iobCobCalculatorPlugin: IobCobCalculatorPlugin, + private val smsCommunicatorPlugin: SmsCommunicatorPlugin, private val config: Config, private val nsUpload: NSUpload, private val dateUtil: DateUtil ) { - fun missedReadingsThreshold(): Long { - return T.mins(sp.getInt(resourceHelper.gs(R.string.key_missed_bg_readings_threshold_minutes), Constants.DEFAULT_MISSED_BG_READINGS_THRESHOLD_MINUTES).toLong()).msecs() + private fun missedReadingsThreshold(): Long { + return T.mins(sp.getInt(R.string.key_missed_bg_readings_threshold_minutes, Constants.DEFAULT_MISSED_BG_READINGS_THRESHOLD_MINUTES).toLong()).msecs() } - fun pumpUnreachableThreshold(): Long { - return T.mins(sp.getInt(resourceHelper.gs(R.string.key_pump_unreachable_threshold_minutes), Constants.DEFAULT_PUMP_UNREACHABLE_THRESHOLD_MINUTES).toLong()).msecs() + private fun pumpUnreachableThreshold(): Long { + return T.mins(sp.getInt(R.string.key_pump_unreachable_threshold_minutes, Constants.DEFAULT_PUMP_UNREACHABLE_THRESHOLD_MINUTES).toLong()).msecs() } fun checkPumpUnreachableAlarm(lastConnection: Long, isStatusOutdated: Boolean, isDisconnected: Boolean) { val alarmTimeoutExpired = isAlarmTimeoutExpired(lastConnection, pumpUnreachableThreshold()) val nextAlarmOccurrenceReached = sp.getLong("nextPumpDisconnectedAlarm", 0L) < System.currentTimeMillis() - if (config.APS && sp.getBoolean(resourceHelper.gs(R.string.key_enable_pump_unreachable_alert), true) - && isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !isDisconnected) { - aapsLogger.debug(LTag.CORE, "Generating pump unreachable alarm. lastConnection: " + dateUtil.dateAndTimeString(lastConnection) + " isStatusOutdated: " + isStatusOutdated) - val n = Notification(Notification.PUMP_UNREACHABLE, resourceHelper.gs(R.string.pump_unreachable), Notification.URGENT) - n.soundId = R.raw.alarm - sp.putLong("nextPumpDisconnectedAlarm", System.currentTimeMillis() + pumpUnreachableThreshold()) - rxBus.send(EventNewNotification(n)) - if (sp.getBoolean(R.string.key_ns_create_announcements_from_errors, true)) { - nsUpload.uploadError(n.text) + if (config.APS && isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !isDisconnected) { + if (sp.getBoolean(R.string.key_enable_pump_unreachable_alert, true)) { + aapsLogger.debug(LTag.CORE, "Generating pump unreachable alarm. lastConnection: " + dateUtil.dateAndTimeString(lastConnection) + " isStatusOutdated: " + isStatusOutdated) + sp.putLong("nextPumpDisconnectedAlarm", System.currentTimeMillis() + pumpUnreachableThreshold()) + rxBus.send(EventNewNotification(Notification(Notification.PUMP_UNREACHABLE, resourceHelper.gs(R.string.pump_unreachable), Notification.URGENT).also { it.soundId - R.raw.alarm })) + if (sp.getBoolean(R.string.key_ns_create_announcements_from_errors, true)) + nsUpload.uploadError(resourceHelper.gs(R.string.pump_unreachable)) } + if (sp.getBoolean(R.string.key_smscommunicator_report_pump_ureachable, true)) + smsCommunicatorPlugin.sendNotificationToAllNumbers(resourceHelper.gs(R.string.pump_unreachable)) } if (!isStatusOutdated && !alarmTimeoutExpired) rxBus.send(EventDismissNotification(Notification.PUMP_UNREACHABLE)) } private fun isAlarmTimeoutExpired(lastConnection: Long, unreachableThreshold: Long): Boolean { - if (activePlugin.activePump.pumpDescription.hasCustomUnreachableAlertCheck) { - return activePlugin.activePump.isUnreachableAlertTimeoutExceeded(unreachableThreshold) + return if (activePlugin.activePump.pumpDescription.hasCustomUnreachableAlertCheck) { + activePlugin.activePump.isUnreachableAlertTimeoutExceeded(unreachableThreshold) } else { - return lastConnection + pumpUnreachableThreshold() < System.currentTimeMillis() + lastConnection + pumpUnreachableThreshold() < System.currentTimeMillis() } } - /*Presnoozes the alarms with 5 minutes if no snooze exists. + /*Pre-snoozes the alarms with 5 minutes if no snooze exists. * Call only at startup! */ - fun presnoozeAlarms() { + fun preSnoozeAlarms() { if (sp.getLong("nextMissedReadingsAlarm", 0L) < System.currentTimeMillis()) { sp.putLong("nextMissedReadingsAlarm", System.currentTimeMillis() + 5 * 60 * 1000) } @@ -83,10 +86,10 @@ class LocalAlertUtils @Inject constructor( fun shortenSnoozeInterval() { //shortens alarm times in case of setting changes or future data var nextMissedReadingsAlarm = sp.getLong("nextMissedReadingsAlarm", 0L) - nextMissedReadingsAlarm = Math.min(System.currentTimeMillis() + missedReadingsThreshold(), nextMissedReadingsAlarm) + nextMissedReadingsAlarm = min(System.currentTimeMillis() + missedReadingsThreshold(), nextMissedReadingsAlarm) sp.putLong("nextMissedReadingsAlarm", nextMissedReadingsAlarm) var nextPumpDisconnectedAlarm = sp.getLong("nextPumpDisconnectedAlarm", 0L) - nextPumpDisconnectedAlarm = Math.min(System.currentTimeMillis() + pumpUnreachableThreshold(), nextPumpDisconnectedAlarm) + nextPumpDisconnectedAlarm = min(System.currentTimeMillis() + pumpUnreachableThreshold(), nextPumpDisconnectedAlarm) sp.putLong("nextPumpDisconnectedAlarm", nextPumpDisconnectedAlarm) } @@ -104,7 +107,7 @@ class LocalAlertUtils @Inject constructor( fun checkStaleBGAlert() { val bgReading: BgReading? = iobCobCalculatorPlugin.lastBg() - if (sp.getBoolean(resourceHelper.gs(R.string.key_enable_missed_bg_readings_alert), false) + if (sp.getBoolean(R.string.key_enable_missed_bg_readings_alert, false) && bgReading != null && bgReading.date + missedReadingsThreshold() < System.currentTimeMillis() && sp.getLong("nextMissedReadingsAlarm", 0L) < System.currentTimeMillis()) { val n = Notification(Notification.BG_READINGS_MISSED, resourceHelper.gs(R.string.missed_bg_readings), Notification.URGENT) n.soundId = R.raw.alarm diff --git a/app/src/main/res/layout/activity_profilehelper.xml b/app/src/main/res/layout/activity_profilehelper.xml index 310a4c566d..da47a6c88c 100644 --- a/app/src/main/res/layout/activity_profilehelper.xml +++ b/app/src/main/res/layout/activity_profilehelper.xml @@ -12,9 +12,9 @@ android:layout_height="wrap_content" android:orientation="vertical"> -