More work in progress on moving stuff from omnipod-eros to omnipod-common

This commit is contained in:
Bart Sopers 2021-02-21 22:01:59 +01:00
parent b56a3d8132
commit 567c215388
71 changed files with 816 additions and 547 deletions

View file

@ -634,7 +634,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList
} }
pump.isSuspended() -> { pump.isSuspended() -> {
binding.infoLayout.apsMode.setImageResource(if (pump.pumpDescription.pumpType == PumpType.Omnipod_Eros) { binding.infoLayout.apsMode.setImageResource(if (pump.model() == PumpType.Omnipod_Eros || pump.model() == PumpType.Omnipod_Dash) {
// For Omnipod, indicate the pump as disconnected when it's suspended. // For Omnipod, indicate the pump as disconnected when it's suspended.
// The only way to 'reconnect' it, is through the Omnipod tab // The only way to 'reconnect' it, is through the Omnipod tab
R.drawable.ic_loop_disconnected R.drawable.ic_loop_disconnected

View file

@ -36,11 +36,11 @@ class StatusLightHandler @Inject constructor(
handleAge(careportal_cannula_age, CareportalEvent.SITECHANGE, R.string.key_statuslights_cage_warning, 48.0, R.string.key_statuslights_cage_critical, 72.0) handleAge(careportal_cannula_age, CareportalEvent.SITECHANGE, R.string.key_statuslights_cage_warning, 48.0, R.string.key_statuslights_cage_critical, 72.0)
handleAge(careportal_insulin_age, CareportalEvent.INSULINCHANGE, R.string.key_statuslights_iage_warning, 72.0, R.string.key_statuslights_iage_critical, 144.0) handleAge(careportal_insulin_age, CareportalEvent.INSULINCHANGE, R.string.key_statuslights_iage_warning, 72.0, R.string.key_statuslights_iage_critical, 144.0)
handleAge(careportal_sensor_age, CareportalEvent.SENSORCHANGE, R.string.key_statuslights_sage_warning, 216.0, R.string.key_statuslights_sage_critical, 240.0) handleAge(careportal_sensor_age, CareportalEvent.SENSORCHANGE, R.string.key_statuslights_sage_warning, 216.0, R.string.key_statuslights_sage_critical, 240.0)
if (pump.pumpDescription.isBatteryReplaceable) { if (pump.pumpDescription.isBatteryReplaceable || (pump is OmnipodErosPumpPlugin && pump.isUseRileyLinkBatteryLevel && pump.isBatteryChangeLoggingEnabled)) {
handleAge(careportal_pb_age, CareportalEvent.PUMPBATTERYCHANGE, R.string.key_statuslights_bage_warning, 216.0, R.string.key_statuslights_bage_critical, 240.0) handleAge(careportal_pb_age, CareportalEvent.PUMPBATTERYCHANGE, R.string.key_statuslights_bage_warning, 216.0, R.string.key_statuslights_bage_critical, 240.0)
} }
if (!config.NSCLIENT) { if (!config.NSCLIENT) {
if (pump.model() == PumpType.Omnipod_Eros) { if (pump.model() == PumpType.Omnipod_Eros || pump.model() == PumpType.Omnipod_Dash) {
handleOmnipodReservoirLevel(careportal_reservoir_level, R.string.key_statuslights_res_critical, 10.0, R.string.key_statuslights_res_warning, 80.0, pump.reservoirLevel, "U") handleOmnipodReservoirLevel(careportal_reservoir_level, R.string.key_statuslights_res_critical, 10.0, R.string.key_statuslights_res_warning, 80.0, pump.reservoirLevel, "U")
} else { } else {
handleLevel(careportal_reservoir_level, R.string.key_statuslights_res_critical, 10.0, R.string.key_statuslights_res_warning, 80.0, pump.reservoirLevel, "U") handleLevel(careportal_reservoir_level, R.string.key_statuslights_res_critical, 10.0, R.string.key_statuslights_res_warning, 80.0, pump.reservoirLevel, "U")
@ -52,8 +52,14 @@ class StatusLightHandler @Inject constructor(
} }
if (!config.NSCLIENT) { if (!config.NSCLIENT) {
if (pump.model() == PumpType.Omnipod_Eros && pump is OmnipodErosPumpPlugin) { // instance of check is needed because at startup, pump can still be VirtualPumpPlugin and that will cause a crash because of the class cast below if (pump.model() == PumpType.Omnipod_Dash) {
handleOmnipodBatteryLevel(careportal_battery_level, R.string.key_statuslights_bat_critical, 26.0, R.string.key_statuslights_bat_warning, 51.0, pump.batteryLevel.toDouble(), "%", pump.isUseRileyLinkBatteryLevel) // Omnipod Dash does not report its battery level
careportal_battery_level?.text = resourceHelper.gs(R.string.notavailable)
careportal_battery_level?.setTextColor(Color.WHITE)
} else if (pump.model() == PumpType.Omnipod_Eros && pump is OmnipodErosPumpPlugin) { // instance of check is needed because at startup, pump can still be VirtualPumpPlugin and that will cause a crash because of the class cast below
// The Omnipod Eros does not report its battery level. However, some RileyLink alternatives do.
// Depending on the user's configuration, we will either show the battery level reported by the RileyLink or "n/a"
handleOmnipodErosBatteryLevel(careportal_battery_level, R.string.key_statuslights_bat_critical, 26.0, R.string.key_statuslights_bat_warning, 51.0, pump.batteryLevel.toDouble(), "%", pump.isUseRileyLinkBatteryLevel)
} else if (pump.model() != PumpType.AccuChekCombo) { } else if (pump.model() != PumpType.AccuChekCombo) {
handleLevel(careportal_battery_level, R.string.key_statuslights_bat_critical, 26.0, R.string.key_statuslights_bat_warning, 51.0, pump.batteryLevel.toDouble(), "%") handleLevel(careportal_battery_level, R.string.key_statuslights_bat_critical, 26.0, R.string.key_statuslights_bat_warning, 51.0, pump.batteryLevel.toDouble(), "%")
} }
@ -93,7 +99,7 @@ class StatusLightHandler @Inject constructor(
} }
@Suppress("SameParameterValue") @Suppress("SameParameterValue")
private fun handleOmnipodBatteryLevel(view: TextView?, criticalSetting: Int, criticalDefaultValue: Double, warnSetting: Int, warnDefaultValue: Double, level: Double, units: String, useRileyLinkBatteryLevel: Boolean) { private fun handleOmnipodErosBatteryLevel(view: TextView?, criticalSetting: Int, criticalDefaultValue: Double, warnSetting: Int, warnDefaultValue: Double, level: Double, units: String, useRileyLinkBatteryLevel: Boolean) {
if (useRileyLinkBatteryLevel) { if (useRileyLinkBatteryLevel) {
handleLevel(view, criticalSetting, criticalDefaultValue, warnSetting, warnDefaultValue, level, units) handleLevel(view, criticalSetting, criticalDefaultValue, warnSetting, warnDefaultValue, level, units)
} else { } else {

View file

@ -27,6 +27,7 @@ import info.nightscout.androidaps.plugins.profile.local.LocalProfilePlugin
import info.nightscout.androidaps.plugins.profile.ns.NSProfileFragment import info.nightscout.androidaps.plugins.profile.ns.NSProfileFragment
import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin
import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDeviceStatusChange
import info.nightscout.androidaps.plugins.pump.omnipod.dash.OmnipodDashPumpPlugin
import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin
import info.nightscout.androidaps.setupwizard.elements.* import info.nightscout.androidaps.setupwizard.elements.*
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate import info.nightscout.androidaps.setupwizard.events.EventSWUpdate
@ -277,14 +278,14 @@ class SWDefinition @Inject constructor(
.add(SWInfoText(injector) .add(SWInfoText(injector)
.label(R.string.setupwizard_pump_pump_not_initialized) .label(R.string.setupwizard_pump_pump_not_initialized)
.visibility { !isPumpInitialized() }) .visibility { !isPumpInitialized() })
.add( // Omnipod only .add( // Omnipod Eros only
SWInfoText(injector) SWInfoText(injector)
.label(R.string.setupwizard_pump_waiting_for_riley_link_connection) .label(R.string.setupwizard_pump_waiting_for_riley_link_connection)
.visibility { .visibility {
val activePump = activePlugin.activePump val activePump = activePlugin.activePump
activePump is OmnipodErosPumpPlugin && !activePump.isRileyLinkReady activePump is OmnipodErosPumpPlugin && !activePump.isRileyLinkReady
}) })
.add( // Omnipod only .add( // Omnipod Eros only
SWEventListener(injector, EventRileyLinkDeviceStatusChange::class.java) SWEventListener(injector, EventRileyLinkDeviceStatusChange::class.java)
.label(R.string.setupwizard_pump_riley_link_status) .label(R.string.setupwizard_pump_riley_link_status)
.visibility { activePlugin.activePump is OmnipodErosPumpPlugin }) .visibility { activePlugin.activePump is OmnipodErosPumpPlugin })
@ -294,18 +295,21 @@ class SWDefinition @Inject constructor(
.visibility { .visibility {
// Hide for Omnipod, because as we don't require a Pod to be paired in the setup wizard, // Hide for Omnipod, because as we don't require a Pod to be paired in the setup wizard,
// Getting the status might not be possible // Getting the status might not be possible
activePlugin.activePump !is OmnipodErosPumpPlugin activePlugin.activePump !is OmnipodErosPumpPlugin && activePlugin.activePump !is OmnipodDashPumpPlugin
}) })
.add(SWEventListener(injector, EventPumpStatusChanged::class.java) .add(SWEventListener(injector, EventPumpStatusChanged::class.java)
.visibility { activePlugin.activePump !is OmnipodErosPumpPlugin }) .visibility { activePlugin.activePump !is OmnipodErosPumpPlugin && activePlugin.activePump !is OmnipodDashPumpPlugin })
.validator { isPumpInitialized() } .validator { isPumpInitialized() }
private fun isPumpInitialized(): Boolean { private fun isPumpInitialized(): Boolean {
val activePump = activePlugin.activePump val activePump = activePlugin.activePump
// For Omnipod, consider the pump initialized when a RL has been configured successfully // For Omnipod, activating a Pod can be done after setup through the Omnipod fragment
// Users will be prompted to activate a Pod after completing the setup wizard. // For the Eros model, consider the pump initialized when a RL has been configured successfully
return activePump.isInitialized() || (activePump is OmnipodErosPumpPlugin && activePump.isRileyLinkReady) // For Dash model, consider the pump setup without any extra conditions
return activePump.isInitialized()
|| (activePump is OmnipodErosPumpPlugin && activePump.isRileyLinkReady)
|| activePump is OmnipodDashPumpPlugin
} }
private val screenAps = SWScreen(injector, R.string.configbuilder_aps) private val screenAps = SWScreen(injector, R.string.configbuilder_aps)

View file

@ -1,9 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest package="info.nightscout.androidaps.plugins.pump.omnipod.common">
package="info.nightscout.androidaps.plugins.pump.omnipod.common">
<application> <application></application>
<activity android:name=".ui.wizard.activation.PodActivationWizardActivity" />
<activity android:name=".ui.wizard.deactivation.PodDeactivationWizardActivity" />
</application>
</manifest> </manifest>

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.dagger
import dagger.Module
import dagger.android.ContributesAndroidInjector
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.PodActivationWizardActivity
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.PodDeactivationWizardActivity
@Module
@Suppress("unused")
abstract class OmnipodCommonModule {
// ACTIVITIES
@ActivityScope
@ContributesAndroidInjector(modules = [OmnipodWizardModule::class])
abstract fun contributesActivationWizardActivity(): PodActivationWizardActivity
@ActivityScope
@ContributesAndroidInjector(modules = [OmnipodWizardModule::class])
abstract fun contributesDeactivationWizardActivity(): PodDeactivationWizardActivity
}

View file

@ -15,7 +15,7 @@ annotation class OmnipodPluginQualifier
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) @Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) @kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@MapKey @MapKey
internal annotation class ViewModelKey(val value: KClass<out ViewModel>) annotation class ViewModelKey(val value: KClass<out ViewModel>)
// TODO: These annotations and Factories could be used globally -> move to core or app // TODO: These annotations and Factories could be used globally -> move to core or app

View file

@ -2,23 +2,18 @@ package info.nightscout.androidaps.plugins.pump.omnipod.common.dagger
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import dagger.multibindings.IntoMap import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action.InitializePodFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.AttachPodInfoFragment import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action.InsertCannulaFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.FillPodInfoFragment import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.AttachPodFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.InitializePodActionFragment import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.PodActivatedFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.InsertCannulaActionFragment import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.StartPodActivationFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.PodActivatedInfoFragment import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.action.DeactivatePodFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.InitializePodActionViewModel import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.PodDeactivatedFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.InsertCannulaActionViewModel import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.PodDiscardedFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.DeactivatePodActionFragment import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.StartPodDeactivationFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.DeactivatePodInfoFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.PodDeactivatedInfoFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.PodDiscardedInfoFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.DeactivatePodActionViewModel
import javax.inject.Provider import javax.inject.Provider
@Module @Module
@ -33,61 +28,48 @@ abstract class OmnipodWizardModule {
} }
} }
// #### VIEW MODELS ############################################################################
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(InitializePodActionViewModel::class)
internal abstract fun initializePodActionViewModel(viewModel: InitializePodActionViewModel): 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 ############################################################################## // #### FRAGMENTS ##############################################################################
@FragmentScope
@ContributesAndroidInjector // POD ACTIVATION
internal abstract fun contributesDeactivatePodActionFragment(): DeactivatePodActionFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesInsertCannulaActionFragment(): InsertCannulaActionFragment internal abstract fun contributesStartPodActivationFragment(): StartPodActivationFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesInitializePodActionFragment(): InitializePodActionFragment internal abstract fun contributesInitializeActionFragment(): InitializePodFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesAttachPodInfoFragment(): AttachPodInfoFragment internal abstract fun contributesAttachPodFragment(): AttachPodFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesDeactivatePodInfoFragment(): DeactivatePodInfoFragment internal abstract fun contributesInsertCannulaFragment(): InsertCannulaFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesFillPodInfoFragment(): FillPodInfoFragment internal abstract fun contributesPodActivatedFragment(): PodActivatedFragment
// POD DEACTIVATION
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesPodDeactivatedInfoFragment(): PodDeactivatedInfoFragment internal abstract fun contributesStartPodDeactivationFragment(): StartPodDeactivationFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesPodDiscardedInfoFragment(): PodDiscardedInfoFragment internal abstract fun contributesDeactivatePodFragment(): DeactivatePodFragment
@FragmentScope @FragmentScope
@ContributesAndroidInjector @ContributesAndroidInjector
internal abstract fun contributesPodActivatedInfoFragment(): PodActivatedInfoFragment internal abstract fun contributesPodDeactivatedFragment(): PodDeactivatedFragment
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesPodDiscardedFragment(): PodDiscardedFragment
} }

View file

@ -5,7 +5,7 @@ import androidx.annotation.IdRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity.OmnipodWizardActivityBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity.OmnipodWizardActivityBase
class PodActivationWizardActivity : OmnipodWizardActivityBase() { abstract class PodActivationWizardActivity : OmnipodWizardActivityBase() {
companion object { companion object {
const val KEY_TYPE = "wizardType" const val KEY_TYPE = "wizardType"
@ -18,18 +18,18 @@ class PodActivationWizardActivity : OmnipodWizardActivityBase() {
} }
@IdRes @IdRes
private var startDestination: Int = R.id.fillPodInfoFragment private var startDestination: Int = R.id.startPodActivationFragment
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.omnipod_common_pod_activation_wizard_activity) setContentView(R.layout.omnipod_common_pod_activation_wizard_activity)
startDestination = savedInstanceState?.getInt(KEY_START_DESTINATION, R.id.fillPodInfoFragment) startDestination = savedInstanceState?.getInt(KEY_START_DESTINATION, R.id.startPodActivationFragment)
?: if (intent.getSerializableExtra(KEY_TYPE) as Type == Type.LONG) { ?: if (intent.getSerializableExtra(KEY_TYPE) as Type == Type.LONG) {
R.id.fillPodInfoFragment R.id.startPodActivationFragment
} else { } else {
R.id.attachPodInfoFragment R.id.attachPodFragment
} }
setStartDestination(startDestination) setStartDestination(startDestination)
@ -52,7 +52,7 @@ class PodActivationWizardActivity : OmnipodWizardActivityBase() {
override fun getTotalDefinedNumberOfSteps(): Int = 5 override fun getTotalDefinedNumberOfSteps(): Int = 5
override fun getActualNumberOfSteps(): Int { override fun getActualNumberOfSteps(): Int {
if (startDestination == R.id.attachPodInfoFragment) { if (startDestination == R.id.attachPodFragment) {
return 3 return 3
} }
return 5 return 5

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment
import androidx.annotation.IdRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
class PodActivatedInfoFragment : InfoFragmentBase() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_pod_activated_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_activation_wizard_pod_activated_text
@IdRes
override fun getNextPageActionId(): Int? = null
override fun getIndex(): Int = 5
}

View file

@ -1,16 +1,15 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action
import android.os.Bundle import android.os.Bundle
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.InitializePodActionViewModel import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InitializePodViewModel
import javax.inject.Inject import javax.inject.Inject
class InitializePodActionFragment : PodActivationActionFragmentBase() { class InitializePodFragment : PodActivationActionFragmentBase() {
@Inject @Inject
@OmnipodPluginQualifier @OmnipodPluginQualifier
@ -19,18 +18,12 @@ class InitializePodActionFragment : PodActivationActionFragmentBase() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val vm: InitializePodActionViewModel by viewModels { viewModelFactory } val vm: InitializePodViewModel by viewModels { viewModelFactory }
this.viewModel = vm this.viewModel = vm
} }
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_initialize_pod_title
@StringRes
override fun getTextId(): Int = (viewModel as InitializePodActionViewModel).getTextId()
@IdRes @IdRes
override fun getNextPageActionId(): Int = R.id.action_initializePodActionFragment_to_attachPodInfoFragment override fun getNextPageActionId(): Int = R.id.action_initializePodFragment_to_attachPodFragment
override fun getIndex(): Int = 2 override fun getIndex(): Int = 2
} }

View file

@ -1,16 +1,15 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action
import android.os.Bundle import android.os.Bundle
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.InsertCannulaActionViewModel import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InsertCannulaViewModel
import javax.inject.Inject import javax.inject.Inject
class InsertCannulaActionFragment : PodActivationActionFragmentBase() { class InsertCannulaFragment : PodActivationActionFragmentBase() {
@Inject @Inject
@OmnipodPluginQualifier @OmnipodPluginQualifier
@ -19,18 +18,12 @@ class InsertCannulaActionFragment : PodActivationActionFragmentBase() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val vm: InsertCannulaActionViewModel by viewModels { viewModelFactory } val vm: InsertCannulaViewModel by viewModels { viewModelFactory }
this.viewModel = vm this.viewModel = vm
} }
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_insert_cannula_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_activation_wizard_insert_cannula_text
@IdRes @IdRes
override fun getNextPageActionId(): Int = R.id.action_insertCannulaActionFragment_to_PodActivatedInfoFragment override fun getNextPageActionId(): Int = R.id.action_insertCannulaFragment_to_PodActivatedFragment
override fun getIndex(): Int = 4 override fun getIndex(): Int = 4
} }

View file

@ -1,11 +1,11 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Button import android.widget.Button
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.PodActivationActionViewModelBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.PodActivationActionViewModelBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.ActionFragmentBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.ActionFragmentBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.PodDeactivationWizardActivity import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.PodDeactivationWizardActivity
@ -23,7 +23,7 @@ abstract class PodActivationActionFragmentBase : ActionFragmentBase() {
} }
override fun onFailure() { override fun onFailure() {
(viewModel as? PodActivationActionViewModelBase)?.let { viewModel -> (actionViewModel as? PodActivationActionViewModelBase)?.let { viewModel ->
if (viewModel.isPodDeactivatable() and (viewModel.isPodInAlarm() or viewModel.isPodActivationTimeExceeded())) { if (viewModel.isPodDeactivatable() and (viewModel.isPodInAlarm() or viewModel.isPodActivationTimeExceeded())) {
view?.let { view?.let {
it.findViewById<Button>(R.id.omnipod_wizard_button_retry)?.visibility = View.GONE it.findViewById<Button>(R.id.omnipod_wizard_button_retry)?.visibility = View.GONE

View file

@ -1,25 +1,34 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Button import android.widget.Button
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.AttachPodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
import javax.inject.Inject
class AttachPodInfoFragment : InfoFragmentBase() { class AttachPodFragment : InfoFragmentBase() {
@StringRes @Inject
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_attach_pod_title @OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
@StringRes override fun onCreate(savedInstanceState: Bundle?) {
override fun getTextId(): Int = R.string.omnipod_common_pod_activation_wizard_attach_pod_text super.onCreate(savedInstanceState)
val vm: AttachPodViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@IdRes @IdRes
override fun getNextPageActionId(): Int = R.id.action_attachPodInfoFragment_to_insertCannulaActionFragment override fun getNextPageActionId(): Int = R.id.action_attachPodFragment_to_insertCannulaFragment
override fun getIndex(): Int = 3 override fun getIndex(): Int = 3

View file

@ -0,0 +1,29 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.PodActivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
import javax.inject.Inject
class PodActivatedFragment : InfoFragmentBase() {
@Inject
@OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: PodActivatedViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@IdRes
override fun getNextPageActionId(): Int? = null
override fun getIndex(): Int = 5
}

View file

@ -1,38 +1,30 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info
import android.os.Bundle import android.os.Bundle
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.FillPodInfoViewModel import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.StartPodActivationViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
import javax.inject.Inject import javax.inject.Inject
class FillPodInfoFragment : InfoFragmentBase() { class StartPodActivationFragment : InfoFragmentBase() {
@Inject @Inject
@OmnipodPluginQualifier @OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var viewModel: FillPodInfoViewModel
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val vm: FillPodInfoViewModel by viewModels { viewModelFactory } val vm: StartPodActivationViewModel by viewModels { viewModelFactory }
this.viewModel = vm this.viewModel = vm
} }
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_fill_pod_title
@StringRes
override fun getTextId(): Int = viewModel.getTextId()
@IdRes @IdRes
override fun getNextPageActionId(): Int = R.id.action_fillPodInfoFragment_to_initializePodActionFragment override fun getNextPageActionId(): Int = R.id.action_startPodActivationFragment_to_initializePodFragment
override fun getIndex(): Int = 1 override fun getIndex(): Int = 1
} }

View file

@ -1,10 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel
import androidx.annotation.StringRes
import androidx.lifecycle.ViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
class FillPodInfoViewModel : ViewModel() {
@StringRes fun getTextId(): Int = R.string.omnipod_pod_activation_wizard_fill_pod_text
}

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel
import androidx.annotation.StringRes
import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodManager
import javax.inject.Inject
class InitializePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val podStateManager: AapsPodStateManager) : PodActivationActionViewModelBase() {
override fun isPodInAlarm(): Boolean = podStateManager.isPodFaulted
override fun isPodActivationTimeExceeded(): Boolean = podStateManager.isPodActivationTimeExceeded
override fun isPodDeactivatable(): Boolean = podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.initializePod()
@StringRes fun getTextId() = R.string.omnipod_pod_activation_wizard_initialize_pod_text
}

View file

@ -1,17 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel
import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodManager
import javax.inject.Inject
class InsertCannulaActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val podStateManager: AapsPodStateManager, private val profileFunction: ProfileFunction) : PodActivationActionViewModelBase() {
override fun isPodInAlarm(): Boolean = podStateManager.isPodFaulted
override fun isPodActivationTimeExceeded(): Boolean = podStateManager.isPodActivationTimeExceeded
override fun isPodDeactivatable(): Boolean = podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.insertCannula(profileFunction.getProfile())
}

View file

@ -0,0 +1,3 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action
abstract class InitializePodViewModel : PodActivationActionViewModelBase()

View file

@ -0,0 +1,3 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action
abstract class InsertCannulaViewModel : PodActivationActionViewModelBase()

View file

@ -1,4 +1,4 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ActionViewModelBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ActionViewModelBase

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
abstract class AttachPodViewModel : ViewModelBase()

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
abstract class PodActivatedViewModel : ViewModelBase()

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
abstract class StartPodActivationViewModel : ViewModelBase()

View file

@ -4,71 +4,70 @@ import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Button import android.widget.Button
import android.widget.ProgressBar
import android.widget.TextView
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ActionViewModelBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.PodActivationActionViewModelBase
import info.nightscout.androidaps.utils.extensions.toVisibility import info.nightscout.androidaps.utils.extensions.toVisibility
abstract class ActionFragmentBase : WizardFragmentBase() { abstract class ActionFragmentBase : WizardFragmentBase() {
protected lateinit var viewModel: ActionViewModelBase val actionViewModel: PodActivationActionViewModelBase
get() = viewModel as PodActivationActionViewModelBase
@SuppressLint("CutPasteId") @SuppressLint("CutPasteId")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.navButtonsLayout.buttonNext.isEnabled = false binding.navButtonsLayout.buttonNext.isEnabled = false
view.findViewById<Button>(R.id.omnipod_wizard_action_page_text).setText(getTextId()) view.findViewById<TextView>(R.id.omnipod_wizard_action_page_text).setText(getTextId())
view.findViewById<Button>(R.id.omnipod_wizard_button_retry).setOnClickListener { viewModel.executeAction() } view.findViewById<Button>(R.id.omnipod_wizard_button_retry).setOnClickListener { actionViewModel.executeAction() }
viewModel.isActionExecutingLiveData.observe(viewLifecycleOwner, { isExecuting -> actionViewModel.isActionExecutingLiveData.observe(viewLifecycleOwner, { isExecuting ->
if (isExecuting) { if (isExecuting) {
view.findViewById<Button>(R.id.omnipod_wizard_action_error).visibility = View.GONE view.findViewById<TextView>(R.id.omnipod_wizard_action_error).visibility = View.GONE
view.findViewById<Button>(R.id.omnipod_wizard_button_deactivate_pod).visibility = View.GONE view.findViewById<Button>(R.id.omnipod_wizard_button_deactivate_pod).visibility = View.GONE
view.findViewById<Button>(R.id.omnipod_wizard_button_discard_pod).visibility = View.GONE view.findViewById<Button>(R.id.omnipod_wizard_button_discard_pod).visibility = View.GONE
view.findViewById<Button>(R.id.omnipod_wizard_button_retry).visibility = View.GONE view.findViewById<Button>(R.id.omnipod_wizard_button_retry).visibility = View.GONE
} }
view.findViewById<Button>(R.id.omnipod_wizard_action_progress_indication).visibility = isExecuting.toVisibility() view.findViewById<ProgressBar>(R.id.omnipod_wizard_action_progress_indication).visibility = isExecuting.toVisibility()
view.findViewById<Button>(R.id.button_cancel).isEnabled = !isExecuting view.findViewById<Button>(R.id.button_cancel).isEnabled = !isExecuting
}) })
viewModel.actionResultLiveData.observe(viewLifecycleOwner, { result -> actionViewModel.actionResultLiveData.observe(viewLifecycleOwner, { result ->
result?.let { result?.let {
val isExecuting = isActionExecuting() val isExecuting = isActionExecuting()
view.findViewById<Button>(R.id.button_next).isEnabled = result.success view.findViewById<Button>(R.id.button_next).isEnabled = result.success
view.findViewById<Button>(R.id.omnipod_wizard_action_success).visibility = result.success.toVisibility() view.findViewById<TextView>(R.id.omnipod_wizard_action_success).visibility = result.success.toVisibility()
view.findViewById<Button>(R.id.omnipod_wizard_action_error).visibility = (!isExecuting && !result.success).toVisibility() view.findViewById<TextView>(R.id.omnipod_wizard_action_error).visibility = (!isExecuting && !result.success).toVisibility()
view.findViewById<Button>(R.id.omnipod_wizard_button_retry).visibility = (!isExecuting && !result.success).toVisibility() view.findViewById<Button>(R.id.omnipod_wizard_button_retry).visibility = (!isExecuting && !result.success).toVisibility()
if (!result.success) { if (!result.success) {
view.findViewById<Button>(R.id.omnipod_wizard_action_error).text = result.comment view.findViewById<TextView>(R.id.omnipod_wizard_action_error).text = result.comment
onFailure() onFailure()
} }
} }
}) })
if (savedInstanceState == null && !isActionExecuting()) { if (savedInstanceState == null && !isActionExecuting()) {
viewModel.executeAction() actionViewModel.executeAction()
} }
} }
protected fun isActionExecuting() = viewModel.isActionExecutingLiveData.value!! protected fun isActionExecuting() = actionViewModel.isActionExecutingLiveData.value!!
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
viewModel.isActionExecutingLiveData.removeObservers(viewLifecycleOwner) actionViewModel.isActionExecutingLiveData.removeObservers(viewLifecycleOwner)
viewModel.actionResultLiveData.removeObservers(viewLifecycleOwner) actionViewModel.actionResultLiveData.removeObservers(viewLifecycleOwner)
} }
abstract fun onFailure() abstract fun onFailure()
@StringRes
abstract fun getTextId(): Int
@LayoutRes @LayoutRes
override fun getLayoutId(): Int = R.layout.omnipod_common_wizard_action_page_fragment override fun getLayoutId(): Int = R.layout.omnipod_common_wizard_action_page_fragment
} }

View file

@ -4,7 +4,6 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.annotation.LayoutRes import androidx.annotation.LayoutRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
abstract class InfoFragmentBase : WizardFragmentBase() { abstract class InfoFragmentBase : WizardFragmentBase() {
@ -15,9 +14,6 @@ abstract class InfoFragmentBase : WizardFragmentBase() {
view.findViewById<TextView>(R.id.omnipod_wizard_info_page_text).setText(getTextId()) view.findViewById<TextView>(R.id.omnipod_wizard_info_page_text).setText(getTextId())
} }
@StringRes
abstract fun getTextId(): Int
@LayoutRes @LayoutRes
override fun getLayoutId(): Int = R.layout.omnipod_common_wizard_info_page_fragment override fun getLayoutId(): Int = R.layout.omnipod_common_wizard_info_page_fragment
} }

View file

@ -13,10 +13,13 @@ import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.databinding.OmnipodCommonWizardBaseFragmentBinding import info.nightscout.androidaps.plugins.pump.omnipod.common.databinding.OmnipodCommonWizardBaseFragmentBinding
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity.OmnipodWizardActivityBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity.OmnipodWizardActivityBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
import kotlin.math.roundToInt import kotlin.math.roundToInt
abstract class WizardFragmentBase : DaggerFragment() { abstract class WizardFragmentBase : DaggerFragment() {
protected lateinit var viewModel: ViewModelBase
var _binding: OmnipodCommonWizardBaseFragmentBinding? = null var _binding: OmnipodCommonWizardBaseFragmentBinding? = null
// This property is only valid between onCreateView and // This property is only valid between onCreateView and
@ -84,7 +87,9 @@ abstract class WizardFragmentBase : DaggerFragment() {
protected abstract fun getNextPageActionId(): Int? protected abstract fun getNextPageActionId(): Int?
@StringRes @StringRes
protected abstract fun getTitleId(): Int protected fun getTitleId(): Int = viewModel.getTitleId()
@StringRes protected fun getTextId(): Int = viewModel.getTextId()
protected abstract fun getIndex(): Int protected abstract fun getIndex(): Int
} }

View file

@ -2,12 +2,11 @@ package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import info.nightscout.androidaps.data.PumpEnactResult import info.nightscout.androidaps.data.PumpEnactResult
import io.reactivex.schedulers.Schedulers import io.reactivex.schedulers.Schedulers
import io.reactivex.subjects.SingleSubject import io.reactivex.subjects.SingleSubject
abstract class ActionViewModelBase : ViewModel() { abstract class ActionViewModelBase : ViewModelBase() {
private val _isActionExecutingLiveData = MutableLiveData(false) private val _isActionExecutingLiveData = MutableLiveData(false)
val isActionExecutingLiveData: LiveData<Boolean> = _isActionExecutingLiveData val isActionExecutingLiveData: LiveData<Boolean> = _isActionExecutingLiveData

View file

@ -0,0 +1,11 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel
import androidx.annotation.StringRes
import androidx.lifecycle.ViewModel
abstract class ViewModelBase : ViewModel() {
@StringRes abstract fun getTitleId(): Int
@StringRes abstract fun getTextId(): Int
}

View file

@ -4,7 +4,7 @@ import android.os.Bundle
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity.OmnipodWizardActivityBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.activity.OmnipodWizardActivityBase
class PodDeactivationWizardActivity : OmnipodWizardActivityBase() { abstract class PodDeactivationWizardActivity : OmnipodWizardActivityBase() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment
import androidx.annotation.IdRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
class DeactivatePodInfoFragment : InfoFragmentBase() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_deactivate_pod_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_deactivation_wizard_deactivate_pod_text
@IdRes
override fun getNextPageActionId(): Int = R.id.action_deactivatePodInfoFragment_to_deactivatePodActionFragment
override fun getIndex(): Int = 1
}

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment
import androidx.annotation.IdRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
class PodDeactivatedInfoFragment : InfoFragmentBase() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_pod_deactivated_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_deactivation_wizard_pod_deactivated_text
@IdRes
override fun getNextPageActionId(): Int? = null
override fun getIndex(): Int = 3
}

View file

@ -1,20 +0,0 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment
import androidx.annotation.IdRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
class PodDiscardedInfoFragment : InfoFragmentBase() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_pod_discarded_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_deactivation_wizard_pod_discarded_text
@IdRes
override fun getNextPageActionId(): Int? = null
override fun getIndex(): Int = 3
}

View file

@ -1,10 +1,9 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.action
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Button import android.widget.Button
import androidx.annotation.IdRes import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@ -12,10 +11,10 @@ import androidx.navigation.fragment.findNavController
import info.nightscout.androidaps.plugins.pump.omnipod.common.R import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.ActionFragmentBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.ActionFragmentBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.DeactivatePodActionViewModel import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.action.DeactivatePodViewModel
import javax.inject.Inject import javax.inject.Inject
class DeactivatePodActionFragment : ActionFragmentBase() { class DeactivatePodFragment : ActionFragmentBase() {
@Inject @Inject
@OmnipodPluginQualifier @OmnipodPluginQualifier
@ -26,7 +25,7 @@ class DeactivatePodActionFragment : ActionFragmentBase() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val vm: DeactivatePodActionViewModel by viewModels { viewModelFactory } val vm: DeactivatePodViewModel by viewModels { viewModelFactory }
this.viewModel = vm this.viewModel = vm
} }
@ -39,8 +38,8 @@ class DeactivatePodActionFragment : ActionFragmentBase() {
.setTitle(getString(R.string.omnipod_common_pod_deactivation_wizard_discard_pod)) .setTitle(getString(R.string.omnipod_common_pod_deactivation_wizard_discard_pod))
.setMessage(getString(R.string.omnipod_common_pod_deactivation_wizard_discard_pod_confirmation)) .setMessage(getString(R.string.omnipod_common_pod_deactivation_wizard_discard_pod_confirmation))
.setPositiveButton(getString(R.string.omnipod_common_yes)) { _, _ -> .setPositiveButton(getString(R.string.omnipod_common_yes)) { _, _ ->
(viewModel as DeactivatePodActionViewModel).discardPod() (actionViewModel as DeactivatePodViewModel).discardPod()
findNavController().navigate(R.id.action_deactivatePodActionFragment_to_podDiscardedInfoFragment) findNavController().navigate(R.id.action_deactivatePodFragment_to_podDiscardedFragment)
} }
.setNegativeButton(getString(R.string.omnipod_common_no), null) .setNegativeButton(getString(R.string.omnipod_common_no), null)
.show() .show()
@ -52,14 +51,8 @@ class DeactivatePodActionFragment : ActionFragmentBase() {
buttonDiscardPod.visibility = View.VISIBLE buttonDiscardPod.visibility = View.VISIBLE
} }
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_deactivating_pod_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_deactivation_wizard_deactivating_pod_text
@IdRes @IdRes
override fun getNextPageActionId(): Int = R.id.action_deactivatePodActionFragment_to_podDeactivatedInfoFragment override fun getNextPageActionId(): Int = R.id.action_deactivatePodFragment_to_podDeactivatedFragment
override fun getIndex(): Int = 2 override fun getIndex(): Int = 2
} }

View file

@ -0,0 +1,29 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.PodDeactivatedViewModel
import javax.inject.Inject
class PodDeactivatedFragment : InfoFragmentBase() {
@Inject
@OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: PodDeactivatedViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@IdRes
override fun getNextPageActionId(): Int? = null
override fun getIndex(): Int = 3
}

View file

@ -0,0 +1,29 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.PodDiscardedViewModel
import javax.inject.Inject
class PodDiscardedFragment : InfoFragmentBase() {
@Inject
@OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: PodDiscardedViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@IdRes
override fun getNextPageActionId(): Int? = null
override fun getIndex(): Int = 3
}

View file

@ -0,0 +1,30 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info
import android.os.Bundle
import androidx.annotation.IdRes
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.fragment.InfoFragmentBase
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.StartPodDeactivationViewModel
import javax.inject.Inject
class StartPodDeactivationFragment : InfoFragmentBase() {
@Inject
@OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: StartPodDeactivationViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@IdRes
override fun getNextPageActionId(): Int = R.id.action_startPodDeactivationFragment_to_deactivatePodFragment
override fun getIndex(): Int = 1
}

View file

@ -0,0 +1,8 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.action
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ActionViewModelBase
abstract class DeactivatePodViewModel : ActionViewModelBase() {
abstract fun discardPod()
}

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
abstract class PodDeactivatedViewModel : ViewModelBase()

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
abstract class PodDiscardedViewModel : ViewModelBase()

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ViewModelBase
abstract class StartPodDeactivationViewModel : ViewModelBase()

View file

@ -1,41 +1,41 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@id/fillPodInfoFragment"> app:startDestination="@id/startPodActivationFragment">
<fragment <fragment
android:id="@+id/fillPodInfoFragment" android:id="@+id/startPodActivationFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.FillPodInfoFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.StartPodActivationFragment"
android:label="FillPodInfoFragment"> android:label="StartPodActivationFragment">
<action <action
android:id="@+id/action_fillPodInfoFragment_to_initializePodActionFragment" android:id="@+id/action_startPodActivationFragment_to_initializePodFragment"
app:destination="@id/initializePodActionFragment" /> app:destination="@id/initializePodFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/initializePodActionFragment" android:id="@+id/initializePodFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.InitializePodActionFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action.InitializePodFragment"
android:label="initializePodActionFragment"> android:label="InitializePodFragment">
<action <action
android:id="@+id/action_initializePodActionFragment_to_attachPodInfoFragment" android:id="@+id/action_initializePodFragment_to_attachPodFragment"
app:destination="@id/attachPodInfoFragment" /> app:destination="@id/attachPodFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/attachPodInfoFragment" android:id="@+id/attachPodFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.AttachPodInfoFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.AttachPodFragment"
android:label="AttachPodInfoFragment"> android:label="AttachPodFragment">
<action <action
android:id="@+id/action_attachPodInfoFragment_to_insertCannulaActionFragment" android:id="@+id/action_attachPodFragment_to_insertCannulaFragment"
app:destination="@id/insertCannulaActionFragment" /> app:destination="@id/insertCannulaFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/insertCannulaActionFragment" android:id="@+id/insertCannulaFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.InsertCannulaActionFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.action.InsertCannulaFragment"
android:label="InsertCannulaActionFragment"> android:label="InsertCannulaFragment">
<action <action
android:id="@+id/action_insertCannulaActionFragment_to_PodActivatedInfoFragment" android:id="@+id/action_insertCannulaFragment_to_PodActivatedFragment"
app:destination="@id/PodActivatedInfoFragment" /> app:destination="@id/PodActivatedFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/PodActivatedInfoFragment" android:id="@+id/PodActivatedFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.PodActivatedInfoFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.PodActivatedFragment"
android:label="PodActivatedInfoFragment" /> android:label="PodActivatedFragment" />
</navigation> </navigation>

View file

@ -1,32 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@id/deactivatePodInfoFragment"> app:startDestination="@id/startPodDeactivationFragment">
<fragment <fragment
android:id="@+id/deactivatePodInfoFragment" android:id="@+id/startPodDeactivationFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.DeactivatePodInfoFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.StartPodDeactivationFragment"
android:label="DeactivatePodInfoFragment"> android:label="StartPodDeactivationFragment">
<action <action
android:id="@+id/action_deactivatePodInfoFragment_to_deactivatePodActionFragment" android:id="@+id/action_startPodDeactivationFragment_to_deactivatePodFragment"
app:destination="@id/deactivatePodActionFragment" /> app:destination="@id/deactivatePodFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/deactivatePodActionFragment" android:id="@+id/deactivatePodFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.DeactivatePodActionFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.action.DeactivatePodFragment"
android:label="DeactivatePodActionFragment"> android:label="DeactivatePodFragment">
<action <action
android:id="@+id/action_deactivatePodActionFragment_to_podDeactivatedInfoFragment" android:id="@+id/action_deactivatePodFragment_to_podDeactivatedFragment"
app:destination="@id/podDeactivatedInfoFragment" /> app:destination="@id/podDeactivatedFragment" />
<action <action
android:id="@+id/action_deactivatePodActionFragment_to_podDiscardedInfoFragment" android:id="@+id/action_deactivatePodFragment_to_podDiscardedFragment"
app:destination="@id/podDiscardedInfoFragment" /> app:destination="@id/podDiscardedFragment" />
</fragment> </fragment>
<fragment <fragment
android:id="@+id/podDeactivatedInfoFragment" android:id="@+id/podDeactivatedFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.PodDeactivatedInfoFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.PodDeactivatedFragment"
android:label="PodDeactivatedInfoFragment" /> android:label="PodDeactivatedFragment" />
<fragment <fragment
android:id="@+id/podDiscardedInfoFragment" android:id="@+id/podDiscardedFragment"
android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.PodDiscardedInfoFragment" android:name="info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.PodDiscardedFragment"
android:label="PodDiscardedInfoFragment" /> android:label="PodDiscardedFragment" />
</navigation> </navigation>

View file

@ -94,7 +94,7 @@
<string name="omnipod_common_wizard_exit_confirmation_title">Exit</string> <string name="omnipod_common_wizard_exit_confirmation_title">Exit</string>
<!-- Omnipod - Pod Activation Wizard --> <!-- Omnipod - Pod Activation Wizard -->
<string name="omnipod_common_pod_activation_wizard_fill_pod_title">Fill Pod</string> <string name="omnipod_common_pod_activation_wizard_start_pod_activation_title">Fill Pod</string>
<string name="omnipod_common_pod_activation_wizard_initialize_pod_title">Initialize Pod</string> <string name="omnipod_common_pod_activation_wizard_initialize_pod_title">Initialize Pod</string>
<string name="omnipod_common_pod_activation_wizard_attach_pod_title">Attach Pod</string> <string name="omnipod_common_pod_activation_wizard_attach_pod_title">Attach Pod</string>
<string name="omnipod_common_pod_activation_wizard_attach_pod_text">Prepare the infusion site. Remove the Pod\'s needle cap and adhesive backing and attach the Pod to the infusion site.\n\nIf the cannula sticks out, please press <b>Cancel</b> and discard your Pod.\n\nPress <b>Next</b> to insert the cannula and begin basal delivery.</string> <string name="omnipod_common_pod_activation_wizard_attach_pod_text">Prepare the infusion site. Remove the Pod\'s needle cap and adhesive backing and attach the Pod to the infusion site.\n\nIf the cannula sticks out, please press <b>Cancel</b> and discard your Pod.\n\nPress <b>Next</b> to insert the cannula and begin basal delivery.</string>
@ -105,8 +105,8 @@
<string name="omnipod_common_pod_activation_wizard_pod_activated_text">The new Pod is now active.\n\nYour basal schedule has been programmed and the cannula has been inserted.\n\nPlease verify that the cannula has been inserted correctly and change your Pod if you think it has not.</string> <string name="omnipod_common_pod_activation_wizard_pod_activated_text">The new Pod is now active.\n\nYour basal schedule has been programmed and the cannula has been inserted.\n\nPlease verify that the cannula has been inserted correctly and change your Pod if you think it has not.</string>
<!-- Omnipod - Pod Deactivation Wizard --> <!-- Omnipod - Pod Deactivation Wizard -->
<string name="omnipod_common_pod_deactivation_wizard_deactivate_pod_title">Deactivate Pod</string> <string name="omnipod_common_pod_deactivation_wizard_start_pod_deactivation_title">Deactivate Pod</string>
<string name="omnipod_common_pod_deactivation_wizard_deactivate_pod_text">Press <b>Next</b> to deactivate the Pod.\n\n<b>Note:</b> This will suspend all insulin delivery and deactivate the Pod.</string> <string name="omnipod_common_pod_deactivation_wizard_start_pod_deactivation_text">Press <b>Next</b> to deactivate the Pod.\n\n<b>Note:</b> This will suspend all insulin delivery and deactivate the Pod.</string>
<string name="omnipod_common_pod_deactivation_wizard_deactivating_pod_title">Deactivating Pod</string> <string name="omnipod_common_pod_deactivation_wizard_deactivating_pod_title">Deactivating Pod</string>
<string name="omnipod_common_pod_deactivation_wizard_deactivating_pod_text">Deactivating the Pod.\n\nWhen deactivation has completed successfully, you can press <b>Next</b>.</string> <string name="omnipod_common_pod_deactivation_wizard_deactivating_pod_text">Deactivating the Pod.\n\nWhen deactivation has completed successfully, you can press <b>Next</b>.</string>
<string name="omnipod_common_pod_deactivation_wizard_pod_deactivated_title">Pod Deactivated</string> <string name="omnipod_common_pod_deactivation_wizard_pod_deactivated_title">Pod Deactivated</string>

View file

@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dash;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject; import org.json.JSONObject;
import java.util.Collections; import java.util.Collections;
@ -82,11 +83,11 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
} }
@Override public void connect(String reason) { @Override public void connect(@NotNull String reason) {
} }
@Override public void disconnect(String reason) { @Override public void disconnect(@NotNull String reason) {
} }
@ -94,15 +95,15 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
} }
@Override public void getPumpStatus(String reason) { @Override public void getPumpStatus(@NotNull String reason) {
} }
@Override public PumpEnactResult setNewBasalProfile(Profile profile) { @NotNull @Override public PumpEnactResult setNewBasalProfile(@NotNull Profile profile) {
return null; return null;
} }
@Override public boolean isThisProfileSet(Profile profile) { @Override public boolean isThisProfileSet(@NotNull Profile profile) {
return false; return false;
} }
@ -122,7 +123,7 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
return 0; return 0;
} }
@Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) { @NotNull @Override public PumpEnactResult deliverTreatment(@NotNull DetailedBolusInfo detailedBolusInfo) {
return null; return null;
} }
@ -130,47 +131,47 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
} }
@Override public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) { @NotNull @Override public PumpEnactResult setTempBasalAbsolute(double absoluteRate, int durationInMinutes, @NotNull Profile profile, boolean enforceNew) {
return null; return null;
} }
@Override public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) { @NotNull @Override public PumpEnactResult setTempBasalPercent(int percent, int durationInMinutes, @NotNull Profile profile, boolean enforceNew) {
return null; return null;
} }
@Override public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) { @NotNull @Override public PumpEnactResult setExtendedBolus(double insulin, int durationInMinutes) {
return null; return null;
} }
@Override public PumpEnactResult cancelTempBasal(boolean enforceNew) { @NotNull @Override public PumpEnactResult cancelTempBasal(boolean enforceNew) {
return null; return null;
} }
@Override public PumpEnactResult cancelExtendedBolus() { @NotNull @Override public PumpEnactResult cancelExtendedBolus() {
return null; return null;
} }
@Override public JSONObject getJSONStatus(Profile profile, String profileName, String version) { @NotNull @Override public JSONObject getJSONStatus(@NotNull Profile profile, @NotNull String profileName, @NotNull String version) {
return null; return null;
} }
@Override public ManufacturerType manufacturer() { @NotNull @Override public ManufacturerType manufacturer() {
return getPumpDescription().pumpType.getManufacturer(); return getPumpDescription().pumpType.getManufacturer();
} }
@Override public PumpType model() { @NotNull @Override public PumpType model() {
return getPumpDescription().pumpType; return getPumpDescription().pumpType;
} }
@Override public String serialNumber() { @NotNull @Override public String serialNumber() {
return null; return null;
} }
@Override public PumpDescription getPumpDescription() { @NotNull @Override public PumpDescription getPumpDescription() {
return PUMP_DESCRIPTION; return PUMP_DESCRIPTION;
} }
@Override public String shortStatus(boolean veryShort) { @NotNull @Override public String shortStatus(boolean veryShort) {
return null; return null;
} }
@ -178,7 +179,7 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
return false; return false;
} }
@Override public PumpEnactResult loadTDDs() { @NotNull @Override public PumpEnactResult loadTDDs() {
return null; return null;
} }
@ -192,15 +193,15 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
} }
@Override @Override
public void executeCustomAction(CustomActionType customActionType) { public void executeCustomAction(@NotNull CustomActionType customActionType) {
aapsLogger.warn(LTag.PUMP, "Unknown custom action: " + customActionType); aapsLogger.warn(LTag.PUMP, "Unsupported custom action: " + customActionType);
} }
@Nullable @Override public PumpEnactResult executeCustomCommand(CustomCommand customCommand) { @Nullable @Override public PumpEnactResult executeCustomCommand(@NotNull CustomCommand customCommand) {
return null; return null;
} }
@Override public void timezoneOrDSTChanged(TimeChangeType timeChangeType) { @Override public void timezoneOrDSTChanged(@NotNull TimeChangeType timeChangeType) {
} }
} }

