diff --git a/app/build.gradle b/app/build.gradle index eef64b9eed..c006866147 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -283,8 +283,6 @@ dependencies { implementation "com.jjoe64:graphview:4.0.1" implementation "com.joanzapata.iconify:android-iconify-fontawesome:2.2.2" implementation 'com.madgag.spongycastle:core:1.58.0.0' - // Omnipod wizard - implementation(name: "com.atech-software.android.library.wizardpager-1.1.4", ext: "aar") implementation("com.google.android:flexbox:0.3.0") { exclude group: "com.android.support" } diff --git a/app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar b/app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar deleted file mode 100644 index af0c6511cf..0000000000 Binary files a/app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar and /dev/null differ diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt index 80eef197bc..42dd3e2972 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/FragmentsModule.kt @@ -36,7 +36,7 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.dialog.RileyL import info.nightscout.androidaps.plugins.pump.insight.LocalInsightFragment import info.nightscout.androidaps.plugins.pump.medtronic.MedtronicFragment import info.nightscout.androidaps.plugins.pump.medtronic.dialog.RileyLinkStatusDeviceMedtronic -import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodFragment +import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodOverviewFragment import info.nightscout.androidaps.plugins.pump.virtual.VirtualPumpFragment import info.nightscout.androidaps.plugins.source.BGSourceFragment import info.nightscout.androidaps.plugins.treatments.TreatmentsFragment @@ -68,7 +68,7 @@ abstract class FragmentsModule { @ContributesAndroidInjector abstract fun contributesLoopFragment(): LoopFragment @ContributesAndroidInjector abstract fun contributesMaintenanceFragment(): MaintenanceFragment @ContributesAndroidInjector abstract fun contributesMedtronicFragment(): MedtronicFragment - @ContributesAndroidInjector abstract fun contributesOmnipodFragment(): OmnipodFragment + @ContributesAndroidInjector abstract fun contributesOmnipodFragment(): OmnipodOverviewFragment @ContributesAndroidInjector abstract fun contributesNSProfileFragment(): NSProfileFragment @ContributesAndroidInjector abstract fun contributesNSClientFragment(): NSClientFragment @ContributesAndroidInjector diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.kt b/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.kt index 6c47f2c3d1..76e5057654 100644 --- a/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.kt +++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/SWDefinition.kt @@ -12,7 +12,11 @@ import info.nightscout.androidaps.activities.PreferencesActivity import info.nightscout.androidaps.dialogs.ProfileSwitchDialog import info.nightscout.androidaps.events.EventConfigBuilderChange import info.nightscout.androidaps.events.EventPumpStatusChanged -import info.nightscout.androidaps.interfaces.* +import info.nightscout.androidaps.interfaces.ActivePluginProvider +import info.nightscout.androidaps.interfaces.CommandQueueProvider +import info.nightscout.androidaps.interfaces.PluginBase +import info.nightscout.androidaps.interfaces.PluginType +import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin @@ -27,6 +31,7 @@ import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin import info.nightscout.androidaps.plugins.profile.ns.NSProfileFragment import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin import info.nightscout.androidaps.plugins.pump.omnipod.OmnipodPumpPlugin +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.ChangePodWizardActivity import info.nightscout.androidaps.setupwizard.elements.* import info.nightscout.androidaps.setupwizard.events.EventSWUpdate import info.nightscout.androidaps.utils.AndroidPermission @@ -299,18 +304,6 @@ class SWDefinition @Inject constructor( .option(PluginType.PUMP, R.string.configbuilder_pump_description) .label(R.string.configbuilder_pump)) .add(SWBreak(injector)) - .add(SWInfotext(injector) - .label(R.string.setupwizard_pump_pump_not_initialized) - .visibility(SWValidator { !isPumpInitialized(activePlugin.activePump) })) - // BEGIN OMNIPOD - .add(SWInfotext(injector) - .label(R.string.setupwizard_pump_waiting_for_riley_link_connection) - .visibility(SWValidator { - val activePump = activePlugin.activePump - activePump is OmnipodPumpPlugin && !activePump.isRileyLinkReady - })) - // TODO after refactoring Pod (de)activation Wizards, start init Pod activity from here - // END OMNIPOD .add(SWButton(injector) .text(R.string.pumpsetup) .action(Runnable { @@ -322,6 +315,35 @@ class SWDefinition @Inject constructor( }, null) }) .visibility(SWValidator { (activePlugin.activePump as PluginBase).preferencesId > 0 })) + .add(SWInfotext(injector) + .label(R.string.setupwizard_pump_pump_not_initialized) + .visibility(SWValidator { !activePlugin.activePump.isInitialized })) + // BEGIN OMNIPOD + .add(SWInfotext(injector) + .label(R.string.setupwizard_pump_waiting_for_riley_link_connection) + .visibility(SWValidator { + val activePump = activePlugin.activePump + activePump is OmnipodPumpPlugin && !activePump.isRileyLinkReady + })) + .add(SWInfotext(injector) + .label(R.string.setupwizard_pump_waiting_for_pod_change) + .visibility(SWValidator { + val activePump = activePlugin.activePump + activePump is OmnipodPumpPlugin && activePump.isRileyLinkReady && !activePump.isInitialized + })) + .add(SWButton(injector) + .text(R.string.setupwizard_pump_omnipod_change_pod) + .action(Runnable { + protectionCheck.queryProtection(activity, ProtectionCheck.Protection.PREFERENCES, Runnable { + val i = Intent(activity, ChangePodWizardActivity::class.java) + activity.startActivity(i) + }, null) + }) + .visibility(SWValidator { + val activePump = activePlugin.activePump + activePump is OmnipodPumpPlugin && activePump.isRileyLinkReady && !activePump.isInitialized + })) + // END OMNIPOD .add(SWButton(injector) .text(R.string.readstatus) .action(Runnable { commandQueue.readStatus("Clicked connect to pump", null) }) @@ -329,13 +351,9 @@ class SWDefinition @Inject constructor( .add(SWEventListener(injector, EventPumpStatusChanged::class.java)) .validator(SWValidator { val activePump = activePlugin.activePump - isPumpInitialized(activePump) + activePump.isInitialized }) - private fun isPumpInitialized(activePump: PumpInterface) = - activePump.isInitialized - || (activePump is OmnipodPumpPlugin && activePump.isRileyLinkReady) - private val screenAps = SWScreen(injector, R.string.configbuilder_aps) .skippable(false) .add(SWInfotext(injector) diff --git a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt index f2d763e32e..782e07f069 100644 --- a/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt +++ b/app/src/main/java/info/nightscout/androidaps/setupwizard/SetupWizardActivity.kt @@ -110,6 +110,7 @@ class SetupWizardActivity : NoSplashAppCompatActivity() { updateButtons() }) { fabricPrivacy.logException(it) } ) + updateButtons() } private fun generateLayout() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 696cd3b823..b76e703166 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -949,9 +949,10 @@ Configure BG source Please select source of profile. If patient is a child you should use NS profile. If there is nobody following you on Nightscout you will probably prefer Local profile. Please remember that you are only selecting the profile source. To use it you must activate it by executing \"Profile switch\" Select one from availables algorithms. They are sorted from oldest to newest. Newer algorithm is usually more powerful and more aggressive. Thus if you are new looper you may probably start with AMA and not with latest one. Do not forget to read the OpenAPS documentation and configure it before use. - Waiting for RileyLink connection\n + Waiting for RileyLink connection…\n + Waiting for Pod change…\n Note: You can continue setup once the pump has been initialized.\n - Init Pod + Change Pod Start your first objective Permission Ask for permission diff --git a/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt b/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt index dd0da3b72f..873c751e2e 100644 --- a/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt +++ b/core/src/main/java/info/nightscout/androidaps/utils/HtmlHelper.kt @@ -1,11 +1,10 @@ package info.nightscout.androidaps.utils -import android.os.Build import android.text.Html import android.text.Spanned object HtmlHelper { fun fromHtml(source: String): Spanned { - return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY) + return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY) } } \ No newline at end of file diff --git a/omnipod/build.gradle b/omnipod/build.gradle index 552e74e3c7..e520dc6323 100644 --- a/omnipod/build.gradle +++ b/omnipod/build.gradle @@ -91,7 +91,6 @@ dependencies { implementation 'org.apache.commons:commons-lang3:3.10' implementation 'net.danlew:android.joda:2.10.6' implementation "com.google.code.gson:gson:2.8.6" - implementation(name: "com.atech-software.android.library.wizardpager-1.1.4", ext: "aar") implementation "com.google.dagger:dagger-android:$dagger_version" implementation "com.google.dagger:dagger-android-support:$dagger_version" diff --git a/omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar b/omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar deleted file mode 100644 index af0c6511cf..0000000000 Binary files a/omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar and /dev/null differ diff --git a/omnipod/src/main/AndroidManifest.xml b/omnipod/src/main/AndroidManifest.xml index 924fee176f..7da09f6d06 100644 --- a/omnipod/src/main/AndroidManifest.xml +++ b/omnipod/src/main/AndroidManifest.xml @@ -9,9 +9,6 @@ - - + \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java index f904d28b7f..1201412345 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/OmnipodPumpPlugin.java @@ -83,7 +83,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandUpda import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.OmnipodCustomCommand; import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.OmnipodCustomCommandType; import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.service.RileyLinkOmnipodService; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodFragment; +import info.nightscout.androidaps.plugins.pump.omnipod.ui.OmnipodOverviewFragment; import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil; import info.nightscout.androidaps.plugins.pump.omnipod.util.OmnipodAlertUtil; import info.nightscout.androidaps.queue.commands.CustomCommand; @@ -169,11 +169,11 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, ) { super(new PluginDescription() // .mainType(PluginType.PUMP) // - .fragmentClass(OmnipodFragment.class.getName()) // + .fragmentClass(OmnipodOverviewFragment.class.getName()) // .pluginName(R.string.omnipod_name) // .shortName(R.string.omnipod_name_short) // .preferencesId(R.xml.pref_omnipod) // - .description(R.string.description_pump_omnipod), // + .description(R.string.omnipod_pump_description), // injector, aapsLogger, resourceHelper, commandQueue); this.aapsLogger = aapsLogger; this.rxBus = rxBus; @@ -358,7 +358,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, rxBus.send(new EventNewNotification(notification)); } else { if (podStateManager.isSuspended()) { - Notification notification = new Notification(Notification.OMNIPOD_POD_SUSPENDED, resourceHelper.gs(R.string.omnipod_pod_suspended), Notification.NORMAL); + Notification notification = new Notification(Notification.OMNIPOD_POD_SUSPENDED, resourceHelper.gs(R.string.omnipod_confirmation_pod_suspended), Notification.NORMAL); rxBus.send(new EventNewNotification(notification)); } } @@ -729,6 +729,8 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, return executeCommand(OmnipodCommandType.SUSPEND_DELIVERY, aapsOmnipodManager::suspendDelivery); case RESUME_DELIVERY: return executeCommand(OmnipodCommandType.RESUME_DELIVERY, () -> aapsOmnipodManager.setBasalProfile(profileFunction.getProfile(), false)); + case DEACTIVATE_POD: + return executeCommand(OmnipodCommandType.DEACTIVATE_POD, aapsOmnipodManager::deactivatePod); case HANDLE_TIME_CHANGE: return handleTimeChange(((CommandHandleTimeChange) command).isRequestedByUser()); case UPDATE_ALERT_CONFIGURATION: @@ -806,7 +808,7 @@ public class OmnipodPumpPlugin extends PumpPluginBase implements PumpInterface, if (!requestedByUser && aapsOmnipodManager.isTimeChangeEventEnabled()) { Notification notification = new Notification( Notification.TIME_OR_TIMEZONE_CHANGE, - resourceHelper.gs(R.string.omnipod_confirmation_time_or_timezone_change), + resourceHelper.gs(R.string.omnipod_confirmation_time_on_pod_updated), Notification.INFO, 60); rxBus.send(new EventNewNotification(notification)); } diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt index e555dcb640..cd932bad82 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodInjectHelpers.kt @@ -17,7 +17,6 @@ annotation class OmnipodPluginQualifier @MapKey internal annotation class ViewModelKey(val value: KClass) - // TODO: These annotations and Factories could be used globally -> move to core or app @Suppress("UNCHECKED_CAST") diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt index 2bf3095cd4..a61a9425bf 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodModule.kt @@ -9,11 +9,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsPodStateManag import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager import info.nightscout.androidaps.plugins.pump.omnipod.ui.PodHistoryActivity import info.nightscout.androidaps.plugins.pump.omnipod.ui.PodManagementActivity -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitPodTask -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.PodInfoFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod.RemoveActionFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.ReplacePodWizardActivity +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.ChangePodWizardActivity @Module @Suppress("unused") @@ -26,19 +22,13 @@ abstract class OmnipodModule { @ActivityScope @ContributesAndroidInjector(modules = [OmnipodWizardModule::class]) - abstract fun contributesWizardActivity(): ReplacePodWizardActivity - - // Fragments - @ContributesAndroidInjector abstract fun initActionFragment(): InitActionFragment - @ContributesAndroidInjector abstract fun removeActionFragment(): RemoveActionFragment - @ContributesAndroidInjector abstract fun podInfoFragment(): PodInfoFragment + abstract fun contributesWizardActivity(): ChangePodWizardActivity // Service @ContributesAndroidInjector abstract fun omnipodCommunicationManagerProvider(): OmnipodRileyLinkCommunicationManager // Data - @ContributesAndroidInjector abstract fun initPodTask(): InitPodTask @ContributesAndroidInjector abstract fun rlHistoryItemOmnipod(): RLHistoryItemOmnipod companion object { diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt index fb7beb86c4..3fe8250a58 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/dagger/OmnipodWizardModule.kt @@ -7,15 +7,13 @@ import dagger.Module import dagger.Provides import dagger.android.ContributesAndroidInjector import dagger.multibindings.IntoMap -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.action.DeactivatePodActionFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.action.InsertCannulaActionFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.action.PairAndPrimePodActionFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info.AttachPodInfoFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info.DeactivatePodInfoFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info.FillPodInfoFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info.PodDeactivatedInfoFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info.PodReplacedInfoFragment -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.viewmodel.WizardViewModel1 +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action.DeactivatePodActionFragment +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action.InsertCannulaActionFragment +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action.PairAndPrimePodActionFragment +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info.* +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.DeactivatePodActionViewModel +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.InsertCannulaActionViewModel +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.PairAndPrimePodActionViewModel import javax.inject.Provider @Module @@ -23,7 +21,6 @@ abstract class OmnipodWizardModule { companion object { @Provides - @JvmStatic @OmnipodPluginQualifier fun providesViewModelFactory(@OmnipodPluginQualifier viewModels: MutableMap, @JvmSuppressWildcards Provider>): ViewModelProvider.Factory { return ViewModelFactory(viewModels) @@ -34,12 +31,22 @@ abstract class OmnipodWizardModule { @Binds @IntoMap @OmnipodPluginQualifier - @ViewModelKey(WizardViewModel1::class) - internal abstract fun bindWizardViewModel1(viewModel: WizardViewModel1): ViewModel - // Add the rest of the view models + @ViewModelKey(PairAndPrimePodActionViewModel::class) + internal abstract fun pairAndPrimePodActionViewModel(viewModel: PairAndPrimePodActionViewModel): ViewModel + + @Binds + @IntoMap + @OmnipodPluginQualifier + @ViewModelKey(InsertCannulaActionViewModel::class) + internal abstract fun insertCannulaActionViewModel(viewModel: InsertCannulaActionViewModel): ViewModel + + @Binds + @IntoMap + @OmnipodPluginQualifier + @ViewModelKey(DeactivatePodActionViewModel::class) + internal abstract fun deactivatePodActionViewModel(viewModel: DeactivatePodActionViewModel): ViewModel // #### FRAGMENTS ############################################################################## - @FragmentScope @ContributesAndroidInjector internal abstract fun contributesDeactivatePodActionFragment(): DeactivatePodActionFragment @@ -70,7 +77,11 @@ abstract class OmnipodWizardModule { @FragmentScope @ContributesAndroidInjector - internal abstract fun contributesPodReplacedInfoFragment(): PodReplacedInfoFragment + internal abstract fun contributesPodDiscardedInfoFragment(): PodDiscardedInfoFragment + + @FragmentScope + @ContributesAndroidInjector + internal abstract fun contributesPodChangedInfoFragment(): PodChangedInfoFragment } diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java index e8f6341ab3..4f196cda3d 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/OmnipodCommandType.java @@ -6,8 +6,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.R; * Created by andy on 4.8.2019 */ public enum OmnipodCommandType { - PAIR_AND_PRIME_POD(R.string.omnipod_cmd_pair_and_prime), // First step of Pod activation - FILL_CANNULA_AND_SET_BASAL_PROFILE(R.string.omnipod_cmd_fill_cannula_set_basal_profile), // Second step of Pod activation + ACTIVATE_POD(R.string.omnipod_cmd_activate_pod), // First step of Pod change + INSERT_CANNULA(R.string.omnipod_cmd_insert_cannula), // Second step of Pod change DEACTIVATE_POD(R.string.omnipod_cmd_deactivate_pod), // SET_BASAL_PROFILE(R.string.omnipod_cmd_set_basal_schedule), // SET_BOLUS(R.string.omnipod_cmd_set_bolus), // diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java index 84720d3238..207a7814fc 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodHistoryEntryType.java @@ -13,8 +13,8 @@ import info.nightscout.androidaps.plugins.pump.omnipod.R; */ public enum PodHistoryEntryType { - PAIR_AND_PRIME(1, R.string.omnipod_init_pod_wizard_step2_title, PumpHistoryEntryGroup.Prime), - FILL_CANNULA_SET_BASAL_PROFILE(2, R.string.omnipod_init_pod_wizard_step4_title, PumpHistoryEntryGroup.Prime), + ACTIVATE_POD(1, R.string.omnipod_cmd_activate_pod, PumpHistoryEntryGroup.Prime), + INSERT_CANNULA(2, R.string.omnipod_cmd_insert_cannula, PumpHistoryEntryGroup.Prime), DEACTIVATE_POD(3, R.string.omnipod_cmd_deactivate_pod, PumpHistoryEntryGroup.Prime), DISCARD_POD_STATE(4, R.string.omnipod_cmd_discard_pod, PumpHistoryEntryGroup.Prime), diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java deleted file mode 100644 index 1424712010..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java +++ /dev/null @@ -1,54 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.definition; - -import java.util.ArrayList; -import java.util.List; - -import info.nightscout.androidaps.plugins.pump.omnipod.R; - -public enum PodInitActionType { - - PAIR_AND_PRIME_WIZARD_STEP(), // - PAIR_POD(R.string.omnipod_init_pod_pair_pod, PAIR_AND_PRIME_WIZARD_STEP), // - PRIME_POD(R.string.omnipod_init_pod_prime_pod, PAIR_AND_PRIME_WIZARD_STEP), // - - FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP(), // - FILL_CANNULA(R.string.omnipod_init_pod_fill_cannula, FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP), // - SET_BASAL_PROFILE(R.string.omnipod_init_pod_set_basal_profile, FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP), // - - DEACTIVATE_POD_WIZARD_STEP(), // - CANCEL_DELIVERY(R.string.omnipod_deactivate_pod_cancel_delivery, DEACTIVATE_POD_WIZARD_STEP), // - DEACTIVATE_POD(R.string.omnipod_deactivate_pod_deactivate_pod, DEACTIVATE_POD_WIZARD_STEP); - - private int resourceId; - private PodInitActionType parent; - - PodInitActionType(int resourceId, PodInitActionType parent) { - this.resourceId = resourceId; - this.parent = parent; - } - - PodInitActionType() { - } - - public boolean isParent() { - return this.parent == null; - } - - public List getChildren() { - - List outList = new ArrayList<>(); - - for (PodInitActionType value : values()) { - if (value.parent == this) { - outList.add(value); - } - } - - return outList; - } - - public int getResourceId() { - return resourceId; - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java deleted file mode 100644 index 35f9f41229..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java +++ /dev/null @@ -1,7 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.definition; - -public interface PodInitReceiver { - - void returnInitTaskStatus(PodInitActionType podInitActionType, boolean isSuccess, String errorMessage); - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java index d099894ab6..13a782fdf7 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/communication/message/response/podinfo/PodInfoFaultEvent.java @@ -69,7 +69,9 @@ public class PodInfoFaultEvent extends PodInfo implements StatusUpdatableRespons unacknowledgedAlerts = new AlertSet(encodedData[15]); faultAccessingTables = encodedData[16] == 0x02; - logEventErrorType = LogEventErrorCode.fromByte((byte) (encodedData[17] >>> 4)); + int i = ByteUtil.convertUnsignedByteToInt(encodedData[17]); + byte value = (byte) (i >>> 4); + logEventErrorType = LogEventErrorCode.fromByte(value); logEventErrorPodProgressStatus = PodProgressStatus.fromByte((byte) (encodedData[17] & 0x0f)); receiverLowGain = (byte) (ByteUtil.convertUnsignedByteToInt(encodedData[18]) >>> 6); radioRSSI = (byte) (encodedData[18] & 0x3f); diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java new file mode 100644 index 0000000000..d429e6a900 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java @@ -0,0 +1,16 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.driver.exception; + +import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus; + +public class PodProgressStatusVerificationFailedException extends OmnipodException { + private final PodProgressStatus expectedStatus; + + public PodProgressStatusVerificationFailedException(PodProgressStatus expectedStatus, Throwable cause) { + super("Failed to verify Pod progress status (expected=" + expectedStatus + ")", cause, false); + this.expectedStatus = expectedStatus; + } + + public PodProgressStatus getExpectedStatus() { + return expectedStatus; + } +} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java index 0672b6ee93..e642fd1f71 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/OmnipodManager.java @@ -48,6 +48,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.IllegalP import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.NonceOutOfSyncException; import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.OmnipodException; import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodFaultException; +import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.PodProgressStatusVerificationFailedException; import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager; import info.nightscout.androidaps.utils.sharedPreferences.SP; import io.reactivex.Completable; @@ -86,7 +87,7 @@ public class OmnipodManager { this.podStateManager = podStateManager; } - public synchronized Single pairAndPrime() { + public synchronized Single pairAndPrime() { logStartingCommandExecution("pairAndPrime"); try { @@ -128,11 +129,11 @@ public class OmnipodManager { long delayInMillis = calculateEstimatedBolusDuration(DateTime.now().minus(OmnipodConstants.AVERAGE_BOLUS_COMMAND_COMMUNICATION_DURATION), OmnipodConstants.POD_PRIME_BOLUS_UNITS, OmnipodConstants.POD_PRIMING_DELIVERY_RATE).getMillis(); return Single.timer(delayInMillis, TimeUnit.MILLISECONDS) // - .map(o -> verifySetupAction(PodProgressStatus.PRIMING_COMPLETED)) // - .observeOn(Schedulers.io()); + .map(o -> verifyPodProgressStatus(PodProgressStatus.PRIMING_COMPLETED)) // + .subscribeOn(Schedulers.io()); } - public synchronized Single insertCannula( + public synchronized Single insertCannula( BasalSchedule basalSchedule, Duration expirationReminderTimeBeforeShutdown, Integer lowReservoirAlertUnits) { if (!podStateManager.isPodInitialized() || podStateManager.getPodProgressStatus().isBefore(PodProgressStatus.PRIMING_COMPLETED)) { throw new IllegalPodProgressException(PodProgressStatus.PRIMING_COMPLETED, !podStateManager.isPodInitialized() ? null : podStateManager.getPodProgressStatus()); @@ -156,8 +157,8 @@ public class OmnipodManager { long delayInMillis = calculateEstimatedBolusDuration(DateTime.now().minus(OmnipodConstants.AVERAGE_BOLUS_COMMAND_COMMUNICATION_DURATION), OmnipodConstants.POD_CANNULA_INSERTION_BOLUS_UNITS, OmnipodConstants.POD_CANNULA_INSERTION_DELIVERY_RATE).getMillis(); return Single.timer(delayInMillis, TimeUnit.MILLISECONDS) // - .map(o -> verifySetupAction(PodProgressStatus.ABOVE_FIFTY_UNITS)) // - .observeOn(Schedulers.io()); + .map(o -> verifyPodProgressStatus(PodProgressStatus.ABOVE_FIFTY_UNITS)) // + .subscribeOn(Schedulers.io()); } public synchronized StatusResponse getPodStatus() { @@ -400,7 +401,7 @@ public class OmnipodManager { long progressReportInterval = estimatedRemainingBolusDuration.getMillis() / numberOfProgressReports; disposables.add(Flowable.intervalRange(0, numberOfProgressReports + 1, 0, progressReportInterval, TimeUnit.MILLISECONDS) // - .observeOn(Schedulers.io()) // + .subscribeOn(Schedulers.io()) // .subscribe(count -> { int percentage = (int) ((double) count / numberOfProgressReports * 100); double estimatedUnitsDelivered = activeBolusData == null ? 0 : activeBolusData.estimateUnitsDelivered(); @@ -421,7 +422,7 @@ public class OmnipodManager { disposables.add(Completable.complete() // .delay(estimatedRemainingBolusDuration.getMillis(), TimeUnit.MILLISECONDS) // - .observeOn(Schedulers.io()) // + .subscribeOn(Schedulers.io()) // .doOnComplete(() -> { synchronized (bolusDataMutex) { double bolusNotDelivered = 0.0d; @@ -626,26 +627,36 @@ public class OmnipodManager { } } - private SetupActionResult verifySetupAction(PodProgressStatus expectedPodProgressStatus) { - SetupActionResult result = null; + /** + * @param expectedPodProgressStatus expected Pod progress status + * @return true if the Pod's progress status matches the expected status, otherwise false + * @throws PodProgressStatusVerificationFailedException in case reading the Pod status fails + */ + private boolean verifyPodProgressStatus(PodProgressStatus expectedPodProgressStatus) { + Boolean result = null; + Throwable lastException = null; + for (int i = 0; ACTION_VERIFICATION_TRIES > i; i++) { try { StatusResponse statusResponse = getPodStatus(); if (statusResponse.getPodProgressStatus().equals(expectedPodProgressStatus)) { - result = new SetupActionResult(SetupActionResult.ResultType.SUCCESS); - break; + return true; } else { - result = new SetupActionResult(SetupActionResult.ResultType.FAILURE) // - .podProgressStatus(statusResponse.getPodProgressStatus()); - break; + result = false; } } catch (Exception ex) { - result = new SetupActionResult(SetupActionResult.ResultType.VERIFICATION_FAILURE) // - .exception(ex); + lastException = ex; } } - return result; + + if (result != null) { + return result; + } + + final Throwable ex = lastException; + + throw new PodProgressStatusVerificationFailedException(expectedPodProgressStatus, ex); } /** diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java deleted file mode 100644 index 867c56aa9f..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java +++ /dev/null @@ -1,61 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.driver.manager; - -import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus; - -public class SetupActionResult { - private final ResultType resultType; - private String message; - private Exception exception; - private PodProgressStatus podProgressStatus; - - public SetupActionResult(ResultType resultType) { - this.resultType = resultType; - } - - public SetupActionResult message(String message) { - this.message = message; - return this; - } - - public SetupActionResult exception(Exception ex) { - exception = ex; - return this; - } - - public SetupActionResult podProgressStatus(PodProgressStatus podProgressStatus) { - this.podProgressStatus = podProgressStatus; - return this; - } - - public ResultType getResultType() { - return resultType; - } - - public String getMessage() { - return message; - } - - public Exception getException() { - return exception; - } - - public PodProgressStatus getPodProgressStatus() { - return podProgressStatus; - } - - public enum ResultType { - SUCCESS(true), - VERIFICATION_FAILURE(false), - FAILURE(false); - - private final boolean success; - - ResultType(boolean success) { - this.success = success; - } - - public boolean isSuccess() { - return success; - } - } -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java index 7a9c400d46..3d21de9c14 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/manager/AapsOmnipodManager.java @@ -22,6 +22,7 @@ import info.nightscout.androidaps.db.OmnipodHistoryRecord; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.events.Event; +import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.interfaces.ActivePluginProvider; import info.nightscout.androidaps.interfaces.DatabaseHelperInterface; import info.nightscout.androidaps.interfaces.ProfileFunction; @@ -38,10 +39,9 @@ import info.nightscout.androidaps.plugins.pump.common.defs.PumpType; import info.nightscout.androidaps.plugins.pump.common.utils.ByteUtil; import info.nightscout.androidaps.plugins.pump.omnipod.R; import info.nightscout.androidaps.plugins.pump.omnipod.data.ActiveBolus; +import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodCommandType; import info.nightscout.androidaps.plugins.pump.omnipod.definition.OmnipodStorageKeys; import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodHistoryEntryType; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitReceiver; import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.StatusResponse; import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoRecentPulseLog; import info.nightscout.androidaps.plugins.pump.omnipod.driver.communication.message.response.podinfo.PodInfoResponse; @@ -50,6 +50,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.Deliver import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.FaultEventCode; import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.OmnipodConstants; import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodInfoType; +import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus; import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalSchedule; import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.schedule.BasalScheduleEntry; import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.CommandFailedAfterChangingDeliveryStatusException; @@ -75,7 +76,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLin import info.nightscout.androidaps.plugins.pump.omnipod.driver.exception.RileyLinkUnreachableException; import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.OmnipodManager; import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager; -import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.SetupActionResult; import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged; import info.nightscout.androidaps.plugins.pump.omnipod.rileylink.manager.OmnipodRileyLinkCommunicationManager; import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil; @@ -153,57 +153,61 @@ public class AapsOmnipodManager { timeChangeEventEnabled = sp.getBoolean(OmnipodStorageKeys.Preferences.TIME_CHANGE_EVENT_ENABLED, true); } - public PumpEnactResult pairAndPrime(PodInitActionType podInitActionType, PodInitReceiver podInitReceiver) { - if (podInitActionType != PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP) { - return new PumpEnactResult(injector).success(false).enacted(false).comment(getStringResource(R.string.omnipod_error_illegal_init_action_type, podInitActionType.name())); - } - + public PumpEnactResult activateNewPod() { + PumpEnactResult result = new PumpEnactResult(injector); try { - executeCommand(() -> delegate.pairAndPrime().subscribe(res -> // - handleSetupActionResult(podInitActionType, podInitReceiver, res, System.currentTimeMillis(), null))); + Boolean res = executeCommand(delegate::pairAndPrime) + .blockingGet(); - return new PumpEnactResult(injector).success(true).enacted(true); + result.success(res).enacted(res); + + if (!res) { + result.comment(R.string.omnipod_error_failed_to_activate_pod); + } } catch (Exception ex) { - String errorMessage = translateException(ex); - podInitReceiver.returnInitTaskStatus(podInitActionType, false, errorMessage); - addFailureToHistory(System.currentTimeMillis(), PodHistoryEntryType.PAIR_AND_PRIME, errorMessage); - return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); + result.success(false).enacted(false).comment(translateException(ex)); } + + addToHistory(System.currentTimeMillis(), PodHistoryEntryType.ACTIVATE_POD, result.comment, result.success); + + return result; } - public PumpEnactResult setInitialBasalScheduleAndInsertCannula(PodInitActionType podInitActionType, PodInitReceiver podInitReceiver, Profile profile) { - if (podInitActionType != PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP) { - String comment = getStringResource(R.string.omnipod_error_illegal_init_action_type, podInitActionType.name()); - podInitReceiver.returnInitTaskStatus(podInitActionType, false, comment); - return new PumpEnactResult(injector).success(false).enacted(false).comment(comment); - } + public PumpEnactResult insertCannula(Profile profile) { if (profile == null) { String comment = getStringResource(R.string.omnipod_error_set_initial_basal_schedule_no_profile); - podInitReceiver.returnInitTaskStatus(podInitActionType, false, comment); return new PumpEnactResult(injector).success(false).enacted(false).comment(comment); } + PumpEnactResult result = new PumpEnactResult(injector); + try { BasalSchedule basalSchedule = mapProfileToBasalSchedule(profile); - executeCommand(() -> delegate.insertCannula(basalSchedule, omnipodAlertUtil.getExpirationReminderTimeBeforeShutdown(), omnipodAlertUtil.getLowReservoirAlertUnits()).subscribe(res -> // - handleSetupActionResult(podInitActionType, podInitReceiver, res, System.currentTimeMillis(), profile))); + Boolean res = executeCommand(() -> delegate.insertCannula(basalSchedule, omnipodAlertUtil.getExpirationReminderTimeBeforeShutdown(), omnipodAlertUtil.getLowReservoirAlertUnits())) // + .blockingGet(); + + result.success(res).enacted(res); + if (!res) { + result.comment(R.string.omnipod_error_failed_to_insert_cannula); + } } catch (Exception ex) { - String errorMessage = translateException(ex); - podInitReceiver.returnInitTaskStatus(podInitActionType, false, errorMessage); - addFailureToHistory(PodHistoryEntryType.FILL_CANNULA_SET_BASAL_PROFILE, errorMessage); - return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); + result.success(false).enacted(false).comment(translateException(ex)); } - uploadCareportalEvent(System.currentTimeMillis() - 2000, CareportalEvent.PUMPBATTERYCHANGE); - uploadCareportalEvent(System.currentTimeMillis() - 1000, CareportalEvent.INSULINCHANGE); - uploadCareportalEvent(System.currentTimeMillis(), CareportalEvent.SITECHANGE); + addToHistory(System.currentTimeMillis(), PodHistoryEntryType.INSERT_CANNULA, result.comment, result.success); - rxBus.send(new EventDismissNotification(Notification.OMNIPOD_POD_NOT_ATTACHED)); + if (result.success) { + uploadCareportalEvent(System.currentTimeMillis() - 2000, CareportalEvent.PUMPBATTERYCHANGE); + uploadCareportalEvent(System.currentTimeMillis() - 1000, CareportalEvent.INSULINCHANGE); + uploadCareportalEvent(System.currentTimeMillis(), CareportalEvent.SITECHANGE); - cancelSuspendedFakeTbrIfExists(); + sendEvent(new EventDismissNotification(Notification.OMNIPOD_POD_NOT_ATTACHED)); - return new PumpEnactResult(injector).success(true).enacted(true); + cancelSuspendedFakeTbrIfExists(); + } + + return result; } public PumpEnactResult configureAlerts(List alertConfigurations) { @@ -234,19 +238,17 @@ public class AapsOmnipodManager { return new PumpEnactResult(injector).success(true).enacted(false); } - public PumpEnactResult deactivatePod(PodInitReceiver podInitReceiver) { + public PumpEnactResult deactivatePod() { try { executeCommand(delegate::deactivatePod); } catch (Exception ex) { String errorMessage = translateException(ex); - podInitReceiver.returnInitTaskStatus(PodInitActionType.DEACTIVATE_POD_WIZARD_STEP, false, errorMessage); addFailureToHistory(PodHistoryEntryType.DEACTIVATE_POD, errorMessage); return new PumpEnactResult(injector).success(false).enacted(false).comment(errorMessage); } addSuccessToHistory(PodHistoryEntryType.DEACTIVATE_POD, null); createSuspendedFakeTbrIfNotExists(); - podInitReceiver.returnInitTaskStatus(PodInitActionType.DEACTIVATE_POD_WIZARD_STEP, true, null); return new PumpEnactResult(injector).success(true).enacted(true); } @@ -297,7 +299,7 @@ public class AapsOmnipodManager { if (historyEntryType == PodHistoryEntryType.RESUME_DELIVERY) { cancelSuspendedFakeTbrIfExists(); - rxBus.send(new EventDismissNotification(Notification.OMNIPOD_POD_SUSPENDED)); + sendEvent(new EventDismissNotification(Notification.OMNIPOD_POD_SUSPENDED)); } addSuccessToHistory(historyEntryType, profile.getBasalValues()); @@ -315,6 +317,9 @@ public class AapsOmnipodManager { createSuspendedFakeTbrIfNotExists(); + sendEvent(new EventOmnipodPumpValuesChanged()); + rxBus.send(new EventRefreshOverview("Omnipod command: " + OmnipodCommandType.DISCARD_POD, false)); + return new PumpEnactResult(injector).success(true).enacted(true); } @@ -694,7 +699,8 @@ public class AapsOmnipodManager { return addSuccessToHistory(System.currentTimeMillis(), entryType, data); } - private long addSuccessToHistory(long requestTime, PodHistoryEntryType entryType, Object data) { + private long addSuccessToHistory(long requestTime, PodHistoryEntryType entryType, Object + data) { return addToHistory(requestTime, entryType, data, true); } @@ -702,11 +708,13 @@ public class AapsOmnipodManager { return addFailureToHistory(System.currentTimeMillis(), entryType, data); } - private long addFailureToHistory(long requestTime, PodHistoryEntryType entryType, Object data) { + private long addFailureToHistory(long requestTime, PodHistoryEntryType entryType, Object + data) { return addToHistory(requestTime, entryType, data, false); } - private long addToHistory(long requestTime, PodHistoryEntryType entryType, Object data, boolean success) { + private long addToHistory(long requestTime, PodHistoryEntryType entryType, Object data, + boolean success) { OmnipodHistoryRecord omnipodHistoryRecord = new OmnipodHistoryRecord(requestTime, entryType.getCode()); if (data != null) { @@ -725,30 +733,6 @@ public class AapsOmnipodManager { return omnipodHistoryRecord.getPumpId(); } - private void handleSetupActionResult(PodInitActionType podInitActionType, PodInitReceiver podInitReceiver, SetupActionResult res, long time, Profile profile) { - String comment = null; - switch (res.getResultType()) { - case FAILURE: { - aapsLogger.error(LTag.PUMP, "Setup action failed: illegal setup progress: {}", res.getPodProgressStatus()); - comment = getStringResource(R.string.omnipod_error_invalid_progress_state, res.getPodProgressStatus()); - } - break; - case VERIFICATION_FAILURE: { - aapsLogger.error(LTag.PUMP, "Setup action verification failed: caught exception", res.getException()); - comment = getStringResource(R.string.omnipod_error_setup_action_verification_failed); - } - break; - } - - if (podInitActionType == PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP) { - addToHistory(time, PodHistoryEntryType.PAIR_AND_PRIME, comment, res.getResultType().isSuccess()); - } else { - addToHistory(time, PodHistoryEntryType.FILL_CANNULA_SET_BASAL_PROFILE, res.getResultType().isSuccess() ? profile.getBasalValues() : comment, res.getResultType().isSuccess()); - } - - podInitReceiver.returnInitTaskStatus(podInitActionType, res.getResultType().isSuccess(), comment); - } - private void executeCommand(Runnable runnable) { try { runnable.run(); @@ -772,7 +756,9 @@ public class AapsOmnipodManager { aapsLogger.error(LTag.PUMP, String.format("Caught OmnipodException[certainFailure=%s] from OmnipodManager", ((OmnipodException) ex).isCertainFailure()), ex); if (ex instanceof PodFaultException) { FaultEventCode faultEventCode = ((PodFaultException) ex).getFaultEvent().getFaultEventCode(); - showPodFaultNotification(faultEventCode); + if (!(faultEventCode == FaultEventCode.NO_FAULTS && podStateManager.isPodInitialized() && podStateManager.getPodProgressStatus() == PodProgressStatus.ACTIVATION_TIME_EXCEEDED)) { + showPodFaultNotification(faultEventCode); + } } } else { aapsLogger.error(LTag.PUMP, "Caught an unexpected non-OmnipodException from OmnipodManager", ex); @@ -827,10 +813,11 @@ public class AapsOmnipodManager { } private String createPodFaultErrorMessage(FaultEventCode faultEventCode) { - String comment; - comment = getStringResource(R.string.omnipod_error_pod_fault, + if (faultEventCode == FaultEventCode.NO_FAULTS && podStateManager.getPodProgressStatus() == PodProgressStatus.ACTIVATION_TIME_EXCEEDED) { + return getStringResource(R.string.omnipod_error_pod_fault_activation_time_exceeded); + } + return getStringResource(R.string.omnipod_error_pod_fault, ByteUtil.convertUnsignedByteToInt(faultEventCode.getValue()), faultEventCode.name()); - return comment; } private void sendEvent(Event event) { diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java new file mode 100644 index 0000000000..3921ec19d7 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java @@ -0,0 +1,7 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.queue.command; + +public final class CommandDeactivatePod extends OmnipodCustomCommand { + public CommandDeactivatePod() { + super(OmnipodCustomCommandType.DEACTIVATE_POD); + } +} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java index ad1cd46652..e6df62c47b 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/OmnipodCustomCommandType.java @@ -6,6 +6,7 @@ public enum OmnipodCustomCommandType { READ_PULSE_LOG("READ PULSE LOG"), SUSPEND_DELIVERY("SUSPEND DELIVERY"), RESUME_DELIVERY("RESUME DELIVERY"), + DEACTIVATE_POD("DEACTIVATE POD"), HANDLE_TIME_CHANGE("HANDLE TIME CHANGE"), UPDATE_ALERT_CONFIGURATION("UPDATE ALERT CONFIGURATION"); diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java index 3dca3d3228..adb9e97e69 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/rileylink/manager/OmnipodRileyLinkCommunicationManager.java @@ -241,6 +241,7 @@ public class OmnipodRileyLinkCommunicationManager extends RileyLinkCommunication byte[] receivedMessageData = response.getEncodedMessage(); while (receivedMessage == null) { try { + aapsLogger.debug(LTag.PUMPBTCOMM, "Attempting to decode message: {}", ByteUtil.shortHexStringWithoutSpaces(receivedMessageData)); receivedMessage = OmnipodMessage.decodeMessage(receivedMessageData); if (receivedMessage.getAddress() != message.getAddress()) { throw new IllegalMessageAddressException(message.getAddress(), receivedMessage.getAddress()); diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodOverviewFragment.kt similarity index 73% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodFragment.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodOverviewFragment.kt index 5ffe10db0b..055e7550d2 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodFragment.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/OmnipodOverviewFragment.kt @@ -29,7 +29,6 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateMa import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.* -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.ReplacePodWizardActivity import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.queue.events.EventQueueChanged @@ -44,8 +43,7 @@ import info.nightscout.androidaps.utils.sharedPreferences.SP import info.nightscout.androidaps.utils.ui.UIRunnable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable -import io.reactivex.schedulers.Schedulers -import kotlinx.android.synthetic.main.omnipod_fragment.* +import kotlinx.android.synthetic.main.omnipod_overview.* import org.apache.commons.lang3.StringUtils import org.joda.time.DateTime import org.joda.time.Duration @@ -53,10 +51,10 @@ import java.util.* import javax.inject.Inject import kotlin.collections.ArrayList -class OmnipodFragment : DaggerFragment() { +class OmnipodOverviewFragment : DaggerFragment() { companion object { - private val REFRESH_INTERVAL_MILLIS = 15 * 1000L; // 15 seconds - private val PLACEHOLDER = "-"; // 15 seconds + private val REFRESH_INTERVAL_MILLIS = 15 * 1000L // 15 seconds + private val PLACEHOLDER = "-" // 15 seconds } @Inject lateinit var fabricPrivacy: FabricPrivacy @@ -87,17 +85,13 @@ class OmnipodFragment : DaggerFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.omnipod_fragment, container, false) + return inflater.inflate(R.layout.omnipod_overview, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - omnipod_button_replace_pod.setOnClickListener { - startActivity(Intent(context, ReplacePodWizardActivity::class.java)) - } - - omnipod_button_pod_mgmt.setOnClickListener { + omnipod_overview_button_pod_management.setOnClickListener { if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) { activity?.let { activity -> protectionCheck.queryProtection( @@ -110,19 +104,19 @@ class OmnipodFragment : DaggerFragment() { } } - omnipod_button_resume_delivery.setOnClickListener { + omnipod_overview_button_resume_delivery.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandResumeDelivery(), DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_resume_delivery), true).messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_delivery_resumed))) } - omnipod_button_refresh_status.setOnClickListener { + omnipod_overview_button_refresh_status.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandGetPodStatus(), DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_refresh_status), false)) } - omnipod_button_rileylink_stats.setOnClickListener { + omnipod_overview_button_rileylink_stats.setOnClickListener { if (omnipodPumpPlugin.rileyLinkService?.verifyConfiguration() == true) { startActivity(Intent(context, RileyLinkStatusActivity::class.java)) } else { @@ -130,28 +124,28 @@ class OmnipodFragment : DaggerFragment() { } } - omnipod_button_acknowledge_active_alerts.setOnClickListener { + omnipod_overview_button_acknowledge_active_alerts.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandAcknowledgeAlerts(), DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_acknowledge_alerts), false) .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_acknowledged_alerts))) } - omnipod_button_suspend_delivery.setOnClickListener { + omnipod_overview_button_suspend_delivery.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandSuspendDelivery(), DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_suspend_delivery), true) .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_suspended_delivery))) } - omnipod_button_set_time.setOnClickListener { + omnipod_overview_button_set_time.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandHandleTimeChange(true), DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_set_time), true) .messageOnSuccess(resourceHelper.gs(R.string.omnipod_confirmation_time_on_pod_updated))) } - omnipod_button_pulse_log.setOnClickListener { + omnipod_overview_button_pulse_log.setOnClickListener { disablePodActionButtons() commandQueue.customCommand(CommandReadPulseLog(), DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_error_failed_to_read_pulse_log), false)) @@ -184,7 +178,7 @@ class OmnipodFragment : DaggerFragment() { }, { fabricPrivacy.logException(it) }) disposables += rxBus .toObservable(EventPreferenceChange::class.java) - .observeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) .subscribe({ updatePodActionButtons() }, { fabricPrivacy.logException(it) }) @@ -211,7 +205,7 @@ class OmnipodFragment : DaggerFragment() { val resourceId = rileyLinkServiceState.getResourceId() val rileyLinkError = rileyLinkServiceData.rileyLinkError - omnipod_rl_status.text = + omnipod_overview_riley_link_status.text = when { rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId) rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId) @@ -219,7 +213,7 @@ class OmnipodFragment : DaggerFragment() { rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.Omnipod)) else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId) } - omnipod_rl_status.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE) + omnipod_overview_riley_link_status.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE) } private fun updateOmnipodStatus() { @@ -237,41 +231,41 @@ class OmnipodFragment : DaggerFragment() { } if (!podStateManager.hasPodState() || !podStateManager.isPodInitialized) { - omnipod_pod_address.text = if (podStateManager.hasPodState()) { + omnipod_overview_pod_address.text = if (podStateManager.hasPodState()) { podStateManager.address.toString() } else { PLACEHOLDER } - omnipod_pod_lot.text = PLACEHOLDER - omnipod_pod_tid.text = PLACEHOLDER - omnipod_pod_firmware_version.text = PLACEHOLDER - omnipod_time_on_pod.text = PLACEHOLDER - omnipod_pod_expiry.text = PLACEHOLDER - omnipod_pod_expiry.setTextColor(Color.WHITE) - omnipod_base_basal_rate.text = PLACEHOLDER - omnipod_total_delivered.text = PLACEHOLDER - omnipod_reservoir.text = PLACEHOLDER - omnipod_reservoir.setTextColor(Color.WHITE) - omnipod_pod_active_alerts.text = PLACEHOLDER + omnipod_overview_pod_lot.text = PLACEHOLDER + omnipod_overview_pod_tid.text = PLACEHOLDER + omnipod_overview_firmware_version.text = PLACEHOLDER + omnipod_overview_time_on_pod.text = PLACEHOLDER + omnipod_overview_pod_expiry_date.text = PLACEHOLDER + omnipod_overview_pod_expiry_date.setTextColor(Color.WHITE) + omnipod_overview_base_basal_rate.text = PLACEHOLDER + omnipod_overview_total_delivered.text = PLACEHOLDER + omnipod_overview_reservoir.text = PLACEHOLDER + omnipod_overview_reservoir.setTextColor(Color.WHITE) + omnipod_overview_pod_active_alerts.text = PLACEHOLDER } else { - omnipod_pod_address.text = podStateManager.address.toString() - omnipod_pod_lot.text = podStateManager.lot.toString() - omnipod_pod_tid.text = podStateManager.tid.toString() - omnipod_pod_firmware_version.text = resourceHelper.gs(R.string.omnipod_pod_firmware_version_value, podStateManager.pmVersion.toString(), podStateManager.piVersion.toString()) + omnipod_overview_pod_address.text = podStateManager.address.toString() + omnipod_overview_pod_lot.text = podStateManager.lot.toString() + omnipod_overview_pod_tid.text = podStateManager.tid.toString() + omnipod_overview_firmware_version.text = resourceHelper.gs(R.string.omnipod_firmware_version_value, podStateManager.pmVersion.toString(), podStateManager.piVersion.toString()) - omnipod_time_on_pod.text = readableZonedTime(podStateManager.time) - omnipod_time_on_pod.setTextColor(if (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5))) { + omnipod_overview_time_on_pod.text = readableZonedTime(podStateManager.time) + omnipod_overview_time_on_pod.setTextColor(if (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5))) { Color.RED } else { Color.WHITE }) val expiresAt = podStateManager.expiresAt if (expiresAt == null) { - omnipod_pod_expiry.text = PLACEHOLDER - omnipod_pod_expiry.setTextColor(Color.WHITE) + omnipod_overview_pod_expiry_date.text = PLACEHOLDER + omnipod_overview_pod_expiry_date.setTextColor(Color.WHITE) } else { - omnipod_pod_expiry.text = readableZonedTime(expiresAt) - omnipod_pod_expiry.setTextColor(if (DateTime.now().isAfter(expiresAt)) { + omnipod_overview_pod_expiry_date.text = readableZonedTime(expiresAt) + omnipod_overview_pod_expiry_date.setTextColor(if (DateTime.now().isAfter(expiresAt)) { Color.RED } else { Color.WHITE @@ -286,29 +280,29 @@ class OmnipodFragment : DaggerFragment() { val now = DateTime.now() // base basal rate - omnipod_base_basal_rate.text = if (podStateManager.isPodActivationCompleted) { + omnipod_overview_base_basal_rate.text = if (podStateManager.isPodActivationCompleted) { resourceHelper.gs(R.string.pump_basebasalrate, omnipodPumpPlugin.model().determineCorrectBasalSize(podStateManager.basalSchedule.rateAt(Duration(now.withTimeAtStartOfDay(), now)))) } else { PLACEHOLDER } // total delivered - omnipod_total_delivered.text = if (podStateManager.isPodActivationCompleted && podStateManager.totalInsulinDelivered != null) { - resourceHelper.gs(R.string.omnipod_total_delivered, podStateManager.totalInsulinDelivered - OmnipodConstants.POD_SETUP_UNITS) + omnipod_overview_total_delivered.text = if (podStateManager.isPodActivationCompleted && podStateManager.totalInsulinDelivered != null) { + resourceHelper.gs(R.string.omnipod_overview_total_delivered_value, podStateManager.totalInsulinDelivered - OmnipodConstants.POD_SETUP_UNITS) } else { PLACEHOLDER } // reservoir if (podStateManager.reservoirLevel == null) { - omnipod_reservoir.text = resourceHelper.gs(R.string.omnipod_reservoir_over50) - omnipod_reservoir.setTextColor(Color.WHITE) + omnipod_overview_reservoir.text = resourceHelper.gs(R.string.omnipod_overview_reservoir_value_over50) + omnipod_overview_reservoir.setTextColor(Color.WHITE) } else { - omnipod_reservoir.text = resourceHelper.gs(R.string.omnipod_reservoir_left, podStateManager.reservoirLevel) - warnColors.setColorInverse(omnipod_reservoir, podStateManager.reservoirLevel, 50.0, 20.0) + omnipod_overview_reservoir.text = resourceHelper.gs(R.string.omnipod_overview_reservoir_value, podStateManager.reservoirLevel) + warnColors.setColorInverse(omnipod_overview_reservoir, podStateManager.reservoirLevel, 50.0, 20.0) } - omnipod_pod_active_alerts.text = if (podStateManager.hasActiveAlerts()) { + omnipod_overview_pod_active_alerts.text = if (podStateManager.hasActiveAlerts()) { TextUtils.join(System.lineSeparator(), omnipodUtil.getTranslatedActiveAlerts(podStateManager)) } else { PLACEHOLDER @@ -316,27 +310,27 @@ class OmnipodFragment : DaggerFragment() { } if (errors.size == 0) { - omnipod_errors.text = PLACEHOLDER - omnipod_errors.setTextColor(Color.WHITE) + omnipod_overview_errors.text = PLACEHOLDER + omnipod_overview_errors.setTextColor(Color.WHITE) } else { - omnipod_errors.text = StringUtils.join(errors, System.lineSeparator()) - omnipod_errors.setTextColor(Color.RED) + omnipod_overview_errors.text = StringUtils.join(errors, System.lineSeparator()) + omnipod_overview_errors.setTextColor(Color.RED) } } private fun updateLastConnection() { if (podStateManager.isPodInitialized && podStateManager.lastSuccessfulCommunication != null) { - omnipod_last_connection.text = readableDuration(podStateManager.lastSuccessfulCommunication) + omnipod_overview_last_connection.text = readableDuration(podStateManager.lastSuccessfulCommunication) val lastConnectionColor = if (omnipodPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) { Color.RED } else { Color.WHITE } - omnipod_last_connection.setTextColor(lastConnectionColor) + omnipod_overview_last_connection.setTextColor(lastConnectionColor) } else { - omnipod_last_connection.setTextColor(Color.WHITE) - omnipod_last_connection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) { + omnipod_overview_last_connection.setTextColor(Color.WHITE) + omnipod_overview_last_connection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) { readableDuration(podStateManager.lastSuccessfulCommunication) } else { PLACEHOLDER @@ -345,16 +339,16 @@ class OmnipodFragment : DaggerFragment() { } private fun updatePodStatus() { - omnipod_pod_status.text = if (!podStateManager.hasPodState()) { + omnipod_overview_pod_status.text = if (!podStateManager.hasPodState()) { resourceHelper.gs(R.string.omnipod_pod_status_no_active_pod) } else if (!podStateManager.isPodActivationCompleted) { if (!podStateManager.isPodInitialized) { - resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_pair_and_prime) + resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_activation) } else { if (PodProgressStatus.ACTIVATION_TIME_EXCEEDED == podStateManager.podProgressStatus) { resourceHelper.gs(R.string.omnipod_pod_status_activation_time_exceeded) } else if (podStateManager.podProgressStatus.isBefore(PodProgressStatus.PRIMING_COMPLETED)) { - resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_pair_and_prime) + resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_activation) } else { resourceHelper.gs(R.string.omnipod_pod_status_waiting_for_cannula_insertion) } @@ -380,12 +374,12 @@ class OmnipodFragment : DaggerFragment() { } else { Color.WHITE } - omnipod_pod_status.setTextColor(podStatusColor) + omnipod_overview_pod_status.setTextColor(podStatusColor) } private fun updateLastBolus() { if (podStateManager.isPodActivationCompleted && podStateManager.hasLastBolus()) { - var text = resourceHelper.gs(R.string.omnipod_last_bolus_value, omnipodPumpPlugin.model().determineCorrectBolusSize(podStateManager.lastBolusAmount), resourceHelper.gs(R.string.insulin_unit_shortname), readableDuration(podStateManager.lastBolusStartTime)) + var text = resourceHelper.gs(R.string.omnipod_overview_last_bolus_value, omnipodPumpPlugin.model().determineCorrectBolusSize(podStateManager.lastBolusAmount), resourceHelper.gs(R.string.insulin_unit_shortname), readableDuration(podStateManager.lastBolusStartTime)) val textColor: Int if (podStateManager.isLastBolusCertain) { @@ -395,12 +389,12 @@ class OmnipodFragment : DaggerFragment() { text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")" } - omnipod_last_bolus.text = text - omnipod_last_bolus.setTextColor(textColor) + omnipod_overview_last_bolus.text = text + omnipod_overview_last_bolus.setTextColor(textColor) } else { - omnipod_last_bolus.text = PLACEHOLDER - omnipod_last_bolus.setTextColor(Color.WHITE) + omnipod_overview_last_bolus.text = PLACEHOLDER + omnipod_overview_last_bolus.setTextColor(Color.WHITE) } } @@ -416,7 +410,7 @@ class OmnipodFragment : DaggerFragment() { var text: String val textColor: Int - text = resourceHelper.gs(R.string.omnipod_temp_basal_value, amount, dateUtil.timeString(startTime.millis), minutesRunning, duration.standardMinutes) + text = resourceHelper.gs(R.string.omnipod_overview_temp_basal_value, amount, dateUtil.timeString(startTime.millis), minutesRunning, duration.standardMinutes) if (podStateManager.isTempBasalCertain) { textColor = Color.WHITE } else { @@ -424,20 +418,20 @@ class OmnipodFragment : DaggerFragment() { text += " (" + resourceHelper.gs(R.string.omnipod_uncertain) + ")" } - omnipod_temp_basal.text = text - omnipod_temp_basal.setTextColor(textColor) + omnipod_overview_temp_basal.text = text + omnipod_overview_temp_basal.setTextColor(textColor) } else { - omnipod_temp_basal.text = PLACEHOLDER - omnipod_temp_basal.setTextColor(Color.WHITE) + omnipod_overview_temp_basal.text = PLACEHOLDER + omnipod_overview_temp_basal.setTextColor(Color.WHITE) } } private fun updateQueueStatus() { if (isQueueEmpty()) { - omnipod_queue.visibility = View.GONE + omnipod_overview_queue.visibility = View.GONE } else { - omnipod_queue.visibility = View.VISIBLE - omnipod_queue.text = commandQueue.spannedStatus().toString() + omnipod_overview_queue.visibility = View.VISIBLE + omnipod_overview_queue.text = commandQueue.spannedStatus().toString() } } @@ -451,62 +445,62 @@ class OmnipodFragment : DaggerFragment() { } private fun disablePodActionButtons() { - omnipod_button_acknowledge_active_alerts.isEnabled = false - omnipod_button_resume_delivery.isEnabled = false - omnipod_button_suspend_delivery.isEnabled = false - omnipod_button_set_time.isEnabled = false - omnipod_button_refresh_status.isEnabled = false - omnipod_button_pulse_log.isEnabled = false + omnipod_overview_button_acknowledge_active_alerts.isEnabled = false + omnipod_overview_button_resume_delivery.isEnabled = false + omnipod_overview_button_suspend_delivery.isEnabled = false + omnipod_overview_button_set_time.isEnabled = false + omnipod_overview_button_refresh_status.isEnabled = false + omnipod_overview_button_pulse_log.isEnabled = false } private fun updateRefreshStatusButton() { - omnipod_button_refresh_status.isEnabled = podStateManager.isPodInitialized && podStateManager.podProgressStatus.isAtLeast(PodProgressStatus.PAIRING_COMPLETED) + omnipod_overview_button_refresh_status.isEnabled = podStateManager.isPodInitialized && podStateManager.podProgressStatus.isAtLeast(PodProgressStatus.PAIRING_COMPLETED) && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() } private fun updateResumeDeliveryButton() { if (podStateManager.isPodRunning && (podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandResumeDelivery::class.java))) { - omnipod_button_resume_delivery.visibility = View.VISIBLE - omnipod_button_resume_delivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() + omnipod_overview_button_resume_delivery.visibility = View.VISIBLE + omnipod_overview_button_resume_delivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() } else { - omnipod_button_resume_delivery.visibility = View.GONE + omnipod_overview_button_resume_delivery.visibility = View.GONE } } private fun updateAcknowledgeAlertsButton() { if (podStateManager.isPodRunning && (podStateManager.hasActiveAlerts() || commandQueue.isCustomCommandInQueue(CommandAcknowledgeAlerts::class.java))) { - omnipod_button_acknowledge_active_alerts.visibility = View.VISIBLE - omnipod_button_acknowledge_active_alerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() + omnipod_overview_button_acknowledge_active_alerts.visibility = View.VISIBLE + omnipod_overview_button_acknowledge_active_alerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() } else { - omnipod_button_acknowledge_active_alerts.visibility = View.GONE + omnipod_overview_button_acknowledge_active_alerts.visibility = View.GONE } } private fun updateSuspendDeliveryButton() { // If the Pod is currently suspended, we show the Resume delivery button instead. if (omnipodManager.isSuspendDeliveryButtonEnabled && podStateManager.isPodRunning && (!podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandSuspendDelivery::class.java))) { - omnipod_button_suspend_delivery.visibility = View.VISIBLE - omnipod_button_suspend_delivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() + omnipod_overview_button_suspend_delivery.visibility = View.VISIBLE + omnipod_overview_button_suspend_delivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() } else { - omnipod_button_suspend_delivery.visibility = View.GONE + omnipod_overview_button_suspend_delivery.visibility = View.GONE } } private fun updateSetTimeButton() { if (podStateManager.isPodRunning && (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5)) || commandQueue.isCustomCommandInQueue(CommandHandleTimeChange::class.java))) { - omnipod_button_set_time.visibility = View.VISIBLE - omnipod_button_set_time.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() + omnipod_overview_button_set_time.visibility = View.VISIBLE + omnipod_overview_button_set_time.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() } else { - omnipod_button_set_time.visibility = View.GONE + omnipod_overview_button_set_time.visibility = View.GONE } } private fun updatePulseLogButton() { if (omnipodManager.isPulseLogButtonEnabled) { - omnipod_button_pulse_log.visibility = View.VISIBLE - omnipod_button_pulse_log.isEnabled = podStateManager.isPodActivationCompleted && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() + omnipod_overview_button_pulse_log.visibility = View.VISIBLE + omnipod_overview_button_pulse_log.isEnabled = podStateManager.isPodActivationCompleted && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() } else { - omnipod_button_pulse_log.visibility = View.GONE + omnipod_overview_button_pulse_log.visibility = View.GONE } } @@ -548,7 +542,7 @@ class OmnipodFragment : DaggerFragment() { val isDaylightTime = timeZone.inDaylightTime(timeAsJavaData) val locale = resources.configuration.locales.get(0) val timeZoneDisplayName = timeZone.getDisplayName(isDaylightTime, TimeZone.SHORT, locale) + " " + timeZone.getDisplayName(isDaylightTime, TimeZone.LONG, locale) - return resourceHelper.gs(R.string.omnipod_pod_time_with_timezone, dateUtil.dateAndTimeString(timeAsJavaData), timeZoneDisplayName) + return resourceHelper.gs(R.string.omnipod_time_with_timezone, dateUtil.dateAndTimeString(timeAsJavaData), timeZoneDisplayName) } private fun readableDuration(dateTime: DateTime): String { diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java index 6f3b627842..ad81185d5c 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodHistoryActivity.java @@ -254,7 +254,7 @@ public class PodHistoryActivity extends NoSplashAppCompatActivity { } break; - case FILL_CANNULA_SET_BASAL_PROFILE: + case INSERT_CANNULA: case SET_BASAL_SCHEDULE: { if (historyEntry.getData() != null) { setProfileValue(historyEntry.getData(), valueView); @@ -275,7 +275,7 @@ public class PodHistoryActivity extends NoSplashAppCompatActivity { case GET_POD_STATUS: case GET_POD_INFO: case SET_TIME: - case PAIR_AND_PRIME: + case ACTIVATE_POD: case CANCEL_TEMPORARY_BASAL_BY_DRIVER: case CANCEL_TEMPORARY_BASAL: case CONFIGURE_ALERTS: diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt index 47567445bb..27f730ef0d 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/PodManagementActivity.kt @@ -4,11 +4,6 @@ import android.content.Intent import android.os.Bundle import android.view.View import android.widget.LinearLayout -import androidx.fragment.app.FragmentStatePagerAdapter -import com.atech.android.library.wizardpager.WizardPagerActivity -import com.atech.android.library.wizardpager.WizardPagerContext -import com.atech.android.library.wizardpager.data.WizardPagerSettings -import com.atech.android.library.wizardpager.defs.WizardStepsWayType import dagger.android.HasAndroidInjector import info.nightscout.androidaps.activities.NoSplashAppCompatActivity import info.nightscout.androidaps.interfaces.CommandQueueProvider @@ -16,21 +11,17 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData import info.nightscout.androidaps.plugins.pump.omnipod.R -import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model.FullInitPodWizardModel -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model.RemovePodWizardModel -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model.ShortInitPodWizardModel -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.ReplacePodWizardActivity +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.ChangePodWizardActivity import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.extensions.plusAssign import info.nightscout.androidaps.utils.resources.ResourceHelper import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable -import kotlinx.android.synthetic.main.omnipod_pod_mgmt.* +import kotlinx.android.synthetic.main.omnipod_pod_management.* import javax.inject.Inject /** @@ -51,26 +42,18 @@ class PodManagementActivity : NoSplashAppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.omnipod_pod_mgmt) + setContentView(R.layout.omnipod_pod_management) - initpod_init_pod.setOnClickListener { - initPodAction() - } - - initpod_replace_pod.setOnClickListener { - val myIntent = Intent(this@PodManagementActivity, ReplacePodWizardActivity::class.java) + omnipod_pod_management_button_change_pod.setOnClickListener { + val myIntent = Intent(this@PodManagementActivity, ChangePodWizardActivity::class.java) this@PodManagementActivity.startActivity(myIntent) } - initpod_remove_pod.setOnClickListener { - deactivatePodAction() - } - - initpod_reset_pod.setOnClickListener { + omnipod_pod_management_button_discard_pod.setOnClickListener { discardPodAction() } - initpod_pod_history.setOnClickListener { + omnipod_pod_management_button_pod_history.setOnClickListener { showPodHistory() } } @@ -94,57 +77,10 @@ class PodManagementActivity : NoSplashAppCompatActivity() { disposables.clear() } - private fun initPodAction() { - - val pagerSettings = WizardPagerSettings() - pagerSettings.setWizardStepsWayType(WizardStepsWayType.CancelNext) - pagerSettings.setFinishStringResourceId(R.string.close) - pagerSettings.setFinishButtonBackground(R.drawable.finish_background) - pagerSettings.setNextButtonBackground(R.drawable.selectable_item_background) - pagerSettings.setBackStringResourceId(R.string.cancel) - pagerSettings.pagerAdapterBehavior = FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT - - val wizardPagerContext = WizardPagerContext.getInstance() - - wizardPagerContext.clearContext() - wizardPagerContext.pagerSettings = pagerSettings - val isFullInit = !podStateManager.isPodInitialized || podStateManager.podProgressStatus.isBefore(PodProgressStatus.PRIMING_COMPLETED) - if (isFullInit) { - wizardPagerContext.wizardModel = FullInitPodWizardModel(applicationContext) - } else { - wizardPagerContext.wizardModel = ShortInitPodWizardModel(applicationContext) - } - - val myIntent = Intent(this@PodManagementActivity, WizardPagerActivity::class.java) - this@PodManagementActivity.startActivity(myIntent) - } - - private fun deactivatePodAction() { - val pagerSettings = WizardPagerSettings() - - pagerSettings.setWizardStepsWayType(WizardStepsWayType.CancelNext) - pagerSettings.setFinishStringResourceId(R.string.close) - pagerSettings.setFinishButtonBackground(R.drawable.finish_background) - pagerSettings.setNextButtonBackground(R.drawable.selectable_item_background) - pagerSettings.setBackStringResourceId(R.string.cancel) - pagerSettings.pagerAdapterBehavior = FragmentStatePagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT - - val wizardPagerContext = WizardPagerContext.getInstance(); - - wizardPagerContext.clearContext() - wizardPagerContext.pagerSettings = pagerSettings - wizardPagerContext.wizardModel = RemovePodWizardModel(applicationContext) - - val myIntent = Intent(this@PodManagementActivity, WizardPagerActivity::class.java) - this@PodManagementActivity.startActivity(myIntent) - - } - private fun discardPodAction() { OKDialog.showConfirmation(this, - resourceHelper.gs(R.string.omnipod_discard_pod_state_confirmation), Thread { + resourceHelper.gs(R.string.omnipod_pod_management_discard_pod_state_confirmation), Thread { aapsOmnipodManager.discardPodState() - rxBus.send(EventOmnipodPumpValuesChanged()) }) } @@ -153,20 +89,17 @@ class PodManagementActivity : NoSplashAppCompatActivity() { } private fun refreshButtons() { - initpod_init_pod.isEnabled = !podStateManager.isPodActivationCompleted - initpod_remove_pod.isEnabled = podStateManager.isPodInitialized - initpod_reset_pod.isEnabled = podStateManager.hasPodState() + omnipod_pod_management_button_change_pod.isEnabled = true + omnipod_pod_management_button_discard_pod.isEnabled = podStateManager.hasPodState() - val waitingForRlView = findViewById(R.id.initpod_waiting_for_rl_layout) + val waitingForRlLayout = findViewById(R.id.omnipod_pod_management_waiting_for_rl_layout) if (rileyLinkServiceData.rileyLinkServiceState.isReady) { - waitingForRlView.visibility = View.GONE + waitingForRlLayout.visibility = View.GONE } else { - // if rileylink is not running we disable all operations that require a RL connection - waitingForRlView.visibility = View.VISIBLE - initpod_init_pod.isEnabled = false - initpod_remove_pod.isEnabled = false - initpod_reset_pod.isEnabled = false + waitingForRlLayout.visibility = View.VISIBLE + omnipod_pod_management_button_change_pod.isEnabled = false + omnipod_pod_management_button_discard_pod.isEnabled = false } } diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/ReplacePodWizardActivity.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/ChangePodWizardActivity.kt similarity index 71% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/ReplacePodWizardActivity.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/ChangePodWizardActivity.kt index 1912162bff..bfdc60932a 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/ReplacePodWizardActivity.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/ChangePodWizardActivity.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2 +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard import android.app.AlertDialog import android.os.Bundle @@ -11,7 +11,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProg import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager import javax.inject.Inject -class ReplacePodWizardActivity : NoSplashAppCompatActivity() { +class ChangePodWizardActivity : NoSplashAppCompatActivity() { companion object { const val KEY_START_DESTINATION = "startDestination" } @@ -25,6 +25,8 @@ class ReplacePodWizardActivity : NoSplashAppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContentView(R.layout.omnipod_change_pod_wizard_activity) + startDestination = savedInstanceState?.getInt(KEY_START_DESTINATION, R.id.deactivatePodInfoFragment) ?: if (!podStateManager.isPodActivationCompleted) { if (!podStateManager.isPodInitialized || podStateManager.podProgressStatus.isBefore(PodProgressStatus.PRIMING_COMPLETED)) { @@ -36,29 +38,16 @@ class ReplacePodWizardActivity : NoSplashAppCompatActivity() { R.id.deactivatePodInfoFragment } - setContentView(R.layout.omnipod_replace_pod_wizard_activity) - - val navController = getNavController() - - if (savedInstanceState == null) { - val navInflater = navController.navInflater - val graph = navInflater.inflate(R.navigation.omnipod_replace_pod_wizard_navigation_graph) - - graph.startDestination = startDestination - navController.graph = graph - } - - navController.addOnDestinationChangedListener { controller, destination, _ -> - if (destination.id == R.id.deactivatePodInfoFragment) { - startDestination = R.id.deactivatePodInfoFragment - controller.graph.startDestination = R.id.deactivatePodInfoFragment - } - } + setStartDestination(startDestination) } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putInt(KEY_START_DESTINATION, startDestination) + fun setStartDestination(@IdRes startDestination: Int) { + this.startDestination = startDestination + val navController = getNavController() + val navInflater = navController.navInflater + val graph = navInflater.inflate(R.navigation.omnipod_change_pod_wizard_navigation_graph) + graph.startDestination = startDestination + navController.graph = graph } override fun onBackPressed() { @@ -71,14 +60,19 @@ class ReplacePodWizardActivity : NoSplashAppCompatActivity() { } else { AlertDialog.Builder(this) .setIcon(android.R.drawable.ic_dialog_alert) - .setTitle(getString(R.string.omnipod_replace_pod_wizard_replace_pod)) - .setMessage(getString(R.string.omnipod_replace_pod_wizard_exit_confirmation)) + .setTitle(getString(R.string.omnipod_change_pod_wizard_change_pod)) + .setMessage(getString(R.string.omnipod_change_pod_wizard_exit_confirmation)) .setPositiveButton(getString(R.string.omnipod_yes)) { _, _ -> finish() } .setNegativeButton(getString(R.string.omnipod_no), null) .show() } } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putInt(KEY_START_DESTINATION, startDestination) + } + private fun getNavController(): NavController = (supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java deleted file mode 100644 index 48380638c2..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java +++ /dev/null @@ -1,7 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.defs; - -public enum PodActionType { - INIT_POD, - DEACTIVATE_POD, - DISCARD_POD -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/FragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/ChangePodWizardFragmentBase.kt similarity index 55% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/FragmentBase.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/ChangePodWizardFragmentBase.kt index 9b6cfa57bb..5c5c1befef 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/FragmentBase.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/ChangePodWizardFragmentBase.kt @@ -1,4 +1,4 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment import android.content.res.ColorStateList import android.os.Bundle @@ -8,23 +8,24 @@ import android.view.ViewGroup import android.view.ViewStub import androidx.annotation.IdRes import androidx.annotation.LayoutRes +import androidx.annotation.StringRes import androidx.navigation.fragment.findNavController import dagger.android.support.DaggerFragment import info.nightscout.androidaps.plugins.pump.omnipod.R -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.ReplacePodWizardActivity -import kotlinx.android.synthetic.main.omnipod_replace_pod_wizard_base_fragment.* -import kotlinx.android.synthetic.main.omnipod_replace_pod_wizard_nav_buttons.* -import kotlinx.android.synthetic.main.omnipod_replace_pod_wizard_progress_indication.* +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.ChangePodWizardActivity +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_base_fragment.* +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_nav_buttons.* +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_progress_indication.* import kotlin.math.roundToInt -abstract class FragmentBase : DaggerFragment() { +abstract class ChangePodWizardFragmentBase : DaggerFragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val baseView = inflater.inflate(R.layout.omnipod_replace_pod_wizard_base_fragment, container, false) - val contentView = baseView.findViewById(R.id.omnipod_wizard_base_fragment_content) + val baseView = inflater.inflate(R.layout.omnipod_change_pod_wizard_base_fragment, container, false) + val contentView = baseView.findViewById(R.id.omnipod_change_pod_wizard_base_fragment_content) contentView?.let { it.layoutResource = getLayoutId() it.inflate() @@ -35,18 +36,18 @@ abstract class FragmentBase : DaggerFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - omnipod_wizard_base_fragment_title.text = getTitle() + omnipod_change_pod_wizard_base_fragment_title.setText(getTitleId()) val nextPage = getNextPageActionId() if (nextPage == null) { - omnipod_replace_pod_wizard_button_next.text = getString(R.string.omnipod_replace_pod_wizard_button_finish) - omnipod_replace_pod_wizard_button_next.backgroundTintList = ColorStateList.valueOf(resources.getColor(R.color.review_green, context?.theme)) + omnipod_change_pod_wizard_button_next.text = getString(R.string.omnipod_change_pod_wizard_button_finish) + omnipod_change_pod_wizard_button_next.backgroundTintList = ColorStateList.valueOf(resources.getColor(R.color.review_green, context?.theme)) } updateProgressIndication() - omnipod_replace_pod_wizard_button_next.setOnClickListener { + omnipod_change_pod_wizard_button_next.setOnClickListener { if (nextPage == null) { activity?.finish() } else { @@ -54,14 +55,16 @@ abstract class FragmentBase : DaggerFragment() { } } - omnipod_replace_pod_wizard_button_cancel.setOnClickListener { - (activity as? ReplacePodWizardActivity)?.exitActivityAfterConfirmation() + omnipod_change_pod_wizard_button_cancel.setOnClickListener { + (activity as? ChangePodWizardActivity)?.exitActivityAfterConfirmation() } } private fun updateProgressIndication() { + val findNavController = findNavController() + val graph = findNavController.graph val totalFragments = - when (findNavController().graph.startDestination) { + when (graph.startDestination) { R.id.fillPodInfoFragment -> { 8 - 3 } @@ -78,16 +81,17 @@ abstract class FragmentBase : DaggerFragment() { val currentFragment = getIndex() - (8 - totalFragments) val progressPercentage = (currentFragment / totalFragments.toDouble() * 100).roundToInt() - omnipod_replace_pod_wizard_progress_indication.progress = progressPercentage + omnipod_change_pod_wizard_progress_indication.progress = progressPercentage } @LayoutRes - abstract fun getLayoutId(): Int + protected abstract fun getLayoutId(): Int @IdRes - abstract fun getNextPageActionId(): Int? + protected abstract fun getNextPageActionId(): Int? - abstract fun getTitle(): String + @StringRes + protected abstract fun getTitleId(): Int - abstract fun getIndex(): Int + protected abstract fun getIndex(): Int } \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/ActionFragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/ActionFragmentBase.kt new file mode 100644 index 0000000000..d640cfedbd --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/ActionFragmentBase.kt @@ -0,0 +1,80 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action + +import android.os.Bundle +import android.view.View +import androidx.annotation.LayoutRes +import androidx.annotation.StringRes +import androidx.lifecycle.Observer +import info.nightscout.androidaps.plugins.pump.omnipod.R +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.ChangePodWizardFragmentBase +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.ActionViewModelBase +import info.nightscout.androidaps.utils.extensions.toVisibility +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_action_page_fragment.* +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_nav_buttons.* + +abstract class ActionFragmentBase : ChangePodWizardFragmentBase() { + protected lateinit var viewModel: ActionViewModelBase + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + omnipod_change_pod_wizard_button_next.isEnabled = false + omnipod_change_pod_wizard_action_page_text.setText(getTextId()) + + omnipod_change_pod_wizard_button_retry.setOnClickListener { viewModel.executeAction() } + + viewModel.isActionExecutingLiveData.observe(viewLifecycleOwner, Observer { isExecuting -> + if (isExecuting) { + omnipod_change_pod_wizard_action_error.visibility = View.GONE + omnipod_change_pod_wizard_button_deactivate_pod.visibility = View.GONE + omnipod_change_pod_wizard_button_discard_pod.visibility = View.GONE + omnipod_change_pod_wizard_button_retry.visibility = View.GONE + } + omnipod_change_pod_wizard_action_progress_indication.visibility = isExecuting.toVisibility() + omnipod_change_pod_wizard_button_cancel.isEnabled = !isExecuting + }) + + viewModel.actionResultLiveData.observe(viewLifecycleOwner, Observer { result -> + result?.let { + val isExecuting = isActionExecuting() + + omnipod_change_pod_wizard_button_next.isEnabled = result.success + omnipod_change_pod_wizard_action_success.visibility = result.success.toVisibility() + omnipod_change_pod_wizard_action_error.visibility = (!isExecuting && !result.success).toVisibility() + omnipod_change_pod_wizard_button_retry.visibility = (!isExecuting && !result.success).toVisibility() + + if (result.success) { + onActionSuccess() + } else { + omnipod_change_pod_wizard_action_error.text = result.comment + onActionFailure() + } + } + }) + + if (savedInstanceState == null && !isActionExecuting()) { + viewModel.executeAction() + } + + } + + protected fun isActionExecuting() = viewModel.isActionExecutingLiveData.value!! + + override fun onDestroyView() { + super.onDestroyView() + viewModel.isActionExecutingLiveData.removeObservers(viewLifecycleOwner) + viewModel.actionResultLiveData.removeObservers(viewLifecycleOwner) + } + + fun onActionSuccess() {} + + open fun onActionFailure() {} + + @StringRes + abstract fun getTextId(): Int + + @LayoutRes + override fun getLayoutId(): Int { + return R.layout.omnipod_change_pod_wizard_action_page_fragment + } +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/DeactivatePodActionFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/DeactivatePodActionFragment.kt new file mode 100644 index 0000000000..202889fdc0 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/DeactivatePodActionFragment.kt @@ -0,0 +1,64 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action + +import android.app.AlertDialog +import android.os.Bundle +import android.view.View +import androidx.annotation.IdRes +import androidx.annotation.StringRes +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import info.nightscout.androidaps.plugins.pump.omnipod.R +import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier +import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.DeactivatePodActionViewModel +import info.nightscout.androidaps.utils.extensions.toVisibility +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_action_page_fragment.* +import javax.inject.Inject + +class DeactivatePodActionFragment : ActionFragmentBase() { + @Inject + @OmnipodPluginQualifier + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var aapsOmnipodManager: AapsOmnipodManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val vm: DeactivatePodActionViewModel by viewModels { viewModelFactory } + this.viewModel = vm + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + omnipod_change_pod_wizard_button_discard_pod.setOnClickListener { + AlertDialog.Builder(context) + .setIcon(android.R.drawable.ic_dialog_alert) + .setTitle(getString(R.string.omnipod_change_pod_wizard_discard_pod)) + .setMessage(getString(R.string.omnipod_change_pod_wizard_discard_pod_confirmation)) + .setPositiveButton(getString(R.string.omnipod_yes)) { _, _ -> + aapsOmnipodManager.discardPodState() + findNavController().navigate(R.id.action_deactivatePodActionFragment_to_podDiscardedInfoFragment) + } + .setNegativeButton(getString(R.string.omnipod_no), null) + .show() + } + } + + override fun onActionFailure() { + omnipod_change_pod_wizard_button_discard_pod.visibility = (!isActionExecuting()).toVisibility() + } + + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_deactivating_pod_title + + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_deactivating_pod_text + + @IdRes + override fun getNextPageActionId(): Int = R.id.action_deactivatePodActionFragment_to_podDeactivatedInfoFragment + + override fun getIndex(): Int = 2 +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/InsertCannulaActionFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/InsertCannulaActionFragment.kt new file mode 100644 index 0000000000..ef9d2e5d39 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/InsertCannulaActionFragment.kt @@ -0,0 +1,61 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action + +import android.os.Bundle +import android.view.View +import androidx.annotation.IdRes +import androidx.annotation.StringRes +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import info.nightscout.androidaps.plugins.pump.omnipod.R +import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier +import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus +import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.ChangePodWizardActivity +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.InsertCannulaActionViewModel +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_action_page_fragment.* +import javax.inject.Inject + +class InsertCannulaActionFragment : ActionFragmentBase() { + @Inject + @OmnipodPluginQualifier + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var podStateManager: PodStateManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val vm: InsertCannulaActionViewModel by viewModels { viewModelFactory } + this.viewModel = vm + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + omnipod_change_pod_wizard_button_deactivate_pod.setOnClickListener { + (activity as? ChangePodWizardActivity)?.setStartDestination(R.id.deactivatePodInfoFragment) + findNavController().navigate(R.id.deactivatePodInfoFragment) + } + } + + override fun onActionFailure() { + if (podStateManager.isPodInitialized && podStateManager.podProgressStatus == PodProgressStatus.ACTIVATION_TIME_EXCEEDED) { + omnipod_change_pod_wizard_action_error.setText(R.string.omnipod_error_pod_fault_activation_time_exceeded) + omnipod_change_pod_wizard_button_retry.visibility = View.GONE + omnipod_change_pod_wizard_button_deactivate_pod.visibility = View.VISIBLE + } + } + + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_insert_cannula_title + + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_insert_cannula_text + + @IdRes + override fun getNextPageActionId(): Int = R.id.action_insertCannulaActionFragment_to_PodChangedInfoFragment + + override fun getIndex(): Int = 7 +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/PairAndPrimePodActionFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/PairAndPrimePodActionFragment.kt new file mode 100644 index 0000000000..f2054bc7ee --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/PairAndPrimePodActionFragment.kt @@ -0,0 +1,61 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.action + +import android.os.Bundle +import android.view.View +import androidx.annotation.IdRes +import androidx.annotation.StringRes +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import info.nightscout.androidaps.plugins.pump.omnipod.R +import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier +import info.nightscout.androidaps.plugins.pump.omnipod.driver.definition.PodProgressStatus +import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.ChangePodWizardActivity +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel.PairAndPrimePodActionViewModel +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_action_page_fragment.* +import javax.inject.Inject + +class PairAndPrimePodActionFragment : ActionFragmentBase() { + @Inject + @OmnipodPluginQualifier + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var podStateManager: PodStateManager + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val vm: PairAndPrimePodActionViewModel by viewModels { viewModelFactory } + this.viewModel = vm + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + omnipod_change_pod_wizard_button_deactivate_pod.setOnClickListener { + (activity as? ChangePodWizardActivity)?.setStartDestination(R.id.deactivatePodInfoFragment) + findNavController().navigate(R.id.deactivatePodInfoFragment) + } + } + + override fun onActionFailure() { + if (podStateManager.isPodInitialized && podStateManager.podProgressStatus == PodProgressStatus.ACTIVATION_TIME_EXCEEDED) { + omnipod_change_pod_wizard_action_error.setText(R.string.omnipod_error_pod_fault_activation_time_exceeded) + omnipod_change_pod_wizard_button_retry.visibility = View.GONE + omnipod_change_pod_wizard_button_deactivate_pod.visibility = View.VISIBLE + } + } + + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_activate_pod_title + + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_activate_pod_text + + @IdRes + override fun getNextPageActionId(): Int = R.id.action_pairAndPrimePodActionFragment_to_attachPodInfoFragment + + override fun getIndex(): Int = 5 +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/AttachPodInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/AttachPodInfoFragment.kt similarity index 51% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/AttachPodInfoFragment.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/AttachPodInfoFragment.kt index 0ddc5fe9fa..53eb8c4806 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/AttachPodInfoFragment.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/AttachPodInfoFragment.kt @@ -1,13 +1,18 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info +import androidx.annotation.IdRes +import androidx.annotation.StringRes import info.nightscout.androidaps.plugins.pump.omnipod.R class AttachPodInfoFragment : InfoFragmentBase() { - override fun getText(): String = "Attach the Pod" + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_attach_pod_title + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_attach_pod_text + + @IdRes override fun getNextPageActionId(): Int = R.id.action_attachPodInfoFragment_to_insertCannulaActionFragment - override fun getTitle(): String = "Attach Pod" - override fun getIndex(): Int = 6 } \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/DeactivatePodInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/DeactivatePodInfoFragment.kt similarity index 51% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/DeactivatePodInfoFragment.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/DeactivatePodInfoFragment.kt index ee80eda785..824a2e44b2 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/DeactivatePodInfoFragment.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/DeactivatePodInfoFragment.kt @@ -1,13 +1,18 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info +import androidx.annotation.IdRes +import androidx.annotation.StringRes import info.nightscout.androidaps.plugins.pump.omnipod.R class DeactivatePodInfoFragment : InfoFragmentBase() { - override fun getText(): String = "Deactivate the Pod" + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_deactivate_pod_title + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_deactivate_pod_text + + @IdRes override fun getNextPageActionId(): Int = R.id.action_deactivatePodInfoFragment_to_deactivatePodActionFragment - override fun getTitle(): String = "Deactivate Pod" - override fun getIndex(): Int = 1 } \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/FillPodInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/FillPodInfoFragment.kt similarity index 52% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/FillPodInfoFragment.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/FillPodInfoFragment.kt index 921e4f1406..1c7e2f24d8 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/FillPodInfoFragment.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/FillPodInfoFragment.kt @@ -1,13 +1,18 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info +import androidx.annotation.IdRes +import androidx.annotation.StringRes import info.nightscout.androidaps.plugins.pump.omnipod.R class FillPodInfoFragment : InfoFragmentBase() { - override fun getText(): String = "Fill the Pod" + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_fill_pod_title + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_fill_pod_text + + @IdRes override fun getNextPageActionId(): Int = R.id.action_fillPodInfoFragment_to_pairAndPrimePodActionFragment - override fun getTitle(): String = "Fill new Pod" - override fun getIndex(): Int = 4 } \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/InfoFragmentBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/InfoFragmentBase.kt new file mode 100644 index 0000000000..1a69cbd701 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/InfoFragmentBase.kt @@ -0,0 +1,27 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info + +import android.os.Bundle +import android.view.View +import androidx.annotation.LayoutRes +import androidx.annotation.StringRes +import info.nightscout.androidaps.plugins.pump.omnipod.R +import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.ChangePodWizardFragmentBase +import kotlinx.android.synthetic.main.omnipod_change_pod_wizard_info_page_fragment.* + +abstract class InfoFragmentBase : ChangePodWizardFragmentBase() { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + omnipod_change_pod_wizard_info_page_text.setText(getTextId()) + } + + @StringRes + abstract fun getTextId(): Int + + @LayoutRes + override fun getLayoutId(): Int { + return R.layout.omnipod_change_pod_wizard_info_page_fragment + } + +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodChangedInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodChangedInfoFragment.kt new file mode 100644 index 0000000000..d0f6cf0561 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodChangedInfoFragment.kt @@ -0,0 +1,18 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info + +import androidx.annotation.IdRes +import androidx.annotation.StringRes +import info.nightscout.androidaps.plugins.pump.omnipod.R + +class PodChangedInfoFragment : InfoFragmentBase() { + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_pod_changed_title + + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_pod_changed_text + + @IdRes + override fun getNextPageActionId(): Int? = null + + override fun getIndex(): Int = 8 +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/PodDeactivatedInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDeactivatedInfoFragment.kt similarity index 51% rename from omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/PodDeactivatedInfoFragment.kt rename to omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDeactivatedInfoFragment.kt index 41cecf28fe..5b3aef7870 100644 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/PodDeactivatedInfoFragment.kt +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDeactivatedInfoFragment.kt @@ -1,13 +1,18 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment.info +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info +import androidx.annotation.IdRes +import androidx.annotation.StringRes import info.nightscout.androidaps.plugins.pump.omnipod.R class PodDeactivatedInfoFragment : InfoFragmentBase() { - override fun getText(): String = "Please remove the Pod from your body" + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_pod_deactivated_title + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_pod_deactivated_text + + @IdRes override fun getNextPageActionId(): Int = R.id.action_podDeactivatedInfoFragment_to_fillPodInfoFragment - override fun getTitle(): String = "Remove Pod" - override fun getIndex(): Int = 3 } \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDiscardedInfoFragment.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDiscardedInfoFragment.kt new file mode 100644 index 0000000000..1e295f5331 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDiscardedInfoFragment.kt @@ -0,0 +1,18 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.fragment.info + +import androidx.annotation.IdRes +import androidx.annotation.StringRes +import info.nightscout.androidaps.plugins.pump.omnipod.R + +class PodDiscardedInfoFragment : InfoFragmentBase() { + @StringRes + override fun getTitleId(): Int = R.string.omnipod_change_pod_wizard_pod_discarded_title + + @StringRes + override fun getTextId(): Int = R.string.omnipod_change_pod_wizard_pod_discarded_text + + @IdRes + override fun getNextPageActionId(): Int = R.id.action_podDiscardedInfoFragment_to_fillPodInfoFragment + + override fun getIndex(): Int = 3 +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java deleted file mode 100644 index e05c86ec5b..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java +++ /dev/null @@ -1,223 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.graphics.Color; -import android.os.AsyncTask; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.LinearLayout; -import android.widget.ProgressBar; -import android.widget.TextView; - -import androidx.fragment.app.FragmentActivity; - -import com.atech.android.library.wizardpager.util.WizardPagesUtil; -import com.tech.freak.wizardpager.model.Page; -import com.tech.freak.wizardpager.ui.PageFragmentCallbacks; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -import javax.inject.Inject; - -import dagger.android.HasAndroidInjector; -import dagger.android.support.DaggerFragment; -import info.nightscout.androidaps.data.PumpEnactResult; -import info.nightscout.androidaps.plugins.pump.omnipod.R; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitReceiver; - -/** - * Created by andy on 12/11/2019 - */ -public class InitActionFragment extends DaggerFragment implements PodInitReceiver { - protected static final String ARG_KEY = "key"; - protected static final String ARG_POD_INIT_ACTION_TYPE = "podInitActionType"; - - private static boolean isFirstView; - - private PageFragmentCallbacks mCallbacks; - private String mKey; - protected InitActionPage mPage; - - protected ProgressBar progressBar; - protected TextView errorView; - protected Button retryButton; - - PodInitActionType podInitActionType; - private List children; - protected Map mapCheckBoxes; - - protected PumpEnactResult callResult; - - @Inject HasAndroidInjector injector; - - public static InitActionFragment create(String key, PodInitActionType podInitActionType) { - Bundle args = new Bundle(); - args.putString(ARG_KEY, key); - args.putSerializable(ARG_POD_INIT_ACTION_TYPE, podInitActionType); - - InitActionFragment fragment = new InitActionFragment(); - fragment.setArguments(args); - return fragment; - } - - @SuppressLint("SourceLockedOrientationActivity") - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState == null) { - isFirstView = true; - } - - getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - - Bundle args = getArguments(); - mKey = args.getString(ARG_KEY); - podInitActionType = (PodInitActionType) args.getSerializable(ARG_POD_INIT_ACTION_TYPE); - mPage = (InitActionPage) mCallbacks.onGetPage(mKey); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - super.onCreateView(inflater, container, savedInstanceState); - - View rootView = inflater.inflate(R.layout.omnipod_initpod_init_action, container, false); - WizardPagesUtil.setTitle(mPage, rootView); - - this.progressBar = rootView.findViewById(R.id.initAction_progressBar); - this.errorView = rootView.findViewById(R.id.initAction_textErrorMessage); - - TextView headerView = rootView.findViewById(R.id.initAction_header); - - LinearLayout linearLayout = rootView.findViewById(R.id.initAction_ItemsHolder); - - children = podInitActionType.getChildren(); - mapCheckBoxes = new HashMap<>(); - - for (PodInitActionType child : children) { - CheckBox checkBox1 = new CheckBox(getContext()); - checkBox1.setText(child.getResourceId()); - checkBox1.setClickable(false); - checkBox1.setTextAppearance(R.style.WizardPagePodListItem); - checkBox1.setHeight(120); - checkBox1.setTextSize(15); - checkBox1.setTextColor(headerView.getTextColors().getDefaultColor()); - - linearLayout.addView(checkBox1); - - mapCheckBoxes.put(child, checkBox1); - } - - if (podInitActionType == PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP) { - headerView.setText(R.string.omnipod_init_pod_wizard_step4_action_header); - } else if (podInitActionType == PodInitActionType.DEACTIVATE_POD_WIZARD_STEP) { - headerView.setText(R.string.omnipod_remove_pod_wizard_step2_action_header); - } - - this.retryButton = rootView.findViewById(R.id.initAction_RetryButton); - - this.retryButton.setOnClickListener(view -> { - - getActivity().runOnUiThread(() -> { - for (PodInitActionType actionType : mapCheckBoxes.keySet()) { - mapCheckBoxes.get(actionType).setChecked(false); - mapCheckBoxes.get(actionType).setTextColor(headerView.getTextColors().getDefaultColor()); - } - }); - - new InitPodTask(injector, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - }); - - return rootView; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - - FragmentActivity activity = getActivity(); - - if (!(activity instanceof PageFragmentCallbacks)) { - throw new ClassCastException("Activity must implement PageFragmentCallbacks"); - } - - mCallbacks = (PageFragmentCallbacks) activity; - } - - @Override - public void onDetach() { - super.onDetach(); - mCallbacks = null; - } - - @Override - public void onResume() { - super.onResume(); - if (isFirstView) { - isFirstView = false; - new InitPodTask(injector, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - } - - public void actionOnReceiveResponse(String result) { - } - - @Override - public void returnInitTaskStatus(PodInitActionType podInitActionType, boolean isSuccess, String errorMessage) { - if (podInitActionType.isParent()) { - for (PodInitActionType actionType : mapCheckBoxes.keySet()) { - setCheckBox(actionType, isSuccess); - } - - // special handling for init - processOnFinishedActions(isSuccess, errorMessage); - - } else { - setCheckBox(podInitActionType, isSuccess); - } - } - - private void processOnFinishedActions(boolean isOk, String errorMessage) { - FragmentActivity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread(() -> { - progressBar.setVisibility(View.GONE); - - if (!isOk) { - errorView.setVisibility(View.VISIBLE); - errorView.setText(errorMessage); - - retryButton.setVisibility(View.VISIBLE); - } - - mPage.setActionCompleted(isOk); - - mPage.getData().putString(Page.SIMPLE_DATA_KEY, UUID.randomUUID().toString()); - mPage.notifyDataChanged(); - - }); - } - } - - protected void setCheckBox(PodInitActionType podInitActionType, boolean isSuccess) { - FragmentActivity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread(() -> { - mapCheckBoxes.get(podInitActionType).setChecked(isSuccess); - mapCheckBoxes.get(podInitActionType).setTextColor(isSuccess ? Color.rgb(34, 135, 91) : - Color.rgb(168, 36, 15)); - }); - } - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java deleted file mode 100644 index 8c086ffe6e..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java +++ /dev/null @@ -1,73 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod; - -import androidx.annotation.StringRes; -import androidx.fragment.app.Fragment; - -import com.tech.freak.wizardpager.model.ModelCallbacks; -import com.tech.freak.wizardpager.model.Page; -import com.tech.freak.wizardpager.model.ReviewItem; - -import java.util.ArrayList; - -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; - - -/** - * Created by andy on 12/11/2019 - *

- * This page is for InitPod and RemovePod, but Fragments called for this 2 actions are different - */ -public class InitActionPage extends Page { - - protected PodInitActionType podInitActionType; - - private boolean actionCompleted = false; - private boolean actionSuccess = false; - - protected InitActionPage(ModelCallbacks callbacks, String title) { - super(callbacks, title); - } - - public InitActionPage(ModelCallbacks callbacks, @StringRes int titleId, PodInitActionType podInitActionType) { - super(callbacks, titleId); - this.podInitActionType = podInitActionType; - } - - @Override - public Fragment createFragment() { - return InitActionFragment.create(getKey(), this.podInitActionType); - } - - @Override - public void getReviewItems(ArrayList dest) { - } - - @Override - public boolean isCompleted() { - return actionCompleted; - } - - public void setActionCompleted(boolean success) { - this.actionCompleted = success; - this.actionSuccess = success; - } - - /** - * This is used just if we want to override default behavior (for example when we enter Page we want prevent any action, until something happens. - * - * @return - */ - @Override public boolean isBackActionPossible() { - return actionCompleted; - } - - /** - * This is used just if we want to override default behavior (for example when we enter Page we want prevent any action, until something happens. - * - * @return - */ - @Override public boolean isNextActionPossible() { - return actionSuccess; - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java deleted file mode 100644 index 12742ff108..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java +++ /dev/null @@ -1,67 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod; - -import android.os.AsyncTask; -import android.view.View; - -import javax.inject.Inject; - -import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.interfaces.ProfileFunction; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.event.EventOmnipodPumpValuesChanged; -import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager; - -/** - * Created by andy on 11/12/2019 - */ -public class InitPodTask extends AsyncTask { - - @Inject ProfileFunction profileFunction; - @Inject AapsOmnipodManager aapsOmnipodManager; - @Inject RxBusWrapper rxBus; - private final InitActionFragment initActionFragment; - - public InitPodTask(HasAndroidInjector injector, InitActionFragment initActionFragment) { - injector.androidInjector().inject(this); - this.initActionFragment = initActionFragment; - } - - @Override - protected void onPreExecute() { - super.onPreExecute(); - initActionFragment.progressBar.setVisibility(View.VISIBLE); - initActionFragment.errorView.setVisibility(View.GONE); - initActionFragment.retryButton.setVisibility(View.GONE); - } - - @Override - protected String doInBackground(Void... params) { - if (initActionFragment.podInitActionType == PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP) { - initActionFragment.callResult = aapsOmnipodManager.pairAndPrime( - initActionFragment.podInitActionType, - initActionFragment - ); - } else if (initActionFragment.podInitActionType == PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP) { - initActionFragment.callResult = aapsOmnipodManager.setInitialBasalScheduleAndInsertCannula( - initActionFragment.podInitActionType, - initActionFragment, - profileFunction.getProfile() - ); - } else if (initActionFragment.podInitActionType == PodInitActionType.DEACTIVATE_POD_WIZARD_STEP) { - initActionFragment.callResult = aapsOmnipodManager.deactivatePod(initActionFragment); - } - - rxBus.send(new EventOmnipodPumpValuesChanged()); - - return "OK"; - } - - @Override - protected void onPostExecute(String result) { - super.onPostExecute(result); - - initActionFragment.actionOnReceiveResponse(result); - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java deleted file mode 100644 index af364324ae..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java +++ /dev/null @@ -1,48 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model; - -import android.content.Context; - -import com.atech.android.library.wizardpager.model.DisplayTextPage; -import com.tech.freak.wizardpager.model.PageList; - -import info.nightscout.androidaps.plugins.pump.omnipod.R; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionPage; - -/** - * Created by andy on 12/11/2019 - */ -// Full init pod wizard model -// Cannot be merged with ShortInitPodWizardModel, because we can't set any instance variables -// before the onNewRootPageList method is called (which happens in the super constructor) -public class FullInitPodWizardModel extends InitPodWizardModel { - - public FullInitPodWizardModel(Context context) { - super(context); - } - - @Override - protected PageList onNewRootPageList() { - return new PageList( - new DisplayTextPage(this, - R.string.omnipod_init_pod_wizard_step1_title, - R.string.omnipod_init_pod_wizard_step1_desc, - R.style.WizardPagePodContent).setRequired(true).setCancelReason("None"), - - new InitActionPage(this, - R.string.omnipod_init_pod_wizard_step2_title, - PodInitActionType.PAIR_AND_PRIME_WIZARD_STEP - ).setRequired(true).setCancelReason("Cancel"), - - new DisplayTextPage(this, - R.string.omnipod_init_pod_wizard_step3_title, - R.string.omnipod_init_pod_wizard_step3_desc, - R.style.WizardPagePodContent).setRequired(true).setCancelReason("Cancel"), - - new InitActionPage(this, - R.string.omnipod_init_pod_wizard_step4_title, - PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP - ).setRequired(true).setCancelReason("Cancel") - ); - } -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java deleted file mode 100644 index e3c4e9c1fe..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java +++ /dev/null @@ -1,20 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model; - -import android.content.Context; - -import androidx.fragment.app.Fragment; - -import com.tech.freak.wizardpager.model.AbstractWizardModel; - -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.PodInfoFragment; - -abstract class InitPodWizardModel extends AbstractWizardModel { - InitPodWizardModel(Context context) { - super(context); - } - - @Override - public Fragment getReviewFragment() { - return PodInfoFragment.create(true); - } -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java deleted file mode 100644 index 381dcb1950..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2012 Roman Nurik - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model; - -import android.content.Context; - -import androidx.fragment.app.Fragment; - -import com.atech.android.library.wizardpager.model.DisplayTextPage; -import com.tech.freak.wizardpager.model.AbstractWizardModel; -import com.tech.freak.wizardpager.model.PageList; - -import info.nightscout.androidaps.plugins.pump.omnipod.R; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages.PodInfoFragment; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod.RemovePodActionPage; - -/** - * Created by andy on 12/11/2019 - */ -public class RemovePodWizardModel extends AbstractWizardModel { - - public RemovePodWizardModel(Context context) { - super(context); - } - - @Override - protected PageList onNewRootPageList() { - return new PageList( - new DisplayTextPage(this, - R.string.omnipod_remove_pod_wizard_step1_title, - R.string.omnipod_remove_pod_wizard_step1_desc, - R.style.WizardPagePodContent).setRequired(true).setCancelReason("None"), - - new RemovePodActionPage(this, - R.string.omnipod_remove_pod_wizard_step2_title, - PodInitActionType.DEACTIVATE_POD_WIZARD_STEP - ).setRequired(true).setCancelReason("Cancel") - - ); - } - - @Override public Fragment getReviewFragment() { - return PodInfoFragment.create(false); - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java deleted file mode 100644 index 3813520e80..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.model; - -import android.content.Context; - -import com.atech.android.library.wizardpager.model.DisplayTextPage; -import com.tech.freak.wizardpager.model.PageList; - -import info.nightscout.androidaps.plugins.pump.omnipod.R; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionPage; - -/** - * Created by andy on 12/11/2019 - */ -// Init pod wizard model without the pair and prime step -// Cannot be merged with FullInitPodWizardModel, because we can't set any instance variables -// before the onNewRootPageList method is called (which happens in the super constructor) -public class ShortInitPodWizardModel extends InitPodWizardModel { - - public ShortInitPodWizardModel(Context context) { - super(context); - } - - @Override - protected PageList onNewRootPageList() { - return new PageList( - new DisplayTextPage(this, - R.string.omnipod_init_pod_wizard_step3_title, - R.string.omnipod_init_pod_wizard_step3_desc, - R.style.WizardPagePodContent).setRequired(true).setCancelReason("Cancel"), - - new InitActionPage(this, - R.string.omnipod_init_pod_wizard_step4_title, - PodInitActionType.FILL_CANNULA_SET_BASAL_PROFILE_WIZARD_STEP - ).setRequired(true).setCancelReason("Cancel") - ); - - } -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java deleted file mode 100644 index 83dbeb0125..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java +++ /dev/null @@ -1,164 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.pages; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.pm.ActivityInfo; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import androidx.fragment.app.FragmentActivity; - -import com.tech.freak.wizardpager.model.ReviewItem; -import com.tech.freak.wizardpager.ui.PageFragmentCallbacks; - -import java.util.ArrayList; - -import javax.inject.Inject; - -import dagger.android.support.DaggerFragment; -import info.nightscout.androidaps.plugins.pump.omnipod.R; -import info.nightscout.androidaps.plugins.pump.omnipod.driver.manager.PodStateManager; -import info.nightscout.androidaps.plugins.pump.omnipod.util.AapsOmnipodUtil; - - -/** - * Created by andy on 12/11/2019 - */ -public class PodInfoFragment extends DaggerFragment { - private static final String ARG_INIT_POD = "initPod"; - - @Inject AapsOmnipodUtil aapsOmnipodUtil; - @Inject PodStateManager podStateManager; - - private boolean isInitPod; - private ArrayList mCurrentReviewItems; - - public static PodInfoFragment create(boolean initPod) { - Bundle args = new Bundle(); - args.putBoolean(ARG_INIT_POD, initPod); - - PodInfoFragment fragment = new PodInfoFragment(); - fragment.setArguments(args); - return fragment; - } - - @SuppressLint("SourceLockedOrientationActivity") @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - - Bundle args = getArguments(); - isInitPod = args.getBoolean(ARG_INIT_POD); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.omnipod_initpod_pod_info, container, false); - - TextView titleView = rootView.findViewById(R.id.podInfoTitle); - titleView.setText(R.string.omnipod_init_pod_wizard_pod_info_title); - titleView.setTextColor(getResources().getColor(com.tech.freak.wizardpager.R.color.review_green)); - - TextView headerText = rootView.findViewById(R.id.podInfoText); - headerText.setText(isInitPod ? // - R.string.omnipod_init_pod_wizard_pod_info_init_pod_description : // - R.string.omnipod_init_pod_wizard_pod_info_remove_pod_description); - - if (isInitPod) { - if (createDataOfPod()) { - - ListView listView = (ListView) rootView.findViewById(R.id.podInfoList); - listView.setAdapter(new PodInfoAdapter(mCurrentReviewItems, getContext())); - listView.setChoiceMode(ListView.CHOICE_MODE_NONE); - } - } - - return rootView; - } - - private boolean createDataOfPod() { - if (podStateManager == null) - return false; - - mCurrentReviewItems = new ArrayList<>(); - mCurrentReviewItems.add(new ReviewItem("Pod Address", "" + podStateManager.getAddress(), "33")); - mCurrentReviewItems.add(new ReviewItem("Activated At", podStateManager.getActivatedAt() == null ? "Not activated yet" : podStateManager.getActivatedAt().toString("dd.MM.yyyy HH:mm:ss"), "34")); - if (podStateManager.getLot() != null) { - mCurrentReviewItems.add(new ReviewItem("LOT", "" + podStateManager.getLot(), "35")); - } - if (podStateManager.getTid() != null) { - mCurrentReviewItems.add(new ReviewItem("TID", "" + podStateManager.getLot(), "36")); - } - if (podStateManager.getPiVersion() != null) { - mCurrentReviewItems.add(new ReviewItem("Pi Version", podStateManager.getPiVersion().toString(), "37")); - } - if (podStateManager.getPmVersion() != null) { - mCurrentReviewItems.add(new ReviewItem("Pm Version", podStateManager.getPmVersion().toString(), "38")); - } - - return true; - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - - FragmentActivity activity = getActivity(); - - if (!(activity instanceof PageFragmentCallbacks)) { - throw new ClassCastException("Activity must implement PageFragmentCallbacks"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - } - - private static class PodInfoAdapter extends ArrayAdapter { - PodInfoAdapter(ArrayList data, Context context) { - super(context, com.tech.freak.wizardpager.R.layout.list_item_review, data); - } - - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - // Get the data item for this position - ReviewItem dataModel = getItem(position); - // Check if an existing view is being reused, otherwise inflate the view - ViewHolder viewHolder; // view lookup cache stored in tag - - if (convertView == null) { - - viewHolder = new ViewHolder(); - LayoutInflater inflater = LayoutInflater.from(getContext()); - convertView = inflater.inflate(R.layout.omnipod_initpod_pod_info_item, parent, false); - viewHolder.txtName = (TextView) convertView.findViewById(android.R.id.text1); - viewHolder.txtType = (TextView) convertView.findViewById(android.R.id.text2); - - convertView.setTag(viewHolder); - } else { - viewHolder = (ViewHolder) convertView.getTag(); - } - - viewHolder.txtName.setText(dataModel.getTitle()); - viewHolder.txtType.setText(dataModel.getDisplayValue()); - - // Return the completed view to render on screen - return convertView; - } - } - - private static class ViewHolder { - TextView txtName; - TextView txtType; - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java deleted file mode 100644 index 2ca5a1d198..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java +++ /dev/null @@ -1,60 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod; - -import android.os.Bundle; -import android.view.View; - -import com.tech.freak.wizardpager.model.Page; - -import java.util.UUID; - -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitReceiver; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionFragment; - -/** - * Created by andy on 29/11/2019 - */ -public class RemoveActionFragment extends InitActionFragment implements PodInitReceiver { - public static RemoveActionFragment create(String key, PodInitActionType podInitActionType) { - Bundle args = new Bundle(); - args.putString(ARG_KEY, key); - args.putSerializable(ARG_POD_INIT_ACTION_TYPE, podInitActionType); - - RemoveActionFragment fragment = new RemoveActionFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void actionOnReceiveResponse(String result) { - System.out.println("ACTION: actionOnReceiveResponse: " + result); - - boolean isOk = callResult.success; - - progressBar.setVisibility(View.GONE); - - if (!isOk) { - errorView.setVisibility(View.VISIBLE); - errorView.setText(callResult.comment); - - retryButton.setVisibility(View.VISIBLE); - } - - mPage.setActionCompleted(isOk); - - mPage.getData().putString(Page.SIMPLE_DATA_KEY, UUID.randomUUID().toString()); - mPage.notifyDataChanged(); - } - - - @Override - public void returnInitTaskStatus(PodInitActionType podInitActionType, boolean isSuccess, String errorMessage) { - if (podInitActionType.isParent()) { - for (PodInitActionType actionType : mapCheckBoxes.keySet()) { - setCheckBox(actionType, isSuccess); - } - } else { - setCheckBox(podInitActionType, isSuccess); - } - } -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java deleted file mode 100644 index 7d1b319d8c..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java +++ /dev/null @@ -1,30 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.removepod; - -import androidx.annotation.StringRes; -import androidx.fragment.app.Fragment; - -import com.tech.freak.wizardpager.model.ModelCallbacks; - -import info.nightscout.androidaps.plugins.pump.omnipod.definition.PodInitActionType; -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.initpod.InitActionPage; - - -/** - * Created by andy on 12/11/2019 - */ -public class RemovePodActionPage extends InitActionPage { - - public RemovePodActionPage(ModelCallbacks callbacks, String title) { - super(callbacks, title); - } - - public RemovePodActionPage(ModelCallbacks callbacks, @StringRes int titleId, PodInitActionType podInitActionType) { - super(callbacks, titleId, podInitActionType); - } - - @Override - public Fragment createFragment() { - return RemoveActionFragment.create(getKey(), this.podInitActionType); - } - -} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/ActionViewModelBase.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/ActionViewModelBase.kt new file mode 100644 index 0000000000..f6212758eb --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/ActionViewModelBase.kt @@ -0,0 +1,30 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import info.nightscout.androidaps.data.PumpEnactResult +import io.reactivex.schedulers.Schedulers +import io.reactivex.subjects.SingleSubject + +abstract class ActionViewModelBase : ViewModel() { + + private val _isActionExecutingLiveData = MutableLiveData(false) + val isActionExecutingLiveData: LiveData = _isActionExecutingLiveData + + private val _actionResultLiveData = MutableLiveData(null) + val actionResultLiveData: LiveData = _actionResultLiveData + + fun executeAction() { + _isActionExecutingLiveData.postValue(true) + val disposable = SingleSubject.fromCallable(this::doExecuteAction) + .subscribeOn(Schedulers.io()) + .doOnSuccess { result -> + _isActionExecutingLiveData.postValue(false) + _actionResultLiveData.postValue(result) + } + .subscribe() + } + + protected abstract fun doExecuteAction(): PumpEnactResult +} diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/DeactivatePodActionViewModel.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/DeactivatePodActionViewModel.kt new file mode 100644 index 0000000000..49d0f2ed19 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/DeactivatePodActionViewModel.kt @@ -0,0 +1,21 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel + +import info.nightscout.androidaps.data.PumpEnactResult +import info.nightscout.androidaps.interfaces.CommandQueueProvider +import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager +import info.nightscout.androidaps.plugins.pump.omnipod.queue.command.CommandDeactivatePod +import info.nightscout.androidaps.queue.Callback +import io.reactivex.subjects.SingleSubject +import javax.inject.Inject + +class DeactivatePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val commandQueueProvider: CommandQueueProvider) : ActionViewModelBase() { + override fun doExecuteAction(): PumpEnactResult { + val singleSubject = SingleSubject.create() + commandQueueProvider.customCommand(CommandDeactivatePod(), object : Callback() { + override fun run() { + singleSubject.onSuccess(result) + } + }) + return singleSubject.blockingGet() + } +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/InsertCannulaActionViewModel.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/InsertCannulaActionViewModel.kt new file mode 100644 index 0000000000..25c3bd9a34 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/InsertCannulaActionViewModel.kt @@ -0,0 +1,10 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel + +import info.nightscout.androidaps.data.PumpEnactResult +import info.nightscout.androidaps.interfaces.ProfileFunction +import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager +import javax.inject.Inject + +class InsertCannulaActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val profileFunction: ProfileFunction) : ActionViewModelBase() { + override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.insertCannula(profileFunction.getProfile()) +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/PairAndPrimePodActionViewModel.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/PairAndPrimePodActionViewModel.kt new file mode 100644 index 0000000000..45c9a39f36 --- /dev/null +++ b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/PairAndPrimePodActionViewModel.kt @@ -0,0 +1,9 @@ +package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard.viewmodel + +import info.nightscout.androidaps.data.PumpEnactResult +import info.nightscout.androidaps.plugins.pump.omnipod.manager.AapsOmnipodManager +import javax.inject.Inject + +class PairAndPrimePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager) : ActionViewModelBase() { + override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.activateNewPod() +} \ No newline at end of file diff --git a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/WizardFragment1.kt b/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/WizardFragment1.kt deleted file mode 100644 index 0422ca30a4..0000000000 --- a/omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/WizardFragment1.kt +++ /dev/null @@ -1,44 +0,0 @@ -package info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.fragment - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.viewModels -import androidx.lifecycle.ViewModelProvider -import dagger.android.support.DaggerFragment -import info.nightscout.androidaps.plugins.pump.omnipod.R -import info.nightscout.androidaps.plugins.pump.omnipod.dagger.OmnipodPluginQualifier -import info.nightscout.androidaps.plugins.pump.omnipod.ui.wizard2.viewmodel.WizardViewModel1 -import javax.inject.Inject - -class WizardFragment1 : DaggerFragment() { - - @Inject - @OmnipodPluginQualifier - lateinit var viewModelFactory: ViewModelProvider.Factory - - lateinit var viewModel: WizardViewModel1 - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - val vm: WizardViewModel1 by viewModels { viewModelFactory } - this.viewModel = vm - vm.doSomethingForTesting() - } - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? = inflater.inflate(R.layout.omnipod_replace_pod_wizard_info_page_fragment, container, false) - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - //view.findViewById