From 18be54f48997f503a7b68c59efbc3341f6b971b0 Mon Sep 17 00:00:00 2001
From: jbr7rr <>
Date: Sat, 18 Feb 2023 19:46:35 +0100
Subject: [PATCH] Empty plugin
---
app/build.gradle | 1 +
.../activities/MyPreferenceFragment.kt | 3 +
.../nightscout/androidaps/di/AppComponent.kt | 2 +
.../androidaps/di/PluginsListModule.kt | 7 +
.../interfaces/pump/defs/ManufacturerType.kt | 1 +
pump/medtrum/.gitignore | 1 +
pump/medtrum/build.gradle | 27 ++
pump/medtrum/consumer-rules.pro | 0
pump/medtrum/proguard-rules.pro | 21 ++
pump/medtrum/src/main/AndroidManifest.xml | 3 +
.../pump/medtrum/MedtrumPumpPlugin.kt | 219 +++++++++++++
.../pump/medtrum/di/MedtrumPumpModule.kt | 14 +
.../events/EventMedtrumPumpUpdateGui.kt | 5 +
.../pump/medtrum/ui/MedtrumPumpFragment.kt | 103 ++++++
.../main/res/layout/medtrum_pump_fragment.xml | 306 ++++++++++++++++++
pump/medtrum/src/main/res/values/strings.xml | 17 +
.../src/main/res/xml/pref_medtrum_pump.xml | 17 +
.../info/nightscout/androidaps/TestBase.kt | 37 +++
settings.gradle | 1 +
19 files changed, 785 insertions(+)
create mode 100644 pump/medtrum/.gitignore
create mode 100644 pump/medtrum/build.gradle
create mode 100644 pump/medtrum/consumer-rules.pro
create mode 100644 pump/medtrum/proguard-rules.pro
create mode 100644 pump/medtrum/src/main/AndroidManifest.xml
create mode 100644 pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPumpPlugin.kt
create mode 100644 pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumPumpModule.kt
create mode 100644 pump/medtrum/src/main/java/info/nightscout/pump/medtrum/events/EventMedtrumPumpUpdateGui.kt
create mode 100644 pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPumpFragment.kt
create mode 100644 pump/medtrum/src/main/res/layout/medtrum_pump_fragment.xml
create mode 100644 pump/medtrum/src/main/res/values/strings.xml
create mode 100644 pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml
create mode 100644 pump/medtrum/src/test/java/info/nightscout/androidaps/TestBase.kt
diff --git a/app/build.gradle b/app/build.gradle
index 19d1aab3a1..16c2b9c158 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -214,6 +214,7 @@ dependencies {
implementation project(':pump:danar')
implementation project(':pump:diaconn')
implementation project(':pump:eopatch')
+ implementation project(':pump:medtrum')
implementation project(':insight')
implementation project(':pump:medtronic')
implementation project(':pump:pump-common')
diff --git a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt
index 50a4030a9b..0fcd7aa767 100644
--- a/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt
+++ b/app/src/main/java/info/nightscout/androidaps/activities/MyPreferenceFragment.kt
@@ -54,6 +54,7 @@ import info.nightscout.plugins.sync.xdrip.XdripPlugin
import info.nightscout.pump.combo.ComboPlugin
import info.nightscout.pump.combov2.ComboV2Plugin
import info.nightscout.pump.diaconn.DiaconnG8Plugin
+import info.nightscout.pump.medtrum.MedtrumPumpPlugin
import info.nightscout.pump.virtual.VirtualPumpPlugin
import info.nightscout.rx.bus.RxBus
import info.nightscout.rx.events.EventPreferenceChange
@@ -122,6 +123,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
@Inject lateinit var wearPlugin: WearPlugin
@Inject lateinit var maintenancePlugin: MaintenancePlugin
@Inject lateinit var eopatchPumpPlugin: EopatchPumpPlugin
+ @Inject lateinit var medtrumPumpPlugin: MedtrumPumpPlugin
@Inject lateinit var passwordCheck: PasswordCheck
@Inject lateinit var nsSettingStatus: NSSettingsStatus
@@ -212,6 +214,7 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang
addPreferencesFromResourceIfEnabled(medtronicPumpPlugin, rootKey, config.PUMPDRIVERS)
addPreferencesFromResourceIfEnabled(diaconnG8Plugin, rootKey, config.PUMPDRIVERS)
addPreferencesFromResourceIfEnabled(eopatchPumpPlugin, rootKey, config.PUMPDRIVERS)
+ addPreferencesFromResourceIfEnabled(medtrumPumpPlugin, rootKey, config.PUMPDRIVERS)
addPreferencesFromResource(R.xml.pref_pump, rootKey, config.PUMPDRIVERS)
addPreferencesFromResourceIfEnabled(virtualPumpPlugin, rootKey)
addPreferencesFromResourceIfEnabled(insulinOrefFreePeakPlugin, rootKey)
diff --git a/app/src/main/java/info/nightscout/androidaps/di/AppComponent.kt b/app/src/main/java/info/nightscout/androidaps/di/AppComponent.kt
index def98a723c..4afc89af2d 100644
--- a/app/src/main/java/info/nightscout/androidaps/di/AppComponent.kt
+++ b/app/src/main/java/info/nightscout/androidaps/di/AppComponent.kt
@@ -33,6 +33,7 @@ import info.nightscout.pump.dana.di.DanaModule
import info.nightscout.pump.danars.di.DanaRSModule
import info.nightscout.pump.diaconn.di.DiaconnG8Module
import info.nightscout.pump.virtual.di.VirtualPumpModule
+import info.nightscout.pump.medtrum.di.MedtrumPumpModule
import info.nightscout.rx.di.RxModule
import info.nightscout.shared.di.SharedModule
import info.nightscout.shared.impl.di.SharedImplModule
@@ -87,6 +88,7 @@ import javax.inject.Singleton
OmnipodErosModule::class,
PumpCommonModule::class,
RileyLinkModule::class,
+ MedtrumPumpModule::class,
VirtualPumpModule::class
]
)
diff --git a/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt b/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt
index b30a77bf89..9dd3ea48b1 100644
--- a/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt
+++ b/app/src/main/java/info/nightscout/androidaps/di/PluginsListModule.kt
@@ -46,6 +46,7 @@ import info.nightscout.plugins.sync.tidepool.TidepoolPlugin
import info.nightscout.plugins.sync.xdrip.XdripPlugin
import info.nightscout.pump.combo.ComboPlugin
import info.nightscout.pump.combov2.ComboV2Plugin
+import info.nightscout.pump.medtrum.MedtrumPumpPlugin
import info.nightscout.pump.diaconn.DiaconnG8Plugin
import info.nightscout.pump.virtual.VirtualPumpPlugin
import info.nightscout.sensitivity.SensitivityAAPSPlugin
@@ -209,6 +210,12 @@ abstract class PluginsListModule {
@IntKey(156)
abstract fun bindEopatchPumpPlugin(plugin: EopatchPumpPlugin): PluginBase
+ @Binds
+ @PumpDriver
+ @IntoMap
+ @IntKey(160)
+ abstract fun bindMedtrumPumpPlugin(plugin: MedtrumPumpPlugin): PluginBase
+
@Binds
@AllConfigs
@IntoMap
diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/pump/defs/ManufacturerType.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/pump/defs/ManufacturerType.kt
index ddecad988c..8ffcfeb6c6 100644
--- a/core/interfaces/src/main/java/info/nightscout/interfaces/pump/defs/ManufacturerType.kt
+++ b/core/interfaces/src/main/java/info/nightscout/interfaces/pump/defs/ManufacturerType.kt
@@ -2,6 +2,7 @@ package info.nightscout.interfaces.pump.defs
enum class ManufacturerType(val description: String) {
AAPS("AAPS"),
+ Medtrum("Medtrum"),
Medtronic("Medtronic"),
Sooil("SOOIL"),
Tandem("Tandem"),
diff --git a/pump/medtrum/.gitignore b/pump/medtrum/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/pump/medtrum/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/pump/medtrum/build.gradle b/pump/medtrum/build.gradle
new file mode 100644
index 0000000000..39d231800f
--- /dev/null
+++ b/pump/medtrum/build.gradle
@@ -0,0 +1,27 @@
+plugins {
+ id 'com.android.library'
+ id 'kotlin-android'
+ id 'kotlin-kapt'
+ id 'kotlin-allopen'
+ id 'com.hiya.jacoco-android'
+}
+
+apply from: "${project.rootDir}/core/main/android_dependencies.gradle"
+apply from: "${project.rootDir}/core/main/android_module_dependencies.gradle"
+apply from: "${project.rootDir}/core/main/allopen_dependencies.gradle"
+apply from: "${project.rootDir}/core/main/test_dependencies.gradle"
+apply from: "${project.rootDir}/core/main/jacoco_global.gradle"
+
+android {
+
+ namespace 'info.nightscout.pump.medtrum'
+}
+
+dependencies {
+ implementation project(':app-wear-shared:shared')
+ implementation project(':database:entities')
+ implementation project(':core:interfaces')
+ implementation project(':core:main')
+ implementation project(':core:ui')
+ implementation project(':core:utils')
+}
\ No newline at end of file
diff --git a/pump/medtrum/consumer-rules.pro b/pump/medtrum/consumer-rules.pro
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/pump/medtrum/proguard-rules.pro b/pump/medtrum/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/pump/medtrum/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/pump/medtrum/src/main/AndroidManifest.xml b/pump/medtrum/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..0a0938ae37
--- /dev/null
+++ b/pump/medtrum/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPumpPlugin.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPumpPlugin.kt
new file mode 100644
index 0000000000..1d2e4c0742
--- /dev/null
+++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/MedtrumPumpPlugin.kt
@@ -0,0 +1,219 @@
+package info.nightscout.pump.medtrum
+
+import dagger.android.HasAndroidInjector
+import info.nightscout.core.utils.fabric.FabricPrivacy
+import info.nightscout.interfaces.plugin.PluginDescription
+import info.nightscout.interfaces.plugin.PluginType
+import info.nightscout.interfaces.profile.Profile
+import info.nightscout.interfaces.profile.ProfileFunction
+import info.nightscout.interfaces.pump.DetailedBolusInfo
+import info.nightscout.interfaces.pump.Pump
+import info.nightscout.interfaces.pump.PumpEnactResult
+import info.nightscout.interfaces.pump.PumpPluginBase
+import info.nightscout.interfaces.pump.PumpSync
+import info.nightscout.interfaces.pump.actions.CustomAction
+import info.nightscout.interfaces.pump.actions.CustomActionType
+import info.nightscout.interfaces.pump.defs.ManufacturerType
+import info.nightscout.interfaces.pump.defs.PumpDescription
+import info.nightscout.interfaces.pump.defs.PumpType
+import info.nightscout.interfaces.queue.CommandQueue
+import info.nightscout.interfaces.queue.CustomCommand
+import info.nightscout.interfaces.ui.UiInteraction
+import info.nightscout.interfaces.utils.TimeChangeType
+import info.nightscout.pump.medtrum.ui.MedtrumPumpFragment
+import info.nightscout.rx.AapsSchedulers
+import info.nightscout.rx.bus.RxBus
+import info.nightscout.rx.events.EventAppInitialized
+import info.nightscout.rx.events.EventOverviewBolusProgress
+import info.nightscout.rx.events.EventPreferenceChange
+import info.nightscout.rx.logging.AAPSLogger
+import info.nightscout.rx.logging.LTag
+import info.nightscout.shared.interfaces.ResourceHelper
+import info.nightscout.shared.utils.DateUtil
+import info.nightscout.shared.utils.T
+import io.reactivex.rxjava3.disposables.CompositeDisposable
+import io.reactivex.rxjava3.functions.Consumer
+import io.reactivex.rxjava3.subjects.BehaviorSubject
+import org.json.JSONException
+import org.json.JSONObject
+import javax.inject.Inject
+import javax.inject.Singleton
+
+
+@Singleton
+class MedtrumPumpPlugin @Inject constructor(
+ injector: HasAndroidInjector,
+ aapsLogger: AAPSLogger,
+ rh: ResourceHelper,
+ commandQueue: CommandQueue,
+ private val aapsSchedulers: AapsSchedulers,
+ private val rxBus: RxBus,
+ private val fabricPrivacy: FabricPrivacy,
+ private val dateUtil: DateUtil,
+ private val pumpSync: PumpSync,
+ private val uiInteraction: UiInteraction,
+ private val profileFunction: ProfileFunction
+) : PumpPluginBase(
+ PluginDescription()
+ .mainType(PluginType.PUMP) // TODO Prefs etc
+ .fragmentClass(MedtrumPumpFragment::class.java.name)
+ .pluginIcon(info.nightscout.core.ui.R.drawable.ic_eopatch2_128) // TODO
+ .pluginName(R.string.medtrum)
+ .shortName(R.string.medtrum_pump_shortname)
+ .preferencesId(R.xml.pref_medtrum_pump)
+ .description(R.string.medtrum_pump_description), injector, aapsLogger, rh, commandQueue
+), Pump {
+
+
+ override fun onStart() {
+ super.onStart()
+ }
+
+ override fun onStop() {
+ super.onStop()
+ aapsLogger.debug(LTag.PUMP, "MedtrumPumpPlugin onStop()")
+ }
+
+ override fun isInitialized(): Boolean {
+ return false
+ }
+
+ override fun isSuspended(): Boolean {
+ return false
+ }
+
+ override fun isBusy(): Boolean {
+ return false
+ }
+
+ override fun isConnected(): Boolean {
+ return false
+ }
+
+ override fun isConnecting(): Boolean {
+ return false
+ }
+
+ override fun isHandshakeInProgress(): Boolean {
+ return false
+ }
+
+ override fun finishHandshaking() {
+ }
+
+ override fun connect(reason: String) {
+ aapsLogger.debug(LTag.PUMP, "Medtrum connect - reason:$reason")
+ }
+
+ override fun disconnect(reason: String) {
+ aapsLogger.debug(LTag.PUMP, "Medtrum disconnect - reason:$reason")
+ }
+
+ override fun stopConnecting() {
+ }
+
+ override fun getPumpStatus(reason: String) {
+ }
+
+ override fun setNewBasalProfile(profile: Profile): PumpEnactResult {
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun isThisProfileSet(profile: Profile): Boolean {
+ return false // TODO
+ }
+
+ override fun lastDataTime(): Long {
+ return 0 // TODO
+ }
+
+ override val baseBasalRate: Double
+ get() = 0.0 // TODO
+
+ override val reservoirLevel: Double
+ get() = 0.0 // TODO
+
+ override val batteryLevel: Int
+ get() = 0 // TODO
+
+ override fun deliverTreatment(detailedBolusInfo: DetailedBolusInfo): PumpEnactResult {
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun stopBolusDelivering() {
+ // TODO
+ }
+
+ override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult {
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun setTempBasalPercent(percent: Int, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult {
+ aapsLogger.info(LTag.PUMP, "setTempBasalPercent - percent: $percent, durationInMinutes: $durationInMinutes, enforceNew: $enforceNew")
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun setExtendedBolus(insulin: Double, durationInMinutes: Int): PumpEnactResult {
+ aapsLogger.info(LTag.PUMP, "setExtendedBolus - insulin: $insulin, durationInMinutes: $durationInMinutes")
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun cancelTempBasal(enforceNew: Boolean): PumpEnactResult {
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun cancelExtendedBolus(): PumpEnactResult {
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun getJSONStatus(profile: Profile, profileName: String, version: String): JSONObject {
+ return JSONObject() // TODO
+ }
+
+ override fun manufacturer(): ManufacturerType {
+ return ManufacturerType.Medtrum
+ }
+
+ override fun model(): PumpType {
+ return PumpType.GENERIC_AAPS // TODO
+ }
+
+ override fun serialNumber(): String {
+ return "0" // TODO
+ }
+
+ override val pumpDescription: PumpDescription
+ get() = PumpDescription(PumpType.GENERIC_AAPS) // TODO
+
+ override fun shortStatus(veryShort: Boolean): String {
+ return ""// TODO
+ }
+
+ override val isFakingTempsByExtendedBoluses: Boolean = false //TODO
+
+ override fun loadTDDs(): PumpEnactResult {
+ return PumpEnactResult(injector) // TODO
+ }
+
+ override fun canHandleDST(): Boolean {
+ return false
+ }
+
+ override fun getCustomActions(): List? {
+ return null
+ }
+
+ override fun executeCustomAction(customActionType: CustomActionType) {
+ }
+
+ override fun executeCustomCommand(customCommand: CustomCommand): PumpEnactResult? {
+ return null
+ }
+
+ override fun timezoneOrDSTChanged(timeChangeType: TimeChangeType) {
+ }
+
+ private fun readTBR(): PumpSync.PumpState.TemporaryBasal? {
+ return pumpSync.expectedPumpState().temporaryBasal // TODO
+ }
+}
\ No newline at end of file
diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumPumpModule.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumPumpModule.kt
new file mode 100644
index 0000000000..fb2f5a0296
--- /dev/null
+++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/di/MedtrumPumpModule.kt
@@ -0,0 +1,14 @@
+package info.nightscout.pump.medtrum.di
+
+import dagger.Binds
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+import info.nightscout.pump.medtrum.ui.MedtrumPumpFragment
+
+@Module
+@Suppress("unused")
+abstract class MedtrumPumpModule {
+
+ @ContributesAndroidInjector abstract fun contributesMedtrumPumpFragment(): MedtrumPumpFragment
+
+}
\ No newline at end of file
diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/events/EventMedtrumPumpUpdateGui.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/events/EventMedtrumPumpUpdateGui.kt
new file mode 100644
index 0000000000..e589f2131e
--- /dev/null
+++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/events/EventMedtrumPumpUpdateGui.kt
@@ -0,0 +1,5 @@
+package info.nightscout.pump.medtrum.events
+
+import info.nightscout.rx.events.EventUpdateGui
+
+class EventMedtrumPumpUpdateGui : EventUpdateGui()
\ No newline at end of file
diff --git a/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPumpFragment.kt b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPumpFragment.kt
new file mode 100644
index 0000000000..8d3297c56c
--- /dev/null
+++ b/pump/medtrum/src/main/java/info/nightscout/pump/medtrum/ui/MedtrumPumpFragment.kt
@@ -0,0 +1,103 @@
+package info.nightscout.pump.medtrum.ui
+
+import android.os.Bundle
+import android.os.Handler
+import android.os.HandlerThread
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import dagger.android.support.DaggerFragment
+import info.nightscout.core.extensions.toStringFull
+import info.nightscout.core.utils.fabric.FabricPrivacy
+import info.nightscout.interfaces.iob.IobCobCalculator
+import info.nightscout.interfaces.profile.ProfileFunction
+import info.nightscout.pump.medtrum.databinding.MedtrumPumpFragmentBinding
+import info.nightscout.pump.medtrum.events.EventMedtrumPumpUpdateGui
+import info.nightscout.pump.medtrum.MedtrumPumpPlugin
+import info.nightscout.rx.AapsSchedulers
+import info.nightscout.rx.bus.RxBus
+import info.nightscout.rx.events.EventExtendedBolusChange
+import info.nightscout.rx.events.EventTempBasalChange
+import info.nightscout.shared.interfaces.ResourceHelper
+import info.nightscout.shared.utils.DateUtil
+import info.nightscout.shared.utils.T
+import io.reactivex.rxjava3.disposables.CompositeDisposable
+import io.reactivex.rxjava3.kotlin.plusAssign
+import javax.inject.Inject
+
+class MedtrumPumpFragment : DaggerFragment() {
+
+ @Inject lateinit var rxBus: RxBus
+ @Inject lateinit var rh: ResourceHelper
+ @Inject lateinit var dateUtil: DateUtil
+ @Inject lateinit var fabricPrivacy: FabricPrivacy
+ @Inject lateinit var medtrumPumpPlugin: MedtrumPumpPlugin
+ @Inject lateinit var profileFunction: ProfileFunction
+ @Inject lateinit var iobCobCalculator: IobCobCalculator
+ @Inject lateinit var aapsSchedulers: AapsSchedulers
+
+ private val disposable = CompositeDisposable()
+
+ private lateinit var refreshLoop: Runnable
+ private var handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper)
+
+ private var _binding: MedtrumPumpFragmentBinding? = null
+
+ // This property is only valid between onCreateView and
+ // onDestroyView.
+ private val binding get() = _binding!!
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View =
+ MedtrumPumpFragmentBinding.inflate(inflater, container, false).also { _binding = it }.root
+
+ @Synchronized
+ override fun onResume() {
+ super.onResume()
+ disposable += rxBus
+ .toObservable(EventMedtrumPumpUpdateGui::class.java)
+ .observeOn(aapsSchedulers.main)
+ .subscribe({ updateGui() }, fabricPrivacy::logException)
+ disposable += rxBus
+ .toObservable(EventTempBasalChange::class.java)
+ .observeOn(aapsSchedulers.main)
+ .subscribe({ updateGui() }, fabricPrivacy::logException)
+ disposable += rxBus
+ .toObservable(EventExtendedBolusChange::class.java)
+ .observeOn(aapsSchedulers.main)
+ .subscribe({ updateGui() }, fabricPrivacy::logException)
+ refreshLoop = Runnable {
+ activity?.runOnUiThread { updateGui() }
+ handler.postDelayed(refreshLoop, T.mins(1).msecs())
+ }
+ handler.postDelayed(refreshLoop, T.mins(1).msecs())
+ updateGui()
+ }
+
+ @Synchronized
+ override fun onPause() {
+ super.onPause()
+ disposable.clear()
+ handler.removeCallbacksAndMessages(null)
+ }
+
+ @Synchronized
+ override fun onDestroyView() {
+ super.onDestroyView()
+ _binding = null
+ }
+
+ @Synchronized
+ private fun updateGui() {
+ if (_binding == null) return
+ val profile = profileFunction.getProfile() ?: return
+ binding.baseBasalRate.text = rh.gs(info.nightscout.core.ui.R.string.pump_base_basal_rate, medtrumPumpPlugin.baseBasalRate)
+ binding.tempbasal.text = iobCobCalculator.getTempBasal(dateUtil.now())?.toStringFull(profile, dateUtil)
+ ?: ""
+ binding.extendedbolus.text = iobCobCalculator.getExtendedBolus(dateUtil.now())?.toStringFull(dateUtil)
+ ?: ""
+ binding.battery.text = rh.gs(info.nightscout.core.ui.R.string.format_percent, 0) // TODO
+ binding.reservoir.text = rh.gs(info.nightscout.interfaces.R.string.format_insulin_units, 0.0) // TODO
+
+ binding.serialNumber.text = medtrumPumpPlugin.serialNumber()
+ }
+}
diff --git a/pump/medtrum/src/main/res/layout/medtrum_pump_fragment.xml b/pump/medtrum/src/main/res/layout/medtrum_pump_fragment.xml
new file mode 100644
index 0000000000..222bed82df
--- /dev/null
+++ b/pump/medtrum/src/main/res/layout/medtrum_pump_fragment.xml
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pump/medtrum/src/main/res/values/strings.xml b/pump/medtrum/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..b361dec76e
--- /dev/null
+++ b/pump/medtrum/src/main/res/values/strings.xml
@@ -0,0 +1,17 @@
+
+
+
+ snInput
+ medtrumpump_settings
+
+
+ Medtrum
+ MEDTRUM
+ Medtrum Nano
+ MEDTRUM
+ Medtrum pump settings
+
+ SN
+ Serial number pump base
+
+
diff --git a/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml b/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml
new file mode 100644
index 0000000000..9b40fc9864
--- /dev/null
+++ b/pump/medtrum/src/main/res/xml/pref_medtrum_pump.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pump/medtrum/src/test/java/info/nightscout/androidaps/TestBase.kt b/pump/medtrum/src/test/java/info/nightscout/androidaps/TestBase.kt
new file mode 100644
index 0000000000..4fd2aef548
--- /dev/null
+++ b/pump/medtrum/src/test/java/info/nightscout/androidaps/TestBase.kt
@@ -0,0 +1,37 @@
+package info.nightscout.androidaps
+
+import info.nightscout.rx.AapsSchedulers
+import info.nightscout.rx.TestAapsSchedulers
+import info.nightscout.rx.logging.AAPSLoggerTest
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.extension.ExtendWith
+import org.mockito.Mockito
+import org.mockito.junit.jupiter.MockitoExtension
+import org.mockito.junit.jupiter.MockitoSettings
+import org.mockito.quality.Strictness
+import java.util.Locale
+
+@ExtendWith(MockitoExtension::class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+open class TestBase {
+
+ val aapsLogger = AAPSLoggerTest()
+ val aapsSchedulers: AapsSchedulers = TestAapsSchedulers()
+
+ @BeforeEach
+ fun setupLocale() {
+ Locale.setDefault(Locale.ENGLISH)
+ System.setProperty("disableFirebase", "true")
+ }
+
+ // Workaround for Kotlin nullability.
+ // https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791
+ // https://stackoverflow.com/questions/30305217/is-it-possible-to-use-mockito-in-kotlin
+ fun anyObject(): T {
+ Mockito.any()
+ return uninitialized()
+ }
+
+ @Suppress("Unchecked_Cast")
+ fun uninitialized(): T = null as T
+}
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 137cc8c2bd..24a3acf745 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -33,6 +33,7 @@ include ':pump:diaconn'
include ':pump:eopatch'
include ':pump:eopatch-core'
include ':insight'
+include ':pump:medtrum'
include ':pump:medtronic'
include ':pump:omnipod-common'
include ':pump:omnipod-eros'