View file

@ -5,16 +5,30 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import dagger.android.support.DaggerFragment import dagger.android.support.DaggerFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.databinding.OmnipodCommonOverviewButtonsBinding
import info.nightscout.androidaps.plugins.pump.omnipod.common.databinding.OmnipodCommonOverviewPodInfoBinding
import info.nightscout.androidaps.plugins.pump.omnipod.dash.databinding.OmnipodDashOverviewBinding import info.nightscout.androidaps.plugins.pump.omnipod.dash.databinding.OmnipodDashOverviewBinding
import info.nightscout.androidaps.plugins.pump.omnipod.dash.databinding.OmnipodDashOverviewBluetoothStatusBinding
class OmnipodDashOverviewFragment : DaggerFragment() { class OmnipodDashOverviewFragment : DaggerFragment() {
private var _binding: OmnipodDashOverviewBinding? = null var _binding: OmnipodDashOverviewBinding? = null
var _bluetoothStatusBinding: OmnipodDashOverviewBluetoothStatusBinding? = null
var _podInfoBinding: OmnipodCommonOverviewPodInfoBinding? = null
var _buttonBinding: OmnipodCommonOverviewButtonsBinding? = null
// This property is only valid between onCreateView and // These properties are only valid between onCreateView and
// onDestroyView. // onDestroyView.
private val binding get() = _binding!! val binding get() = _binding!!
val bluetoothStatusBinding get() = _bluetoothStatusBinding!!
val podInfoBinding get() = _podInfoBinding!!
val buttonBinding get() = _buttonBinding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
OmnipodDashOverviewBinding.inflate(inflater, container!!).also { _binding = it }.root OmnipodDashOverviewBinding.inflate(inflater, container, false).also {
_buttonBinding = OmnipodCommonOverviewButtonsBinding.bind(it.root)
_podInfoBinding = OmnipodCommonOverviewPodInfoBinding.bind(it.root)
_bluetoothStatusBinding = OmnipodDashOverviewBluetoothStatusBinding.bind(it.root)
_binding = it
}.root
} }

