From 8af6519687838339bc1c69e7b677f8bc69b95bfb Mon Sep 17 00:00:00 2001 From: Bart Sopers Date: Tue, 29 Sep 2020 20:53:12 +0200 Subject: [PATCH] Finish new Change Pod Wizard (and some other small changes) --- app/build.gradle | 2 - ...ware.android.library.wizardpager-1.1.4.aar | Bin 97170 -> 0 bytes .../dependencyInjection/FragmentsModule.kt | 4 +- .../androidaps/setupwizard/SWDefinition.kt | 54 +++-- .../setupwizard/SetupWizardActivity.kt | 1 + app/src/main/res/values/strings.xml | 5 +- .../nightscout/androidaps/utils/HtmlHelper.kt | 3 +- omnipod/build.gradle | 1 - ...ware.android.library.wizardpager-1.1.4.aar | Bin 97170 -> 0 bytes omnipod/src/main/AndroidManifest.xml | 5 +- .../pump/omnipod/OmnipodPumpPlugin.java | 12 +- .../omnipod/dagger/OmnipodInjectHelpers.kt | 1 - .../pump/omnipod/dagger/OmnipodModule.kt | 14 +- .../omnipod/dagger/OmnipodWizardModule.kt | 41 ++-- .../definition/OmnipodCommandType.java | 4 +- .../definition/PodHistoryEntryType.java | 4 +- .../omnipod/definition/PodInitActionType.java | 54 ----- .../omnipod/definition/PodInitReceiver.java | 7 - .../response/podinfo/PodInfoFaultEvent.java | 4 +- ...ressStatusVerificationFailedException.java | 16 ++ .../driver/manager/OmnipodManager.java | 47 ++-- .../driver/manager/SetupActionResult.java | 61 ----- .../omnipod/manager/AapsOmnipodManager.java | 125 +++++----- .../queue/command/CommandDeactivatePod.java | 7 + .../command/OmnipodCustomCommandType.java | 1 + .../OmnipodRileyLinkCommunicationManager.java | 1 + ...Fragment.kt => OmnipodOverviewFragment.kt} | 194 ++++++++------- .../pump/omnipod/ui/PodHistoryActivity.java | 4 +- .../pump/omnipod/ui/PodManagementActivity.kt | 97 ++------ .../ChangePodWizardActivity.kt} | 44 ++-- .../omnipod/ui/wizard/defs/PodActionType.java | 7 - .../fragment/ChangePodWizardFragmentBase.kt} | 44 ++-- .../fragment/action/ActionFragmentBase.kt | 80 +++++++ .../action/DeactivatePodActionFragment.kt | 64 +++++ .../action/InsertCannulaActionFragment.kt | 61 +++++ .../action/PairAndPrimePodActionFragment.kt | 61 +++++ .../fragment/info/AttachPodInfoFragment.kt | 13 +- .../info/DeactivatePodInfoFragment.kt | 13 +- .../fragment/info/FillPodInfoFragment.kt | 13 +- .../wizard/fragment/info/InfoFragmentBase.kt | 27 +++ .../fragment/info/PodChangedInfoFragment.kt | 18 ++ .../info/PodDeactivatedInfoFragment.kt | 13 +- .../fragment/info/PodDiscardedInfoFragment.kt | 18 ++ .../ui/wizard/initpod/InitActionFragment.java | 223 ------------------ .../ui/wizard/initpod/InitActionPage.java | 73 ------ .../ui/wizard/initpod/InitPodTask.java | 67 ------ .../wizard/model/FullInitPodWizardModel.java | 48 ---- .../ui/wizard/model/InitPodWizardModel.java | 20 -- .../ui/wizard/model/RemovePodWizardModel.java | 61 ----- .../wizard/model/ShortInitPodWizardModel.java | 39 --- .../ui/wizard/pages/PodInfoFragment.java | 164 ------------- .../removepod/RemoveActionFragment.java | 60 ----- .../wizard/removepod/RemovePodActionPage.java | 30 --- .../wizard/viewmodel/ActionViewModelBase.kt | 30 +++ .../viewmodel/DeactivatePodActionViewModel.kt | 21 ++ .../viewmodel/InsertCannulaActionViewModel.kt | 10 + .../PairAndPrimePodActionViewModel.kt | 9 + .../ui/wizard2/fragment/WizardFragment1.kt | 44 ---- .../fragment/action/ActionFragmentBase.kt | 21 -- .../action/DeactivatePodActionFragment.kt | 13 - .../action/InsertCannulaActionFragment.kt | 13 - .../action/PairAndPrimePodActionFragment.kt | 13 - .../wizard2/fragment/info/InfoFragmentBase.kt | 23 -- .../fragment/info/PodReplacedInfoFragment.kt | 11 - .../ui/wizard2/viewmodel/WizardViewModel1.kt | 20 -- .../src/main/res/drawable/ic_exit_to_app.xml | 12 - .../src/main/res/drawable/ic_toast_check.xml | 10 + .../res/drawable/ic_toast_delete_confirm.xml | 10 + ...change_pod_wizard_action_page_fragment.xml | 77 ++++++ ...=> omnipod_change_pod_wizard_activity.xml} | 4 +- ...nipod_change_pod_wizard_base_fragment.xml} | 16 +- ..._change_pod_wizard_info_page_fragment.xml} | 5 +- ...omnipod_change_pod_wizard_nav_buttons.xml} | 8 +- ...change_pod_wizard_progress_indication.xml} | 4 +- .../src/main/res/layout/omnipod_initpod.xml | 107 --------- .../layout/omnipod_initpod_init_action.xml | 85 ------- .../res/layout/omnipod_initpod_pod_info.xml | 56 ----- .../layout/omnipod_initpod_pod_info_item.xml | 47 ---- ...ipod_fragment.xml => omnipod_overview.xml} | 117 ++++----- ...od_mgmt.xml => omnipod_pod_management.xml} | 61 +---- ..._replace_pod_wizard_info_page_fragment.xml | 11 - ...od_change_pod_wizard_navigation_graph.xml} | 50 ++-- .../src/main/res/values-bg-rBG/strings.xml | 119 +++------- .../src/main/res/values-cs-rCZ/strings.xml | 108 +++------ .../src/main/res/values-de-rDE/strings.xml | 69 +++--- .../src/main/res/values-es-rES/strings.xml | 32 +-- .../src/main/res/values-fr-rFR/strings.xml | 117 +++------ .../src/main/res/values-it-rIT/strings.xml | 119 +++------- .../src/main/res/values-lt-rLT/strings.xml | 32 +-- .../src/main/res/values-nl-rNL/strings.xml | 31 +-- .../src/main/res/values-pl-rPL/strings.xml | 32 +-- .../src/main/res/values-pt-rPT/strings.xml | 56 ++--- .../src/main/res/values-ro-rRO/strings.xml | 106 ++++----- .../src/main/res/values-ru-rRU/strings.xml | 119 +++------- .../src/main/res/values-sk-rSK/strings.xml | 119 +++------- .../src/main/res/values-sv-rSE/strings.xml | 32 +-- omnipod/src/main/res/values/colors.xml | 5 +- omnipod/src/main/res/values/dimens.xml | 4 + omnipod/src/main/res/values/strings.xml | 159 +++++++------ omnipod/src/main/res/values/styles.xml | 46 +--- .../message/response/StatusResponseTest.java | 2 +- .../podinfo/PodInfoActiveAlertsTest.java | 2 +- 102 files changed, 1440 insertions(+), 2807 deletions(-) delete mode 100644 app/libs/com.atech-software.android.library.wizardpager-1.1.4.aar delete mode 100644 omnipod/libs/com.atech-software.android.library.wizardpager-1.1.4.aar delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitActionType.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/definition/PodInitReceiver.java create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/exception/PodProgressStatusVerificationFailedException.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/driver/manager/SetupActionResult.java create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/queue/command/CommandDeactivatePod.java rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{OmnipodFragment.kt => OmnipodOverviewFragment.kt} (73%) rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{wizard2/ReplacePodWizardActivity.kt => wizard/ChangePodWizardActivity.kt} (71%) delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/defs/PodActionType.java rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{wizard2/fragment/FragmentBase.kt => wizard/fragment/ChangePodWizardFragmentBase.kt} (55%) create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/ActionFragmentBase.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/DeactivatePodActionFragment.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/InsertCannulaActionFragment.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/action/PairAndPrimePodActionFragment.kt rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{wizard2 => wizard}/fragment/info/AttachPodInfoFragment.kt (51%) rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{wizard2 => wizard}/fragment/info/DeactivatePodInfoFragment.kt (51%) rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{wizard2 => wizard}/fragment/info/FillPodInfoFragment.kt (52%) create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/InfoFragmentBase.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodChangedInfoFragment.kt rename omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/{wizard2 => wizard}/fragment/info/PodDeactivatedInfoFragment.kt (51%) create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/fragment/info/PodDiscardedInfoFragment.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionFragment.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitActionPage.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/initpod/InitPodTask.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/FullInitPodWizardModel.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/InitPodWizardModel.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/RemovePodWizardModel.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/model/ShortInitPodWizardModel.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/pages/PodInfoFragment.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemoveActionFragment.java delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/removepod/RemovePodActionPage.java create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/ActionViewModelBase.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/DeactivatePodActionViewModel.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/InsertCannulaActionViewModel.kt create mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard/viewmodel/PairAndPrimePodActionViewModel.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/WizardFragment1.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/action/ActionFragmentBase.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/action/DeactivatePodActionFragment.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/action/InsertCannulaActionFragment.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/action/PairAndPrimePodActionFragment.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/InfoFragmentBase.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/fragment/info/PodReplacedInfoFragment.kt delete mode 100644 omnipod/src/main/java/info/nightscout/androidaps/plugins/pump/omnipod/ui/wizard2/viewmodel/WizardViewModel1.kt delete mode 100644 omnipod/src/main/res/drawable/ic_exit_to_app.xml create mode 100644 omnipod/src/main/res/drawable/ic_toast_check.xml create mode 100644 omnipod/src/main/res/drawable/ic_toast_delete_confirm.xml create mode 100644 omnipod/src/main/res/layout/omnipod_change_pod_wizard_action_page_fragment.xml rename omnipod/src/main/res/layout/{omnipod_replace_pod_wizard_activity.xml => omnipod_change_pod_wizard_activity.xml} (73%) rename omnipod/src/main/res/layout/{omnipod_replace_pod_wizard_base_fragment.xml => omnipod_change_pod_wizard_base_fragment.xml} (52%) rename omnipod/src/main/res/layout/{omnipod_replace_pod_wizard_action_page_fragment.xml => omnipod_change_pod_wizard_info_page_fragment.xml} (63%) rename omnipod/src/main/res/layout/{omnipod_replace_pod_wizard_nav_buttons.xml => omnipod_change_pod_wizard_nav_buttons.xml} (64%) rename omnipod/src/main/res/layout/{omnipod_replace_pod_wizard_progress_indication.xml => omnipod_change_pod_wizard_progress_indication.xml} (78%) delete mode 100644 omnipod/src/main/res/layout/omnipod_initpod.xml delete mode 100644 omnipod/src/main/res/layout/omnipod_initpod_init_action.xml delete mode 100644 omnipod/src/main/res/layout/omnipod_initpod_pod_info.xml delete mode 100644 omnipod/src/main/res/layout/omnipod_initpod_pod_info_item.xml rename omnipod/src/main/res/layout/{omnipod_fragment.xml => omnipod_overview.xml} (89%) rename omnipod/src/main/res/layout/{omnipod_pod_mgmt.xml => omnipod_pod_management.xml} (62%) delete mode 100644 omnipod/src/main/res/layout/omnipod_replace_pod_wizard_info_page_fragment.xml rename omnipod/src/main/res/navigation/{omnipod_replace_pod_wizard_navigation_graph.xml => omnipod_change_pod_wizard_navigation_graph.xml} (63%) create mode 100644 omnipod/src/main/res/values/dimens.xml 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 af0c6511cfc6626fa12762691f5e8a0ff9f06024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97170 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%0AIx=hTCXN31 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%0AhgV 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 T+^3dFK{|o)>__0&ARzw-tE7F- 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 af0c6511cfc6626fa12762691f5e8a0ff9f06024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97170 zcmY&fLy#y+kR027W81c8-q^Nn+qP}nwr$(CjeY;J8+*y_?5?Pes5=9bUdA^ zDsN+VRveH1JXkzBu3E2|H0u8r{+$i|Gy+VAcEb+ElcXHA!JZlQNGsX5f^3&;gIoQ4 z9-~9Xqbb2>;PZ^LJr}f*HS~QqnfPnk{mfpfle{>34b*1drZJZT6khec1V@mUsC8UW zqR%ePQ<28$=TK2npXbqmok_OiRT-Mgr15=nE&pZe+kSWNc5-<51@2!{;sYSPTSCIr zJ8r?qog=jilX`gU!zuqoJJqYJbH{6ym=O2%>Q-G+nw+F2Az?{3%*Ym8Z}BNG7h1!W zQ+n@Y6)J9K&gvPEJ-XJ2hU+|t@N@v`q>e0%X-pn1Dfr%s_~3ExdVVE$-t013@8QG3 z=XErCxkyiDk9A`>XbY95`N}4JSXqH+-c>&0`u(cjuaP7I@MM2*%BK7%z0_aaycX5x zgLrd&iOlC1ISIKX^h@VQPCoR!Bn!Xz2)QQ#bt>2ba%8D&xEBNFQN|PfG2#1R%q1t* zN=OOxpt{TZFb=!|;gu5>iRwwL8IMsV+(j}{N?Gsc;CawWXBwFnka2yt_pzP}mQO5^|D`i8*xWFo0&gpG| z>-`-^xGxpBd<3Y3LYyAmZ~{ns4Ot+mCnscMW~SFoFf|b7#rcQQI+^FK_;hJcx@O0% z2XDZFpeFXIzzeuebMD)*y+=dZ#NbrPhBPlk#*R1U4&3QwxU7~NQ2{6>I!#C3?6U0n zguZQ3Ge}LZ9`qVh+9Oo)Hd#Yw!h06~U&gHuJup~-JN#;RL^N&xjT2ry)`Hs@Kxf{A zLv9z})!g@Cy@=@8cLnXYbN!cqov}PU-US-F`1o18na0byye)7JG$oWJ!%+_?J)=pG zVXCnep}Q0pAW-^dQ5a0&=e1JL-*fJ#=SvVZ6{akiN(bB~)U(Jbxc`>?6#z#Hh%8)MkC17GEX;#o!)q z^Rm;6tEHdqFO$GD7VNp7lRN?5T~j&1REU&;s{LNJ4@&mgj=uc|xx6|4)TRTH@^-fdPE??ip86onJGt1X# z8=K#(u%?-nWOFq1Z7HtH-^|~e*|D>Dd8_L{j+V<~78rD1UxqpUyVl0Gj(DuEcQ|-| zcYMk>&?v1m-{f44nrZeQH=mVwetn!XT{?piTupkm^G)$W>VH?Y+WRb8J%a>~x$(zx zANA^N^%(m`GCNkSV+^yH7&l!&_|+;?=WGJ) zWpS~{ESUY;j%O$$8^;Lx|$;MqFf z+kP$So_yq3Zux5KId21KHap{W)y{m6zYufX@am9;)!r^H?nSM*;zWCKU5;0H^ybUo zzHdEqPaRH%^KCG{T7iB$g&S=FFo7_p7eM?0yBAL?%laX=b`m9 zJNX&)XyvIZDBYjZ-Tkrub~87HX9pzOWuu+AG=Av|^CT&le{a}CwRv|?9F8?zMsP@;_{51UD4UOlDTM`HNH2h*Z@Dzb}*05rcaI&>A5Fj0x z>)bY17^_Wt8!%0R?~|YxniBx{eIz&7&w3Nj&pnHh+`(}m|822CDB6$3H-mw`9!!5D-}}gdp6wUlc8$=iH;+1uD6WPY8t{Y|*Ueecdhc-a z>BamEs}3wOy2k)zaF2I)7;QVeH)Rt+k5kULvMaRxnL_2J;mKymvXk97KNy;X)I|AQ z@M~1_wO$Qt=-Z;%QNAB^&EghNm2>9;Vc4fabnZzRm88w_szQgr?7g4k@AA<7Oi+Qv zA&9Gk{5|_%wwcmgM(AiicNyCautkY7@Fb5aUozj*Mn0H|$I0?FuLFZ`yfd9u3*S0s zg=1Lv)-|wRxM@DP_2nAArCuC5lcu^lRaq-a|M|}a4yb)c9H!dIvCj!nGngiDBKC>E zYI#SGi?<=H)m=q~B*)$^nD2Xg4I&Dr=62qw&EP5x(9~f2ZbScjd3sJbhz zXqi@25|@Voebsnlmc&*r98?@RMCN=9)Dt z$xu117B#0ww`C)VzD`bG%nyaAzpyc@C;Z`59+sYf!)^v<05d8`xIQ7RI8MOcO}V+C z+A0ofU!ILaq&UhpqQane*k{`#-eFI{Hb2a7h)%UJ0)ETMkQHfN_Ku1D9abZ|jd|aI zjqG6TDqFLj5nwR%TsE~>z7wDUt0|sMcW4Z;rk)7f`Y3p|K6KQ%%k}oXkEb1;&Rg4+ zab!`KMm543@DhSu#%bxHR^ST*eZl6M+v5{j#tbvOYK$@umzeL-nghBEI#Qtq>c)IG z8l3RVC#;_>c3=9I;qerpv<%T53?Gcu&SO?c$D*gs9C>RB2Xp3U;hBJG_ayEy*K9WCqykh_^*2znBTn=kOOCTbh`(1U7AqDfQwv&1s zkq(fmO=>5Id8wXK@b9-WlfCoOEw7pbgsG8MezQuOD@be+bBCc7GY; zyV1;Zeec@opZ70V2wv2(EMfn6(m;PBfP*O3KT(9hd9{)tm3~&@W79w`xPC5dFe9<^ zJ1PBr3>(Xg80@42Mwb>%op?iak^KOS(suyS&}pX6x1sTsHltL!k@<$sq=M}jFvN>; z>}h)RE>;2FjDhn850K0nU_wJvilZ-jN^8t4k7Mz_P4NEvUb%nm@#wbAZ`QWM@W6=r zdL{*6FyI+6o}Yzc_I2qHz0ewA4SZ4+t4yJ{=jHAdAUa>`Z$ERplpQx`mwf|T0_1ft zHgxfu2=f~ZUy!O*<7_gbW3@Uw=!RLt92XCHXEKo)ab}cfM@R$5l*?A^TV9FyR=ap+ z0?oFEiopS!NI2Gg@#bWB}sb9*RFu*J*>}(&3jG zSQ17Ly48Q#ALgxeLI|w$>7C_(Fg~SuRA;2swjfMalb=*d!bHTJU{csWI9)@bpBT%L5nI{|axBBt+> z%Ij%^s9M~1zz^jFdrb)Sh)C^?&g&k^&zYhh!1HxecM`{DE5x=K)w@{C#>4yjzoiTwf-WKe8J}aW_00jNxLD3BveR+c$%sExnZ>g&SX;4_5%-b|uIX+07Cx zk1yTx-Qo|z8-+liPKe#W5ik%rt9+N`7bp>ge^Vn%S*n$c-m;%+uPJ^kVfv}D8d&%x zZ`WE0ayNB8rYNlnMo>Qu;HxIGN)6)ovj>!O|FAyjxiK{8KCCKHvSzQ}x$#Do91-eP zPtb)ibg)yV3A}4H?z>wT!~^&6>ym;K^B1LtY1=M@M0-BPGSQe06UF1OqTfvV2!+KdZ1DQ=c4f=f7^@pd>Zn-*P0)JJbW%HQNwWIM<~% zA<0t7F1bm{aB}JlJGevRa5WYs@@HEfh*OKGS)i5BCMeIx3AeasRTk35U`GvF0f~43 zvDGih5X*-o(%<)kSYwrp)4q1bXtBK?61(gZgW*_XyMKQ}D?oJr5@d}u{J7Ql;OYxs z&Q!fsEd&K3F5$UII-9O|o0aTLF1C73S=F}-pmd0f8DiG#gKY2vc@VNX28d1;D!mVY zG)fv}vws>D%?6ei)hF_LkI34S!Vq={mr zomQ$pqCx9SFQ(RyYL73gIw)>uNQkHCp3tf{O-f$@J#HSYGd_}3rS6~JbSZxJ`L?_1 z)_s61eBF}QDhmWZF1I59#bmuVXx$0W4S8``WX_Rb9+wjZoKVRva@GSHHXFXExR^9k z3f6B@b2S>E=20^`GTyU@GGuWx>MCRq5DG~*oBKNbY0}=N-d05uL9a183Ftn}R! zIuqEdH14UQ-|=S9mBGYg4xU<#`zr^xO!odTPkbEs%s~6^nNb*&<99C$r4}Yh1^bop zd!O{$f@7@&cA&ftOV!nMI-=0L7htF2EGg=T8EV<$JJHslo~)sc4np$cOt|^lzq(4i z_S5DjJzZXm+Xp>EQw1#>kUT$={EoVs3aAZ?O*^uLE|913pA~|_QuoI}JyS+&HCJ3p5;f+>J!2{SYID}e>2H*aoze~xzS;+?-#UD+BBG65Kp&XMo@@nH z4y~Xvd;!7F$0sFvI_zVw%cUh%JzP*QW{$dn9xpDz^D^4cPQQVuRB6*4X)WdB0xnxz!VJ}KNPzEKWRA0+?dY01dcy2feB2-Lb- zDbGWdDp}NoVm(9D6ni#Mx;iNYE4;TshcsT+0u$8VWPc{b?!4UHxux!wjUWL-Ro*@T zqdaM#MD4tm*|C??Gk281ZPXpqBxn~I2P7hnK|zTpV=g4h__2l$?VY6JjIR~d zY}Vl@P-^Xx2it`m%81P9?ngo|&yt>{HiT1B|Da&=lr*fx3?&#IUz?y_#>BSD@h;V* zF%M<7Tj-nK%tI(fP1YxI3zwgYdoRXDKS{9)x|!0h;t*r0qVPF zY}p{Q*C4cZA{=WyJJ8+x^z=dI7~cd+wPU%(yXNL^um`D81_YRuSY+EHzrH1aRtX6& z(^N#ua%nt|`fif?(|HzMlu)iIY~nlLP}Qs7BWO+4o;au*p$lB3v>>W-IjV*c`bXo| ze_g20#RTWGxs}+O(!vwe*Ti4vSxuSstMfOk1q{Hwio+duIY~l!dR7b(JDzp454Nmb zL#@yOqYO7xBaz?a_yzdvuvKjP_jzKjD}$K03`_fJ!a3rczTi+j#W-iN^Gx%8o3pED zZm@t%?q=7WrSS7zCQK0l=!d_8H6iK_da7A(Pi|8<;B=rxGed>XDhjzb(zkWk+qRZq zBdu8?dV?W;n7scviKG`p(2wHan3i8vF?5RuN@XL~lxZIUe5JNcS&Qr5c8W+;GZ*g! z5C@k$TwPxTX#}KmNW-#jf3>$|i}#A?V8J|)$OR!SF z5NTdIIY++gpkk*DNF_dsWy?iYnuH`lkvVxcwn_AmS|z^GnGKWy6alX{J2gEgIYd7V z41>{?hmVCScm*f{ALGapBgA$8pt(^qaszTCCDjB4#JD>OA)cU(!`ar>C{{W&0lQt2 z{R>&@%g`}p&CeIYlQw96mvYPHFqEJd$oE$316~$SemBG}6+k`@As`C{{sS3tn~ZBC z9VCNBWp#?>OnC?`q`XE2ll5y@5H*ecpO9)3=`xh!Iu#(n#;{nJW@4ug?dMqJUVqN# zrE@P)tM`C3@?_&HB#asGu_eiNyxxsXYf?snRBMh=P4Y)5vZ563l$=??OBQmq zMtleJfThS(@y>vtTwx-{d!_Z~)Snk&8uX+bfYbA#1BcVZ_#VC|K%it4QT7?xkP-dSjH!Ea%-#?;;i`kHc-w(OH9BpwV`06|@4HuacX(Ixb-RqPsDDxJ{mxskfS95p2;Wb-JPyeS#6r(#J&dH z-Ed9&ts9G0^}r78#2uCkO?QI;_8+S>Mf#_577a^9W}3% z08_MFvV8$C5hTDPIZ{MM$u&|$2gx-OL@3EMGDHbUc4EYq6gd(^mlQcN#FvygVnn!< zxe^3^raNNpx+vOkJsP3f?oo&qF=}y`^k$fpqL3*KFv$cV6PiGhae~H_{)D4A^+`Q( zhp{T-I${o^6-KoLZ2oG}a)Q=>cS~`=lVS?MW-Y`Fekzg+KxR$EG=8j-2?5p()Z&mW z!;JVK_hTx~DebaX&Z^DoA1=7KsdQMh@vLat2xfp49*(V2)@YsDYwR%i`857^HD%?~ z8ZF=sHpNxb1I>{S_~7t@DD8y!1}W!CD%bv5bT3OL!|Omtp_o^PE1uM<$nu0)g5#P6 z*Q-sIjVUm8LX+7KCz${TZkadD!3J_w~~eQH=N&Z=Kk7yW_tI8&c^;W z?Y5RrD`dO5)jMk|?bR|WfS;IZsCt*0xfkc`%H?CBQ=-95X}2`1b7tm7a@qC_N=aEx zy8CzVy%*Y{*~VK^N^MrsC48bPVL~J9R@M8m(%AMYD`pl`e49SUJATeFcV4zl47_)? zp>Ojt(QN8=^#80goAD_>3Xky8Uz-=IST@!W{c!hoU%yTQe|6&6CnbM>!fwH6WEP`; zi^*JEF)bQVZY;Pe8C&M=+Q{Ifk#bea7N}8CNkflsQgBnPXS}q-pl9x+tn+PB_*k#- z9|5zszm^m?tH0dE;{z=VMq(tLp|qBmht@Ruvd}>5E;Lm@n0S@K=SY17W}&r&(#I|K z|9A__SXpjpXr20Bw6@4jm%?8yj`&g@Mh~mH(Ugd!k=+V;{_9YhyhHf(&vp|pM0L%y zMBl?}A(0T*bL)KDOMbndrlDd#(>txgs}VS$)?SRJp4pgFg)0r<+b(TX4>b5SEuy1cSj|1Y5}Y1EtjijDrEHS z%L-IUJ$P}0v~R75uEshY+0qG<%}2f4X}s!7x%p#xMK-Sf?grTbt!~$viKibAyx}$~ zN8kAXwmmfr94CAxy-Jmihhr*mpxrTiOd%&QS?by`Wubs60<0kWmd{U|(Asyw%bdo2 zJ;S!%>BRy2nGm80gyjkPqj&s<7pzQPz5$%(n`vj5<63_&pBU3CFNad*Y>zv+E0P^M zf0UiYL5{DflTVpo9JqNGnpu?fh5sps8kJ+CO?L04ZOs>Jm-Fa0_)XtbL>s7@CXhol z>t3zRt=b=G22J%Bb(7rZNBpIfLPk=6s{+RAFT<)DvE~m)%g5jLI#`^N4y{<4knfMe z;M-8EGTC zwLfKg8_f zW0|w|jkdt){*jq>1n`wgQMD@fOa4|iF7^PE-C*H1b0cITjON~5jrjfvr@UG!RWvc3 zHpA1RGHLpuD_d6wLGwE97z<&c;K;N#Ep`A}psE9xfMZs1QUI~U_~mE!sofp59NVe( zq-+zdW?lPRJJ(hPbF4^$jHnqQ3d}6~)SOm;(&Quyz-f^;zFC9F zQb#*B77NWwnT4?<(Jt0ieM77LZJV2(K9MDS2O`bdvV!goi-M9HU7SndB{Mdc&N`vn zcW4}Kl1S9ueYs2)eq4E zusJfNgET-St$;THOOFAweZ6$fL8s9kK(f1Lx0Q50dMo@@WofxkYX2h^UaS+T%83$5 zm-^RNiLwPTruwzsKqal7dK!rf8HEhmZmZCWm<3*b_^nZUD>VoW1qB}8R!a&;HbphW zEu+MR?D*EuxjVVD%V3t9c-(dcb*1j@Igg~1-sYw~1*x6=fAx;#Cxigs3T#OJf zDIz&OawfnxO`P6dd&eapsNjOXF2`~hRtUak~mIbF$qwS|Nbu^L&NtuLMnuGz~^nE zm@o;pLRc9oWp1+;D2>hEWGuiJ=whYmC3)Uq3$K*VebtDC5``Gske76ILSICN#v$5l zvsXjV#U~5;-_V4l5Oxd>(pW{ z0C8d1xMEL#aA%In;u0=E>EZU$PoUa?1swm2c)6MLo4#BAMyJrcWYZp#YfSr;8w@$Y zHH5`(L3#!)$@3aOk_#5Kj>Lzx z$eG1$#UjU<#qT7UbAg>(J!H4~){hEcj~IB1`lafdv{{WMeTDDL9ie2p(-Krib@J+3 z4-SBFwpfk|J%t(<$E%W@xAfl{SEPGll2M&7Vl`Kj^0ni+CD+Muwef)+k|{z5nmR|w zyKQv~f1EK)S?N?7EKk^s>zPvMD${U*^O`V05*6+{s!{YO931Rpj0_ z+WbC2(sZ9;{r82Y*8^xl_{r{`got7Z#eb8EPaN{`p@F9~9VY!}c{lTfAd!WPL91E{ zvtv**;lQ~E=(}%|d}R#6!x0MeKOso`(n^FJKk4u(QvqG0!<3)TY8TMh#>b#h%D2#7KQ zTgCURwA(!6w^t`_lL~Y|$8Wpup+VXvyLwR>h);*ZrUM}zdO-DZeF_(IB%{jqjk|;j zi#G`S^=YEw?=7vujXxP9tr3h9_NXp$6|DgPV=lpkvq%MW{$&LuUgihVGq4>OtFvd! zn7Tdq&_+`CO>8Ryo`mddD_~j7M!!9H2jsUk5&jQ$k;dpJRSknxi6CIm9~QG$%# zni|0-usf{$pPb|Fz8NC&lare_;QfM@)=n7hm}8JF%o4k%i+U0$q&Kz_$C>T3ZRnW8 zrnceL-nh~S^_BA<=c!nIy*hMwMZWXM^VYf*hO+4%R>l(ps_wl$+#pMEz`o|C^-K;@ z-)>lHyWyd{$$GKJyA#i{$Q`$-KO8{kPH)^;Zdq#E09~G@rM(L_3^EzF_s43`?6+4w zRN)vZ?pnYNZ7VD1U>DZ4;%5yvq!2lfz^GJ&`-;SVBR>nTzsj&^bp~E!q9WKFC-~I^?4@ zAYRh#12{rZCBxLiJt)x97UmmjKA&x>Xk$!8wdR?6tNz&GQ;{hXKZZboHLHyBxN`1C zP1;UXWC?$)8`A2eRI%SlYNw=dGP>^GC`sHBd9ru~Dp6hF5kaL=76ycuugdihVUnPH z=8Sk&v?Ui+(nC!e!&@{jFGy;ujab}jK5rD8n3r58AuW(7dX2==YknqW0A1|n04-au zoilx{?TLJHb!-tPP5D+ZfWMP~PM7(yJTIdn(8)yRWUM|&U2qsFaelWnXUDR8W@SK} zGxx5+-5%NLCWqxdt9b2A@oVD1%2vhufgWGu@9y{*Hu{+s&5Ja;(3KjoJ{pl0c`l<0 zaPf@o_(tW#wOE;}Zqw|(Jx1L^TL+B~>a<{mG^5*U(l5u}ERjwbvZtyYR}}N{GFL3B zlQT0{?C}HBvHAqcfF-wfq03uWTQJEL6w)u6CI~)}P0OSVKDJ?Gb!G%VT_v_ZrgrBM zt2g&$AX#N&)1S{bA_QcVj-Xr|P~9XR_lU2wPA~x$_=j%U;m(=F+s`Uii9uZpKGq3E z-5b&iOgNewq~ROzRMv^iI1%L5iAC4Tk_mO^MaQU2} z&^n=sXup74d?`HsA6`KU{KL2XAiME|EkWwNBr=W=e#$l}ah-q|tz+>WLJqTJGLE=s zH|3lonH3>r_XI`tNQGl@T2i#UiNq}FqRV5td!Brm)ZU?YH!Phm5;#+5oaov%%{+N0znR9hs%$#`MoM74V&C8XSw{z@DJS1K8zu@}j@1I99D?w5$j zytR`Zc5$71M1qFg-w55jM8BH`&3g!e7To~U*t-CTGn-+WB5*!eDjNcZn|8;nfsY2u zRnht(Ucu2rYSZYJ%LNE_x|a1Kxm@4C$igX(Q)~ixcN0h_GK&BX@LXL4>FKP+S&GV) zDUKg(h*-m!^wXd_^Al`WQG2JdfLBN}PSG@uzuALYwLXRJ4&!NQnYN?K$EkPR#ai6G^S?$2aTvRGwczl>(Y50BDhPq67^ z;9req?hl^+$yKnaWHb;>X8;e-M_d_Cx9%oW=F%OV*a<2UIsOLgBF&9wB@WO<92?C* z?u%iNIm&>J60xT{LcAIGXHIc|X5qGuX9@Mv!LJ*wSL`Shu&B3C3V7g7Hz|%K>nal=a{nW! zU>=6{{q*=vi@ai z#?m`vteRLCA7<)OCNU(OpFghDAWh)k)~>HGOAFA#de-exLv1Mz?dUU5-p=S6`+OD8Xc4^f+QxC?W>28|Lyg3$o~a9qeKvz99N`x&8pQ{ zjHz}OS6fi@izihUK#fxW3sNt;T&sbyvfaHR&k2hWYj-(VUAUwko?&1QG#yRxS`_mdQK5MKV`NN0QLNWBr|GW4z(|3hJ}E=L+o8y2sYq+Y0lw6R^wm=?T8DJGhHq%QI#P|F99*1-GXShhOUf>~nj4 z3$};lXUo6NUPh&pv1>KhcYCq?+gyF9()q|R2{IS>*0)WS5|Bmt4p>DUw!C}u=GK0H zZtM8tPWe#lQhEb@(3u{}Z{ zHn+R*_FYjC9E|1oZb1XxO2~JATM(I1wR`Dnk}a7?pJboA{Mg2E-@=) zbYB_GCM?oin?rVb;F_Q}hDdcm*LWWc5KmiMA~hHbJZ~A=bU%e5*JE}7wn0z0vS}YveQlfKs=lM?aIW=(N@#Sn9?8+>7$96K#SzRwxanx{ zfi@04D6?wD#L<`pIon?%bpV1Z+%;*~|E4Yrj&O;>O9c-v@(BvpqFVFKsz;ubQlu5l zdKjtV8_K#J$zM8}RU7gpjzqorCn2)>5a;X&9#q{FSKasC(!D{7WjRin`m^FTi1goY z{83&jb26{B*paY}4siJ>3W`$~4Fp3EMZZ@rafbyb*0-xkzh?IO_T3+SQd4n<1yuHd znZ;iCP{a2K-GUvIth?cr#+4KY2pIC_fLzC7B#x^z7zYcO_BAu5`QD5XNAD2gXYaWH zzHui9RB&W!CO5#fHS(b1LMy6_jBZI1NpSuKeVDw|r|@Gm{lK*Ams<^pE%BL1fBj4? z?HE~`BE7uTKiN6%!w~O+ixJK+PPcFjF1MpfY#skNsBN0l6uPZ3Ri1ihFz3xeW^KZHaA{H?nSc@AGr4wz8T3pHhYZObqYsd_ut4s{NdKX(9N- z($wdM6)jHP?_7_SW4>|^J04;eCh<#Rn@(<+Q?L$G)y=^lU#*a8i0`c50!WbtH_wK^ z|J}Lmpnep}*5SZ?*^k%?EJo7~ZJRMK5Qf^yctvFD5c&>_w#MK73C+wBdSNSo*%dz< zN6ZwQxdYfS2S>~id|^G%{u+?FMj785ZeqoHReI&#PG`6Vvx;!1R3IvmSC#KLNf;(w zWqR588GTTrSvmCCIOo_=yrX)ve9$B9?fLf6a$EM1-6RLAcB6a{#rN&Q>-dtClA>nM zna*!yQecDHWm*6lQXmGQgESvB2VXowt8valHjV_e$I04$ll}sYzl*&!BJ~ERb~%`1 z5UDLX^%kN0a&(jUCK8cLOgA+BQ-JP!IJy9f_R;QRD>o;6m>cQ46oW0Ye+oEvNaZkE zZC7YW5md5l%ACSzixtFDU^H4V;>XEDQ`>gv0uS<+nK>C_9?_Byj866SssmW9FBgaU z4c2Q1?Ck_Ltk()}Gw>UM#Tr>4F<6w~kLOF&3w_#qwSKCqK` z!HZ`F&K<`iDtI2}~yE9ZSTiLOxLLzhITcBPHd7oZAAr zLbqx5Z3ld;2XL+fPQexR25vg|bp}%9B{c#XoALj_lnVh%$_G7f#s5Yt+6~||7x5CLIN0;%a2th7$_F;~t4zTm7XsgD4Xj-IFU>B^oAqR$->ZJ#A^n~`#vQwz z!j#|W|FWolukdc5(Z@@8%Gt#hR}W8GZauqugZyD1D|=(+^MxKinquJyY}b%bXk4`` z2oSVWA(T%3TtAigmI!2AeEb-~piz)8y;isZA>deIOBQZMyLn0_VS5$P@Hk@hp=VlS z1y4Fa;f%zkJp;Z89*7QB72+_)4`1sj2#&`$R80E>M2G~KM`udnaWt6atI;YLWbYk2 z@0KRw!nmeSBX#i+0=3&uNlP;~Iu7Aa#@Nv7&i(9T{8=#0i|AEm&Gd5kuOTc3`j+*Q z^vJykTTV@#hH)`6;43g&S@3j!oC|~>I-SZmVa*BRKzrBUJrfs7#WC?mq^glkL8T#X z6E>H>63L1>tYz&CoAq0*4(OuAcAm+j)T2nwG7OIOAjdS1Y1wDW8F&jh)2`9ZHVlgP zV|cc=vVl=v-pQj@Az^*1>Y~&otYj^D%}0oq<=c`fEEEQmAx~K7h~&FC=o-RPpmDd0 zYT4K}Ls~GellU#vT~S1&hGUqx3~898IQ6K0%J$PDL%f*wD^<8Y7e_>*1oK_a*ZE;< zLPVT%tI|Y*Y>{E8VpY#UBN~xm1mrnh@4F%PK98!#Mb9KcLr&3w5mE@A3bhkrokA<2 zKlkUvs+tpGfkG<^U1Eij6T2h!xE@LItf_N!hgWDLr>e$P-GFL44DurxS_n(=eYFO7 zW)!|n^T(S3GSyMc-j!Lm^g3_kGxR&Q|58>`O{B)VdSSbFTFKiIN$&!kc1AO|#V~@9 z{b`9GS&8B^rQ2l#!ZSZtfwxFaB=Vp{Fn8*=V3}0%OA|T=?Xw<&YvUD$#5BXI4+<^- z8`=y5q&EBJj2{_gNZb_Le0@Q$L@GNE;pJF)S8G1m*y>vPWk~29Vvxs*hBY z@vHLa)gB5%Q13*j|L%~jBa5JF)q90J5sqJGz2fbUBX8M=*!~-JMkzSwck_yP8Skdg zJFrS#+a8-1DGxCn;IqL3k^%YZ$Xf7=(=vyKvNA$&7aYU}wi1 zqT`$}Y)smKbc_izs{!cEN}H4TOIwL!rwWkfsAG=tbUUdP?Y#Z{HV$ckd`Y|O=B z@js1w*8O#P#y3DDP3c85oMT1IaEby?Ko7_bYGiexV2&Do<4{;QdBImkJ*K@^&5xpr z!4NxrZLgTl5I=ydOBrY9ng(S-`IdoXc|^-rQS%XMJ$!7DV+2Mh;Ww+9cBP0SSxev6 z9V8O;UGM$ALssQRlx5WQw)+Mk0y(BefBlx1P;%cs}L8Mhg$Ha+D6EqhAGk=0VD zYae<3ZoyIrpUx_TqbaRx5BFM-+Q)kPIQk&M(9Cl^#fH3{>2@5m@$MD$%&J0EiDtHY z8<3PJNLWJP`@FZj2J0nYZpeUFCdB8rXuim?46OSa-X~VJC2eexM_0yGN!KCM-o72a zwN~CfMQ(atfGcIZJ^AgVS4noMlmR}Pab{UyUch+K&(0Z?)?d!f6ImwvnH5)71_Q39 zSgq{QY~MY@HU^(wxp^PksPgKFFoR)L3&2>AD1tyhHhMF#km3NnU>=AcGl4mw&{&~; z_+piVRt!L&gVfREH{GoJJ0<7Dk~dO+ibn)dLvP?dwd3!vml1a4VRD!6?~~!X(Tk4| zSw41j?=jeBO46|O(4Y@sSeWdbkCRQ2sldDbvRBqV1niB#YH&g67yKn7_d1*7R!q*O}|HDm-d4L z@ZM-(yJrz{FU;|QVYz<$3Q9+=JkQJ-zX zbwkbquYFP>wSUTOvOR3Ux-y*eM{Tz1)EoG`(u2 z;g*W6v|K4Qg;cr)_R*BGIjbPWZ_rIayJueJf(-Nta1koMlR1Ru#oRQIDWPH8dD9 z{q>%arHXCjE)vB=zq+{}f89ry=@fT)pG#FZ@N`|N!nwgjcd3%xx9D3zya(KZUxcpb zw`Rp+K+N0EhEokOELZ~$qnK)KUgIO7t&a|B*77qi;mQ;8A`0(4m~LL6bgu;H&&+c= zPWy87cbPs_t5WnD%8}cSKvE*@eUfW2IfgTUyxMJp$XSEkpOww^aZG$+z2yyrBETgXOlhrVYdul#aqP{}itFAx6VN$U~@aRJJxxl9&b}99E zwP0ol`x|rgIFtR)l}zBym~29ow<`Wk%`~hMMKEJCWr%^vVg(W%xG)d@n3-udAvy7S z(hsutd9LoAyV{BA1)>K`sfH?NojBz0a!yDAE;Igcs#(cV;u}-ABsZNj+ME!G?LH4A zE4T!xN|20uL1Z+bxRTe00Xh>gJFWQbdgAX9qV?AD^SgVe@;MEbp+&DDjQsOg)DgV> zXTvBXZDI<-7(Bi%x9!>A^N4yHig58q5W4*q*_1fgfqT3=b~qG9;UT2f0kD3-DC+6I z!Rci&tmTD@Vs(R2V@~Dl#LzCdWRv(er?p(OFO5 zZ}zqOTwye7rX_7uJvmwtKVG>vivBkD#^SzO_Ctk_gXa!aP?=PCX5rvgBKySbHLj|m}-7C&P)>5&(w;<90??CVA zN&*u~0LC!K>D$F})29C7a^k_)gQWTHUh{OaU8Vn@Ppw)t=d(?JnQ-ggF4dh6(rSjBie9h1M+XSJFmuf(BHEA zoB@a84!&^ERL`2c)BL41M?pl~8P}sSNUtyUtXj84J%9gCL;Ey{4%w^UQR4ve#HLH& z!KS`oe|^EPh(1)CD}_FK78lq(C?XFqR;>r zn_?KTE(VKg|(!Ld{m!{ zSC%QC3qPn|O;~hykwE#-bA;&G?z`S0oeP{p1GT>Zhc8OggT6R8pGXs(xni7`Ze5%m z5v!ijJ$XRb$gxpMs6=stLm20ZzV9K#ErK3+JMy~v<31~^TbMdCyzvi$QSK1C%CPnf z!GHbG14S~p?Woj>_OmTJ2w~xF&J5Z*wRzA}sS^BmIo@FJ?;3FF_dyt%VYDPiSlzA~ zydFn)twqqz_h-J3fxD4g@h!dA0lPgr^D_3GGNR4iBjB{4L`cu%$KFdp+jIE@ctb|| zV{`H0h2)OvIggYf_VAj>2;wfo8=6yip zex#({V2G^9Q5Nq0)oMs1tNN1oKCHI?OB6f!u`9Ior$WuoQY~ zA*ih~#27-;;LQ92`(Qo+vvdVu=I)4Tl{nJXDzE$%sCi+o-EFyRxA<4K3`xr1FfR={>~evT8|BDUvr1f~^ODXuHTr&;?C-ZiNPGsWe<)g*OQs(UJU`*No_t%4^U)QBb2^Q_8C@YgWaLGFI{aZt`0?cV-QU&uJ_GxoK34$wG>fkE6K-4{Et6~9Zm?>QV3Fy zSYUG@62d`IkAozFK(-RQuCmmFD-xH91$?Rp+htL(c=|5Qltj;$ z#5eH&uNFCc=dZ*y0KgLp;Qs(WK)}BM3jhEBV{Bn_b7gZbYGHD;yHk`V+qSNqwr$(C zZQEbkwr#W0mA13ewr$(2G%EAVx&CvpZst1s-@EO&8W9)KT8#d_&*-B^A4;;IU}!*4 zP*6ZXK*T`*ehCAi1DQD3F#=r8Oe`4z_NLAbR;G-$R>sZ%XD>z%D{p|asUyI`%$ZU1 zUt^`e$HFGAR_<1=US!M+Cbj?<7j-pwAjp4z>(>MjP`CQE0;(_?KWK?;Mv0n|P-URb zujaAfSK!|TbC$LX(bDi=EKVJ~Euh!-O}Qd>;J$GA{bEV4gOGOxu^uhr!)J&U4bl#` z-Ayhx-4+TKy}o}QvHM7znTMF{28PH{Q`&3~U{ok-53&&IvZYKUvSWj)gS0_i;FQ(V zrkD5zW%}kHWAlbLtlI2fmj&?U5fM-2#h_`sND5t7tJv`?qco zDSzX<$l5bv!rbZgn+*tPAjkxf5a6Qv~HZDl8a!&NB# zJC8DGGzQX+D1$TgW?x=YI1kzC7g4N4Hp!b0W5|rX`TDfZBo2>D(LvyTEhnPGQ zTp&5h`>d3Q4Wi#6R-tWhms_;k$dsvIpqW77ss8H}cB8U4gl7<-vFN&tDcD8m%!;jp z!_ureq=ZLneafev^pSuB#VJMdOxKRGFoG%B0r^&JT=enMxEs&_5F6_u>y4%68WZ|d z%nwhVx91a)VVxJ{Jag7|j;UX6~b^3LBGvQbJ2~h`qY)|$Y)}O#fud8xPk30>EEz>D+RDudIDDu??9H)D+jqmJN-2kT6jrzct~R&|~rf?6Fdhc4f13(A+{3~5vgn9sy3a#(&=Qs`D#>$XL;#C$vsWA9GeTFGKT{P$uG6MSxlHYI*iyV^ zXK^djOVQk^5L8U2nZ_F@#HZL&q<0FCS2L{!x8oQb+l9bXq)TYwhMAO6VjfiLaaJQ3 zzBx2MgCwy^QQOhV_Q{Jp)T@xf@7h+sB>yFSPMhWP(HdOpTBXC599^l=D9q3DAo#YV z(lB>iszS0v@hSVBleDv4v(7i8VXSo?Zuh{o-BrNrj1jvq9&m;uH%Dr^=raTXAt#G^ zQNS4Euk?VbL$ND%HSj1|KVb2QN5&0m>O&0~>6m_{#0wk3g-AA5KYu(3j$`A}ed&k} zOW22yg!3oV6*td2p<1{?^wA#AHSyOx!4)fOX)^YxQIh&lO;oG2KkVU}D8Yy0{qv9H z14VLiy&)#*w$%E1Cl=Ci6bYxyFDq~3QOEc>qG1*x$uG3hq&MKd^}puK?iBc!{%gSh z_w>*D5Bl%c*j2<+NBgp0XQ_wNg$Zkk+*nb^l)=`a0WVl`r@v0$Rsk2T`lV;i$iy_Y zH$^9yWoaBMXlxvdgF2bwz?Xd{<99a?`AudLdph;AzHcy`e0zL{`(>*8H0QSSbj#=a z^R#sr_|fPW#x&D`rLYGcrXzE_>>1$P8Q(ydQC9QdOf&%BU>Jxqq`Fflq=2h-pZ!M9 z;v7QO%HH7g#2jz1ZFt4rX3Vm!h?rIhe@ffGQP+sbrXwaCE|uFtit@HyW2e5xO3~Y9 zB>G9p`;DBtiqC{4^|rxx8?M@nRtuMiH6+~xTogpK0_Lh&5o&0`-T)eJQYXGcS1U(j zr!A*Ndhv&wyp^KV?7>$$%g8?L8TP2M!A5#dUAfQG9y6H_RNM)V)g}ujn2yT&HyoX= z_3)3M6mY8f#C>0QiZ1v;a+w4V)+3yzT;o_f0OCWiiR`3Ol3V6yvbp92i=g)gp)6SL zb~Kcq`?W&8Q}mvtI4wUCRX>a_vN9%uq1McSCsRGqtJ8!)O;~Nur*MiEA12_~kUT72lrr$*(%Ed@ zf(rGBd7drp@fUDl9tp8hgy6~Z%PgIxpWAz!iuR7|(9I3iqc_{w_+Ojf|0|!2iArjU*8TBoa@n4cXz(IOLT{(5G^M)!X8B| z9wg`2;_&maO9Lvq!r>21We8h8QzdSXk!^udi~pR13p!a6Ae-+|#?RH?6xKiaNyFQI z>!5pSZWFbo!$!iG0mAS!n=c`L?ID#4A)>b}K&RWR`S5j&fj5yJ+G|4_Q^F$me9te5 zJTnJg2M$6>jDz!fSK_ma{N8$iz0i`xCg!&?#5?m1GJj7S|A`jwmA+w(1L_-kT5cC5 zvG0`wE)rD(?LD&}HkNKFiq7BXJvxh&T~0%SAuXBzQ)f?dE2={WnZ12RaBkxb>=#Hi z88t(FRL3~{Qd6Pw>5Tc(x>#YP2_5=;eNexY$0zef3!ix12uYUl8;OGLp6fVdJQ;^L zA(pOsWDVxilD{05fG|ovN!aXM7~>hs2RX}YbS=5zA#hJWTF)?FPm%KOA+tYJJC`U& z@>$t;3^DEHcT;10#vMyT5(#%uQNUqV`13~ZoO5mFiEHRoo+M?riL2rbiEI~!db7;@ zEty1ORc*=T1Gq2HJ>%ab>mJOIlmP<*s)YUDBN^L2l1x_>PaN$Fhl97Cw=Y~bxF1#~ zIZP^CjEoG7L|a;~NpFe->vq}}6ts!;QjW2H9&7gxsD`$gN{Lys?|eD!c*wD8^>56# zpXp^5K|&nr+Uu!m^P7I9AD1pY4{k4ShxwhoAfCYaOGWsM5{^J2$T)e?Mo?v!P7s6E zo*co*v6Uw|I6Y{?STiNjT2zRI2>dUN?2f0$Kus?zD; zP^Yvf8;+<3ExTZH^0dR12Bx9HOH+>{$9>%mJXw8rC}dqG*xUIh`DNocMqS zwBRH|{)Aj(^7U)F+hvu!+KS2-=enlwmew!dz|d$H9AY=@;qqyjlDQL+;Zt{k+tZvS zI{zp*CI)6=D<7dgid(z3bpF$8%taKKvUe0qzZ<` z;eioX@n!~)fnUY$n4r4JqoJlUds9hdi)vz-93D-z319Syj|!F3p=>N!BX?iroH@;n zr3YzP9Z|>KFQxYF{ZJFs$6T%CIZd0$k?lbxqAw>;k)p)QR~PtnAo&yiF1MF` zPIP8bB&t0@cj$6VqOoyyT{c(vX;hiOMJw^v17|!F{OHq};n{-GXB39c2BA^_2<17a znD{GDNBOE;i+k!9!U2oH7ubSkD;4wEq5!f6WHQOHTH54bGS5SP$!Z= zy9l8Tmhk-C>A03xi`N4GzCe?5&E=?=~vK`RV!0M(gw40QR`DFPMED<-rO zirM7}uWf^qH4RaTVdraUd zv4&U-1YF(0!Xx^~PAG&-a4R2_&d+?Uu^?9JS!I$VSOVr;A2;@sT=A$V8m5j%*xoqk zn(~s2(Kx%Gy(gK%UaeR-+>#D)STcCe>_iK+%m9+q2`BYrrA_eEWu5c;`+@2y>M`UqC|79h`^&$swj3nIoMJ5&)}zO z!&TFHZO{xk&iKMmE3?#`@&v3#&jztXgyfL5ftd@C1aW+cFi<6fG*GZ|BUoMeWvgI< zp%(e`a5lhY;q$$Mg)Y=AG5aMMMkEig3xZ3K%~$8fYl|YL_wcS0e3FLv_kIuQL!9Vf zGE2=5bck68*OI%2o_T>t=l>yigR0x_Su!+IMD~^-d&SRfh7*w36bG1yc-rKDuY#W)8n|Z+&+eXa5|t&VpE$ zssfAM<)9g+9pne=eKsw9iAUE--@8$NsYg42ArEtczH<6jq3j|Y@V?q3?GC<_yavg= z7A$?~oAVR)!M-LremEfs_A8b=6Q;dtBMFWMK-?R?hM_Uiyq3g%wobjNBe{7}2WH&c zoPWdx??NyW_NL^0E8qEmf8!2;d=f``e=75QEB4biUgQ_wTU2z@_J>Q_u1=K*rO`rDDc0bQ0zo?hw?u&zt(=p`P*7KqL!Pj%kWbTz zlglfedjy*PnYq9(TksIP7VQ92rxSKD5t#wMpvNN^SmPRWmxDP(k;V9k2{SGZTv-MV zqff^VYeqM8QUrlqp==#f-11{uLe|vPDsfuS;COT%Rp`#gq)#;;St zbx{1F!BaaqvF$CFu;%Tm+H1cNDt&MFuG~p)w+WrXRK;2~gG{A4bMU9(p-#E&4Xa!{g>kghw;9`U}Gl3oZVw)R<6SR-34HFE?29r(riRpbc~_)h3A_mza@3pP1FT^@fS#p?xxAy;Ar zvF0^G_@8f`g_)ag(2aOZdhtt(SjoJC!+Y8=_i)gt^-Gn*@A zLx+ za4l?1dy{S+J6H2%4dV;a&tW_1MpPr4Y&-Ewvskl9Tz4DniAzPDzqEA7YUC*BM78dg z5W=0w67&ZKoPrZUiAPN+fpSOd6@K8l?bt*Cb0`j6nODKH>X?z(`79d^Y!z{0O{Q_eACh8GpH-f`Hg|g-%3ExvuXzj8 zqs-G+^;A?uIa*kPWS8&9!F~1=$$PD*N7+h#;WVc4?Kc|JVKO5q>cy@ir#H!RPA*(h zG`lJiw;qQ+q3*AcUinI99DCIw<*kp9qhfk^&6LRV0&r7a2`vuVlq)r|d*|qf#zfLhG0>le<(h$C1{uh>%uW%pl;Ai&Z_Rkk(<9 zA);B)jO$U+9Py0O(xXhQSmL)-w6NSo7r)33qhGb)k9_96@T$kRdRDRk99@n!>=!y* zNBMlG?RHa1kNVA5m8<}%&SH9vO|EKzj$xaI(2yr3dtI-^FQHE}Y&9Axrd69P%_$ct z-XudUqZm01gZ{!4%MEEFBp8$egRgESl*&gTvqNRVDg9thZJ%_Yfz8G6YqR*7q9eE7 zNDn($#H0KXqkk&bxJ$d}$T#@9mFAJ7htS;Os(RHn+eN(B7p+6Gq;-*3&AaT*J0sGW zQK9nD-aA3&w&VlNJ74Cu4AC)KEj0?}OpS+FWq0=B{-@;&(6#z~;#CIZIdPhR6k^pQ zl%G_Ar20FPpIAx4#OG+}HxYs6xrxe0+g0cCsjd6KFu|}g$Bz}vQ(um1@|68)15&{T zuPc6H+a|GV9Xj{G6mQvr(YGFMj)H6-bLmT$<{Si!rNO#$P0CLCpXCfvgphQ)2`M_t%(jP)j&M<`dM|$xcr5z#{7~0vkKbyU+~&g8;1kp})cT#Se38|0 zpvRzFZAw>gZ&%J!^5Vo&Qbty?An*05%^VM_!d#jwSC?LLt3a6&m72TFs-JZ(puisL z+?ddq+g;%dJrz8{tG@XdqSKpX#DJ(kRe`hnj(_Uzfexz2L_r46(V`gryVwTx*D6!4 zXph}bQW{1KeE3{a~1( zYzD#Ml%*V5>=@^T?1Ph7rm1u6T0ozVL3XO#`JeW5&#pM9qXFMCd+zp9Eb%1xLok|5 zQbaG()2RvSQ-k}5O21^rsS*h&n^6`MhWkoJ@vClx8KwlIOj|6 zfF`_jR->6hHCxh2ls#|x1!9AqgS>COp1D)J;@KPEg| z`0ia(yCP!o&*>!%;vd^(CVW^XNX(0ujt$@pek92FM)N`nah2%qR}*M-vnmsKxoD@0 zC^kwR{&W_pN{f8D#N{Gp#k$;b^Dj49vfw-AA&^7Y@^3sW{S29N9YhHuD<+@9hn{4~ z@sNf_%9isgik(OO+l>L)w9R`NI`1M9oineR!iZKByjilLd3XB6VL-4cfFB9NaISD^fIe8dN3re zOCCmaZ}%9#*!Pngz%_``9?auudif?`l&9Wm79QLf7n6|rBuHE=w(HY&O$Pj;JQ)9B zKRISvg(Y6+6h=4W{bnGr@=V&?3k(@5qUeO;QwyBQ^vzC62e|p6%h6jhszdOAER1G0 zHy4=6s};SMjk)-mO5hiT5m>-JLCG! z1Xa!UpZ}6LiKIqXM|_oc?fPHW?e`mR~>07~C_ollxU_y->opHIA{_ zptH@e=`#9REz?h;;TVu7Shc99WlJ*qX=>kxZO!7>z1Nh4C~@mzrkmlL>OtMwP>8QY zP@fNAt`2tzMh2Fz_HEX5R~s`B4sw}Z^L()snF#U#vjLfsJt2^HF1{Fy2ijesv)rZm z=UJ<)-Ag;stqu3L?qolaG;hb-`6={2^=aPKE$Y3Y%;;{i_>F15Xni2?ls{K3<}R{a z?KH44L7SBOk1?@ozXPp(kue*!;5`v!@0LOE=%)Agu011Kf6IJD|Lkc@;kHMgxvIk~ z-=D15Hv#RMENJJX?PeTWdtlwfagv6()TyXqpnN2?ocOTwOTuKFG!pGuP8a?liiZMh zv#y;Do;FlW;xY&Z^-CdB8LG9}+$q#bfXv zXcjb!`G$L8?GuPItamUR;=GeB{X&1~2{nAUy}if%MD8tt`HU|;K#bqTSto5hMCro4 z1wgNH=0Va@N4^{gJnJRW+zWK&^HV3r8ZT6>Nx=v><_4o$V1t^$++=Y0ZV6k=1NW{L zF>Q@!h7}4}9MIlfKaE6lr_N@Lvhe>H{PbpAk~gQiy)T^H;VZ5Zv;B;c{+hb;`vo+T z!ms}M+u)dabEXNre32~Y`taxRO;H|PEx|}K7bh8^b$K<=?xOQ+UN|DpX6hXi@1_}n z`-V_ElV77}cD=vX_=F4Ym8j5100Wg~fST#?NwU*PgWUJAH3#H!;`=QEh3`Zp3y zapE$~si|YG?UOLr&0Q`&-$xo>A%jGqri!wBN<(60{f|;3Y;_ZM6C?VM4;F$=Iaa*; z6Xv*R_E#n!gU9XUMGshk-~?{~btFp*JA3ayG!nt!&oYsGOj7fv$PY!MaIsR<840Rb zF|)VDNb7<*TQy~T^Etew1#s||yj)!$4uO%^$uKc)XuOMrkMne3I%Yrg!Zp7 zFrE<3e4u#(0$w9eT7Lp{@$&2Ih>}~%lzIaFitDEPsl(rD8OxrvFU)*s#Rzu;i{SG`}iH zYp>bp>q9k3WtP%B+G?Ivl|5#?K%FV=-n4o%G}~N2d0uqA`5+Te2PtRUGO&>V`PG4< zcu;{d6a*OJ(~|O?ApOGS(+_TQ_8k%(OC{16k@U?9*_S$q-nY=QIz^#0=J&jLWP@8{EZM`7`(jOTWJ{E4EBTtVG+$E%Y?rh&XwR_2R@Kl)hP6LwqQ&B0o7sEYC zpZGhhEp2D&(B<5|16K8$@b41BnQ%bEFd`7p5%qs6Aqf0;N(iD3_O520uK(CG;-iQv zjFf-<;UuI>{VD`5+?_sJ@DrF^%+lBxL?k%q_4K(TefUu31_MnH{S_*T!XHR5)ybTj zN)J(VFMoY>`j)vV<>TSy)B)&6um$(nfG5TRlW>0_lk`4xSeez2iG7~Da4QJx^Y`e^ z7Na}kaeF&mJ!qfB1N%Xn@$loZj?r$v%aqT7?hynBnAwfF5A}^zom!OqWm$-~!`NdD zQ7*VV8=C3Ie$>xH?oW8UcK3n6RQ|F0 zLn!j}u-ijUh>{Zeo>BUUPI;S>9&%fnpFR;j1M09X$v!IAtWwj`nw4GIz2-@KRz9K zWKhj$TpHbhdOBKp=CNaTVoQnDvZZ6Q+B9qd zB{Uz1g64!$%VV~7Bvv0`baH)hh{`fhu4)&c z-@QbCzMxokiQKWW*5F2z=~+_RFX@q3iuFgA2 z!;8^-@h9el*+W>tK*EX9%t>~#41Sv9=_zw}i<8!-CZD&{-QF*VKyt2&2;?=mehgpy zV4HgUP`LA4B)%|xoa?YXY+unL2dl>%iQS}E0We0Rd?;%*7~ELzewX^j(h1?cMbM^n*xsUbxyhC-}AJEE2lHS9neJXINUG`@h%(d&@!$yf6QVcg-6*lz9DiG#lE^&=CIGk+C z9dc);vY{(;Ch!-rb{7%=U9GgNiYT@C{v-G4`lm)IY{`xi3t19-EcEP@-r+rs4SC;S zu)1q&Rv2}f$zOvr^`zlk4ZPC~5{2fQ=%hh;;7uy5j>bA!XAR>C+$`-CROV$ieGJi! zMvjXSPtE7MQavHc2g{Xv6wA@Vx1wyDlW-lF7#`S9+_x~WSq54f#KbstklZa8St1$f3_5Zp>AkLo2FOKK z`v;(UR@^C97{foqb&*@T?iVo!1UUKZh&Hx_EL;GJd$|cZU$ovBDrjWE!W_kaup4|W zvZA{Au^T?kXN-6qRS&ICXF9!*y(G;laguH3HMCwr^hU&X6!3rPx`puZ z;hPfL8%l}jvvv_A!P+xKNrWzq{{kj1bJb83#X{~21+m1^GRX_Vfmc47gbyK-nM+U22x(^jH53=zk;#vgHN7`ql85ujW1k5EtJ_q5AFO2J zm`%b1{7||VVFzfjpfBUR_Y2@xQVA!XGL6zr7aAgX&tdw(%PBSU2L!;H10R7ynEc0f zQa`U=47ybs_SsE0b(6wk2gqAS8MKzbs`qys?DXEd7xUd%-F`k@An;is#(*;BQ)tnB zAbuR>r6r$D-z<5&kMgdwtt!f9^AN|PdFS<-IeAMv$0l#QUC$tfaNKqROL(t>BfRJz z;VVU>hTVcHgzbhK9x%r(-3X$}9-dI8r&U0pIU1f}#o+R8&Z~#gj1b`j(_g7m`?Zjdo;9u?UH%j6G3ksWsR}GVnJjf%KrzZlag@Q&d8v z3k(@wLQU7;Q2(buzQkZ(n0&WDxr22tVU0P9Wys=rYdF?1A&4#_Y3eai?y*43Bj|VE zeNdLmV7}yFy{F)6S>g0!BF%21?6an0P?p=^YAIoeZX#^zu}VDCIoQSsfmvT6`!*sc z>aj%3qjoehVo2=Y!B<7IvV@7$m}J!8(B8sq)MF;xQgg5>LivS=W6iL?xvQmx!n;>r zlwf{?=_)zcgPi1%Hx( zOHT@e7$oM;pJEawMuIMY8*&TaDv9s|Z{MN0@h9lZ%vXBn^TwfNfi?2bZn@oj zo|vDtcys?yF?H4;%E97uM=I%R=gEyuO+cCuiA2%+9hUW+0_!PI$B#{)?mGU`{wB4;)%CbtzMkY9keL30mVqou%iPQ5XDB-~9(b)HfQ- zV9Bo6=C{zy&~3B)suegNRu*CIET83zrzDuU?p64Sdlx{w5Yzr)f2E$12F^Rq zr^Qk7xcT^G^8Euo2JmNaC@lr_=2?8~u2LzdD@*5LGniP{gKz%KLziUjfIh>$`G>hn zMnBEc%UfVJ!wXL-I(YnQ1sWyA%(7p0r#t~y@@=Zxlc(m`7PrWPz8fE(we+-$aS zih`sM!Zf)ZH-3WTpFkRF@JuOnyO+niPF4%fF8@}Zf<$(&)%0CN+xv|ql#|(ziR6X8 zYTq~)2!evCJ6{qVP_G{lwSe(HI2MS;F(%WI5@s^n)tB zZ6X}lr)UGG%mL8>(G{MWvlS%{QaM6tuNBOn>Ww2%Vc>KlURe;@+JH197_XYMasp>tbP%Bbx8Pj+Dhzlj8Wqcu@VgknAD? z#nt(*u_(aa#LQOsUl0GOi9u!39+er5Ux6Zl0@N-7gQ`wNhyn z#(K?tavQ=Or){;*FPxp4rDB2K$}JDSvce4No$?@euVM_v-zaV-*#fQ#lr*_u;>so| zN(?(Z!Y^r z=qDM69+`Mf-ww@%-Ecy{v93HCO757R*`0Qdq>bXybl+KzQ)sPj6;>fBmtBkDXmd+c zj8)^m#%WPE|7f7S92_MNKlv0M7Rb`NpBKq4cnR2$1$`Rb+dLDKZv1nw+m6X?Xr_@F zlsK_juwN7Mo&du~nFq1u@=m>SmUlJpovEM*-A~mrSZ4%K;ue2m#i!LO`6WJ2?kUzR z!5e@u%mWhr=(R>==?;Bf|8zG`-DMWe;q=NHUge_Jzvr%i_FyS=Htl3E_!OL?>iT58 zkEte@tGr^7aS0o2Z4un!SVXq2tFS{S-@`4s{SN-O*zVBa<_>^?fRO$d#U^28Z{=e7 z{}7wJ!y*%w|5oYw3Peko9a9e^~Y`&q-?03grU5Bj#Y_F&yA%e@x;8#brbsBMZH=IR&q z(&&DFTeUp=@e07559LAko@i3Z=bU9)i6ZvOyG}7_W+o>IYQ+*9qBn`GYi%<1_d{IF z{f~&#pruOzQuwA(rCZko?3`0ClBk93pihihQ+ z+-dhiiJi0+e3F9sd*)@j?4p7-NH-|Yg(0^1C#d+7O6&bsYQsLJX8fLQLvwiniQ}Ci zs{|VL7X@J)qOSoI(hjE%BOzyEBdMRmy)KN-Jrl7@e#o*G89NoQIPBJr)n49{@lT4s zgkMqHFGuxnEcbS92d{8Fero+ zwhM+T`id?HPgzgB7Mu)23{DKL3^uR0V$zh<)WU(wgclbK>PR)T5e*iMCdbUW(DkaN2+&eUAh+IuQpj-$%Z<5BhH_#>8`y^p_X~%GK?==Glcxy>#`+Z zTIiQAbXHJ9MN&-+0}H_aV?VNXc0vImEW8HO9dZ4y_Tj;kz?YZ5rXU~qKZQX0zZC*; zJ4aWq|Jtgepv#QJKXWP41|}u)Q)tozJu(ziUxl~;imZ4JTv&<@-!P@E`#ugYVs-S9 zP%BkNzuvT8l6WM8PRB^K!eA;BdzL$|;m_;i2SJ~OEt+zlFETrwXA@Txp8%K^O#PJ7 zYhj#wC*1n`3AJc#rdTwfv?T7G=fWeEA3662%drNDxGzoh^F3Fl3qQZEH#sW5gcY0PBbxTYYXQ3-k-vXSl5+AS6d zgbJ)7;yYA^RHX&m5YHWc67VB-e{Wa)nMc%O{9D)Z`Kjv*zWRn$?K1mTUxHYp^wRtM zfdIwui`b*E7EeC2Y|ODg%VEC)*bii1pOU8}{=p+Z4Hxp9clh_OV)mDZ(^;7i+1 zaLh6X6HbA@>wY9+y#jwyg`z5{SD>O0>~!<)c3ZqXT>b&=<9;UbT!UtYX^@3tP_MZ{ z@8{*oL;j4KAqS*Z>KL@DQ%uv(%9LG|>D)Pw#9h4Boo$M+hg#9N4!5Nh8gil3 zo40A#Q$7vI3!J_z)a&iA$HG>*PM0okF`%?|Qjc^y3qu_@q1CvB6ya{;5Th>Jace!~ z@!v@j42~u;y+v$?9^I;rXq&`cYC`TKfxdKZV+VFXcHnT0;3W_4kK>;G>P66p_nsdN zuewhF&W^-GX-VH-%roJ~ss^*dj`dl6=KMPzy*2plP=Cea{y)0*zX#5L55@lzoC*II zoDhG5Q^^S=JD8fP!ZMg7h${Gu^0MJ?Zm#@0H$|v_7@HS+-7aR&*1aGCX>vt7Ass61 z7b6S0>(LFr`?TmqsHX6dQeE2xRTAk-BAHxw=QR-#4*^v{mIXk(55ods0?2?N2XC1~>{24NLPC93x}Mpf z>WzXdKae^m79z{!nijT8p;w!u6BVsP2P zd?ry5QzAk@Q%mLh9OA__jC)o!0EylHqr=*+@t?I<^X-6ujv zp*d^=#Yg38HMJhvyg=(a<<^N+X@O;xFTvw-K{HKhG5rqOgW(=L{4Hd{otNLON*bKj zaK)mpsCXo>g zpac+}%igE)X2R9AF4Q^?W1D+(PP_U&`0q8-bLN!oNzSlbzAa{{LzvgWDNMUqq$$AD)QF0?v7OUe zA2|E%6PpHEbUe7lQj-y`h2xhFaa_0~7{Q()_^*9-X35f!&R^N++JCImi~N_J?Pm4w zww7=PSlF4_|Km?C%@0l7QS>he3=Nb^q)_?T2KWkmIxsDHsV$sHUAQ%Mx=t`A4to_I zshBRnuc}&!wc>=wq{nRvtL$R=?8n^4C(#sDG2Q&d(%$EUi}UWHw8Xf*SGI_vOx~uK z`)!At9qq4&-GEQjKCCaiLF($Pv5~m}7lvRfjB6-@LofPZR%R@%W8&EfPHpGcbrVp2n!COGJr5%w@pJ(~@jw+gm}4vsN80Gkwb*?x-~J&??R{D1$NfpZuD+RGU ziaiwqFMzpJDjOJo3lKxB;=qUJ0O@9T1Ie4*q#53njrWUT+oZ&wRXzpNK^2uvePb&j zoy&CM`;cj`w}y;yP7@tr_1EZ-WpVVxx5v3C73I!Z{FIVcqEEi8hG1Fi%DB(O*JD4x z7E8BOKXPPl=pFF?HPb<0gyOcc(Wb6;J*ldX6#V?6ym9>pG%@{+fd183T=;qJJa zB<}0LGqjmvc@XOrn{gDLD|;z3vjHn(^VdG{#9(h7{}6sd%Iv7rP{Yb$nmo znfY#VILaK^<5EQinbMWq(RNn~WWM^ATG~RPBjN={jsSF5Q~hpxTJ(J)j+i_sHztM$szW3m4srTdD8DA+fNVbEWNp@P+TC;B-yV1m`;7#^XV({g9hWxikJ zxio}}u`~1|Dqs7Rdxzz|CCqRygTmizpR?;*7q)kh7X@zW6cJVn z4eLWNtEz847t?nmtz@B@u3~*tyK~GTqtCJi3fqmGkwFPo3}O$qNB}vMeSy|vCxMxb4 zN}V=f^|z97xz%M(TlF4BGwe=EBG0rB+3Y!i2E;2EA3Ihy(<5?Tg^Wh!kWBCfq<~3*5lH7lIaY z1%rhXB^Im0Zdmef)pJ^=hVJmXtnQ3jaETdXr4?$=ZKZF8dn#rNVB-L9b4eDdtM^gfNyGcXoJz;U1w?CXP*Qr#HFm|V z&=%ddn1WvyIW^SM6tzZPIue!RC@>qVu(dF(eo2L{p{&h;#no`Hl~vUmGZRxsg6p2H^?E z0v3>BPC#t~6X%z0cEJH%wj_?B;}=gnPcAkwy`v{H6rm7%v5^2dK*qlbTFk@qC*&us zLFZ$$SGp4I9@%x|TDR#+*nx@n4eX)EEAjhsQ+K38J4DBGD1L*=rIfn(c?Nm@sW1nf zMT!4H{7JgWbzgUM2Z^;N!l}AaN&Iw{XobV59Asw6FPX|;v;U~3zr6o=NRv)A$8JaO zE!AbfxFY&_Cz<*`tbJ3IrAxPE z+P1UOHY;u0wrv|bRcYI{ZQGT$%}Q5g*ExURF}fd4-E&9x+m8Jd-x@Pwt~D3p@OF%y zV9gPA(SuKzlyA`?$qYYNa`w1cTRCwk;8X~HE2ofcqm|;lg~_9KWfmE)MZs{;R0ev66Ti6FG%k#_1={_Y5VhUwgvK9Il6)X0$M`&|5Hx#n{EG-iczyP zb^kjr{trx>t+ZjcD1gM9Nh7HPA_*(Im;?}FpdUcw34p2yp%##!5+a3B+F_rm(3I$o zZ1FGF5k`0NQS}zAt_}7mY?0tV%!pWPwjXR3qvcT(;o4K zaeFV}K4($TM;-1*l}1l7h!tNlMAOU0_I1ymu^mxtP^k1+dX%Qa+{hK9J!_ z2>_GqEl*?;@Cq@fs(JupXCz8I_JWhlTjcRnk?GC$SK<5GDl%rZyi&Y|8u1sZO7zAI z8)RwLafw&2sb0*?nbl?ev;S+&Qh(9x~Z!WIWf8ISzssqt@ zSRBC7ueOCtW7L>vLa5@dFxeaSixF^4jThAGz_P)*0zNWeRPRHGF21kBwf`7Pg+rA^ zpTG?E6F-Naho)4r63c;F7os^Jgm9LWABMA*WjJ?^m#7^TJ-v{4K+?%7$Cp-dGiVRSyg(QwKwF%^Ii{^$~EL`F}ayK2|IDBv7g>tGzUC-mhpt(K=THAE8zx$`O(DdG^PbaE%&Y1b_NB5Hk05g{1Z*1V86K$t4B3KclHyld0tGj~qmpmPX&ytOP$n15kbJUs>IubknZ)pgqcjoH5;YvyEXX#IZyRmj!S#zffO z&dk#MpEMvPZF>|!v|lBg7)2a5l}py$DrIi1r-jkuPL^af0s#q43?>>SF6Rx>DY~*B z>LZZRh`)gRlkVV9R);V-(plc8vu=D&n0x&`U!Zr<^~~aiP~qiSR!19IQ7DTPWcC7x z6swbG<*--52UAoTTBn~pdrj50(@UHE27UC6$23F9vi9 z#&YM+-DVk1+cZ~s4PSoGjP~oEh%1kbV6Y(wClc<#?+C<;%E_7tB#~M90YV@VIZ%hH zsNp0*rp#BVz3lhgrMh?~%Ztb3=Qmk1_tH~?YTq820`h??RgfFcQ zVUJ}LY7|SPcLxYE+)Aji2ssG6?aX3U3iV=l_u5Q_nMFM4PcA}(O}UDW7FbmuDQ0+q zJV^YQ`neYp8)Ba%dbSoSm6hDkC zrCF56borT!1Fq{<^R*4bt*=g6N7wNOwtB3C<+d;rR0L#(x+KGycvv=I?Yzs@4Vyi+ zej?`t>RO3|Vly`qe3Sm;9V-%(az0T?>0NoO^5cvlmX(>*Nf;hnbD%QB7`6-INA;pq z!pg|EdThf(sGV=SbORf!n!DN|_TtwMO=;&8Yn?7eb8@Q0j<@ialT%0AIx=hTCXN31 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%0AhgV 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 T+^3dFK{|o)>__0&ARzw-tE7F- 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