diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/LoopDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/LoopDialog.kt index 0f8f00eb4a..eeda33c9b3 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/LoopDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/LoopDialog.kt @@ -27,6 +27,7 @@ import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.ToastUtils import info.nightscout.androidaps.utils.alertDialogs.OKDialog +import info.nightscout.androidaps.utils.extensions.toVisibility import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP import io.reactivex.android.schedulers.AndroidSchedulers @@ -53,6 +54,7 @@ class LoopDialog : DaggerDialogFragment() { private var showOkCancel: Boolean = true private var _binding: DialogLoopBinding? = null + // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! @@ -68,7 +70,7 @@ class LoopDialog : DaggerDialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + savedInstanceState: Bundle?): View { // load data from bundle (savedInstanceState ?: arguments)?.let { bundle -> showOkCancel = bundle.getInt("showOkCancel", 1) == 1 @@ -85,22 +87,22 @@ class LoopDialog : DaggerDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { updateGUI("LoopDialogOnViewCreated") - binding.overviewCloseloop.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewLgsloop.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewOpenloop.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewDisable.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewEnable.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewResume.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewReconnect.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewSuspend1h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewSuspend2h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewSuspend3h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewSuspend10h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewDisconnect15m.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewDisconnect30m.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewDisconnect1h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewDisconnect2h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } - binding.overviewDisconnect3h.setOnClickListener { if(showOkCancel) onClick_OkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewCloseloop.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewLgsloop.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewOpenloop.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewDisable.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewEnable.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewResume.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewReconnect.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewSuspend1h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewSuspend2h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewSuspend3h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewSuspend10h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewDisconnect15m.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewDisconnect30m.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewDisconnect1h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewDisconnect2h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } + binding.overviewDisconnect3h.setOnClickListener { if (showOkCancel) onClickOkCancelEnabled(it) else onClick(it); dismiss() } // cancel button binding.cancel.setOnClickListener { dismiss() } @@ -111,49 +113,59 @@ class LoopDialog : DaggerDialogFragment() { .observeOn(AndroidSchedulers.mainThread()) .subscribe({ activity?.runOnUiThread { updateGUI("EventNewOpenLoopNotification") } - }, { fabricPrivacy.logException(it) }) + }, fabricPrivacy::logException) ) } + @Synchronized override fun onDestroyView() { super.onDestroyView() disposable.clear() + _binding = null } + @Synchronized fun updateGUI(from: String) { + if (_binding == null) return aapsLogger.debug("UpdateGUI from $from") val pumpDescription: PumpDescription = activePlugin.activePump.pumpDescription val closedLoopAllowed = objectivesPlugin.isClosedLoopAllowed(Constraint(true)) val lgsEnabled = objectivesPlugin.isLgsAllowed(Constraint(true)) - var APSmode = sp.getString(R.string.key_aps_mode, "open") + val apsMode = sp.getString(R.string.key_aps_mode, "open") if (profileFunction.isProfileValid("LoopDialogUpdateGUI")) { if (loopPlugin.isEnabled(PluginType.LOOP)) { - if (closedLoopAllowed.value()) { - binding.overviewCloseloop.visibility = if (APSmode == "closed") View.GONE else View.VISIBLE - binding.overviewLgsloop.visibility = if (APSmode == "lgs") View.GONE else View.VISIBLE - binding.overviewOpenloop.visibility = if (APSmode == "open") View.GONE else View.VISIBLE - } else if (lgsEnabled.value() ) { - binding.overviewCloseloop.visibility = View.GONE - binding.overviewLgsloop.visibility = if (APSmode == "lgs") View.GONE else View.VISIBLE - binding.overviewOpenloop.visibility = if (APSmode == "open") View.GONE else View.VISIBLE - } else { - binding.overviewCloseloop.visibility = View.GONE - binding.overviewLgsloop.visibility = View.GONE - binding.overviewOpenloop.visibility = View.GONE + when { + closedLoopAllowed.value() -> { + binding.overviewCloseloop.visibility = (apsMode != "closed").toVisibility() + binding.overviewLgsloop.visibility = (apsMode != "lgs").toVisibility() + binding.overviewOpenloop.visibility = (apsMode != "open").toVisibility() + } + + lgsEnabled.value() -> { + binding.overviewCloseloop.visibility = View.GONE + binding.overviewLgsloop.visibility = (apsMode != "lgs").toVisibility() + binding.overviewOpenloop.visibility = (apsMode != "open").toVisibility() + } + + else -> { + binding.overviewCloseloop.visibility = View.GONE + binding.overviewLgsloop.visibility = View.GONE + binding.overviewOpenloop.visibility = View.GONE + } } - binding.overviewEnable.visibility = View.GONE //sp.getBoolean(R.string.key_usesuperbolus, false).toVisibility() + binding.overviewEnable.visibility = View.GONE binding.overviewDisable.visibility = View.VISIBLE - if (!loopPlugin.isSuspended) { - binding.overviewSuspendHeader.text=resourceHelper.gs(R.string.suspendloop) + if (!loopPlugin.isSuspended) { + binding.overviewSuspendHeader.text = resourceHelper.gs(R.string.suspendloop) binding.overviewResume.visibility = View.GONE - binding.overviewSuspendButtons.visibility=View.VISIBLE - binding.overviewSuspend.visibility=View.VISIBLE + binding.overviewSuspendButtons.visibility = View.VISIBLE + binding.overviewSuspend.visibility = View.VISIBLE } else { if (!loopPlugin.isDisconnected) { binding.overviewSuspendHeader.text = resourceHelper.gs(R.string.resumeloop) binding.overviewResume.visibility = View.VISIBLE - binding.overviewSuspendButtons.visibility=View.GONE - binding.overviewSuspend.visibility=View.VISIBLE + binding.overviewSuspendButtons.visibility = View.GONE + binding.overviewSuspend.visibility = View.VISIBLE } else binding.overviewSuspend.visibility = View.GONE } @@ -164,8 +176,8 @@ class LoopDialog : DaggerDialogFragment() { } if (!loopPlugin.isDisconnected) { binding.overviewPumpHeader.text = resourceHelper.gs(R.string.disconnectpump) - binding.overviewDisconnect15m.visibility = if (pumpDescription.tempDurationStep15mAllowed) View.VISIBLE else View.GONE - binding.overviewDisconnect30m.visibility = if (pumpDescription.tempDurationStep30mAllowed) View.VISIBLE else View.GONE + binding.overviewDisconnect15m.visibility = pumpDescription.tempDurationStep15mAllowed.toVisibility() + binding.overviewDisconnect30m.visibility = pumpDescription.tempDurationStep30mAllowed.toVisibility() binding.overviewDisconnectButtons.visibility = View.VISIBLE binding.overviewReconnect.visibility = View.GONE } else { @@ -185,25 +197,25 @@ class LoopDialog : DaggerDialogFragment() { } - fun onClick_OkCancelEnabled(v: View): Boolean { + fun onClickOkCancelEnabled(v: View): Boolean { var description = "" - when(v.id) { - R.id.overview_closeloop -> description = resourceHelper.gs(R.string.closedloop) - R.id.overview_lgsloop -> description = resourceHelper.gs(R.string.lowglucosesuspend) - R.id.overview_openloop -> description = resourceHelper.gs(R.string.openloop) - R.id.overview_disable -> description = resourceHelper.gs(R.string.disableloop) - R.id.overview_enable -> description = resourceHelper.gs(R.string.enableloop) - R.id.overview_resume -> description = resourceHelper.gs(R.string.resume) - R.id.overview_reconnect -> description = resourceHelper.gs(R.string.reconnect) - R.id.overview_suspend_1h -> description = resourceHelper.gs(R.string.suspendloopfor1h) - R.id.overview_suspend_2h -> description = resourceHelper.gs(R.string.suspendloopfor2h) - R.id.overview_suspend_3h -> description = resourceHelper.gs(R.string.suspendloopfor3h) - R.id.overview_suspend_10h -> description = resourceHelper.gs(R.string.suspendloopfor10h) - R.id.overview_disconnect_15m -> description = resourceHelper.gs(R.string.disconnectpumpfor15m) - R.id.overview_disconnect_30m -> description = resourceHelper.gs(R.string.disconnectpumpfor30m) - R.id.overview_disconnect_1h -> description = resourceHelper.gs(R.string.disconnectpumpfor1h) - R.id.overview_disconnect_2h -> description = resourceHelper.gs(R.string.disconnectpumpfor2h) - R.id.overview_disconnect_3h -> description = resourceHelper.gs(R.string.disconnectpumpfor3h) + when (v.id) { + R.id.overview_closeloop -> description = resourceHelper.gs(R.string.closedloop) + R.id.overview_lgsloop -> description = resourceHelper.gs(R.string.lowglucosesuspend) + R.id.overview_openloop -> description = resourceHelper.gs(R.string.openloop) + R.id.overview_disable -> description = resourceHelper.gs(R.string.disableloop) + R.id.overview_enable -> description = resourceHelper.gs(R.string.enableloop) + R.id.overview_resume -> description = resourceHelper.gs(R.string.resume) + R.id.overview_reconnect -> description = resourceHelper.gs(R.string.reconnect) + R.id.overview_suspend_1h -> description = resourceHelper.gs(R.string.suspendloopfor1h) + R.id.overview_suspend_2h -> description = resourceHelper.gs(R.string.suspendloopfor2h) + R.id.overview_suspend_3h -> description = resourceHelper.gs(R.string.suspendloopfor3h) + R.id.overview_suspend_10h -> description = resourceHelper.gs(R.string.suspendloopfor10h) + R.id.overview_disconnect_15m -> description = resourceHelper.gs(R.string.disconnectpumpfor15m) + R.id.overview_disconnect_30m -> description = resourceHelper.gs(R.string.disconnectpumpfor30m) + R.id.overview_disconnect_1h -> description = resourceHelper.gs(R.string.disconnectpumpfor1h) + R.id.overview_disconnect_2h -> description = resourceHelper.gs(R.string.disconnectpumpfor2h) + R.id.overview_disconnect_3h -> description = resourceHelper.gs(R.string.disconnectpumpfor3h) } activity?.let { activity -> OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.confirm), description, Runnable { @@ -219,15 +231,21 @@ class LoopDialog : DaggerDialogFragment() { R.id.overview_closeloop -> { sp.putString(R.string.key_aps_mode, "closed") rxBus.send(EventPreferenceChange(resourceHelper.gs(R.string.closedloop))) + return true } + R.id.overview_lgsloop -> { sp.putString(R.string.key_aps_mode, "lgs") rxBus.send(EventPreferenceChange(resourceHelper.gs(R.string.lowglucosesuspend))) + return true } + R.id.overview_openloop -> { sp.putString(R.string.key_aps_mode, "open") rxBus.send(EventPreferenceChange(resourceHelper.gs(R.string.lowglucosesuspend))) + return true } + R.id.overview_disable -> { aapsLogger.debug("USER ENTRY: LOOP DISABLED") loopPlugin.setPluginEnabled(PluginType.LOOP, false) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt index 9f037ce5f8..4493a9e804 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationFragment.kt @@ -112,6 +112,7 @@ class AutomationFragment : DaggerFragment(), OnStartDragListener { disposable.clear() } + @Synchronized override fun onDestroyView() { super.onDestroyView() _binding = null @@ -119,6 +120,7 @@ class AutomationFragment : DaggerFragment(), OnStartDragListener { @Synchronized private fun updateGui() { + if (_binding == null) return eventListAdapter.notifyDataSetChanged() val sb = StringBuilder() for (l in automationPlugin.executionLog.reversed()) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.kt index 84324fd256..c388c34a40 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/EditEventDialog.kt @@ -92,31 +92,28 @@ class EditEventDialog : DialogFragmentWithDate() { .subscribe({ actionListAdapter?.notifyDataSetChanged() showPreconditions() - }, { fabricPrivacy.logException(it) } - ) + }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventAutomationAddAction::class.java) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ event.addAction(it.action) actionListAdapter?.notifyDataSetChanged() - }, { fabricPrivacy.logException(it) } - ) + }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventAutomationUpdateTrigger::class.java) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ event.trigger = it.trigger binding.triggerDescription.text = event.trigger.friendlyDescription() - }, { fabricPrivacy.logException(it) } - ) + }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventAutomationUpdateAction::class.java) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ event.actions[it.position] = it.action actionListAdapter?.notifyDataSetChanged() - }, { fabricPrivacy.logException(it) }) + }, fabricPrivacy::logException) } override fun submit(): Boolean { diff --git a/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt b/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt index 9348a8f864..6d9c93146f 100644 --- a/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt +++ b/dana/src/main/java/info/nightscout/androidaps/dana/DanaFragment.kt @@ -103,10 +103,10 @@ class DanaFragment : DaggerFragment() { if (activePlugin.activePump.pumpDescription.pumpType == PumpType.DanaRS) binding.btconnection.setOnLongClickListener { activity?.let { - OKDialog.showConfirmation(it, resourceHelper.gs(R.string.resetpairing), { + OKDialog.showConfirmation(it, resourceHelper.gs(R.string.resetpairing)) { aapsLogger.error("USER ENTRY: Clearing pairing keys !!!") (activePlugin.activePump as DanaPumpInterface).clearPairing() - }) + } } true } @@ -119,23 +119,23 @@ class DanaFragment : DaggerFragment() { disposable += rxBus .toObservable(EventInitializationChanged::class.java) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ updateGUI() }, { fabricPrivacy.logException(it) }) + .subscribe({ updateGUI() }, fabricPrivacy::logException) disposable += rxBus .toObservable(info.nightscout.androidaps.dana.events.EventDanaRNewStatus::class.java) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ updateGUI() }, { fabricPrivacy.logException(it) }) + .subscribe({ updateGUI() }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventExtendedBolusChange::class.java) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ updateGUI() }, { fabricPrivacy.logException(it) }) + .subscribe({ updateGUI() }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventTempBasalChange::class.java) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ updateGUI() }, { fabricPrivacy.logException(it) }) + .subscribe({ updateGUI() }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventQueueChanged::class.java) .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ updateGUI() }, { fabricPrivacy.logException(it) }) + .subscribe({ updateGUI() }, fabricPrivacy::logException) disposable += rxBus .toObservable(EventPumpStatusChanged::class.java) .observeOn(AndroidSchedulers.mainThread()) @@ -157,7 +157,7 @@ class DanaFragment : DaggerFragment() { } else { binding.danaPumpstatuslayout.visibility = View.GONE } - }, { fabricPrivacy.logException(it) }) + }, fabricPrivacy::logException) updateGUI() } @@ -168,14 +168,15 @@ class DanaFragment : DaggerFragment() { loopHandler.removeCallbacks(refreshLoop) } + @Synchronized override fun onDestroyView() { super.onDestroyView() _binding = null } - // GUI functions @Synchronized fun updateGUI() { + if (_binding == null) return val pump = danaPump val plugin: PumpInterface = activePlugin.activePump if (pump.lastConnection != 0L) {