View file

@ -1,4 +1,4 @@
<merge xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -24,13 +24,9 @@
android:layout_marginBottom="5dp" android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" /> android:background="@color/list_delimiter" />
<include <include layout="@layout/omnipod_dash_overview_bluetooth_status" />
android:id="@+id/bluetooth_status"
layout="@layout/omnipod_dash_overview_bluetooth_status" />
<include <include layout="@layout/omnipod_common_overview_pod_info" />
android:id="@+id/pod_info"
layout="@layout/omnipod_common_overview_pod_info" />
</LinearLayout> </LinearLayout>
@ -43,10 +39,8 @@
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:orientation="horizontal"> android:orientation="horizontal">
<include <include layout="@layout/omnipod_common_overview_buttons" />
android:id="@+id/buttons"
layout="@layout/omnipod_common_overview_buttons" />
</LinearLayout> </LinearLayout>
</merge> </RelativeLayout>

View file

@ -38,44 +38,44 @@
android:paddingEnd="5dp" android:paddingEnd="5dp"
android:textSize="14sp" /> android:textSize="14sp" />
<LinearLayout <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1.5" android:orientation="horizontal">
android:gravity="end"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/omnipod_dash_bluetooth_status"
android:textSize="14sp" />
<TextView <TextView
android:layout_width="5dp" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="0" android:layout_weight="1.5"
android:gravity="center_horizontal" android:gravity="end"
android:paddingStart="2dp" android:paddingStart="5dp"
android:paddingEnd="2dp" android:paddingEnd="5dp"
android:text=":" android:text="@string/omnipod_dash_bluetooth_status"
android:textSize="14sp" android:textSize="14sp" />
tools:ignore="HardcodedText" />
<com.joanzapata.iconify.widget.IconTextView <TextView
android:id="@+id/omnipod_dash_bluetooth_address" android:layout_width="5dp"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:layout_weight="0"
android:layout_weight="1" android:gravity="center_horizontal"
android:gravity="start" android:paddingStart="2dp"
android:paddingStart="5dp" android:paddingEnd="2dp"
android:paddingEnd="5dp" android:text=":"
android:text="{fa-bluetooth-b} " android:textSize="14sp"
android:textSize="14sp" tools:ignore="HardcodedText" />
tools:ignore="HardcodedText" />
</LinearLayout> <com.joanzapata.iconify.widget.IconTextView
android:id="@+id/omnipod_dash_bluetooth_address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="start"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="{fa-bluetooth-b} "
android:textSize="14sp"
tools:ignore="HardcodedText" />
</LinearLayout>
</LinearLayout> </LinearLayout>

