diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/pump/Medtrum.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/pump/Medtrum.kt index 92ebebf2dc..1310693dc0 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/pump/Medtrum.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/pump/Medtrum.kt @@ -8,4 +8,5 @@ interface Medtrum { fun loadEvents(): PumpEnactResult // events history to build treatments from fun setUserOptions(): PumpEnactResult // set user settings fun clearAlarms(): PumpEnactResult // clear alarms + fun deactivate(): PumpEnactResult // deactivate patch } \ No newline at end of file diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/queue/Command.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/queue/Command.kt index fce81c02bf..96efac7dd7 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/queue/Command.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/queue/Command.kt @@ -29,6 +29,7 @@ abstract class Command( START_PUMP, STOP_PUMP, CLEAR_ALARMS, // so far only Medtrum specific + DEACTIVATE, // so far only Medtrum specific INSIGHT_SET_TBR_OVER_ALARM, // insight only CUSTOM_COMMAND } diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/queue/CommandQueue.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/queue/CommandQueue.kt index cbc413d97d..26cadfd6dc 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/queue/CommandQueue.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/queue/CommandQueue.kt @@ -32,6 +32,7 @@ interface CommandQueue { fun loadTDDs(callback: Callback?): Boolean fun loadEvents(callback: Callback?): Boolean fun clearAlarms(callback: Callback?): Boolean + fun deactivate(callback: Callback?): Boolean fun customCommand(customCommand: CustomCommand, callback: Callback?): Boolean fun isCustomCommandRunning(customCommandType: Class): Boolean fun isCustomCommandInQueue(customCommandType: Class): Boolean diff --git a/core/ui/src/main/res/values/strings.xml b/core/ui/src/main/res/values/strings.xml index 3d27666bf4..228f1cfa92 100644 --- a/core/ui/src/main/res/values/strings.xml +++ b/core/ui/src/main/res/values/strings.xml @@ -394,6 +394,7 @@ EXTENDED BOLUS %1$.2f U %2$d min LOAD EVENTS CLEAR_ALARMS + DEACTIVATE LOAD HISTORY %1$d LOAD TDDs SET PROFILE diff --git a/implementation/src/main/java/info/nightscout/implementation/di/CommandQueueModule.kt b/implementation/src/main/java/info/nightscout/implementation/di/CommandQueueModule.kt index 0e9a04ba45..ecdb7ae52f 100644 --- a/implementation/src/main/java/info/nightscout/implementation/di/CommandQueueModule.kt +++ b/implementation/src/main/java/info/nightscout/implementation/di/CommandQueueModule.kt @@ -16,6 +16,7 @@ import info.nightscout.implementation.queue.commands.CommandCancelExtendedBolus import info.nightscout.implementation.queue.commands.CommandCancelTempBasal import info.nightscout.implementation.queue.commands.CommandClearAlarms import info.nightscout.implementation.queue.commands.CommandCustomCommand +import info.nightscout.implementation.queue.commands.CommandDeactivate import info.nightscout.implementation.queue.commands.CommandExtendedBolus import info.nightscout.implementation.queue.commands.CommandInsightSetTBROverNotification import info.nightscout.implementation.queue.commands.CommandLoadEvents @@ -34,6 +35,7 @@ abstract class CommandQueueModule { @ContributesAndroidInjector abstract fun commandInsightSetTBROverNotificationInjector(): CommandInsightSetTBROverNotification @ContributesAndroidInjector abstract fun commandLoadEventsInjector(): CommandLoadEvents @ContributesAndroidInjector abstract fun commandClearAlarmsInjector(): CommandClearAlarms + @ContributesAndroidInjector abstract fun commandDeactivateInjector(): CommandDeactivate @ContributesAndroidInjector abstract fun commandLoadHistoryInjector(): CommandLoadHistory @ContributesAndroidInjector abstract fun commandLoadTDDsInjector(): CommandLoadTDDs @ContributesAndroidInjector abstract fun commandReadStatusInjector(): CommandReadStatus diff --git a/implementation/src/main/java/info/nightscout/implementation/queue/CommandQueueImplementation.kt b/implementation/src/main/java/info/nightscout/implementation/queue/CommandQueueImplementation.kt index 18cbf76b38..f36d42836a 100644 --- a/implementation/src/main/java/info/nightscout/implementation/queue/CommandQueueImplementation.kt +++ b/implementation/src/main/java/info/nightscout/implementation/queue/CommandQueueImplementation.kt @@ -24,6 +24,7 @@ import info.nightscout.implementation.queue.commands.CommandCancelExtendedBolus import info.nightscout.implementation.queue.commands.CommandCancelTempBasal import info.nightscout.implementation.queue.commands.CommandClearAlarms import info.nightscout.implementation.queue.commands.CommandCustomCommand +import info.nightscout.implementation.queue.commands.CommandDeactivate import info.nightscout.implementation.queue.commands.CommandExtendedBolus import info.nightscout.implementation.queue.commands.CommandInsightSetTBROverNotification import info.nightscout.implementation.queue.commands.CommandLoadEvents @@ -550,6 +551,19 @@ class CommandQueueImplementation @Inject constructor( return true } + override fun deactivate(callback: Callback?): Boolean { + if (isRunning(CommandType.DEACTIVATE)) { + callback?.result(executingNowError())?.run() + return false + } + // remove all unfinished + removeAll(CommandType.DEACTIVATE) + // add new command to queue + add(CommandDeactivate(injector, callback)) + notifyAboutNewCommand() + return true + } + override fun customCommand(customCommand: CustomCommand, callback: Callback?): Boolean { if (isCustomCommandInQueue(customCommand.javaClass)) { callback?.result(executingNowError())?.run() diff --git a/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandClearAlarms.kt b/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandClearAlarms.kt index cbfb184d61..00e5bb1ff0 100644 --- a/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandClearAlarms.kt +++ b/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandClearAlarms.kt @@ -31,7 +31,7 @@ class CommandClearAlarms( override fun status(): String = rh.gs(info.nightscout.core.ui.R.string.clear_alarms) - override fun log(): String = "CLEAR ALAMRS" + override fun log(): String = "CLEAR ALARMS" override fun cancel() { aapsLogger.debug(LTag.PUMPQUEUE, "Result cancel") callback?.result(PumpEnactResult(injector).success(false).comment(info.nightscout.core.ui.R.string.connectiontimedout))?.run() diff --git a/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandDeactivate.kt b/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandDeactivate.kt new file mode 100644 index 0000000000..eef55c1ecc --- /dev/null +++ b/implementation/src/main/java/info/nightscout/implementation/queue/commands/CommandDeactivate.kt @@ -0,0 +1,39 @@ +package info.nightscout.implementation.queue.commands + +import dagger.android.HasAndroidInjector +import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.pump.Dana +import info.nightscout.interfaces.pump.Diaconn +import info.nightscout.interfaces.pump.Medtrum +import info.nightscout.interfaces.pump.PumpEnactResult +import info.nightscout.interfaces.queue.Callback +import info.nightscout.interfaces.queue.Command +import info.nightscout.rx.logging.LTag +import javax.inject.Inject + +class CommandDeactivate( + injector: HasAndroidInjector, + callback: Callback? +) : Command(injector, CommandType.DEACTIVATE, callback) { + + @Inject lateinit var activePlugin: ActivePlugin + + override fun execute() { + val pump = activePlugin.activePump + + if (pump is Medtrum) { + val medtrumPump = pump as Medtrum + val r = medtrumPump.deactivate() + aapsLogger.debug(LTag.PUMPQUEUE, "Result success: ${r.success} enacted: ${r.enacted}") + callback?.result(r)?.run() + } + } + + override fun status(): String = rh.gs(info.nightscout.core.ui.R.string.deactivate) + + override fun log(): String = "DEACTIVATE" + override fun cancel() { + aapsLogger.debug(LTag.PUMPQUEUE, "Result cancel") + callback?.result(PumpEnactResult(injector).success(false).comment(info.nightscout.core.ui.R.string.connectiontimedout))?.run() + } +} diff --git a/implementation/src/test/java/info/nightscout/implementation/queue/CommandQueueImplementationTest.kt b/implementation/src/test/java/info/nightscout/implementation/queue/CommandQueueImplementationTest.kt index 38165f5c90..9c12a6e421 100644 --- a/implementation/src/test/java/info/nightscout/implementation/queue/CommandQueueImplementationTest.kt +++ b/implementation/src/test/java/info/nightscout/implementation/queue/CommandQueueImplementationTest.kt @@ -242,6 +242,10 @@ class CommandQueueImplementationTest : TestBaseWithProfile() { // add clearAlarms commandQueue.clearAlarms(null) Assertions.assertEquals(5, commandQueue.size()) + + // add deactivate + commandQueue.deactivate(null) + Assertions.assertEquals(6, commandQueue.size()) commandQueue.clear() commandQueue.tempBasalAbsolute(0.0, 30, true, validProfile, PumpSync.TemporaryBasalType.NORMAL, null) @@ -375,6 +379,22 @@ class CommandQueueImplementationTest : TestBaseWithProfile() { Assertions.assertEquals(1, commandQueue.size()) } + @Test + fun isDeactivateCommandInQueue() { + // given + Assertions.assertEquals(0, commandQueue.size()) + + // when + commandQueue.deactivate(null) + + // then + Assertions.assertTrue(commandQueue.isLastScheduled(Command.CommandType.DEACTIVATE)) + Assertions.assertEquals(1, commandQueue.size()) + // next should be ignored + commandQueue.deactivate(null) + Assertions.assertEquals(1, commandQueue.size()) + } + @Test fun isLoadTDDsCommandInQueue() { // given diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt index 1a466b2f43..c01623be66 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPlugin.kt @@ -82,7 +82,7 @@ import kotlin.math.round PluginDescription() .mainType(PluginType.PUMP) .fragmentClass(MedtrumOverviewFragment::class.java.name) - .pluginIcon(info.nightscout.core.ui.R.drawable.ic_eopatch2_128) // TODO + .pluginIcon(info.nightscout.core.ui.R.drawable.ic_generic_icon) // TODO .pluginName(R.string.medtrum) .shortName(R.string.medtrum_pump_shortname) .preferencesId(R.xml.pref_medtrum_pump) @@ -442,4 +442,14 @@ import kotlin.math.round val connectionOK = medtrumService?.clearAlarms() ?: false return PumpEnactResult(injector).success(connectionOK) } + + override fun deactivate(): PumpEnactResult { + // if (!isInitialized()) { + // val result = PumpEnactResult(injector).success(false) + // result.comment = "pump not initialized" + // return result + // } + val connectionOK = medtrumService?.deactivatePatch() ?: false + return PumpEnactResult(injector).success(connectionOK) + } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/code/PatchStep.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/code/PatchStep.kt index c3e7bc9ab5..bba4cdfecb 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/code/PatchStep.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/code/PatchStep.kt @@ -3,13 +3,17 @@ package info.nightscout.pump.medtrum.code enum class PatchStep { START_DEACTIVATION, DEACTIVATE, + FORCE_DEACTIVATION, DEACTIVATION_COMPLETE, PREPARE_PATCH, + PREPARE_PATCH_CONNECT, PRIME, + PRIMING, + PRIME_COMPLETE, ATTACH_PATCH, ACTIVATE, + ACTIVATE_COMPLETE, + ERROR, CANCEL, - COMPLETE, - BACK_TO_HOME, - FINISH; + COMPLETE; } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt index 99a46174bd..3d4ca93cad 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/comm/packets/GetRecordPacket.kt @@ -112,7 +112,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int val detailedBolusInfo = detailedBolusInfoStorage.findDetailedBolusInfo(bolusStartTime, bolusNormalDelivered) var newRecord = false if (detailedBolusInfo != null) { - val success = pumpSync.syncBolusWithTempId( + val syncOk = pumpSync.syncBolusWithTempId( timestamp = bolusStartTime, amount = bolusNormalDelivered, temporaryId = detailedBolusInfo.timestamp, @@ -121,7 +121,7 @@ class GetRecordPacket(injector: HasAndroidInjector, private val recordIndex: Int pumpType = medtrumPump.pumpType(), pumpSerial = medtrumPump.pumpSN.toString(radix = 16) ) - if (success == false) { + if (syncOk == false) { aapsLogger.warn(LTag.PUMPCOMM, "GetRecordPacket HandleResponse: BOLUS_RECORD: Failed to sync bolus with tempId: ${detailedBolusInfo.timestamp}") // detailedInfo can be from another similar record. Reinsert detailedBolusInfoStorage.add(detailedBolusInfo) diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumModule.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumModule.kt index 429cf3f319..4dd4612536 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumModule.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumModule.kt @@ -7,13 +7,18 @@ import dagger.Module import dagger.Provides import dagger.android.ContributesAndroidInjector import dagger.multibindings.IntoMap -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumActivateFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumAttachPatchFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumDeactivatePatchFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumPreparePatchFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumPrimeFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumStartDeactivationFragment import info.nightscout.pump.medtrum.services.MedtrumService +import info.nightscout.pump.medtrum.ui.MedtrumActivateCompleteFragment +import info.nightscout.pump.medtrum.ui.MedtrumActivateFragment +import info.nightscout.pump.medtrum.ui.MedtrumAttachPatchFragment +import info.nightscout.pump.medtrum.ui.MedtrumDeactivatePatchFragment +import info.nightscout.pump.medtrum.ui.MedtrumDeactivationCompleteFragment +import info.nightscout.pump.medtrum.ui.MedtrumPreparePatchConnectFragment +import info.nightscout.pump.medtrum.ui.MedtrumPreparePatchFragment +import info.nightscout.pump.medtrum.ui.MedtrumPrimeCompleteFragment +import info.nightscout.pump.medtrum.ui.MedtrumPrimeFragment +import info.nightscout.pump.medtrum.ui.MedtrumPrimingFragment +import info.nightscout.pump.medtrum.ui.MedtrumStartDeactivationFragment import info.nightscout.pump.medtrum.ui.MedtrumActivity import info.nightscout.pump.medtrum.ui.MedtrumOverviewFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumOverviewViewModel @@ -60,14 +65,30 @@ abstract class MedtrumModule { @ContributesAndroidInjector internal abstract fun contributesDeactivatePatchFragment(): MedtrumDeactivatePatchFragment + @FragmentScope + @ContributesAndroidInjector + internal abstract fun contributesDeactivationCompleteFragment(): MedtrumDeactivationCompleteFragment + @FragmentScope @ContributesAndroidInjector internal abstract fun contributesPreparePatchFragment(): MedtrumPreparePatchFragment + @FragmentScope + @ContributesAndroidInjector + internal abstract fun contributesPreparePatchConnectFragment(): MedtrumPreparePatchConnectFragment + @FragmentScope @ContributesAndroidInjector internal abstract fun contributesPrimeFragment(): MedtrumPrimeFragment + @FragmentScope + @ContributesAndroidInjector + internal abstract fun contributesPrimeCompleteFragment(): MedtrumPrimeCompleteFragment + + @FragmentScope + @ContributesAndroidInjector + internal abstract fun contributesPrimingFragment(): MedtrumPrimingFragment + @FragmentScope @ContributesAndroidInjector internal abstract fun contributesAttachPatchFragment(): MedtrumAttachPatchFragment @@ -76,6 +97,10 @@ abstract class MedtrumModule { @ContributesAndroidInjector internal abstract fun contributesActivateFragment(): MedtrumActivateFragment + @FragmentScope + @ContributesAndroidInjector + internal abstract fun contributesActivateCompleteFragment(): MedtrumActivateCompleteFragment + // ACTIVITIES @ContributesAndroidInjector abstract fun contributesMedtrumActivity(): MedtrumActivity diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt index 9985c85e48..26bbc22f7e 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/services/MedtrumService.kt @@ -414,12 +414,6 @@ class MedtrumService : DaggerService(), BLECommCallback { // Map the pump state to a notification when (state) { MedtrumPumpState.NONE, - MedtrumPumpState.IDLE, - MedtrumPumpState.FILLED, - MedtrumPumpState.PRIMING, - MedtrumPumpState.PRIMED, - MedtrumPumpState.EJECTING, - MedtrumPumpState.EJECTED, MedtrumPumpState.STOPPED -> { rxBus.send(EventDismissNotification(Notification.PUMP_ERROR)) rxBus.send(EventDismissNotification(Notification.PUMP_SUSPENDED)) @@ -432,6 +426,18 @@ class MedtrumService : DaggerService(), BLECommCallback { medtrumPump.clearAlarmState() } + MedtrumPumpState.IDLE, + MedtrumPumpState.FILLED, + MedtrumPumpState.PRIMING, + MedtrumPumpState.PRIMED, + MedtrumPumpState.EJECTING, + MedtrumPumpState.EJECTED -> { + rxBus.send(EventDismissNotification(Notification.PUMP_ERROR)) + rxBus.send(EventDismissNotification(Notification.PUMP_SUSPENDED)) + medtrumPump.setFakeTBRIfNeeded() + medtrumPump.clearAlarmState() + } + MedtrumPumpState.ACTIVE, MedtrumPumpState.ACTIVE_ALT -> { rxBus.send(EventDismissNotification(Notification.PATCH_NOT_ACTIVE)) @@ -599,7 +605,7 @@ class MedtrumService : DaggerService(), BLECommCallback { } fun onSendMessageError(reason: String) { - aapsLogger.debug(LTag.PUMPCOMM, "onSendMessageError: " + this.toString() + "reason: $reason") + aapsLogger.warn(LTag.PUMPCOMM, "onSendMessageError: " + this.toString() + "reason: $reason") responseHandled = true responseSuccess = false } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateCompleteFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateCompleteFragment.kt new file mode 100644 index 0000000000..ef9a94ca16 --- /dev/null +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateCompleteFragment.kt @@ -0,0 +1,53 @@ +package info.nightscout.pump.medtrum.ui + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.ViewModelProvider +import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.pump.medtrum.R +import info.nightscout.pump.medtrum.code.PatchStep +import info.nightscout.pump.medtrum.databinding.FragmentMedtrumActivateBinding +import info.nightscout.pump.medtrum.databinding.FragmentMedtrumActivateCompleteBinding +import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment +import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.rx.logging.LTag +import javax.inject.Inject + +class MedtrumActivateCompleteFragment : MedtrumBaseFragment() { + + @Inject lateinit var aapsLogger: AAPSLogger + + companion object { + + fun newInstance(): MedtrumActivateCompleteFragment = MedtrumActivateCompleteFragment() + } + + override fun getLayoutId(): Int = R.layout.fragment_medtrum_activate_complete + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.apply { + viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(MedtrumViewModel::class.java) + viewModel?.apply { + setupStep.observe(viewLifecycleOwner) { + when (it) { + MedtrumViewModel.SetupStep.INITIAL, + MedtrumViewModel.SetupStep.PRIMED -> Unit // Nothing to do here, previous state + MedtrumViewModel.SetupStep.ACTIVATED -> btnPositive.visibility = View.VISIBLE + + MedtrumViewModel.SetupStep.ERROR -> { + ToastUtils.errorToast(requireContext(), "Error Activating") // TODO: String resource and show error message + moveStep(PatchStep.CANCEL) + } + + else -> { + ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message + aapsLogger.error(LTag.PUMP, "Unexpected state: $it") + } + } + } + } + } + } +} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateFragment.kt index ab788b9d4b..2af09f86a5 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivateFragment.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.ui +package info.nightscout.pump.medtrum.ui import android.os.Bundle import android.view.View @@ -11,11 +11,13 @@ import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag +import info.nightscout.shared.interfaces.ResourceHelper import javax.inject.Inject class MedtrumActivateFragment : MedtrumBaseFragment() { @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rh: ResourceHelper companion object { @@ -31,16 +33,20 @@ class MedtrumActivateFragment : MedtrumBaseFragment Unit // Nothing to do here, previous state - MedtrumViewModel.SetupStep.ACTIVATED -> btnPositive.visibility = View.VISIBLE - MedtrumViewModel.SetupStep.ERROR -> { - ToastUtils.errorToast(requireContext(), "Error Activating") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) + MedtrumViewModel.SetupStep.INITIAL, + MedtrumViewModel.SetupStep.PRIMED -> Unit // Nothing to do here, previous state + MedtrumViewModel.SetupStep.ACTIVATED -> moveStep(PatchStep.ACTIVATE_COMPLETE) + + MedtrumViewModel.SetupStep.ERROR -> { + moveStep(PatchStep.ERROR) + updateSetupStep(MedtrumViewModel.SetupStep.PRIMED) // Reset setup step + binding.textActivatingPump.text = rh.gs(R.string.activating_error) + binding.btnPositive.visibility = View.VISIBLE } - else -> { - ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) + else -> { + ToastUtils.errorToast(requireContext(), "Unexpected state: $it") + aapsLogger.error(LTag.PUMP, "Unexpected state: $it") } } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt index 77656cefb5..2534cb253b 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumActivity.kt @@ -3,21 +3,29 @@ package info.nightscout.pump.medtrum.ui import android.app.Dialog import android.content.Context import android.content.Intent +import android.content.pm.ActivityInfo import android.media.MediaPlayer import android.media.RingtoneManager import android.os.Bundle import android.view.MotionEvent +import android.view.WindowManager import androidx.appcompat.app.AlertDialog import androidx.lifecycle.ViewModelProvider -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumActivateFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumAttachPatchFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumDeactivatePatchFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumPreparePatchFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumPrimeFragment -import info.nightscout.androidaps.plugins.pump.eopatch.ui.MedtrumStartDeactivationFragment +import info.nightscout.pump.medtrum.ui.MedtrumActivateCompleteFragment +import info.nightscout.pump.medtrum.ui.MedtrumActivateFragment +import info.nightscout.pump.medtrum.ui.MedtrumAttachPatchFragment +import info.nightscout.pump.medtrum.ui.MedtrumDeactivatePatchFragment +import info.nightscout.pump.medtrum.ui.MedtrumDeactivationCompleteFragment +import info.nightscout.pump.medtrum.ui.MedtrumPreparePatchConnectFragment +import info.nightscout.pump.medtrum.ui.MedtrumPreparePatchFragment +import info.nightscout.pump.medtrum.ui.MedtrumPrimeCompleteFragment +import info.nightscout.pump.medtrum.ui.MedtrumPrimeFragment +import info.nightscout.pump.medtrum.ui.MedtrumPrimingFragment +import info.nightscout.pump.medtrum.ui.MedtrumStartDeactivationFragment import info.nightscout.core.utils.extensions.safeGetSerializableExtra import info.nightscout.pump.medtrum.R import info.nightscout.pump.medtrum.code.PatchStep +import info.nightscout.pump.medtrum.comm.enums.MedtrumPumpState import info.nightscout.pump.medtrum.databinding.ActivityMedtrumBinding import info.nightscout.pump.medtrum.extension.replaceFragmentInActivity import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel @@ -36,6 +44,8 @@ class MedtrumActivity : MedtrumBaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) binding.apply { viewModel = ViewModelProvider(this@MedtrumActivity, viewModelFactory).get(MedtrumViewModel::class.java) @@ -45,15 +55,33 @@ class MedtrumActivity : MedtrumBaseActivity() { patchStep.observe(this@MedtrumActivity) { when (it) { PatchStep.PREPARE_PATCH -> setupViewFragment(MedtrumPreparePatchFragment.newInstance()) + PatchStep.PREPARE_PATCH_CONNECT -> setupViewFragment(MedtrumPreparePatchConnectFragment.newInstance()) PatchStep.PRIME -> setupViewFragment(MedtrumPrimeFragment.newInstance()) + PatchStep.PRIMING -> setupViewFragment(MedtrumPrimingFragment.newInstance()) + PatchStep.PRIME_COMPLETE -> setupViewFragment(MedtrumPrimeCompleteFragment.newInstance()) PatchStep.ATTACH_PATCH -> setupViewFragment(MedtrumAttachPatchFragment.newInstance()) PatchStep.ACTIVATE -> setupViewFragment(MedtrumActivateFragment.newInstance()) - PatchStep.COMPLETE -> this@MedtrumActivity.finish() // TODO proper finish - PatchStep.CANCEL -> this@MedtrumActivity.finish() + PatchStep.ACTIVATE_COMPLETE -> setupViewFragment(MedtrumActivateCompleteFragment.newInstance()) + PatchStep.COMPLETE -> this@MedtrumActivity.finish() + PatchStep.ERROR -> Unit // Do nothing, let activity handle this + + PatchStep.CANCEL -> { + if (setupStep.value !in listOf(MedtrumViewModel.SetupStep.ACTIVATED, MedtrumViewModel.SetupStep.START_DEACTIVATION, MedtrumViewModel.SetupStep.STOPPED)) { + resetPumpState() + } + this@MedtrumActivity.finish() + } + PatchStep.START_DEACTIVATION -> setupViewFragment(MedtrumStartDeactivationFragment.newInstance()) PatchStep.DEACTIVATE -> setupViewFragment(MedtrumDeactivatePatchFragment.newInstance()) - PatchStep.DEACTIVATION_COMPLETE -> this@MedtrumActivity.finish() // TODO proper finish - else -> Unit + + PatchStep.FORCE_DEACTIVATION -> { + medtrumPump.pumpState = MedtrumPumpState.STOPPED + moveStep(PatchStep.DEACTIVATION_COMPLETE) + } + + PatchStep.DEACTIVATION_COMPLETE -> setupViewFragment(MedtrumDeactivationCompleteFragment.newInstance()) + null -> Unit } } } @@ -69,7 +97,9 @@ class MedtrumActivity : MedtrumBaseActivity() { binding.viewModel?.apply { intent?.run { val step = intent.safeGetSerializableExtra(EXTRA_START_PATCH_STEP, PatchStep::class.java) - initializePatchStep(step) + if (step != null) { + initializePatchStep(step) + } } } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumAttachPatchFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumAttachPatchFragment.kt index b8741413b7..97baead2b1 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumAttachPatchFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumAttachPatchFragment.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.ui +package info.nightscout.pump.medtrum.ui import android.os.Bundle import android.view.View @@ -32,14 +32,16 @@ class MedtrumAttachPatchFragment : MedtrumBaseFragment Unit // Nothing to do here, previous state - MedtrumViewModel.SetupStep.ERROR -> { + MedtrumViewModel.SetupStep.ERROR -> { ToastUtils.errorToast(requireContext(), "Error attach patch") // TODO: String resource and show error message moveStep(PatchStep.CANCEL) } - else -> { + + else -> { ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) + aapsLogger.error(LTag.PUMP, "Unexpected state: $it") } } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivatePatchFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivatePatchFragment.kt index 0791f8cb79..b996fa778e 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivatePatchFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivatePatchFragment.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.ui +package info.nightscout.pump.medtrum.ui import android.os.Bundle import android.view.View @@ -11,11 +11,13 @@ import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag +import info.nightscout.shared.interfaces.ResourceHelper import javax.inject.Inject class MedtrumDeactivatePatchFragment : MedtrumBaseFragment() { @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rh: ResourceHelper companion object { @@ -32,11 +34,16 @@ class MedtrumDeactivatePatchFragment : MedtrumBaseFragment btnPositive.visibility = View.VISIBLE + MedtrumViewModel.SetupStep.STOPPED -> { + moveStep(PatchStep.DEACTIVATION_COMPLETE) + } MedtrumViewModel.SetupStep.ERROR -> { - ToastUtils.errorToast(requireContext(), "Error deactivate") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) + moveStep(PatchStep.ERROR) + updateSetupStep(MedtrumViewModel.SetupStep.START_DEACTIVATION) // Reset setup step + binding.textDeactivatingPump.text = rh.gs(R.string.deactivating_error) + binding.btnNegative.visibility = View.VISIBLE + binding.btnPositive.visibility = View.VISIBLE } else -> Unit // Nothing to do here diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivationCompleteFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivationCompleteFragment.kt new file mode 100644 index 0000000000..b433a0fad8 --- /dev/null +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumDeactivationCompleteFragment.kt @@ -0,0 +1,37 @@ +package info.nightscout.pump.medtrum.ui + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.ViewModelProvider +import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.pump.medtrum.R +import info.nightscout.pump.medtrum.code.PatchStep +import info.nightscout.pump.medtrum.databinding.FragmentMedtrumDeactivationCompleteBinding +import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment +import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.rx.logging.LTag +import javax.inject.Inject + +class MedtrumDeactivationCompleteFragment : MedtrumBaseFragment() { + + @Inject lateinit var aapsLogger: AAPSLogger + + companion object { + + fun newInstance(): MedtrumDeactivationCompleteFragment = MedtrumDeactivationCompleteFragment() + } + + override fun getLayoutId(): Int = R.layout.fragment_medtrum_deactivation_complete + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + aapsLogger.debug(LTag.PUMP, "MedtrumStartDeactivationFragment onViewCreated") + binding.apply { + viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(MedtrumViewModel::class.java) + viewModel?.apply { + // Nothing to do here (yet) + } + } + } +} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchConnectFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchConnectFragment.kt new file mode 100644 index 0000000000..0664d27ead --- /dev/null +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchConnectFragment.kt @@ -0,0 +1,51 @@ +package info.nightscout.pump.medtrum.ui + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.ViewModelProvider +import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.pump.medtrum.R +import info.nightscout.pump.medtrum.code.PatchStep +import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPreparePatchConnectBinding +import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment +import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.rx.logging.LTag +import javax.inject.Inject + +class MedtrumPreparePatchConnectFragment : MedtrumBaseFragment() { + + @Inject lateinit var aapsLogger: AAPSLogger + + companion object { + + fun newInstance(): MedtrumPreparePatchConnectFragment = MedtrumPreparePatchConnectFragment() + } + + override fun getLayoutId(): Int = R.layout.fragment_medtrum_prepare_patch_connect + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + aapsLogger.debug(LTag.PUMP, "MedtrumPreparePatchFragment onViewCreated") + binding.apply { + viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(MedtrumViewModel::class.java) + viewModel?.apply { + setupStep.observe(viewLifecycleOwner) { + when (it) { + MedtrumViewModel.SetupStep.INITIAL -> btnPositive.visibility = View.GONE + // TODO: Confirmation dialog + MedtrumViewModel.SetupStep.FILLED -> btnPositive.visibility = View.VISIBLE + + MedtrumViewModel.SetupStep.ERROR -> { + ToastUtils.errorToast(requireContext(), "Error preparing patch") // TODO: String resource and show error message + moveStep(PatchStep.CANCEL) + } + + else -> Unit + } + } + preparePatchConnect() + } + } + } +} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt index d044e82073..7c0c319025 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPreparePatchFragment.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.ui +package info.nightscout.pump.medtrum.ui import android.os.Bundle import android.view.View @@ -30,23 +30,6 @@ class MedtrumPreparePatchFragment : MedtrumBaseFragment btnPositive.visibility = View.GONE - // TODO: Confirmation dialog - MedtrumViewModel.SetupStep.FILLED -> btnPositive.visibility = View.VISIBLE - - MedtrumViewModel.SetupStep.ERROR -> { - ToastUtils.errorToast(requireContext(), "Error preparing patch") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) - } - - else -> { - ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) - } - } - } preparePatch() } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt new file mode 100644 index 0000000000..38be727974 --- /dev/null +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeCompleteFragment.kt @@ -0,0 +1,50 @@ +package info.nightscout.pump.medtrum.ui + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.ViewModelProvider +import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.pump.medtrum.R +import info.nightscout.pump.medtrum.code.PatchStep +import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimeCompleteBinding +import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment +import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.rx.logging.LTag +import javax.inject.Inject + +class MedtrumPrimeCompleteFragment : MedtrumBaseFragment() { + + @Inject lateinit var aapsLogger: AAPSLogger + + companion object { + + fun newInstance(): MedtrumPrimeCompleteFragment = MedtrumPrimeCompleteFragment() + } + + override fun getLayoutId(): Int = R.layout.fragment_medtrum_prime_complete + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.apply { + viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(MedtrumViewModel::class.java) + viewModel?.apply { + setupStep.observe(viewLifecycleOwner) { + when (it) { + MedtrumViewModel.SetupStep.INITIAL, + MedtrumViewModel.SetupStep.PRIMED -> Unit // Nothing to do here, previous state + MedtrumViewModel.SetupStep.ERROR -> { + ToastUtils.errorToast(requireContext(), "Error priming") // TODO: String resource and show error message + moveStep(PatchStep.CANCEL) + } + + else -> { + ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message + aapsLogger.error(LTag.PUMP, "Unexpected state: $it") + } + } + } + } + } + } +} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt index d0903226b0..49839bee3f 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimeFragment.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.ui +package info.nightscout.pump.medtrum.ui import android.os.Bundle import android.view.View @@ -31,20 +31,19 @@ class MedtrumPrimeFragment : MedtrumBaseFragment() viewModel?.apply { setupStep.observe(viewLifecycleOwner) { when (it) { + MedtrumViewModel.SetupStep.INITIAL, MedtrumViewModel.SetupStep.FILLED -> Unit // Nothing to do here, previous state - MedtrumViewModel.SetupStep.PRIMED -> btnPositive.visibility = View.VISIBLE - MedtrumViewModel.SetupStep.ERROR -> { + MedtrumViewModel.SetupStep.ERROR -> { ToastUtils.errorToast(requireContext(), "Error priming") // TODO: String resource and show error message moveStep(PatchStep.CANCEL) } - else -> { + else -> { ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) + aapsLogger.error(LTag.PUMP, "Unexpected state: $it") } } } - startPrime() } } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt new file mode 100644 index 0000000000..6e2defca85 --- /dev/null +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPrimingFragment.kt @@ -0,0 +1,57 @@ +package info.nightscout.pump.medtrum.ui + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.ViewModelProvider +import info.nightscout.core.ui.toast.ToastUtils +import info.nightscout.pump.medtrum.R +import info.nightscout.pump.medtrum.code.PatchStep +import info.nightscout.pump.medtrum.databinding.FragmentMedtrumPrimingBinding +import info.nightscout.pump.medtrum.ui.MedtrumBaseFragment +import info.nightscout.pump.medtrum.ui.viewmodel.MedtrumViewModel +import info.nightscout.rx.logging.AAPSLogger +import info.nightscout.rx.logging.LTag +import info.nightscout.shared.interfaces.ResourceHelper +import javax.inject.Inject + +class MedtrumPrimingFragment : MedtrumBaseFragment() { + + @Inject lateinit var aapsLogger: AAPSLogger + @Inject lateinit var rh: ResourceHelper + + companion object { + + fun newInstance(): MedtrumPrimingFragment = MedtrumPrimingFragment() + } + + override fun getLayoutId(): Int = R.layout.fragment_medtrum_priming + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.apply { + viewModel = ViewModelProvider(requireActivity(), viewModelFactory).get(MedtrumViewModel::class.java) + viewModel?.apply { + setupStep.observe(viewLifecycleOwner) { + when (it) { + MedtrumViewModel.SetupStep.INITIAL, + MedtrumViewModel.SetupStep.FILLED -> Unit // Nothing to do here, previous state + MedtrumViewModel.SetupStep.PRIMED -> moveStep(PatchStep.PRIME_COMPLETE) + + MedtrumViewModel.SetupStep.ERROR -> { + moveStep(PatchStep.ERROR) + updateSetupStep(MedtrumViewModel.SetupStep.FILLED) // Reset setup step + binding.textWaitForPriming.text = rh.gs(R.string.priming_error) + binding.btnPositive.visibility = View.VISIBLE + } + + else -> { + ToastUtils.errorToast(requireContext(), "Unexpected state: $it") // TODO: String resource and show error message + aapsLogger.error(LTag.PUMP, "Unexpected state: $it") + } + } + } + startPrime() + } + } + } +} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumStartDeactivationFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumStartDeactivationFragment.kt index 7e9814c667..974ed08ec5 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumStartDeactivationFragment.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumStartDeactivationFragment.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.eopatch.ui +package info.nightscout.pump.medtrum.ui import android.os.Bundle import android.view.View @@ -30,19 +30,7 @@ class MedtrumStartDeactivationFragment : MedtrumBaseFragment btnPositive.visibility = View.VISIBLE - - MedtrumViewModel.SetupStep.ERROR -> { - ToastUtils.errorToast(requireContext(), "Error deactivate") // TODO: String resource and show error message - moveStep(PatchStep.CANCEL) - } - - else -> Unit // Nothing to do here - } - } - startDeactivation() + updateSetupStep(MedtrumViewModel.SetupStep.START_DEACTIVATION) } } } diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/BaseViewModel.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/BaseViewModel.kt index a4b1b52831..0b69688829 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/BaseViewModel.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/BaseViewModel.kt @@ -29,14 +29,4 @@ abstract class BaseViewModel : ViewModel() { fun finish() = navigator?.finish() fun Disposable.addTo() = apply { compositeDisposable.add(this) } - - fun convertToPatchStep(pumpState: MedtrumPumpState) = when (pumpState) { - MedtrumPumpState.NONE, MedtrumPumpState.IDLE -> PatchStep.PREPARE_PATCH - MedtrumPumpState.FILLED -> PatchStep.PREPARE_PATCH - MedtrumPumpState.PRIMING -> PatchStep.PRIME - MedtrumPumpState.PRIMED, MedtrumPumpState.EJECTED -> PatchStep.ATTACH_PATCH - MedtrumPumpState.ACTIVE, MedtrumPumpState.ACTIVE_ALT -> PatchStep.COMPLETE - MedtrumPumpState.STOPPED -> PatchStep.DEACTIVATION_COMPLETE - else -> PatchStep.CANCEL - } -} \ No newline at end of file +} diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt index 01fb12016a..c22f41e2ba 100644 --- a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt +++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/viewmodel/MedtrumViewModel.kt @@ -3,6 +3,8 @@ package info.nightscout.pump.medtrum.ui.viewmodel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import info.nightscout.core.utils.fabric.FabricPrivacy +import info.nightscout.interfaces.queue.Callback +import info.nightscout.interfaces.queue.CommandQueue import info.nightscout.pump.medtrum.MedtrumPlugin import info.nightscout.pump.medtrum.MedtrumPump import info.nightscout.pump.medtrum.R @@ -35,7 +37,8 @@ class MedtrumViewModel @Inject constructor( private val aapsSchedulers: AapsSchedulers, private val fabricPrivacy: FabricPrivacy, private val medtrumPlugin: MedtrumPlugin, - private val medtrumPump: MedtrumPump, + private val commandQueue: CommandQueue, + val medtrumPump: MedtrumPump, private val sp: SP ) : BaseViewModel() { @@ -55,25 +58,43 @@ class MedtrumViewModel @Inject constructor( get() = _eventHandler private var mInitPatchStep: PatchStep? = null + private var connectRetryCounter = 0 init { - // TODO destroy scope scope.launch { medtrumPump.connectionStateFlow.collect { state -> aapsLogger.debug(LTag.PUMP, "MedtrumViewModel connectionStateFlow: $state") if (patchStep.value != null) { when (state) { ConnectionState.CONNECTED -> { - if (patchStep.value == PatchStep.START_DEACTIVATION) { - updateSetupStep(SetupStep.READY_DEACTIVATE) - } medtrumPump.lastConnection = System.currentTimeMillis() } - ConnectionState.DISCONNECTED -> { - if (patchStep.value != PatchStep.DEACTIVATION_COMPLETE && patchStep.value != PatchStep.COMPLETE && patchStep.value != PatchStep.CANCEL) { + ConnectionState.DISCONNECTED -> { // TODO: This is getting ridiciolous, refactor + if (patchStep.value != PatchStep.START_DEACTIVATION + && patchStep.value != PatchStep.DEACTIVATE + && patchStep.value != PatchStep.FORCE_DEACTIVATION + && patchStep.value != PatchStep.DEACTIVATION_COMPLETE + && patchStep.value != PatchStep.ACTIVATE_COMPLETE + && patchStep.value != PatchStep.CANCEL + && patchStep.value != PatchStep.ERROR + && patchStep.value != PatchStep.PREPARE_PATCH + && patchStep.value != PatchStep.PREPARE_PATCH_CONNECT + ) { medtrumService?.connect("Try reconnect from viewModel") } + if (patchStep.value == PatchStep.PREPARE_PATCH_CONNECT) { + // We are disconnected during prepare patch connect, this means we failed to connect (wrong session token?) + // Retry 3 times, then give up + if (connectRetryCounter < 3) { + connectRetryCounter++ + aapsLogger.info(LTag.PUMP, "preparePatchConnect: retry $connectRetryCounter") + medtrumService?.connect("Try reconnect from viewModel") + } else { + aapsLogger.info(LTag.PUMP, "preparePatchConnect: failed to connect") + updateSetupStep(SetupStep.ERROR) + } + } } ConnectionState.CONNECTING -> { @@ -132,21 +153,30 @@ class MedtrumViewModel @Inject constructor( if (oldPatchStep != newPatchStep) { when (newPatchStep) { PatchStep.CANCEL -> { - if (medtrumService?.isConnected == true || medtrumService?.isConnecting == true) medtrumService?.disconnect("Cancel") else { - } - // TODO: For DEACTIVATE STATE we might want to move to force cancel screen - if (oldPatchStep == PatchStep.START_DEACTIVATION || oldPatchStep == PatchStep.DEACTIVATE) { - // What to do here? - } + // TODO: Are you sure? + // TODO: Dont disconnect when deactivating + medtrumService?.disconnect("Cancel") } PatchStep.COMPLETE -> { - if (medtrumService?.isConnected == true || medtrumService?.isConnecting == true) medtrumService?.disconnect("Complete") else { - } + medtrumService?.disconnect("Complete") } - PatchStep.DEACTIVATION_COMPLETE -> { - if (medtrumService?.isConnected == true || medtrumService?.isConnecting == true) medtrumService?.disconnect("DeactivationComplete") else { + PatchStep.START_DEACTIVATION, + PatchStep.DEACTIVATE, + PatchStep.FORCE_DEACTIVATION, + PatchStep.DEACTIVATION_COMPLETE, + PatchStep.PREPARE_PATCH -> { + // Do nothing, deactivation uses commandQueue to control connection + } + + PatchStep.PREPARE_PATCH_CONNECT -> { + // Make sure we are disconnected, else dont move step + if (medtrumService?.isConnected == true) { + // TODO, replace with error message + aapsLogger.info(LTag.PUMP, "moveStep: connected, not moving step") + return + } else { } } @@ -155,7 +185,7 @@ class MedtrumViewModel @Inject constructor( if (medtrumService?.isConnected == false) { aapsLogger.info(LTag.PUMP, "moveStep: not connected, not moving step") return - } else { + } else { } } } @@ -166,101 +196,108 @@ class MedtrumViewModel @Inject constructor( aapsLogger.info(LTag.PUMP, "moveStep: $oldPatchStep -> $newPatchStep") } - fun initializePatchStep(step: PatchStep?) { + fun initializePatchStep(step: PatchStep) { mInitPatchStep = prepareStep(step) } fun preparePatch() { - // Make sure patch step is updated when already filled - // TODO: Maybe a nicer solution for this - if (medtrumPump.pumpState == MedtrumPumpState.FILLED) { - updateSetupStep(SetupStep.FILLED) - } - // New session, generate new session token, only do this when not connected - if (medtrumService?.isConnected == false) { - aapsLogger.info(LTag.PUMP, "preparePatch: new session") - medtrumPump.patchSessionToken = Crypt().generateRandomToken() - // Connect to pump - medtrumService?.connect("PreparePatch") - } else { - aapsLogger.error(LTag.PUMP, "preparePatch: Already connected when trying to prepare patch") - // Do nothing here, continue with old key and connection + medtrumService?.disconnect("PreparePatch") + } + + fun preparePatchConnect() { + scope.launch { + if (medtrumService?.isConnected == false) { + aapsLogger.info(LTag.PUMP, "preparePatch: new session") + // New session, generate new session token, only do this when not connected + medtrumPump.patchSessionToken = Crypt().generateRandomToken() + // Connect to pump + medtrumService?.connect("PreparePatch") + } else { + aapsLogger.error(LTag.PUMP, "preparePatch: Already connected when trying to prepare patch") + // Do nothing, we are already connected + } } } fun startPrime() { - if (medtrumPump.pumpState == MedtrumPumpState.PRIMING) { - aapsLogger.info(LTag.PUMP, "startPrime: already priming!") - } else { - if (medtrumService?.startPrime() == true) { - aapsLogger.info(LTag.PUMP, "startPrime: success!") + scope.launch { + if (medtrumPump.pumpState == MedtrumPumpState.PRIMING) { + aapsLogger.info(LTag.PUMP, "startPrime: already priming!") } else { - aapsLogger.info(LTag.PUMP, "startPrime: failure!") - updateSetupStep(SetupStep.ERROR) + if (medtrumService?.startPrime() == true) { + aapsLogger.info(LTag.PUMP, "startPrime: success!") + } else { + aapsLogger.info(LTag.PUMP, "startPrime: failure!") + updateSetupStep(SetupStep.ERROR) + } } } } fun startActivate() { - if (medtrumService?.startActivate() == true) { - aapsLogger.info(LTag.PUMP, "startActivate: success!") - } else { - aapsLogger.info(LTag.PUMP, "startActivate: failure!") - updateSetupStep(SetupStep.ERROR) + scope.launch { + if (medtrumService?.startActivate() == true) { + aapsLogger.info(LTag.PUMP, "startActivate: success!") + } else { + aapsLogger.info(LTag.PUMP, "startActivate: failure!") + updateSetupStep(SetupStep.ERROR) + } } } - fun startDeactivation() { - // Start connecting if needed - if (medtrumService?.isConnected == true) { - updateSetupStep(SetupStep.READY_DEACTIVATE) - } else if (medtrumService?.isConnecting != true) { - medtrumService?.connect("StartDeactivation") - } - // TODO: Also start timer to check if connection is made, if timed out show force forget patch - } - fun deactivatePatch() { - if (medtrumService?.deactivatePatch() == true) { - aapsLogger.info(LTag.PUMP, "deactivatePatch: success!") - } else { - aapsLogger.info(LTag.PUMP, "deactivatePatch: failure!") - // TODO: State to force forget the patch or try again - updateSetupStep(SetupStep.ERROR) - } - } - - private fun prepareStep(step: PatchStep?): PatchStep { - (step ?: convertToPatchStep(medtrumPump.pumpState)).let { newStep -> - when (newStep) { - PatchStep.PREPARE_PATCH -> R.string.step_prepare_patch - PatchStep.PRIME -> R.string.step_prime - PatchStep.ATTACH_PATCH -> R.string.step_attach - PatchStep.ACTIVATE -> R.string.step_activate - PatchStep.COMPLETE -> R.string.step_complete - PatchStep.START_DEACTIVATION, PatchStep.DEACTIVATE -> R.string.step_deactivate - PatchStep.DEACTIVATION_COMPLETE -> R.string.step_complete - else -> _title.value - }.let { - aapsLogger.info(LTag.PUMP, "prepareStep: title before cond: $it") - if (_title.value != it) { - aapsLogger.info(LTag.PUMP, "prepareStep: title: $it") - _title.postValue(it) + commandQueue.deactivate(object : Callback() { + override fun run() { + if (this.result.success) { + // Do nothing, state change will handle this + } else { + updateSetupStep(SetupStep.ERROR) } } - - patchStep.postValue(newStep) - - return newStep - } + }) } - enum class SetupStep { INITIAL, FILLED, PRIMED, ACTIVATED, ERROR, START_DEACTIVATION, STOPPED, READY_DEACTIVATE + fun resetPumpState() { + medtrumPump.pumpState = MedtrumPumpState.NONE + } + + private fun prepareStep(newStep: PatchStep): PatchStep { + val stringResId = when (newStep) { + PatchStep.PREPARE_PATCH -> R.string.step_prepare_patch + PatchStep.PREPARE_PATCH_CONNECT -> R.string.step_prepare_patch_connect + PatchStep.PRIME -> R.string.step_prime + PatchStep.PRIMING -> R.string.step_priming + PatchStep.PRIME_COMPLETE -> R.string.step_priming_complete + PatchStep.ATTACH_PATCH -> R.string.step_attach + PatchStep.ACTIVATE -> R.string.step_activate + PatchStep.ACTIVATE_COMPLETE -> R.string.step_activate_complete + PatchStep.START_DEACTIVATION -> R.string.step_deactivate + PatchStep.DEACTIVATE -> R.string.step_deactivating + PatchStep.DEACTIVATION_COMPLETE -> R.string.step_deactivate_complete + PatchStep.COMPLETE, + PatchStep.FORCE_DEACTIVATION, + PatchStep.ERROR, + PatchStep.CANCEL -> _title.value + } + + val currentTitle = _title.value + aapsLogger.info(LTag.PUMP, "prepareStep: title before cond: $stringResId") + if (currentTitle != stringResId) { + aapsLogger.info(LTag.PUMP, "prepareStep: title: $stringResId") + _title.postValue(stringResId) + } + + patchStep.postValue(newStep) + + return newStep + } + + enum class SetupStep { INITIAL, FILLED, PRIMED, ACTIVATED, ERROR, START_DEACTIVATION, STOPPED } val setupStep = MutableLiveData() - private fun updateSetupStep(newSetupStep: SetupStep) { + fun updateSetupStep(newSetupStep: SetupStep) { aapsLogger.info(LTag.PUMP, "curSetupStep: ${setupStep.value}, newSetupStep: $newSetupStep") setupStep.postValue(newSetupStep) } diff --git a/pump/medtrum/src/main/res/layout/fragment_medtrum_activate.xml b/pump/medtrum/src/main/res/layout/fragment_medtrum_activate.xml index dbf6522fe1..f1bbcaec00 100644 --- a/pump/medtrum/src/main/res/layout/fragment_medtrum_activate.xml +++ b/pump/medtrum/src/main/res/layout/fragment_medtrum_activate.xml @@ -25,6 +25,20 @@ android:layout_height="wrap_content" tools:context=".ui.MedtrumActivity"> + + + - + diff --git a/pump/medtrum/src/main/res/layout/fragment_medtrum_activate_complete.xml b/pump/medtrum/src/main/res/layout/fragment_medtrum_activate_complete.xml new file mode 100644 index 0000000000..ef9a93c14b --- /dev/null +++ b/pump/medtrum/src/main/res/layout/fragment_medtrum_activate_complete.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + +