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() -> {
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.
// The only way to 'reconnect' it, is through the Omnipod tab
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_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)
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)
}
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")
} else {
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 (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
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)
if (pump.model() == PumpType.Omnipod_Dash) {
// 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) {
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")
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) {
handleLevel(view, criticalSetting, criticalDefaultValue, warnSetting, warnDefaultValue, level, units)
} 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.NSProfilePlugin
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.setupwizard.elements.*
import info.nightscout.androidaps.setupwizard.events.EventSWUpdate
@ -277,14 +278,14 @@ class SWDefinition @Inject constructor(
.add(SWInfoText(injector)
.label(R.string.setupwizard_pump_pump_not_initialized)
.visibility { !isPumpInitialized() })
.add( // Omnipod only
.add( // Omnipod Eros only
SWInfoText(injector)
.label(R.string.setupwizard_pump_waiting_for_riley_link_connection)
.visibility {
val activePump = activePlugin.activePump
activePump is OmnipodErosPumpPlugin && !activePump.isRileyLinkReady
})
.add( // Omnipod only
.add( // Omnipod Eros only
SWEventListener(injector, EventRileyLinkDeviceStatusChange::class.java)
.label(R.string.setupwizard_pump_riley_link_status)
.visibility { activePlugin.activePump is OmnipodErosPumpPlugin })
@ -294,18 +295,21 @@ class SWDefinition @Inject constructor(
.visibility {
// 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
activePlugin.activePump !is OmnipodErosPumpPlugin
activePlugin.activePump !is OmnipodErosPumpPlugin && activePlugin.activePump !is OmnipodDashPumpPlugin
})
.add(SWEventListener(injector, EventPumpStatusChanged::class.java)
.visibility { activePlugin.activePump !is OmnipodErosPumpPlugin })
.visibility { activePlugin.activePump !is OmnipodErosPumpPlugin && activePlugin.activePump !is OmnipodDashPumpPlugin })
.validator { isPumpInitialized() }
private fun isPumpInitialized(): Boolean {
val activePump = activePlugin.activePump
// For Omnipod, consider the pump initialized when a RL has been configured successfully
// Users will be prompted to activate a Pod after completing the setup wizard.
return activePump.isInitialized() || (activePump is OmnipodErosPumpPlugin && activePump.isRileyLinkReady)
// For Omnipod, activating a Pod can be done after setup through the Omnipod fragment
// For the Eros model, consider the pump initialized when a RL has been configured successfully
// 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)

View file

@ -1,9 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="info.nightscout.androidaps.plugins.pump.omnipod.common">
<manifest package="info.nightscout.androidaps.plugins.pump.omnipod.common">
<application>
<activity android:name=".ui.wizard.activation.PodActivationWizardActivity" />
<activity android:name=".ui.wizard.deactivation.PodDeactivationWizardActivity" />
</application>
<application></application>
</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)
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@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

View file

@ -2,23 +2,18 @@ package info.nightscout.androidaps.plugins.pump.omnipod.common.dagger
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.android.ContributesAndroidInjector
import dagger.multibindings.IntoMap
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.FillPodInfoFragment
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.InsertCannulaActionFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.PodActivatedInfoFragment
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.InsertCannulaActionViewModel
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.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 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.action.InsertCannulaFragment
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.info.PodActivatedFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.fragment.info.StartPodActivationFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.action.DeactivatePodFragment
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.fragment.info.PodDeactivatedFragment
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.info.StartPodDeactivationFragment
import javax.inject.Provider
@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 ##############################################################################
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesDeactivatePodActionFragment(): DeactivatePodActionFragment
// POD ACTIVATION
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesInsertCannulaActionFragment(): InsertCannulaActionFragment
internal abstract fun contributesStartPodActivationFragment(): StartPodActivationFragment
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesInitializePodActionFragment(): InitializePodActionFragment
internal abstract fun contributesInitializeActionFragment(): InitializePodFragment
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesAttachPodInfoFragment(): AttachPodInfoFragment
internal abstract fun contributesAttachPodFragment(): AttachPodFragment
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesDeactivatePodInfoFragment(): DeactivatePodInfoFragment
internal abstract fun contributesInsertCannulaFragment(): InsertCannulaFragment
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesFillPodInfoFragment(): FillPodInfoFragment
internal abstract fun contributesPodActivatedFragment(): PodActivatedFragment
// POD DEACTIVATION
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesPodDeactivatedInfoFragment(): PodDeactivatedInfoFragment
internal abstract fun contributesStartPodDeactivationFragment(): StartPodDeactivationFragment
@FragmentScope
@ContributesAndroidInjector
internal abstract fun contributesPodDiscardedInfoFragment(): PodDiscardedInfoFragment
internal abstract fun contributesDeactivatePodFragment(): DeactivatePodFragment
@FragmentScope
@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.ui.wizard.common.activity.OmnipodWizardActivityBase
class PodActivationWizardActivity : OmnipodWizardActivityBase() {
abstract class PodActivationWizardActivity : OmnipodWizardActivityBase() {
companion object {
const val KEY_TYPE = "wizardType"
@ -18,18 +18,18 @@ class PodActivationWizardActivity : OmnipodWizardActivityBase() {
}
@IdRes
private var startDestination: Int = R.id.fillPodInfoFragment
private var startDestination: Int = R.id.startPodActivationFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
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) {
R.id.fillPodInfoFragment
R.id.startPodActivationFragment
} else {
R.id.attachPodInfoFragment
R.id.attachPodFragment
}
setStartDestination(startDestination)
@ -52,7 +52,7 @@ class PodActivationWizardActivity : OmnipodWizardActivityBase() {
override fun getTotalDefinedNumberOfSteps(): Int = 5
override fun getActualNumberOfSteps(): Int {
if (startDestination == R.id.attachPodInfoFragment) {
if (startDestination == R.id.attachPodFragment) {
return 3
}
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 androidx.annotation.IdRes
import androidx.annotation.StringRes
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.activation.viewmodel.InitializePodActionViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InitializePodViewModel
import javax.inject.Inject
class InitializePodActionFragment : PodActivationActionFragmentBase() {
class InitializePodFragment : PodActivationActionFragmentBase() {
@Inject
@OmnipodPluginQualifier
@ -19,18 +18,12 @@ class InitializePodActionFragment : PodActivationActionFragmentBase() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: InitializePodActionViewModel by viewModels { viewModelFactory }
val vm: InitializePodViewModel by viewModels { viewModelFactory }
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
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
}

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 androidx.annotation.IdRes
import androidx.annotation.StringRes
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.activation.viewmodel.InsertCannulaActionViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.activation.viewmodel.action.InsertCannulaViewModel
import javax.inject.Inject
class InsertCannulaActionFragment : PodActivationActionFragmentBase() {
class InsertCannulaFragment : PodActivationActionFragmentBase() {
@Inject
@OmnipodPluginQualifier
@ -19,18 +18,12 @@ class InsertCannulaActionFragment : PodActivationActionFragmentBase() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: InsertCannulaActionViewModel by viewModels { viewModelFactory }
val vm: InsertCannulaViewModel by viewModels { viewModelFactory }
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
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
}

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.os.Bundle
import android.view.View
import android.widget.Button
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.deactivation.PodDeactivationWizardActivity
@ -23,7 +23,7 @@ abstract class PodActivationActionFragmentBase : ActionFragmentBase() {
}
override fun onFailure() {
(viewModel as? PodActivationActionViewModelBase)?.let { viewModel ->
(actionViewModel as? PodActivationActionViewModelBase)?.let { viewModel ->
if (viewModel.isPodDeactivatable() and (viewModel.isPodInAlarm() or viewModel.isPodActivationTimeExceeded())) {
view?.let {
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.view.View
import android.widget.Button
import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
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 javax.inject.Inject
class AttachPodInfoFragment : InfoFragmentBase() {
class AttachPodFragment : InfoFragmentBase() {
@StringRes
override fun getTitleId(): Int = R.string.omnipod_common_pod_activation_wizard_attach_pod_title
@Inject
@OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
@StringRes
override fun getTextId(): Int = R.string.omnipod_common_pod_activation_wizard_attach_pod_text
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: AttachPodViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@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

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 androidx.annotation.IdRes
import androidx.annotation.StringRes
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.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 javax.inject.Inject
class FillPodInfoFragment : InfoFragmentBase() {
class StartPodActivationFragment : InfoFragmentBase() {
@Inject
@OmnipodPluginQualifier
lateinit var viewModelFactory: ViewModelProvider.Factory
private lateinit var viewModel: FillPodInfoViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: FillPodInfoViewModel by viewModels { viewModelFactory }
val vm: StartPodActivationViewModel by viewModels { viewModelFactory }
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
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
}

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

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.view.View
import android.widget.Button
import android.widget.ProgressBar
import android.widget.TextView
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.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
abstract class ActionFragmentBase : WizardFragmentBase() {
protected lateinit var viewModel: ActionViewModelBase
val actionViewModel: PodActivationActionViewModelBase
get() = viewModel as PodActivationActionViewModelBase
@SuppressLint("CutPasteId")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
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) {
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_discard_pod).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
})
viewModel.actionResultLiveData.observe(viewLifecycleOwner, { result ->
actionViewModel.actionResultLiveData.observe(viewLifecycleOwner, { result ->
result?.let {
val isExecuting = isActionExecuting()
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<Button>(R.id.omnipod_wizard_action_error).visibility = (!isExecuting && !result.success).toVisibility()
view.findViewById<TextView>(R.id.omnipod_wizard_action_success).visibility = 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()
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()
}
}
})
if (savedInstanceState == null && !isActionExecuting()) {
viewModel.executeAction()
actionViewModel.executeAction()
}
}
protected fun isActionExecuting() = viewModel.isActionExecutingLiveData.value!!
protected fun isActionExecuting() = actionViewModel.isActionExecutingLiveData.value!!
override fun onDestroyView() {
super.onDestroyView()
viewModel.isActionExecutingLiveData.removeObservers(viewLifecycleOwner)
viewModel.actionResultLiveData.removeObservers(viewLifecycleOwner)
actionViewModel.isActionExecutingLiveData.removeObservers(viewLifecycleOwner)
actionViewModel.actionResultLiveData.removeObservers(viewLifecycleOwner)
}
abstract fun onFailure()
@StringRes
abstract fun getTextId(): Int
@LayoutRes
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.widget.TextView
import androidx.annotation.LayoutRes
import androidx.annotation.StringRes
import info.nightscout.androidaps.plugins.pump.omnipod.common.R
abstract class InfoFragmentBase : WizardFragmentBase() {
@ -15,9 +14,6 @@ abstract class InfoFragmentBase : WizardFragmentBase() {
view.findViewById<TextView>(R.id.omnipod_wizard_info_page_text).setText(getTextId())
}
@StringRes
abstract fun getTextId(): Int
@LayoutRes
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.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.viewmodel.ViewModelBase
import kotlin.math.roundToInt
abstract class WizardFragmentBase : DaggerFragment() {
protected lateinit var viewModel: ViewModelBase
var _binding: OmnipodCommonWizardBaseFragmentBinding? = null
// This property is only valid between onCreateView and
@ -84,7 +87,9 @@ abstract class WizardFragmentBase : DaggerFragment() {
protected abstract fun getNextPageActionId(): Int?
@StringRes
protected abstract fun getTitleId(): Int
protected fun getTitleId(): Int = viewModel.getTitleId()
@StringRes protected fun getTextId(): Int = viewModel.getTextId()
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.MutableLiveData
import androidx.lifecycle.ViewModel
import info.nightscout.androidaps.data.PumpEnactResult
import io.reactivex.schedulers.Schedulers
import io.reactivex.subjects.SingleSubject
abstract class ActionViewModelBase : ViewModel() {
abstract class ActionViewModelBase : ViewModelBase() {
private val _isActionExecutingLiveData = MutableLiveData(false)
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.ui.wizard.common.activity.OmnipodWizardActivityBase
class PodDeactivationWizardActivity : OmnipodWizardActivityBase() {
abstract class PodDeactivationWizardActivity : OmnipodWizardActivityBase() {
override fun onCreate(savedInstanceState: Bundle?) {
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.view.View
import android.widget.Button
import androidx.annotation.IdRes
import androidx.annotation.StringRes
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.viewModels
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.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.deactivation.viewmodel.DeactivatePodActionViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.action.DeactivatePodViewModel
import javax.inject.Inject
class DeactivatePodActionFragment : ActionFragmentBase() {
class DeactivatePodFragment : ActionFragmentBase() {
@Inject
@OmnipodPluginQualifier
@ -26,7 +25,7 @@ class DeactivatePodActionFragment : ActionFragmentBase() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val vm: DeactivatePodActionViewModel by viewModels { viewModelFactory }
val vm: DeactivatePodViewModel by viewModels { viewModelFactory }
this.viewModel = vm
}
@ -39,8 +38,8 @@ class DeactivatePodActionFragment : ActionFragmentBase() {
.setTitle(getString(R.string.omnipod_common_pod_deactivation_wizard_discard_pod))
.setMessage(getString(R.string.omnipod_common_pod_deactivation_wizard_discard_pod_confirmation))
.setPositiveButton(getString(R.string.omnipod_common_yes)) { _, _ ->
(viewModel as DeactivatePodActionViewModel).discardPod()
findNavController().navigate(R.id.action_deactivatePodActionFragment_to_podDiscardedInfoFragment)
(actionViewModel as DeactivatePodViewModel).discardPod()
findNavController().navigate(R.id.action_deactivatePodFragment_to_podDiscardedFragment)
}
.setNegativeButton(getString(R.string.omnipod_common_no), null)
.show()
@ -52,14 +51,8 @@ class DeactivatePodActionFragment : ActionFragmentBase() {
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
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
}

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

View file

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

View file

@ -94,7 +94,7 @@
<string name="omnipod_common_wizard_exit_confirmation_title">Exit</string>
<!-- 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_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>
@ -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>
<!-- Omnipod - Pod Deactivation Wizard -->
<string name="omnipod_common_pod_deactivation_wizard_deactivate_pod_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_title">Deactivate 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_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>

View file

@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.pump.omnipod.dash;
import androidx.annotation.Nullable;
import org.jetbrains.annotations.NotNull;
import org.json.JSONObject;
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;
}
@Override public boolean isThisProfileSet(Profile profile) {
@Override public boolean isThisProfileSet(@NotNull Profile profile) {
return false;
}
@ -122,7 +123,7 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
return 0;
}
@Override public PumpEnactResult deliverTreatment(DetailedBolusInfo detailedBolusInfo) {
@NotNull @Override public PumpEnactResult deliverTreatment(@NotNull DetailedBolusInfo detailedBolusInfo) {
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;
}
@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;
}
@Override public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) {
@NotNull @Override public PumpEnactResult setExtendedBolus(double insulin, int durationInMinutes) {
return null;
}
@Override public PumpEnactResult cancelTempBasal(boolean enforceNew) {
@NotNull @Override public PumpEnactResult cancelTempBasal(boolean enforceNew) {
return null;
}
@Override public PumpEnactResult cancelExtendedBolus() {
@NotNull @Override public PumpEnactResult cancelExtendedBolus() {
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;
}
@Override public ManufacturerType manufacturer() {
@NotNull @Override public ManufacturerType manufacturer() {
return getPumpDescription().pumpType.getManufacturer();
}
@Override public PumpType model() {
@NotNull @Override public PumpType model() {
return getPumpDescription().pumpType;
}
@Override public String serialNumber() {
@NotNull @Override public String serialNumber() {
return null;
}
@Override public PumpDescription getPumpDescription() {
@NotNull @Override public PumpDescription getPumpDescription() {
return PUMP_DESCRIPTION;
}
@Override public String shortStatus(boolean veryShort) {
@NotNull @Override public String shortStatus(boolean veryShort) {
return null;
}
@ -178,7 +179,7 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
return false;
}
@Override public PumpEnactResult loadTDDs() {
@NotNull @Override public PumpEnactResult loadTDDs() {
return null;
}
@ -192,15 +193,15 @@ public class OmnipodDashPumpPlugin extends PumpPluginBase implements PumpInterfa
}
@Override
public void executeCustomAction(CustomActionType customActionType) {
aapsLogger.warn(LTag.PUMP, "Unknown custom action: " + customActionType);
public void executeCustomAction(@NotNull CustomActionType 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;
}
@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.ViewGroup
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.OmnipodDashOverviewBluetoothStatusBinding
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.
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 =
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -24,13 +24,9 @@
android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" />
<include
android:id="@+id/bluetooth_status"
layout="@layout/omnipod_dash_overview_bluetooth_status" />
<include layout="@layout/omnipod_dash_overview_bluetooth_status" />
<include
android:id="@+id/pod_info"
layout="@layout/omnipod_common_overview_pod_info" />
<include layout="@layout/omnipod_common_overview_pod_info" />
</LinearLayout>
@ -43,10 +39,8 @@
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<include
android:id="@+id/buttons"
layout="@layout/omnipod_common_overview_buttons" />
<include layout="@layout/omnipod_common_overview_buttons" />
</LinearLayout>
</merge>
</RelativeLayout>

View file

@ -38,44 +38,44 @@
android:paddingEnd="5dp"
android:textSize="14sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/omnipod_dash_bluetooth_status"
android:textSize="14sp" />
android:orientation="horizontal">
<TextView
android:layout_width="5dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:gravity="center_horizontal"
android:paddingStart="2dp"
android:paddingEnd="2dp"
android:text=":"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="end"
android:paddingStart="5dp"
android:paddingEnd="5dp"
android:text="@string/omnipod_dash_bluetooth_status"
android:textSize="14sp" />
<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>
<TextView
android:layout_width="5dp"
android:layout_height="wrap_content"
android:layout_weight="0"
android:gravity="center_horizontal"
android:paddingStart="2dp"
android:paddingEnd="2dp"
android:text=":"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<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>

View file

@ -7,6 +7,8 @@
android:enabled="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.ErosPodHistoryActivity" />
</application>

View file

@ -3,27 +3,40 @@ package info.nightscout.androidaps.plugins.pump.omnipod.eros.dagger
import dagger.Module
import dagger.Provides
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.driver.manager.PodStateManager
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.ui.ErosPodHistoryActivity
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
@Suppress("unused")
abstract class OmnipodErosModule {
// Activities
// ACTIVITIES
@ActivityScope
@ContributesAndroidInjector(modules = [OmnipodErosWizardModule::class])
abstract fun contributesActivationWizardActivity(): ErosPodActivationWizardActivity
@ActivityScope
@ContributesAndroidInjector(modules = [OmnipodErosWizardModule::class])
abstract fun contributesDeactivationWizardActivity(): ErosPodDeactivationWizardActivity
@ContributesAndroidInjector
abstract fun contributesPodManagementActivity(): ErosPodManagementActivity
@ContributesAndroidInjector abstract fun contributesPodHistoryActivity(): ErosPodHistoryActivity
// Service
// SERVICES
@ContributesAndroidInjector
abstract fun omnipodCommunicationManagerProvider(): OmnipodRileyLinkCommunicationManager
// Data
// DATA
@ContributesAndroidInjector abstract fun rlHistoryItemOmnipod(): RLHistoryItemOmnipod
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
public void onCreate(Bundle 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);
statusView = findViewById(R.id.omnipod_historystatus);
@ -223,7 +223,7 @@ public class ErosPodHistoryActivity extends NoSplashAppCompatActivity {
@NotNull
@Override
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);
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.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.deactivation.PodDeactivationWizardActivity
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.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.manager.PodStateManager
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.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.events.EventQueueChanged
import info.nightscout.androidaps.utils.FabricPrivacy
@ -54,12 +55,12 @@ class ErosPodManagementActivity : NoSplashAppCompatActivity() {
private var disposables: CompositeDisposable = CompositeDisposable()
private lateinit var binding: OmnipodPodManagementBinding
private lateinit var binding: OmnipodErosPodManagementBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = OmnipodPodManagementBinding.inflate(layoutInflater)
binding = OmnipodErosPodManagementBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.buttonActivatePod.setOnClickListener {
@ -70,13 +71,13 @@ class ErosPodManagementActivity : NoSplashAppCompatActivity() {
PodActivationWizardActivity.Type.LONG
}
val intent = Intent(this, PodActivationWizardActivity::class.java)
val intent = Intent(this, ErosPodActivationWizardActivity::class.java)
intent.putExtra(PodActivationWizardActivity.KEY_TYPE, type)
startActivity(intent)
}
binding.buttonDeactivatePod.setOnClickListener {
startActivity(Intent(this, PodDeactivationWizardActivity::class.java))
startActivity(Intent(this, ErosPodDeactivationWizardActivity::class.java))
}
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.RileyLinkTargetDevice
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.CommandHandleTimeChange
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.R
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.OmnipodConstants
import info.nightscout.androidaps.plugins.pump.omnipod.eros.driver.definition.PodProgressStatus
@ -94,20 +97,29 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
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.
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 =
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
}.root
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.buttons.buttonPodManagement.setOnClickListener {
buttonBinding.buttonPodManagement.setOnClickListener {
if (omnipodErosPumpPlugin.rileyLinkService?.verifyConfiguration() == true) {
activity?.let { activity ->
context?.let { context ->
@ -122,19 +134,19 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
}
binding.buttons.buttonResumeDelivery.setOnClickListener {
buttonBinding.buttonResumeDelivery.setOnClickListener {
disablePodActionButtons()
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)))
}
binding.buttons.buttonRefreshStatus.setOnClickListener {
buttonBinding.buttonRefreshStatus.setOnClickListener {
disablePodActionButtons()
commandQueue.customCommand(CommandGetPodStatus(),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_refresh_status), false))
}
binding.buttons.buttonSilenceAlerts.setOnClickListener {
buttonBinding.buttonSilenceAlerts.setOnClickListener {
disablePodActionButtons()
commandQueue.customCommand(CommandAcknowledgeAlerts(),
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)) })
}
binding.buttons.buttonSuspendDelivery.setOnClickListener {
buttonBinding.buttonSuspendDelivery.setOnClickListener {
disablePodActionButtons()
commandQueue.customCommand(CommandSuspendDelivery(),
DisplayResultDialogCallback(resourceHelper.gs(R.string.omnipod_common_error_failed_to_suspend_delivery), true)
.messageOnSuccess(resourceHelper.gs(R.string.omnipod_common_confirmation_suspended_delivery)))
}
binding.buttons.buttonSetTime.setOnClickListener {
buttonBinding.buttonSetTime.setOnClickListener {
disablePodActionButtons()
commandQueue.customCommand(CommandHandleTimeChange(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 rileyLinkError = rileyLinkServiceData.rileyLinkError
binding.rileyLink.rileyLinkStatus.text =
rileyLinkStatusBinding.rileyLinkStatus.text =
when {
rileyLinkServiceState == RileyLinkServiceState.NotStarted -> 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))
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() {
@ -242,41 +254,41 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
if (!podStateManager.hasPodState() || !podStateManager.isPodInitialized) {
binding.podInfo.podAddress.text = if (podStateManager.hasPodState()) {
podInfoBinding.podAddress.text = if (podStateManager.hasPodState()) {
podStateManager.address.toString()
} else {
PLACEHOLDER
}
binding.podInfo.podLot.text = PLACEHOLDER
binding.podInfo.podTid.text = PLACEHOLDER
binding.podInfo.firmwareVersion.text = PLACEHOLDER
binding.podInfo.timeOnPod.text = PLACEHOLDER
binding.podInfo.podExpiryDate.text = PLACEHOLDER
binding.podInfo.podExpiryDate.setTextColor(Color.WHITE)
binding.podInfo.baseBasalRate.text = PLACEHOLDER
binding.podInfo.totalDelivered.text = PLACEHOLDER
binding.podInfo.reservoir.text = PLACEHOLDER
binding.podInfo.reservoir.setTextColor(Color.WHITE)
binding.podInfo.podActiveAlerts.text = PLACEHOLDER
podInfoBinding.podLot.text = PLACEHOLDER
podInfoBinding.podTid.text = PLACEHOLDER
podInfoBinding.firmwareVersion.text = PLACEHOLDER
podInfoBinding.timeOnPod.text = PLACEHOLDER
podInfoBinding.podExpiryDate.text = PLACEHOLDER
podInfoBinding.podExpiryDate.setTextColor(Color.WHITE)
podInfoBinding.baseBasalRate.text = PLACEHOLDER
podInfoBinding.totalDelivered.text = PLACEHOLDER
podInfoBinding.reservoir.text = PLACEHOLDER
podInfoBinding.reservoir.setTextColor(Color.WHITE)
podInfoBinding.podActiveAlerts.text = PLACEHOLDER
} else {
binding.podInfo.podAddress.text = podStateManager.address.toString()
binding.podInfo.podLot.text = podStateManager.lot.toString()
binding.podInfo.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.podAddress.text = podStateManager.address.toString()
podInfoBinding.podLot.text = podStateManager.lot.toString()
podInfoBinding.podTid.text = podStateManager.tid.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)
binding.podInfo.timeOnPod.setTextColor(if (podStateManager.timeDeviatesMoreThan(OmnipodConstants.TIME_DEVIATION_THRESHOLD)) {
podInfoBinding.timeOnPod.text = readableZonedTime(podStateManager.time)
podInfoBinding.timeOnPod.setTextColor(if (podStateManager.timeDeviatesMoreThan(OmnipodConstants.TIME_DEVIATION_THRESHOLD)) {
Color.RED
} else {
Color.WHITE
})
val expiresAt = podStateManager.expiresAt
if (expiresAt == null) {
binding.podInfo.podExpiryDate.text = PLACEHOLDER
binding.podInfo.podExpiryDate.setTextColor(Color.WHITE)
podInfoBinding.podExpiryDate.text = PLACEHOLDER
podInfoBinding.podExpiryDate.setTextColor(Color.WHITE)
} else {
binding.podInfo.podExpiryDate.text = readableZonedTime(expiresAt)
binding.podInfo.podExpiryDate.setTextColor(if (DateTime.now().isAfter(expiresAt)) {
podInfoBinding.podExpiryDate.text = readableZonedTime(expiresAt)
podInfoBinding.podExpiryDate.setTextColor(if (DateTime.now().isAfter(expiresAt)) {
Color.RED
} else {
Color.WHITE
@ -289,14 +301,14 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
// 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()))))
} else {
PLACEHOLDER
}
// 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)
} else {
PLACEHOLDER
@ -304,21 +316,21 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
// reservoir
if (podStateManager.reservoirLevel == null) {
binding.podInfo.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value_over50)
binding.podInfo.reservoir.setTextColor(Color.WHITE)
podInfoBinding.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value_over50)
podInfoBinding.reservoir.setTextColor(Color.WHITE)
} else {
val lowReservoirThreshold = (omnipodAlertUtil.lowReservoirAlertUnits
?: OmnipodConstants.DEFAULT_MAX_RESERVOIR_ALERT_THRESHOLD).toDouble()
binding.podInfo.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value, podStateManager.reservoirLevel)
binding.podInfo.reservoir.setTextColor(if (podStateManager.reservoirLevel < lowReservoirThreshold) {
podInfoBinding.reservoir.text = resourceHelper.gs(R.string.omnipod_common_overview_reservoir_value, podStateManager.reservoirLevel)
podInfoBinding.reservoir.setTextColor(if (podStateManager.reservoirLevel < lowReservoirThreshold) {
Color.RED
} else {
Color.WHITE
})
}
binding.podInfo.podActiveAlerts.text = if (podStateManager.hasActiveAlerts()) {
podInfoBinding.podActiveAlerts.text = if (podStateManager.hasActiveAlerts()) {
TextUtils.join(System.lineSeparator(), omnipodUtil.getTranslatedActiveAlerts(podStateManager))
} else {
PLACEHOLDER
@ -326,27 +338,27 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
if (errors.size == 0) {
binding.podInfo.errors.text = PLACEHOLDER
binding.podInfo.errors.setTextColor(Color.WHITE)
podInfoBinding.errors.text = PLACEHOLDER
podInfoBinding.errors.setTextColor(Color.WHITE)
} else {
binding.podInfo.errors.text = StringUtils.join(errors, System.lineSeparator())
binding.podInfo.errors.setTextColor(Color.RED)
podInfoBinding.errors.text = StringUtils.join(errors, System.lineSeparator())
podInfoBinding.errors.setTextColor(Color.RED)
}
}
private fun updateLastConnection() {
if (podStateManager.isPodInitialized && podStateManager.lastSuccessfulCommunication != null) {
binding.podInfo.lastConnection.text = readableDuration(podStateManager.lastSuccessfulCommunication)
podInfoBinding.lastConnection.text = readableDuration(podStateManager.lastSuccessfulCommunication)
val lastConnectionColor =
if (omnipodErosPumpPlugin.isUnreachableAlertTimeoutExceeded(getPumpUnreachableTimeout().millis)) {
Color.RED
} else {
Color.WHITE
}
binding.podInfo.lastConnection.setTextColor(lastConnectionColor)
podInfoBinding.lastConnection.setTextColor(lastConnectionColor)
} else {
binding.podInfo.lastConnection.setTextColor(Color.WHITE)
binding.podInfo.lastConnection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) {
podInfoBinding.lastConnection.setTextColor(Color.WHITE)
podInfoBinding.lastConnection.text = if (podStateManager.hasPodState() && podStateManager.lastSuccessfulCommunication != null) {
readableDuration(podStateManager.lastSuccessfulCommunication)
} else {
PLACEHOLDER
@ -355,7 +367,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
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)
} else if (!podStateManager.isPodActivationCompleted) {
if (!podStateManager.isPodInitialized) {
@ -394,7 +406,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
} else {
Color.WHITE
}
binding.podInfo.podStatus.setTextColor(podStatusColor)
podInfoBinding.podStatus.setTextColor(podStatusColor)
}
private fun updateLastBolus() {
@ -409,20 +421,20 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")"
}
binding.podInfo.lastBolus.text = text
binding.podInfo.lastBolus.setTextColor(textColor)
podInfoBinding.lastBolus.text = text
podInfoBinding.lastBolus.setTextColor(textColor)
} else {
binding.podInfo.lastBolus.text = PLACEHOLDER
binding.podInfo.lastBolus.setTextColor(Color.WHITE)
podInfoBinding.lastBolus.text = PLACEHOLDER
podInfoBinding.lastBolus.setTextColor(Color.WHITE)
}
}
private fun updateTempBasal() {
if (podStateManager.isPodActivationCompleted && podStateManager.isTempBasalRunning) {
if (!podStateManager.hasTempBasal()) {
binding.podInfo.tempBasal.text = "???"
binding.podInfo.tempBasal.setTextColor(Color.RED)
podInfoBinding.tempBasal.text = "???"
podInfoBinding.tempBasal.setTextColor(Color.RED)
} else {
val now = DateTime.now()
@ -442,8 +454,8 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")"
}
binding.podInfo.tempBasal.text = text
binding.podInfo.tempBasal.setTextColor(textColor)
podInfoBinding.tempBasal.text = text
podInfoBinding.tempBasal.setTextColor(textColor)
}
} else {
var text = PLACEHOLDER
@ -456,17 +468,17 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
text += " (" + resourceHelper.gs(R.string.omnipod_eros_uncertain) + ")"
}
binding.podInfo.tempBasal.text = text
binding.podInfo.tempBasal.setTextColor(textColor)
podInfoBinding.tempBasal.text = text
podInfoBinding.tempBasal.setTextColor(textColor)
}
}
private fun updateQueueStatus() {
if (isQueueEmpty()) {
binding.podInfo.queue.visibility = View.GONE
podInfoBinding.queue.visibility = View.GONE
} else {
binding.podInfo.queue.visibility = View.VISIBLE
binding.podInfo.queue.text = commandQueue.spannedStatus().toString()
podInfoBinding.queue.visibility = View.VISIBLE
podInfoBinding.queue.text = commandQueue.spannedStatus().toString()
}
}
@ -479,52 +491,52 @@ class OmnipodErosOverviewFragment : DaggerFragment() {
}
private fun disablePodActionButtons() {
binding.buttons.buttonSilenceAlerts.isEnabled = false
binding.buttons.buttonResumeDelivery.isEnabled = false
binding.buttons.buttonSuspendDelivery.isEnabled = false
binding.buttons.buttonSetTime.isEnabled = false
binding.buttons.buttonRefreshStatus.isEnabled = false
buttonBinding.buttonSilenceAlerts.isEnabled = false
buttonBinding.buttonResumeDelivery.isEnabled = false
buttonBinding.buttonSuspendDelivery.isEnabled = false
buttonBinding.buttonSetTime.isEnabled = false
buttonBinding.buttonRefreshStatus.isEnabled = false
}
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()
}
private fun updateResumeDeliveryButton() {
if (podStateManager.isPodRunning && (podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandResumeDelivery::class.java))) {
binding.buttons.buttonResumeDelivery.visibility = View.VISIBLE
binding.buttons.buttonResumeDelivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
buttonBinding.buttonResumeDelivery.visibility = View.VISIBLE
buttonBinding.buttonResumeDelivery.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else {
binding.buttons.buttonResumeDelivery.visibility = View.GONE
buttonBinding.buttonResumeDelivery.visibility = View.GONE
}
}
private fun updateSilenceAlertsButton() {
if (!omnipodManager.isAutomaticallyAcknowledgeAlertsEnabled && podStateManager.isPodRunning && (podStateManager.hasActiveAlerts() || commandQueue.isCustomCommandInQueue(CommandAcknowledgeAlerts::class.java))) {
binding.buttons.buttonSilenceAlerts.visibility = View.VISIBLE
binding.buttons.buttonSilenceAlerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
buttonBinding.buttonSilenceAlerts.visibility = View.VISIBLE
buttonBinding.buttonSilenceAlerts.isEnabled = rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else {
binding.buttons.buttonSilenceAlerts.visibility = View.GONE
buttonBinding.buttonSilenceAlerts.visibility = View.GONE
}
}
private fun updateSuspendDeliveryButton() {
// If the Pod is currently suspended, we show the Resume delivery button instead.
if (omnipodManager.isSuspendDeliveryButtonEnabled && podStateManager.isPodRunning && (!podStateManager.isSuspended || commandQueue.isCustomCommandInQueue(CommandSuspendDelivery::class.java))) {
binding.buttons.buttonSuspendDelivery.visibility = View.VISIBLE
binding.buttons.buttonSuspendDelivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
buttonBinding.buttonSuspendDelivery.visibility = View.VISIBLE
buttonBinding.buttonSuspendDelivery.isEnabled = podStateManager.isPodRunning && !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} else {
binding.buttons.buttonSuspendDelivery.visibility = View.GONE
buttonBinding.buttonSuspendDelivery.visibility = View.GONE
}
}
private fun updateSetTimeButton() {
if (podStateManager.isPodRunning && (podStateManager.timeDeviatesMoreThan(Duration.standardMinutes(5)) || commandQueue.isCustomCommandInQueue(CommandHandleTimeChange::class.java))) {
binding.buttons.buttonSetTime.visibility = View.VISIBLE
binding.buttons.buttonSetTime.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
buttonBinding.buttonSetTime.visibility = View.VISIBLE
buttonBinding.buttonSetTime.isEnabled = !podStateManager.isSuspended && rileyLinkServiceData.rileyLinkServiceState.isReady && isQueueEmpty()
} 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.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.ui.wizard.common.viewmodel.ActionViewModelBase
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodManager
import info.nightscout.androidaps.plugins.pump.omnipod.common.ui.wizard.deactivation.viewmodel.action.DeactivatePodViewModel
import info.nightscout.androidaps.plugins.pump.omnipod.eros.manager.AapsOmnipodErosManager
import info.nightscout.androidaps.queue.Callback
import io.reactivex.subjects.SingleSubject
import javax.inject.Inject
class DeactivatePodActionViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodManager, private val commandQueueProvider: CommandQueueProvider) : ActionViewModelBase() {
class ErosDeactivatePodViewModel @Inject constructor(private val aapsOmnipodManager: AapsOmnipodErosManager, private val commandQueueProvider: CommandQueueProvider) : DeactivatePodViewModel() {
override fun doExecuteAction(): PumpEnactResult {
val singleSubject = SingleSubject.create<PumpEnactResult>()
@ -21,7 +23,13 @@ class DeactivatePodActionViewModel @Inject constructor(private val aapsOmnipodMa
return singleSubject.blockingGet()
}
fun discardPod() {
override fun discardPod() {
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -24,13 +24,9 @@
android:layout_marginBottom="5dp"
android:background="@color/list_delimiter" />
<include
android:id="@+id/riley_link"
layout="@layout/omnipod_eros_overview_riley_link_status" />
<include layout="@layout/omnipod_eros_overview_riley_link_status" />
<include
android:id="@+id/pod_info"
layout="@layout/omnipod_common_overview_pod_info" />
<include layout="@layout/omnipod_common_overview_pod_info" />
</LinearLayout>
@ -43,10 +39,8 @@
android:layout_alignParentBottom="true"
android:orientation="horizontal">
<include
android:id="@+id/buttons"
layout="@layout/omnipod_common_overview_buttons" />
<include layout="@layout/omnipod_common_overview_buttons" />
</LinearLayout>
</merge>
</RelativeLayout>

View file

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

View file

@ -89,7 +89,7 @@
<string name="omnipod_eros_pod_management_pulse_log_value">Pulse Log (copied to clipboard)</string>
<!-- 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>
<!-- Omnipod Eros - Other -->