View file

@ -7,6 +7,8 @@
android:enabled="true" android:enabled="true"
android:exported="true" /> android:exported="true" />
<activity android:name=".ui.wizard.activation.ErosPodActivationWizardActivity" />
<activity android:name=".ui.wizard.deactivation.ErosPodDeactivationWizardActivity" />
<activity android:name=".ui.ErosPodManagementActivity" /> <activity android:name=".ui.ErosPodManagementActivity" />
<activity android:name=".ui.ErosPodHistoryActivity" /> <activity android:name=".ui.ErosPodHistoryActivity" />
</application> </application>

View file

@ -3,27 +3,40 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.dagger
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.android.ContributesAndroidInjector import dagger.android.ContributesAndroidInjector
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.ActivityScope
import info.nightscout.androidaps.plugins.pump.omnipod.eros.data.RLHistoryItemOmnipod import info.nightscout.androidaps.plugins.pump.omnipod.eros.data.RLHistoryItemOmnipod
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.manager.PodStateManager import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.manager.PodStateManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsErosPodStateManager import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsErosPodStateManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.rileylink.manager.OmnipodRileyLinkCommunicationManager import info.nightscout.androidaps.plugins.pump.omnipod.eros.rileylink.manager.OmnipodRileyLinkCommunicationManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.ErosPodHistoryActivity import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.ErosPodHistoryActivity
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.ErosPodManagementActivity import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.ErosPodManagementActivity
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.ErosPodActivationWizardActivity
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.ErosPodDeactivationWizardActivity
@Module @Module
@Suppress("unused") @Suppress("unused")
abstract class OmnipodErosModule { abstract class OmnipodErosModule {
// Activities // ACTIVITIES
@ActivityScope
@ContributesAndroidInjector(modules = [OmnipodErosWizardModule::class])
abstract fun contributesActivationWizardActivity(): ErosPodActivationWizardActivity
@ActivityScope
@ContributesAndroidInjector(modules = [OmnipodErosWizardModule::class])
abstract fun contributesDeactivationWizardActivity(): ErosPodDeactivationWizardActivity
@ContributesAndroidInjector @ContributesAndroidInjector
abstract fun contributesPodManagementActivity(): ErosPodManagementActivity abstract fun contributesPodManagementActivity(): ErosPodManagementActivity
@ContributesAndroidInjector abstract fun contributesPodHistoryActivity(): ErosPodHistoryActivity @ContributesAndroidInjector abstract fun contributesPodHistoryActivity(): ErosPodHistoryActivity
// Service // SERVICES
@ContributesAndroidInjector @ContributesAndroidInjector
abstract fun omnipodCommunicationManagerProvider(): OmnipodRileyLinkCommunicationManager abstract fun omnipodCommunicationManagerProvider(): OmnipodRileyLinkCommunicationManager
// Data // DATA
@ContributesAndroidInjector abstract fun rlHistoryItemOmnipod(): RLHistoryItemOmnipod @ContributesAndroidInjector abstract fun rlHistoryItemOmnipod(): RLHistoryItemOmnipod
companion object { companion object {

View file

@ -0,0 +1,88 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.dagger
import androidx.lifecycle.ViewModel
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.OmnipodPluginQualifier
import info.nightscout.androidaps.plugins.pump.omnipod.common.dagger.ViewModelKey
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InitializePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InsertCannulaViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.AttachPodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.PodActivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.action.DeactivatePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.PodDeactivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.PodDiscardedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.StartPodDeactivationViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.action.ErosInitializePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.action.ErosInsertCannulaViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.info.ErosAttachPodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.info.ErosPodActivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.info.ErosStartPodActivationViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.action.ErosDeactivatePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.info.ErosPodDeactivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.info.ErosPodDiscardedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.info.ErosStartPodDeactivationViewModel
@Module
@Suppress("unused")
abstract class OmnipodErosWizardModule {
// #### VIEW MODELS ############################################################################
// POD ACTIVATION
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(ErosStartPodActivationViewModel::class)
internal abstract fun startPodActivationViewModel(viewModel: ErosStartPodActivationViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(InitializePodViewModel::class)
internal abstract fun initializePodViewModel(viewModel: ErosInitializePodViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(AttachPodViewModel::class)
internal abstract fun attachPodViewModel(viewModel: ErosAttachPodViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(InsertCannulaViewModel::class)
internal abstract fun insertCannulaViewModel(viewModel: ErosInsertCannulaViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(PodActivatedViewModel::class)
internal abstract fun podActivatedViewModel(viewModel: ErosPodActivatedViewModel): ViewModel
// POD DEACTIVATION
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(StartPodDeactivationViewModel::class)
internal abstract fun startPodDeactivationViewModel(viewModel: ErosStartPodDeactivationViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(DeactivatePodViewModel::class)
internal abstract fun deactivatePodViewModel(viewModel: ErosDeactivatePodViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(PodDeactivatedViewModel::class)
internal abstract fun podDeactivatedViewModel(viewModel: ErosPodDeactivatedViewModel): ViewModel
@Binds
@IntoMap
@OmnipodPluginQualifier
@ViewModelKey(PodDiscardedViewModel::class)
internal abstract fun podDiscardedViewModel(viewModel: ErosPodDiscardedViewModel): ViewModel
}

View file

@ -132,7 +132,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.omnipod_pod_history_activity); setContentView(R.layout.omnipod_eros_pod_history_activity);
historyTypeSpinner = findViewById(R.id.omnipod_historytype); historyTypeSpinner = findViewById(R.id.omnipod_historytype);
statusView = findViewById(R.id.omnipod_historystatus); statusView = findViewById(R.id.omnipod_historystatus);
@ -223,7 +223,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
@NotNull @NotNull
@Override @Override
public HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { public HistoryViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.omnipod_pod_history_item, // View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.omnipod_eros_pod_history_item, //
viewGroup, false); viewGroup, false);
return new HistoryViewHolder(v); return new HistoryViewHolder(v);
} }

View file

@ -15,15 +15,16 @@ import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.tasks.ServiceTaskExecutor
import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandPlayTestBeep import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandPlayTestBeep
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.PodActivationWizardActivity import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.PodActivationWizardActivity
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.PodDeactivationWizardActivity
import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
import info.nightscout.androidaps.plugins.pump.omnipod.eros.databinding.OmnipodPodManagementBinding import info.nightscout.androidaps.plugins.pump.omnipod.eros.databinding.OmnipodErosPodManagementBinding
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ActivationProgress import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ActivationProgress
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.manager.PodStateManager import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.manager.PodStateManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.event.EventOmnipodErosPumpValuesChanged import info.nightscout.androidaps.plugins.pump.omnipod.eros.event.EventOmnipodErosPumpValuesChanged
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.queue.command.CommandReadPulseLog import info.nightscout.androidaps.plugins.pump.omnipod.eros.queue.command.CommandReadPulseLog
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.ErosPodActivationWizardActivity
import info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.ErosPodDeactivationWizardActivity
import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.queue.events.EventQueueChanged import info.nightscout.androidaps.queue.events.EventQueueChanged
import info.nightscout.androidaps.utils.FabricPrivacy import info.nightscout.androidaps.utils.FabricPrivacy
@ -54,12 +55,12 @@ class ErosPodManagementActivity : NoSplashAppCompatActivity() {
private var disposables: CompositeDisposable = CompositeDisposable() private var disposables: CompositeDisposable = CompositeDisposable()
private lateinit var binding: OmnipodPodManagementBinding private lateinit var binding: OmnipodErosPodManagementBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
binding = OmnipodPodManagementBinding.inflate(layoutInflater) binding = OmnipodErosPodManagementBinding.inflate(layoutInflater)
setContentView(binding.root) setContentView(binding.root)
binding.buttonActivatePod.setOnClickListener { binding.buttonActivatePod.setOnClickListener {
@ -70,13 +71,13 @@ class ErosPodManagementActivity : NoSplashAppCompatActivity() {
PodActivationWizardActivity.Type.LONG PodActivationWizardActivity.Type.LONG
} }
val intent = Intent(this, PodActivationWizardActivity::class.java) val intent = Intent(this, ErosPodActivationWizardActivity::class.java)
intent.putExtra(PodActivationWizardActivity.KEY_TYPE, type) intent.putExtra(PodActivationWizardActivity.KEY_TYPE, type)
startActivity(intent) startActivity(intent)
} }
binding.buttonDeactivatePod.setOnClickListener { binding.buttonDeactivatePod.setOnClickListener {
startActivity(Intent(this, PodDeactivationWizardActivity::class.java)) startActivity(Intent(this, ErosPodDeactivationWizardActivity::class.java))
} }
binding.buttonDiscardPod.setOnClickListener { binding.buttonDiscardPod.setOnClickListener {

View file

@ -22,6 +22,8 @@ import info.nightscout.androidaps.plugins.pump.common.events.EventRileyLinkDevic
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkServiceState
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.defs.RileyLinkTargetDevice
import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData import info.nightscout.androidaps.plugins.pump.common.hw.rileylink.service.RileyLinkServiceData
import info.nightscout.androidaps.plugins.pump.omnipod.common.databinding.OmnipodCommonOverviewButtonsBinding
import info.nightscout.androidaps.plugins.pump.omnipod.common.databinding.OmnipodCommonOverviewPodInfoBinding
import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandAcknowledgeAlerts import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandAcknowledgeAlerts
import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandHandleTimeChange import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandHandleTimeChange
import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandResumeDelivery import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandResumeDelivery
@ -29,6 +31,7 @@ import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.Comm
import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin import info.nightscout.androidaps.plugins.pump.omnipod.eros.OmnipodErosPumpPlugin
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
import info.nightscout.androidaps.plugins.pump.omnipod.eros.databinding.OmnipodErosOverviewBinding import info.nightscout.androidaps.plugins.pump.omnipod.eros.databinding.OmnipodErosOverviewBinding
import info.nightscout.androidaps.plugins.pump.omnipod.eros.databinding.OmnipodErosOverviewRileyLinkStatusBinding
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ActivationProgress import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ActivationProgress
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.OmnipodConstants
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus
@ -94,20 +97,29 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
var _binding: OmnipodErosOverviewBinding? = null var _binding: OmnipodErosOverviewBinding? = null
var _rileyLinkStatusBinding: OmnipodErosOverviewRileyLinkStatusBinding? = null
var _podInfoBinding: OmnipodCommonOverviewPodInfoBinding? = null
var _buttonBinding: OmnipodCommonOverviewButtonsBinding? = null
// This property is only valid between onCreateView and // These properties are only valid between onCreateView and
// onDestroyView. // onDestroyView.
val binding get() = _binding!! val binding get() = _binding!!
val rileyLinkStatusBinding get() = _rileyLinkStatusBinding!!
val podInfoBinding get() = _podInfoBinding!!
val buttonBinding get() = _buttonBinding!!
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
OmnipodErosOverviewBinding.inflate(inflater, container!!).also { OmnipodErosOverviewBinding.inflate(inflater, container, false).also {
_buttonBinding = OmnipodCommonOverviewButtonsBinding.bind(it.root)
_podInfoBinding = OmnipodCommonOverviewPodInfoBinding.bind(it.root)
_rileyLinkStatusBinding = OmnipodErosOverviewRileyLinkStatusBinding.bind(it.root)
_binding = it _binding = it
}.root }.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
binding.buttons.buttonPodManagement.setOnClickListener { buttonBinding.buttonPodManagement.setOnClickListener {
if (omnipodErosPumpPlugin.rileyLinkService?.verifyConfiguration() == true) { if (omnipodErosPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
activity?.let { activity -> activity?.let { activity ->
context?.let { context -> context?.let { context ->
@ -122,19 +134,19 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
} }
binding.buttons.buttonResumeDelivery.setOnClickListener { buttonBinding.buttonResumeDelivery.setOnClickListener {
disablePodActionButtons() disablePodActionButtons()
commandQueue.customCommand(CommandResumeDelivery(), commandQueue.customCommand(CommandResumeDelivery(),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_resume_delivery), true).messageOnSuccess(resourceHelper.gs(R.string.omnipod_common_confirmation_delivery_resumed))) DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_resume_delivery), true).messageOnSuccess(resourceHelper.gs(R.string.omnipod_common_confirmation_delivery_resumed)))
} }
binding.buttons.buttonRefreshStatus.setOnClickListener { buttonBinding.buttonRefreshStatus.setOnClickListener {
disablePodActionButtons() disablePodActionButtons()
commandQueue.customCommand(CommandGetPodStatus(), commandQueue.customCommand(CommandGetPodStatus(),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_refresh_status), false)) DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_refresh_status), false))
} }
binding.buttons.buttonSilenceAlerts.setOnClickListener { buttonBinding.buttonSilenceAlerts.setOnClickListener {
disablePodActionButtons() disablePodActionButtons()
commandQueue.customCommand(CommandAcknowledgeAlerts(), commandQueue.customCommand(CommandAcknowledgeAlerts(),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_silence_alerts), false) DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_silence_alerts), false)
@ -142,14 +154,14 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
.actionOnSuccess { rxBus.send(EventDismissNotification(Notification.OMNIPOD_POD_ALERTS)) }) .actionOnSuccess { rxBus.send(EventDismissNotification(Notification.OMNIPOD_POD_ALERTS)) })
} }
binding.buttons.buttonSuspendDelivery.setOnClickListener { buttonBinding.buttonSuspendDelivery.setOnClickListener {
disablePodActionButtons() disablePodActionButtons()
commandQueue.customCommand(CommandSuspendDelivery(), commandQueue.customCommand(CommandSuspendDelivery(),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_suspend_delivery), true) DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_suspend_delivery), true)
.messageOnSuccess(resourceHelper.gs(R.string.omnipod_common_confirmation_suspended_delivery))) .messageOnSuccess(resourceHelper.gs(R.string.omnipod_common_confirmation_suspended_delivery)))
} }
binding.buttons.buttonSetTime.setOnClickListener { buttonBinding.buttonSetTime.setOnClickListener {
disablePodActionButtons() disablePodActionButtons()
commandQueue.customCommand(CommandHandleTimeChange(true), commandQueue.customCommand(CommandHandleTimeChange(true),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_set_time), true) DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_set_time), true)
@ -216,7 +228,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
val resourceId = rileyLinkServiceState.resourceId val resourceId = rileyLinkServiceState.resourceId
val rileyLinkError = rileyLinkServiceData.rileyLinkError val rileyLinkError = rileyLinkServiceData.rileyLinkError
binding.rileyLink.rileyLinkStatus.text = rileyLinkStatusBinding.rileyLinkStatus.text =
when { when {
rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId) rileyLinkServiceState == RileyLinkServiceState.NotStarted -> resourceHelper.gs(resourceId)
rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId) rileyLinkServiceState.isConnecting -> "{fa-bluetooth-b spin} " + resourceHelper.gs(resourceId)
@ -224,7 +236,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.Omnipod)) rileyLinkServiceState.isError && rileyLinkError != null -> "{fa-bluetooth-b} " + resourceHelper.gs(rileyLinkError.getResourceId(RileyLinkTargetDevice.Omnipod))
else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId) else -> "{fa-bluetooth-b} " + resourceHelper.gs(resourceId)
} }
binding.rileyLink.rileyLinkStatus.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE) rileyLinkStatusBinding.rileyLinkStatus.setTextColor(if (rileyLinkServiceState.isError || rileyLinkError != null) Color.RED else Color.WHITE)
} }
private fun updateOmnipodStatus() { private fun updateOmnipodStatus() {
@ -242,41 +254,41 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
if (!podStateManager.hasPodState() || !podStateManager.isPodInitialized) { if (!podStateManager.hasPodState() || !podStateManager.isPodInitialized) {
binding.podInfo.podAddress.text = if (podStateManager.hasPodState()) { podInfoBinding.podAddress.text = if (podStateManager.hasPodState()) {
podStateManager.address.toString() podStateManager.address.toString()
} else { } else {
PLACEHOLDER PLACEHOLDER
} }
binding.podInfo.podLot.text = PLACEHOLDER podInfoBinding.podLot.text = PLACEHOLDER
binding.podInfo.podTid.text = PLACEHOLDER podInfoBinding.podTid.text = PLACEHOLDER
binding.podInfo.firmwareVersion.text = PLACEHOLDER podInfoBinding.firmwareVersion.text = PLACEHOLDER
binding.podInfo.timeOnPod.text = PLACEHOLDER podInfoBinding.timeOnPod.text = PLACEHOLDER
binding.podInfo.podExpiryDate.text = PLACEHOLDER podInfoBinding.podExpiryDate.text = PLACEHOLDER
binding.podInfo.podExpiryDate.setTextColor(Color.WHITE) podInfoBinding.podExpiryDate.setTextColor(Color.WHITE)
binding.podInfo.baseBasalRate.text = PLACEHOLDER podInfoBinding.baseBasalRate.text = PLACEHOLDER
binding.podInfo.totalDelivered.text = PLACEHOLDER podInfoBinding.totalDelivered.text = PLACEHOLDER
binding.podInfo.reservoir.text = PLACEHOLDER podInfoBinding.reservoir.text = PLACEHOLDER
binding.podInfo.reservoir.setTextColor(Color.WHITE) podInfoBinding.reservoir.setTextColor(Color.WHITE)
binding.podInfo.podActiveAlerts.text = PLACEHOLDER podInfoBinding.podActiveAlerts.text = PLACEHOLDER
} else { } else {
binding.podInfo.podAddress.text = podStateManager.address.toString() podInfoBinding.podAddress.text = podStateManager.address.toString()
binding.podInfo.podLot.text = podStateManager.lot.toString() podInfoBinding.podLot.text = podStateManager.lot.toString()
binding.podInfo.podTid.text = podStateManager.tid.toString() podInfoBinding.podTid.text = podStateManager.tid.toString()
binding.podInfo.firmwareVersion.text = resourceHelper.gs(R.string.omnipod_eros_overview_firmware_version_value, podStateManager.pmVersion.toString(), podStateManager.piVersion.toString()) podInfoBinding.firmwareVersion.text = resourceHelper.gs(R.string.omnipod_eros_overview_firmware_version_value, podStateManager.pmVersion.toString(), podStateManager.piVersion.toString())
binding.podInfo.timeOnPod.text = readableZonedTime(podStateManager.time) podInfoBinding.timeOnPod.text = readableZonedTime(podStateManager.time)
binding.podInfo.timeOnPod.setTextColor(if (podStateManager.timeDeviatesMoreThan(OmnipodConstants.TIME_DEVIATION_THRESHOLD)) { podInfoBinding.timeOnPod.setTextColor(if (podStateManager.timeDeviatesMoreThan(OmnipodConstants.TIME_DEVIATION_THRESHOLD)) {
Color.RED Color.RED
} else { } else {
Color.WHITE Color.WHITE
}) })
val expiresAt = podStateManager.expiresAt val expiresAt = podStateManager.expiresAt
if (expiresAt == null) { if (expiresAt == null) {
binding.podInfo.podExpiryDate.text = PLACEHOLDER podInfoBinding.podExpiryDate.text = PLACEHOLDER
binding.podInfo.podExpiryDate.setTextColor(Color.WHITE) podInfoBinding.podExpiryDate.setTextColor(Color.WHITE)
} else { } else {
binding.podInfo.podExpiryDate.text = readableZonedTime(expiresAt) podInfoBinding.podExpiryDate.text = readableZonedTime(expiresAt)
binding.podInfo.podExpiryDate.setTextColor(if (DateTime.now().isAfter(expiresAt)) { podInfoBinding.podExpiryDate.setTextColor(if (DateTime.now().isAfter(expiresAt)) {
Color.RED Color.RED
} else { } else {
Color.WHITE Color.WHITE
@ -289,14 +301,14 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
// base basal rate // base basal rate
binding.podInfo.baseBasalRate.text = if (podStateManager.isPodActivationCompleted) { podInfoBinding.baseBasalRate.text = if (podStateManager.isPodActivationCompleted) {
resourceHelper.gs(R.string.pump_basebasalrate, omnipodErosPumpPlugin.model().determineCorrectBasalSize(podStateManager.basalSchedule.rateAt(TimeUtil.toDuration(DateTime.now())))) resourceHelper.gs(R.string.pump_basebasalrate, omnipodErosPumpPlugin.model().determineCorrectBasalSize(podStateManager.basalSchedule.rateAt(TimeUtil.toDuration(DateTime.now()))))
} else { } else {
PLACEHOLDER PLACEHOLDER
} }
// total delivered // total delivered
binding.podInfo.totalDelivered.text = if (podStateManager.isPodActivationCompleted && podStateManager.totalInsulinDelivered != null) { podInfoBinding.totalDelivered.text = if (podStateManager.isPodActivationCompleted && podStateManager.totalInsulinDelivered != null) {
resourceHelper.gs(R.string.omnipod_common_overview_total_delivered_value, podStateManager.totalInsulinDelivered - OmnipodConstants.POD_SETUP_UNITS) resourceHelper.gs(R.string.omnipod_common_overview_total_delivered_value, podStateManager.totalInsulinDelivered - OmnipodConstants.POD_SETUP_UNITS)
} else { } else {
PLACEHOLDER PLACEHOLDER
@ -304,21 +316,21 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
// reservoir // reservoir
if (podStateManager.reservoirLevel == null) { if (podStateManager.reservoirLevel == null) {
binding.podInfo.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value_over50) podInfoBinding.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value_over50)
binding.podInfo.reservoir.setTextColor(Color.WHITE) podInfoBinding.reservoir.setTextColor(Color.WHITE)
} else { } else {
val lowReservoirThreshold = (omnipodAlertUtil.lowReservoirAlertUnits val lowReservoirThreshold = (omnipodAlertUtil.lowReservoirAlertUnits
?: OmnipodConstants.DEFAULT_MAX_RESERVOIR_ALERT_THRESHOLD).toDouble() ?: OmnipodConstants.DEFAULT_MAX_RESERVOIR_ALERT_THRESHOLD).toDouble()
binding.podInfo.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value, podStateManager.reservoirLevel) podInfoBinding.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value, podStateManager.reservoirLevel)
binding.podInfo.reservoir.setTextColor(if (podStateManager.reservoirLevel < lowReservoirThreshold) { podInfoBinding.reservoir.setTextColor(if (podStateManager.reservoirLevel < lowReservoirThreshold) {
Color.RED Color.RED
} else { } else {
Color.WHITE Color.WHITE
}) })
} }
binding.podInfo.podActiveAlerts.text = if (podStateManager.hasActiveAlerts()) { podInfoBinding.podActiveAlerts.text = if (podStateManager.hasActiveAlerts()) {
TextUtils.join(System.lineSeparator(), omnipodUtil.getTranslatedActiveAlerts(podStateManager)) TextUtils.join(System.lineSeparator(), omnipodUtil.getTranslatedActiveAlerts(podStateManager))
} else { } else {
PLACEHOLDER PLACEHOLDER
@ -326,27 +338,27 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
if (errors.size == 0) { if (errors.size == 0) {
binding.podInfo.errors.text = PLACEHOLDER podInfoBinding.errors.text = PLACEHOLDER
binding.podInfo.errors.setTextColor(Color.WHITE) podInfoBinding.errors.setTextColor(Color.WHITE)
} else { } else {
binding.podInfo.errors.text = StringUtils.join(errors, System.lineSeparator()) podInfoBinding.errors.text = StringUtils.join(errors, System.lineSeparator())
binding.podInfo.errors.setTextColor(Color.RED) podInfoBinding.errors.setTextColor(Color.RED)
} }
} }
private fun updateLastConnection() { private fun updateLastConnection() {
if (podStateManager.isPodInitialized && podStateManager.lastSuccessfulCommunication != null) { if (podStateManager.isPodInitialized && podStateManager.lastSuccessfulCommunication != null) {
binding.podInfo.lastConnection.text = readableDuration(podStateManager.lastSuccessfulCommunication) podInfoBinding.lastConnection.text = readableDuration(podStateManager.lastSuccessfulCommunication)
val lastConnectionColor = val lastConnectionColor =
if (omnipodErosPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) { if (omnipodErosPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) {
Color.RED Color.RED
} else { } else {
Color.WHITE Color.WHITE
} }
binding.podInfo.lastConnection.setTextColor(lastConnectionColor) podInfoBinding.lastConnection.setTextColor(lastConnectionColor)
} else { } else {
binding.podInfo.lastConnection.setTextColor(Color.WHITE) podInfoBinding.lastConnection.setTextColor(Color.WHITE)
binding.podInfo.lastConnection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) { podInfoBinding.lastConnection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) {
readableDuration(podStateManager.lastSuccessfulCommunication) readableDuration(podStateManager.lastSuccessfulCommunication)
} else { } else {
PLACEHOLDER PLACEHOLDER
@ -355,7 +367,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
private fun updatePodStatus() { private fun updatePodStatus() {
binding.podInfo.podStatus.text = if (!podStateManager.hasPodState()) { podInfoBinding.podStatus.text = if (!podStateManager.hasPodState()) {
resourceHelper.gs(R.string.omnipod_common_pod_status_no_active_pod) resourceHelper.gs(R.string.omnipod_common_pod_status_no_active_pod)
} else if (!podStateManager.isPodActivationCompleted) { } else if (!podStateManager.isPodActivationCompleted) {
if (!podStateManager.isPodInitialized) { if (!podStateManager.isPodInitialized) {
@ -394,7 +406,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} else { } else {
Color.WHITE Color.WHITE
} }
binding.podInfo.podStatus.setTextColor(podStatusColor) podInfoBinding.podStatus.setTextColor(podStatusColor)
} }
private fun updateLastBolus() { private fun updateLastBolus() {
@ -409,20 +421,20 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")" text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")"
} }
binding.podInfo.lastBolus.text = text podInfoBinding.lastBolus.text = text
binding.podInfo.lastBolus.setTextColor(textColor) podInfoBinding.lastBolus.setTextColor(textColor)
} else { } else {
binding.podInfo.lastBolus.text = PLACEHOLDER podInfoBinding.lastBolus.text = PLACEHOLDER
binding.podInfo.lastBolus.setTextColor(Color.WHITE) podInfoBinding.lastBolus.setTextColor(Color.WHITE)
} }
} }
private fun updateTempBasal() { private fun updateTempBasal() {
if (podStateManager.isPodActivationCompleted && podStateManager.isTempBasalRunning) { if (podStateManager.isPodActivationCompleted && podStateManager.isTempBasalRunning) {
if (!podStateManager.hasTempBasal()) { if (!podStateManager.hasTempBasal()) {
binding.podInfo.tempBasal.text = "???" podInfoBinding.tempBasal.text = "???"
binding.podInfo.tempBasal.setTextColor(Color.RED) podInfoBinding.tempBasal.setTextColor(Color.RED)
} else { } else {
val now = DateTime.now() val now = DateTime.now()
@ -442,8 +454,8 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")" text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")"
} }
binding.podInfo.tempBasal.text = text podInfoBinding.tempBasal.text = text
binding.podInfo.tempBasal.setTextColor(textColor) podInfoBinding.tempBasal.setTextColor(textColor)
} }
} else { } else {
var text = PLACEHOLDER var text = PLACEHOLDER
@ -456,17 +468,17 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")" text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")"
} }
binding.podInfo.tempBasal.text = text podInfoBinding.tempBasal.text = text
binding.podInfo.tempBasal.setTextColor(textColor) podInfoBinding.tempBasal.setTextColor(textColor)
} }
} }
private fun updateQueueStatus() { private fun updateQueueStatus() {
if (isQueueEmpty()) { if (isQueueEmpty()) {
binding.podInfo.queue.visibility = View.GONE podInfoBinding.queue.visibility = View.GONE
} else { } else {
binding.podInfo.queue.visibility = View.VISIBLE podInfoBinding.queue.visibility = View.VISIBLE
binding.podInfo.queue.text = commandQueue.spannedStatus().toString() podInfoBinding.queue.text = commandQueue.spannedStatus().toString()
} }
} }
@ -479,52 +491,52 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} }
private fun disablePodActionButtons() { private fun disablePodActionButtons() {
binding.buttons.buttonSilenceAlerts.isEnabled = false buttonBinding.buttonSilenceAlerts.isEnabled = false
binding.buttons.buttonResumeDelivery.isEnabled = false buttonBinding.buttonResumeDelivery.isEnabled = false
binding.buttons.buttonSuspendDelivery.isEnabled = false buttonBinding.buttonSuspendDelivery.isEnabled = false
binding.buttons.buttonSetTime.isEnabled = false buttonBinding.buttonSetTime.isEnabled = false
binding.buttons.buttonRefreshStatus.isEnabled = false buttonBinding.buttonRefreshStatus.isEnabled = false
} }
private fun updateRefreshStatusButton() { private fun updateRefreshStatusButton() {
binding.buttons.buttonRefreshStatus.isEnabled = podStateManager.isPodInitialized && podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED) buttonBinding.buttonRefreshStatus.isEnabled = podStateManager.isPodInitialized && podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
&& rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} }
private fun updateResumeDeliveryButton() { private fun updateResumeDeliveryButton() {
if (podStateManager.isPodRunning && (podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandResumeDelivery::class.java))) { if (podStateManager.isPodRunning && (podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandResumeDelivery::class.java))) {
binding.buttons.buttonResumeDelivery.visibility = View.VISIBLE buttonBinding.buttonResumeDelivery.visibility = View.VISIBLE
binding.buttons.buttonResumeDelivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() buttonBinding.buttonResumeDelivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else { } else {
binding.buttons.buttonResumeDelivery.visibility = View.GONE buttonBinding.buttonResumeDelivery.visibility = View.GONE
} }
} }
private fun updateSilenceAlertsButton() { private fun updateSilenceAlertsButton() {
if (!omnipodManager.isAutomaticallyAcknowledgeAlertsEnabled && podStateManager.isPodRunning && (podStateManager.hasActiveAlerts() || commandQueue.isCustomCommandInQueue(CommandAcknowledgeAlerts::class.java))) { if (!omnipodManager.isAutomaticallyAcknowledgeAlertsEnabled && podStateManager.isPodRunning && (podStateManager.hasActiveAlerts() || commandQueue.isCustomCommandInQueue(CommandAcknowledgeAlerts::class.java))) {
binding.buttons.buttonSilenceAlerts.visibility = View.VISIBLE buttonBinding.buttonSilenceAlerts.visibility = View.VISIBLE
binding.buttons.buttonSilenceAlerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() buttonBinding.buttonSilenceAlerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else { } else {
binding.buttons.buttonSilenceAlerts.visibility = View.GONE buttonBinding.buttonSilenceAlerts.visibility = View.GONE
} }
} }
private fun updateSuspendDeliveryButton() { private fun updateSuspendDeliveryButton() {
// If the Pod is currently suspended, we show the Resume delivery button instead. // 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))) { if (omnipodManager.isSuspendDeliveryButtonEnabled && podStateManager.isPodRunning && (!podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandSuspendDelivery::class.java))) {
binding.buttons.buttonSuspendDelivery.visibility = View.VISIBLE buttonBinding.buttonSuspendDelivery.visibility = View.VISIBLE
binding.buttons.buttonSuspendDelivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() buttonBinding.buttonSuspendDelivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else { } else {
binding.buttons.buttonSuspendDelivery.visibility = View.GONE buttonBinding.buttonSuspendDelivery.visibility = View.GONE
} }
} }
private fun updateSetTimeButton() { private fun updateSetTimeButton() {
if (podStateManager.isPodRunning && (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5)) || commandQueue.isCustomCommandInQueue(CommandHandleTimeChange::class.java))) { if (podStateManager.isPodRunning && (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5)) || commandQueue.isCustomCommandInQueue(CommandHandleTimeChange::class.java))) {
binding.buttons.buttonSetTime.visibility = View.VISIBLE buttonBinding.buttonSetTime.visibility = View.VISIBLE
binding.buttons.buttonSetTime.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty() buttonBinding.buttonSetTime.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else { } else {
binding.buttons.buttonSetTime.visibility = View.GONE buttonBinding.buttonSetTime.visibility = View.GONE
} }
} }

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.PodActivationWizardActivity
class ErosPodActivationWizardActivity : PodActivationWizardActivity()

