From 50b7263acd0f4d68460001fa62a6a768396efaff Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Wed, 8 Nov 2023 11:11:19 +0100 Subject: [PATCH] DynISF: add notification on SMB fallback --- .../aaps/implementations/UiInteractionImpl.kt | 2 +- .../interfaces/notifications/Notification.kt | 1 + .../aaps/core/interfaces/ui/UiInteraction.kt | 3 +-- .../plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt | 2 +- .../OpenAPSSMBDynamicISFPlugin.kt | 17 ++++++++++++++--- .../constraints/ConstraintsCheckerImplTest.kt | 3 ++- .../sync/nsclient/services/NSClientService.kt | 6 +++--- .../nsclientV3/services/NSClientV3Service.kt | 14 ++++++-------- 8 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt b/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt index 5672ea7650..0cdba33ce2 100644 --- a/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt +++ b/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt @@ -190,7 +190,7 @@ class UiInteractionImpl @Inject constructor( rxBus.send(EventNewNotification(Notification(id, System.currentTimeMillis(), text, level, validTo))) } - override fun addNotificationWithAction(injector: HasAndroidInjector, nsAlarm: NSAlarm) { + override fun addNotificationWithAction(nsAlarm: NSAlarm) { rxBus.send(EventNewNotification(NotificationWithAction(injector, nsAlarm))) } diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/notifications/Notification.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/notifications/Notification.kt index 336b16afe5..eac3ee624a 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/notifications/Notification.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/notifications/Notification.kt @@ -140,6 +140,7 @@ open class Notification { const val BLUETOOTH_NOT_SUPPORTED = 86 const val PUMP_WARNING = 87 const val PUMP_SYNC_ERROR = 88 + const val SMB_FALLBACK = 89 const val USER_MESSAGE = 1000 diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/ui/UiInteraction.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/ui/UiInteraction.kt index e56d83adce..82c924e0c3 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/ui/UiInteraction.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/ui/UiInteraction.kt @@ -5,7 +5,6 @@ import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.fragment.app.FragmentManager import app.aaps.core.interfaces.nsclient.NSAlarm -import dagger.android.HasAndroidInjector /** * Interface to use activities located in different modules @@ -73,7 +72,7 @@ interface UiInteraction { fun addNotificationValidFor(id: Int, text: String, level: Int, validMinutes: Int) fun addNotificationWithSound(id: Int, text: String, level: Int, @RawRes soundId: Int?) fun addNotificationValidTo(id: Int, date: Long, text: String, level: Int, validTo: Long) - fun addNotificationWithAction(injector: HasAndroidInjector, nsAlarm: NSAlarm) + fun addNotificationWithAction(nsAlarm: NSAlarm) fun addNotificationWithAction(id: Int, text: String, level: Int, buttonText: Int, action: Runnable, @RawRes soundId: Int? = null, date: Long = System.currentTimeMillis()) fun showToastAndNotification(ctx: Context?, string: String?, @RawRes soundID: Int) diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt index d54a5b0f6c..84e8d6ca4e 100644 --- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt +++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMB/OpenAPSSMBPlugin.kt @@ -58,7 +58,7 @@ open class OpenAPSSMBPlugin @Inject constructor( private val hardLimits: HardLimits, private val profiler: Profiler, private val sp: SP, - private val dateUtil: DateUtil, + protected val dateUtil: DateUtil, private val repository: AppRepository, private val glucoseStatusProvider: GlucoseStatusProvider, private val bgQualityCheck: BgQualityCheck, diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/OpenAPSSMBDynamicISFPlugin.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/OpenAPSSMBDynamicISFPlugin.kt index c8f3dc1d64..fcf0a249ef 100644 --- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/OpenAPSSMBDynamicISFPlugin.kt +++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/OpenAPSSMBDynamicISFPlugin.kt @@ -9,6 +9,7 @@ import app.aaps.core.interfaces.constraints.ConstraintsChecker import app.aaps.core.interfaces.iob.GlucoseStatusProvider import app.aaps.core.interfaces.iob.IobCobCalculator import app.aaps.core.interfaces.logging.AAPSLogger +import app.aaps.core.interfaces.notifications.Notification import app.aaps.core.interfaces.plugin.ActivePlugin import app.aaps.core.interfaces.profile.ProfileFunction import app.aaps.core.interfaces.profiling.Profiler @@ -16,8 +17,10 @@ import app.aaps.core.interfaces.resources.ResourceHelper import app.aaps.core.interfaces.rx.bus.RxBus import app.aaps.core.interfaces.sharedPreferences.SP import app.aaps.core.interfaces.stats.TddCalculator +import app.aaps.core.interfaces.ui.UiInteraction import app.aaps.core.interfaces.utils.DateUtil import app.aaps.core.interfaces.utils.HardLimits +import app.aaps.core.interfaces.utils.T import app.aaps.database.impl.AppRepository import app.aaps.plugins.aps.R import app.aaps.plugins.aps.openAPSSMB.DetermineBasalAdapterSMBJS @@ -46,7 +49,8 @@ class OpenAPSSMBDynamicISFPlugin @Inject constructor( repository: AppRepository, glucoseStatusProvider: GlucoseStatusProvider, bgQualityCheck: BgQualityCheck, - tddCalculator: TddCalculator + tddCalculator: TddCalculator, + private val uiInteraction: UiInteraction ) : OpenAPSSMBPlugin( injector, aapsLogger, @@ -78,9 +82,16 @@ class OpenAPSSMBDynamicISFPlugin @Inject constructor( // If there is no TDD data fallback to SMB as ISF calculation may be really off override fun provideDetermineBasalAdapter(): DetermineBasalAdapter = - if (tdd1D == null || tdd7D == null || tddLast4H == null || tddLast8to4H == null || tddLast24H == null || !dynIsfEnabled.value()) + if (tdd1D == null || tdd7D == null || tddLast4H == null || tddLast8to4H == null || tddLast24H == null || !dynIsfEnabled.value()) { + uiInteraction.addNotificationValidTo( + Notification.SMB_FALLBACK, dateUtil.now(), + rh.gs(R.string.fallback_smb_no_tdd), Notification.INFO, dateUtil.now() + T.mins(1).msecs() + ) DetermineBasalAdapterSMBJS(ScriptReader(context), injector) - else DetermineBasalAdapterSMBDynamicISFJS(ScriptReader(context), injector) + } else { + uiInteraction.dismissNotification(Notification.SMB_FALLBACK) + DetermineBasalAdapterSMBDynamicISFJS(ScriptReader(context), injector) + } override fun isAutosensModeEnabled(value: Constraint): Constraint { value.set(false, rh.gs(R.string.autosens_disabled_in_dyn_isf), this) diff --git a/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/ConstraintsCheckerImplTest.kt b/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/ConstraintsCheckerImplTest.kt index 932a6d89c0..58bd58cb4c 100644 --- a/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/ConstraintsCheckerImplTest.kt +++ b/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/ConstraintsCheckerImplTest.kt @@ -188,7 +188,8 @@ class ConstraintsCheckerImplTest : TestBaseWithProfile() { repository, glucoseStatusProvider, bgQualityCheck, - tddCalculator + tddCalculator, + uiInteraction ) openAPSAMAPlugin = OpenAPSAMAPlugin( diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/services/NSClientService.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/services/NSClientService.kt index c6ddabc390..bac58bc0ed 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/services/NSClientService.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/services/NSClientService.kt @@ -642,7 +642,7 @@ class NSClientService : DaggerService() { val defaultVal = config.NSCLIENT if (sp.getBoolean(app.aaps.core.utils.R.string.key_ns_announcements, defaultVal)) { val nsAlarm = NSAlarmObject(announcement) - uiInteraction.addNotificationWithAction(injector, nsAlarm) + uiInteraction.addNotificationWithAction(nsAlarm) rxBus.send(EventNSClientNewLog("◄ ANNOUNCEMENT", safeGetString(announcement, "message", "received"))) aapsLogger.debug(LTag.NSCLIENT, announcement.toString()) } @@ -654,7 +654,7 @@ class NSClientService : DaggerService() { val snoozedTo = sp.getLong(rh.gs(app.aaps.core.utils.R.string.key_snoozed_to) + alarm.optString("level"), 0L) if (snoozedTo == 0L || System.currentTimeMillis() > snoozedTo) { val nsAlarm = NSAlarmObject(alarm) - uiInteraction.addNotificationWithAction(injector, nsAlarm) + uiInteraction.addNotificationWithAction(nsAlarm) } rxBus.send(EventNSClientNewLog("◄ ALARM", safeGetString(alarm, "message", "received"))) aapsLogger.debug(LTag.NSCLIENT, alarm.toString()) @@ -667,7 +667,7 @@ class NSClientService : DaggerService() { val snoozedTo = sp.getLong(rh.gs(app.aaps.core.utils.R.string.key_snoozed_to) + alarm.optString("level"), 0L) if (snoozedTo == 0L || System.currentTimeMillis() > snoozedTo) { val nsAlarm = NSAlarmObject(alarm) - uiInteraction.addNotificationWithAction(injector, nsAlarm) + uiInteraction.addNotificationWithAction(nsAlarm) } rxBus.send(EventNSClientNewLog("◄ URGENTALARM", safeGetString(alarm, "message", "received"))) aapsLogger.debug(LTag.NSCLIENT, alarm.toString()) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/services/NSClientV3Service.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/services/NSClientV3Service.kt index e2e766cecf..27a8bb7366 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/services/NSClientV3Service.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/services/NSClientV3Service.kt @@ -4,8 +4,6 @@ import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.os.Binder -import android.os.Handler -import android.os.HandlerThread import android.os.IBinder import android.os.PowerManager import app.aaps.core.interfaces.configuration.Config @@ -63,7 +61,6 @@ class NSClientV3Service : DaggerService() { private var wakeLock: PowerManager.WakeLock? = null private val binder: IBinder = LocalBinder() - private val handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) @SuppressLint("WakelockTimeout") override fun onCreate() { @@ -94,7 +91,7 @@ class NSClientV3Service : DaggerService() { private var alarmSocket: Socket? = null internal var wsConnected = false - internal fun shutdownWebsockets() { + private fun shutdownWebsockets() { storageSocket?.on(Socket.EVENT_CONNECT, onConnectStorage) storageSocket?.on(Socket.EVENT_DISCONNECT, onDisconnectStorage) storageSocket?.on("create", onDataCreateUpdate) @@ -113,7 +110,8 @@ class NSClientV3Service : DaggerService() { alarmSocket = null } - internal fun initializeWebSockets(reason: String) { + @Suppress("SameParameterValue") + private fun initializeWebSockets(reason: String) { if (sp.getString(app.aaps.core.utils.R.string.key_nsclientinternal_url, "").isEmpty()) return val urlStorage = sp.getString(app.aaps.core.utils.R.string.key_nsclientinternal_url, "").lowercase().replace(Regex("/$"), "") + "/storage" val urlAlarm = sp.getString(app.aaps.core.utils.R.string.key_nsclientinternal_url, "").lowercase().replace(Regex("/$"), "") + "/alarm" @@ -277,7 +275,7 @@ class NSClientV3Service : DaggerService() { rxBus.send(EventNSClientNewLog("◄ ANNOUNCEMENT", data.optString("message"))) aapsLogger.debug(LTag.NSCLIENT, data.toString()) if (sp.getBoolean(app.aaps.core.utils.R.string.key_ns_announcements, config.NSCLIENT)) - uiInteraction.addNotificationWithAction(injector, NSAlarmObject(data)) + uiInteraction.addNotificationWithAction(NSAlarmObject(data)) } private val onAlarm = Emitter.Listener { args -> @@ -300,7 +298,7 @@ class NSClientV3Service : DaggerService() { if (sp.getBoolean(app.aaps.core.utils.R.string.key_ns_alarms, config.NSCLIENT)) { val snoozedTo = sp.getLong(rh.gs(app.aaps.core.utils.R.string.key_snoozed_to) + data.optString("level"), 0L) if (snoozedTo == 0L || System.currentTimeMillis() > snoozedTo) - uiInteraction.addNotificationWithAction(injector, NSAlarmObject(data)) + uiInteraction.addNotificationWithAction(NSAlarmObject(data)) } } @@ -311,7 +309,7 @@ class NSClientV3Service : DaggerService() { if (sp.getBoolean(app.aaps.core.utils.R.string.key_ns_alarms, config.NSCLIENT)) { val snoozedTo = sp.getLong(rh.gs(app.aaps.core.utils.R.string.key_snoozed_to) + data.optString("level"), 0L) if (snoozedTo == 0L || System.currentTimeMillis() > snoozedTo) - uiInteraction.addNotificationWithAction(injector, NSAlarmObject(data)) + uiInteraction.addNotificationWithAction(NSAlarmObject(data)) } }