View file

@ -0,0 +1,27 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.action
import androidx.annotation.StringRes
import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InitializePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ActivationProgress
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsErosPodStateManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager
import javax.inject.Inject
class ErosInitializePodViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodErosManager, private val podStateManager: AapsErosPodStateManager) : InitializePodViewModel() {
override fun isPodInAlarm(): Boolean = podStateManager.isPodFaulted
override fun isPodActivationTimeExceeded(): Boolean = podStateManager.isPodActivationTimeExceeded
override fun isPodDeactivatable(): Boolean = podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.initializePod()
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_initialize_pod_title
@StringRes
override fun getTextId() = R.string.omnipod_eros_pod_activation_wizard_initialize_pod_text
}

View file

@ -0,0 +1,28 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.action
import androidx.annotation.StringRes
import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InsertCannulaViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.ActivationProgress
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsErosPodStateManager
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager
import javax.inject.Inject
class ErosInsertCannulaViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodErosManager, private val podStateManager: AapsErosPodStateManager, private val profileFunction: ProfileFunction) : InsertCannulaViewModel() {
override fun isPodInAlarm(): Boolean = podStateManager.isPodFaulted
override fun isPodActivationTimeExceeded(): Boolean = podStateManager.isPodActivationTimeExceeded
override fun isPodDeactivatable(): Boolean = podStateManager.activationProgress.isAtLeast(ActivationProgress.PAIRING_COMPLETED)
override fun doExecuteAction(): PumpEnactResult = aapsOmnipodManager.insertCannula(profileFunction.getProfile())
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_insert_cannula_title
@StringRes
override fun getTextId() = R.string.omnipod_common_pod_activation_wizard_insert_cannula_text
}

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.info
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.AttachPodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
class ErosAttachPodViewModel : AttachPodViewModel() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_attach_pod_title
@StringRes
override fun getTextId() = R.string.omnipod_common_pod_activation_wizard_attach_pod_text
}

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.info
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.PodActivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
class ErosPodActivatedViewModel : PodActivatedViewModel() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_pod_activated_title
@StringRes
override fun getTextId() = R.string.omnipod_common_pod_activation_wizard_pod_activated_text
}

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.activation.viewmodel.info
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.info.StartPodActivationViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
class ErosStartPodActivationViewModel : StartPodActivationViewModel() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_start_pod_activation_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_eros_pod_activation_wizard_start_pod_activation_text
}

View file

@ -0,0 +1,5 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.PodDeactivationWizardActivity
class ErosPodDeactivationWizardActivity : PodDeactivationWizardActivity()

View file

@ -1,15 +1,17 @@
package info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.action
import androidx.annotation.StringRes
import info.nightscout.androidaps.data.PumpEnactResult import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.interfaces.CommandQueueProvider import info.nightscout.androidaps.interfaces.CommandQueueProvider
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandDeactivatePod import info.nightscout.androidaps.plugins.pump.omnipod.common.queue.command.CommandDeactivatePod
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.common.viewmodel.ActionViewModelBase import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.action.DeactivatePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodManager import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager
import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.queue.Callback
import io.reactivex.subjects.SingleSubject import io.reactivex.subjects.SingleSubject
import javax.inject.Inject import javax.inject.Inject
class DeactivatePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val commandQueueProvider: CommandQueueProvider) : ActionViewModelBase() { class ErosDeactivatePodViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodErosManager, private val commandQueueProvider: CommandQueueProvider) : DeactivatePodViewModel() {
override fun doExecuteAction(): PumpEnactResult { override fun doExecuteAction(): PumpEnactResult {
val singleSubject = SingleSubject.create<PumpEnactResult>() val singleSubject = SingleSubject.create<PumpEnactResult>()
@ -21,7 +23,13 @@ class DeactivatePodActionViewModel @Inject constructor(private val aapsOmnipodMa
return singleSubject.blockingGet() return singleSubject.blockingGet()
} }
fun discardPod() { override fun discardPod() {
aapsOmnipodManager.discardPodState() aapsOmnipodManager.discardPodState()
} }
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_deactivating_pod_title
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_deactivation_wizard_deactivating_pod_text
} }

View file

@ -0,0 +1,15 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.info
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.PodDeactivatedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
class ErosPodDeactivatedViewModel : PodDeactivatedViewModel() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_pod_deactivated_title
@StringRes
override fun getTextId() = R.string.omnipod_common_pod_deactivation_wizard_pod_deactivated_text
}

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.info
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.PodDiscardedViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
class ErosPodDiscardedViewModel : PodDiscardedViewModel() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_pod_discarded_title
@StringRes
override fun getTextId() = R.string.omnipod_common_pod_deactivation_wizard_pod_discarded_text
}

View file

@ -0,0 +1,14 @@
package info.nightscout.androidaps.plugins.pump.omnipod.eros.ui.wizard.deactivation.viewmodel.info
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.info.StartPodDeactivationViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.R
class ErosStartPodDeactivationViewModel : StartPodDeactivationViewModel() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_deactivation_wizard_start_pod_deactivation_title
@StringRes
override fun getTextId() = R.string.omnipod_common_pod_deactivation_wizard_start_pod_deactivation_text
}

View file

@ -1,4 +1,4 @@
<merge xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -24,13 +24,9 @@
android:layout_marginBottom="5dp" android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" /> android:background="@color/list_delimiter" />
<include <include layout="@layout/omnipod_eros_overview_riley_link_status" />
android:id="@+id/riley_link"
layout="@layout/omnipod_eros_overview_riley_link_status" />
<include <include layout="@layout/omnipod_common_overview_pod_info" />
android:id="@+id/pod_info"
layout="@layout/omnipod_common_overview_pod_info" />
</LinearLayout> </LinearLayout>
@ -43,10 +39,8 @@
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:orientation="horizontal"> android:orientation="horizontal">
<include <include layout="@layout/omnipod_common_overview_buttons" />
android:id="@+id/buttons"
layout="@layout/omnipod_common_overview_buttons" />
</LinearLayout> </LinearLayout>
</merge> </RelativeLayout>

View file

@ -2,39 +2,39 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<LinearLayout <LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"> android:orientation="horizontal">
<TextView <TextView
android:gravity="end" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1.5" android:layout_weight="1.5"
android:layout_width="match_parent" android:gravity="end"
android:paddingEnd="5dp"
android:paddingStart="5dp" android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/rileylink_status" android:text="@string/rileylink_status"
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:gravity="center_horizontal" android:layout_width="5dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="0" android:layout_weight="0"
android:layout_width="5dp" android:gravity="center_horizontal"
android:paddingEnd="2dp"
android:paddingStart="2dp" android:paddingStart="2dp"
android:paddingEnd="2dp"
android:text=":" android:text=":"
android:textSize="14sp" android:textSize="14sp"
tools:ignore="HardcodedText" /> tools:ignore="HardcodedText" />
<com.joanzapata.iconify.widget.IconTextView <com.joanzapata.iconify.widget.IconTextView
android:gravity="start"
android:id="@+id/riley_link_status" android:id="@+id/riley_link_status"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:layout_width="match_parent" android:gravity="start"
android:paddingEnd="5dp"
android:paddingStart="5dp" android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="{fa-bluetooth-b}" android:text="{fa-bluetooth-b}"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="14sp" android:textSize="14sp"
@ -43,11 +43,11 @@
</LinearLayout> </LinearLayout>
<View <View
android:background="@color/list_delimiter" android:layout_width="fill_parent"
android:layout_height="2dip" android:layout_height="2dip"
android:layout_marginBottom="5dp"
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:layout_width="fill_parent" /> android:layout_marginRight="20dp"
android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" />
</merge> </merge>

View file

@ -89,7 +89,7 @@
<string name="omnipod_eros_pod_management_pulse_log_value">Pulse Log (copied to clipboard)</string> <string name="omnipod_eros_pod_management_pulse_log_value">Pulse Log (copied to clipboard)</string>
<!-- Omnipod Eros - Pod Activation Wizard --> <!-- Omnipod Eros - Pod Activation Wizard -->
<string name="omnipod_eros_pod_activation_wizard_fill_pod_text">Fill a new Pod with enough insulin for 3 days.\n\nListen for two beeps from the Pod during the filling process. These indicate that the minimum amount of 85U has been inserted. Be sure to completely empty the fill syringe, even after hearing the two beeps.\n\nAfter filling the Pod, please press <b>Next</b>.\n\n<b>Note:</b> do not remove the Pod\'s needle cap at this time.\n<b>Note:</b> please place the RileyLink in an upright position and place the Pod a few inches away from it.</string> <string name="omnipod_eros_pod_activation_wizard_start_pod_activation_text">Fill a new Pod with enough insulin for 3 days.\n\nListen for two beeps from the Pod during the filling process. These indicate that the minimum amount of 85U has been inserted. Be sure to completely empty the fill syringe, even after hearing the two beeps.\n\nAfter filling the Pod, please press <b>Next</b>.\n\n<b>Note:</b> do not remove the Pod\'s needle cap at this time.\n<b>Note:</b> please place the RileyLink in an upright position and place the Pod a few inches away from it.</string>
<string name="omnipod_eros_pod_activation_wizard_initialize_pod_text">Trying to pair with the new Pod and prime it.\n\nWhen the initialization process has successfully been completed, you can press <b>Next</b>.\n\n<b>Note:</b> please place the RileyLink in an upright position and place the Pod a few inches away from it.</string> <string name="omnipod_eros_pod_activation_wizard_initialize_pod_text">Trying to pair with the new Pod and prime it.\n\nWhen the initialization process has successfully been completed, you can press <b>Next</b>.\n\n<b>Note:</b> please place the RileyLink in an upright position and place the Pod a few inches away from it.</string>
<!-- Omnipod Eros - Other --> <!-- Omnipod Eros - Other -->