diff --git a/_docs/icons/as_above.svg b/_docs/icons/as_above.svg new file mode 100644 index 00000000000..c91dd26b169 --- /dev/null +++ b/_docs/icons/as_above.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/_docs/icons/as_below.svg b/_docs/icons/as_below.svg new file mode 100644 index 00000000000..2d48a14f638 --- /dev/null +++ b/_docs/icons/as_below.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/_docs/icons/x_as_above.svg b/_docs/icons/x_as_above.svg new file mode 100644 index 00000000000..5927ff86a28 --- /dev/null +++ b/_docs/icons/x_as_above.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/_docs/icons/x_as_below.svg b/_docs/icons/x_as_below.svg new file mode 100644 index 00000000000..ae867866a67 --- /dev/null +++ b/_docs/icons/x_as_below.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/app/src/androidTest/kotlin/app/aaps/CompatDbHelperTest.kt b/app/src/androidTest/kotlin/app/aaps/CompatDbHelperTest.kt index e8199b1636b..0e819d087e9 100644 --- a/app/src/androidTest/kotlin/app/aaps/CompatDbHelperTest.kt +++ b/app/src/androidTest/kotlin/app/aaps/CompatDbHelperTest.kt @@ -109,7 +109,7 @@ class CompatDbHelperTest @Inject constructor() { val now = dateUtil.now() // Set Profile in ProfilePlugin - nsIncomingDataProcessor.processProfile(JSONObject(profileData)) + nsIncomingDataProcessor.processProfile(JSONObject(profileData), false) assertThat(activePlugin.activeProfileSource.profile).isNotNull() // Create a profile switch diff --git a/app/src/androidTest/kotlin/app/aaps/LoopTest.kt b/app/src/androidTest/kotlin/app/aaps/LoopTest.kt index 54204d42b59..5730d13965b 100644 --- a/app/src/androidTest/kotlin/app/aaps/LoopTest.kt +++ b/app/src/androidTest/kotlin/app/aaps/LoopTest.kt @@ -110,7 +110,7 @@ class LoopTest @Inject constructor() { assertThat((loopStatusEvent.second as EventLoopSetLastRunGui).text).contains("NO PROFILE SET") // Set Profile in ProfilePlugin - nsIncomingDataProcessor.processProfile(JSONObject(profileData)) + nsIncomingDataProcessor.processProfile(JSONObject(profileData), false) assertThat(activePlugin.activeProfileSource.profile).isNotNull() // Create a profile switch diff --git a/app/src/androidTest/kotlin/app/aaps/di/TestModule.kt b/app/src/androidTest/kotlin/app/aaps/di/TestModule.kt index fbe5951a4ac..f2af45da49f 100644 --- a/app/src/androidTest/kotlin/app/aaps/di/TestModule.kt +++ b/app/src/androidTest/kotlin/app/aaps/di/TestModule.kt @@ -42,7 +42,7 @@ open class TestModule { val plugins = allConfigs.toMutableMap() if (config.PUMPDRIVERS) plugins += pumpDrivers.get() if (config.APS) plugins += aps.get() - if (!config.NSCLIENT) plugins += notNsClient.get() + if (!config.AAPSCLIENT) plugins += notNsClient.get() //if (config.isUnfinishedMode()) plugins += unfinished.get() return plugins.toList().sortedBy { it.first }.map { it.second } } diff --git a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.kt b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.kt index 2a33b6459f7..2e8d867281b 100644 --- a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.kt +++ b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSAMA/DetermineBasalAdapterAMAJS.kt @@ -89,7 +89,7 @@ class DetermineBasalAdapterAMAJS(private val scriptReader: ScriptReader, private val rhino = Context.enter() val scope: Scriptable = rhino.initStandardObjects() // Turn off optimization to make Rhino Android compatible - rhino.optimizationLevel = -1 + rhino.isInterpretedMode = true try { //register logger callback for console.log and console.error diff --git a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.kt b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.kt index f208fc48854..04f54a70f5d 100644 --- a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.kt +++ b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMB/DetermineBasalAdapterSMBJS.kt @@ -105,7 +105,7 @@ class DetermineBasalAdapterSMBJS(private val scriptReader: ScriptReader, private val rhino = Context.enter() val scope: Scriptable = rhino.initStandardObjects() // Turn off optimization to make Rhino Android compatible - rhino.optimizationLevel = -1 + rhino.isInterpretedMode = true try { //register logger callback for console.log and console.error diff --git a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBAutoISF/DetermineBasalAdapterAutoISFJS.kt b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBAutoISF/DetermineBasalAdapterAutoISFJS.kt index 94097477782..ada90818b00 100644 --- a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBAutoISF/DetermineBasalAdapterAutoISFJS.kt +++ b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBAutoISF/DetermineBasalAdapterAutoISFJS.kt @@ -109,7 +109,7 @@ class DetermineBasalAdapterAutoISFJS(private val scriptReader: ScriptReader, pri val rhino = Context.enter() val scope: Scriptable = rhino.initStandardObjects() // Turn off optimization to make Rhino Android compatible - rhino.optimizationLevel = -1 + rhino.isInterpretedMode = true try { //register logger callback for console.log and console.error diff --git a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt index 24cf40e9273..cc08ed863ea 100644 --- a/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt +++ b/app/src/androidTest/kotlin/app/aaps/plugins/aps/openAPSSMBDynamicISF/DetermineBasalAdapterSMBDynamicISFJS.kt @@ -119,7 +119,7 @@ class DetermineBasalAdapterSMBDynamicISFJS(private val scriptReader: ScriptReade val rhino = Context.enter() val scope: Scriptable = rhino.initStandardObjects() // Turn off optimization to make Rhino Android compatible - rhino.optimizationLevel = -1 + rhino.isInterpretedMode = true try { //register logger callback for console.log and console.error diff --git a/app/src/main/kotlin/app/aaps/MainActivity.kt b/app/src/main/kotlin/app/aaps/MainActivity.kt index ec185543417..d8ffb5464c5 100644 --- a/app/src/main/kotlin/app/aaps/MainActivity.kt +++ b/app/src/main/kotlin/app/aaps/MainActivity.kt @@ -100,6 +100,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() { @Inject lateinit var iconsProvider: IconsProvider @Inject lateinit var constraintChecker: ConstraintsChecker @Inject lateinit var signatureVerifierPlugin: SignatureVerifierPlugin + @Inject lateinit var maitenancePlugin: MaintenancePlugin @Inject lateinit var uel: UserEntryLogger @Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var fileListProvider: FileListProvider @@ -288,7 +289,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() { } androidPermission.notifyForStoragePermission(this) androidPermission.notifyForBatteryOptimizationPermission(this) - if (!config.NSCLIENT) androidPermission.notifyForLocationPermissions(this) + if (!config.AAPSCLIENT) androidPermission.notifyForLocationPermissions(this) if (config.PUMPDRIVERS) { if (smsCommunicator.isEnabled()) androidPermission.notifyForSMSPermissions(this) @@ -331,7 +332,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() { text = rh.gs(app.aaps.core.ui.R.string.aaps_directory_not_selected), level = Notification.IMPORTANCE_HIGH, buttonText = R.string.select, - action = { accessTree?.launch(null) }, + action = { maitenancePlugin.selectAapsDirectory(this) }, validityCheck = { preferences.getIfExists(StringKey.AapsDirectoryUri).isNullOrEmpty() } ) } @@ -493,7 +494,7 @@ class MainActivity : DaggerAppCompatActivityWithResult() { val hashes: List = signatureVerifierPlugin.shortHashes() if (hashes.isNotEmpty()) fabricPrivacy.setUserProperty("Hash", hashes[0]) activePlugin.activePump.let { fabricPrivacy.setUserProperty("Pump", it::class.java.simpleName) } - if (!config.NSCLIENT && !config.PUMPCONTROL) + if (!config.AAPSCLIENT && !config.PUMPCONTROL) activePlugin.activeAPS.let { fabricPrivacy.setUserProperty("Aps", it::class.java.simpleName) } activePlugin.activeBgSource.let { fabricPrivacy.setUserProperty("BgSource", it::class.java.simpleName) } fabricPrivacy.setUserProperty("Profile", activePlugin.activeProfileSource.javaClass.simpleName) diff --git a/app/src/main/kotlin/app/aaps/MainApp.kt b/app/src/main/kotlin/app/aaps/MainApp.kt index 6c993b95eac..fb00915db60 100644 --- a/app/src/main/kotlin/app/aaps/MainApp.kt +++ b/app/src/main/kotlin/app/aaps/MainApp.kt @@ -9,10 +9,6 @@ import android.os.Build import android.os.Handler import android.os.HandlerThread import androidx.lifecycle.ProcessLifecycleOwner -import androidx.work.Data -import androidx.work.ExistingPeriodicWorkPolicy -import androidx.work.PeriodicWorkRequest -import androidx.work.WorkManager import app.aaps.core.data.model.GlucoseUnit import app.aaps.core.data.model.TE import app.aaps.core.data.ue.Action @@ -61,7 +57,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import rxdogtag2.RxDogTag import java.io.IOException -import java.util.concurrent.TimeUnit import javax.inject.Inject import javax.inject.Provider @@ -211,9 +206,13 @@ class MainApp : DaggerApplication() { sp.putBoolean("ConfigBuilder_APS_OpenAPSSMB_Enabled", true) preferences.put(BooleanKey.ApsUseDynamicSensitivity, true) } - // convert Double to IntString - if (preferences.getIfExists(IntKey.ApsDynIsfAdjustmentFactor) != null) - sp.putString(IntKey.ApsDynIsfAdjustmentFactor.key, preferences.get(IntKey.ApsDynIsfAdjustmentFactor).toString()) + // convert Double to Int + try { + val dynIsf = sp.getDouble("DynISFAdjust", 0.0) + if (dynIsf != 0.0 && dynIsf.toInt() != preferences.get(IntKey.ApsDynIsfAdjustmentFactor)) + preferences.put(IntKey.ApsDynIsfAdjustmentFactor, dynIsf.toInt()) + } catch (_: Exception) { /* ignore */ + } } override fun applicationInjector(): AndroidInjector { diff --git a/app/src/main/kotlin/app/aaps/activities/MyPreferenceFragment.kt b/app/src/main/kotlin/app/aaps/activities/MyPreferenceFragment.kt index 18c1c17a1c3..40205e58b62 100644 --- a/app/src/main/kotlin/app/aaps/activities/MyPreferenceFragment.kt +++ b/app/src/main/kotlin/app/aaps/activities/MyPreferenceFragment.kt @@ -131,10 +131,8 @@ class MyPreferenceFragment : PreferenceFragmentCompat(), OnSharedPreferenceChang if (pluginName != null) { val plugin = activePlugin.getPluginsList().firstOrNull { it.javaClass.simpleName == pluginName } ?: error("Plugin not found") addPreferencesIfEnabled(plugin, rootKey) - } else if (customPreference != null) { - when (customPreference!!) { - UiInteraction.Preferences.PROTECTION -> addProtectionScreen(rootKey) - } + } else if (customPreference == UiInteraction.Preferences.PROTECTION) { + addProtectionScreen(rootKey) } else { addGeneralScreen(rootKey) addProtectionScreen(rootKey) diff --git a/app/src/main/kotlin/app/aaps/di/AppModule.kt b/app/src/main/kotlin/app/aaps/di/AppModule.kt index 8d9bd7607df..30b9481de5d 100644 --- a/app/src/main/kotlin/app/aaps/di/AppModule.kt +++ b/app/src/main/kotlin/app/aaps/di/AppModule.kt @@ -40,7 +40,7 @@ open class AppModule { val plugins = allConfigs.toMutableMap() if (config.PUMPDRIVERS) plugins += pumpDrivers.get() if (config.APS) plugins += aps.get() - if (!config.NSCLIENT) plugins += notNsClient.get() + if (!config.AAPSCLIENT) plugins += notNsClient.get() //if (config.isUnfinishedMode()) plugins += unfinished.get() return plugins.toList().sortedBy { it.first }.map { it.second } } diff --git a/app/src/main/kotlin/app/aaps/implementations/ConfigImpl.kt b/app/src/main/kotlin/app/aaps/implementations/ConfigImpl.kt index a9b00c52cde..bfbe9457f0d 100644 --- a/app/src/main/kotlin/app/aaps/implementations/ConfigImpl.kt +++ b/app/src/main/kotlin/app/aaps/implementations/ConfigImpl.kt @@ -16,9 +16,9 @@ class ConfigImpl @Inject constructor( override val SUPPORTED_NS_VERSION = 150000 // 15.0.0 override val APS = BuildConfig.FLAVOR == "full" - override val NSCLIENT = BuildConfig.FLAVOR == "aapsclient" || BuildConfig.FLAVOR == "aapsclient2" - override val NSCLIENT1 = BuildConfig.FLAVOR == "aapsclient" - override val NSCLIENT2 = BuildConfig.FLAVOR == "aapsclient2" + override val AAPSCLIENT = BuildConfig.FLAVOR == "aapsclient" || BuildConfig.FLAVOR == "aapsclient2" + override val AAPSCLIENT1 = BuildConfig.FLAVOR == "aapsclient" + override val AAPSCLIENT2 = BuildConfig.FLAVOR == "aapsclient2" override val PUMPCONTROL = BuildConfig.FLAVOR == "pumpcontrol" override val PUMPDRIVERS = BuildConfig.FLAVOR == "full" || BuildConfig.FLAVOR == "pumpcontrol" override val FLAVOR = BuildConfig.FLAVOR diff --git a/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt b/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt index 6e71db6819b..78282002978 100644 --- a/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt +++ b/app/src/main/kotlin/app/aaps/implementations/UiInteractionImpl.kt @@ -167,10 +167,15 @@ class UiInteractionImpl @Inject constructor( } override fun runBolusProgressDialog(fragmentManager: FragmentManager, insulin: Double, id: Long) { - BolusProgressDialog().also { - it.setInsulin(insulin) - it.setId(id) - it.show(fragmentManager, "BolusProgress") + // Activity may be destroyed before Dialog pop up so try/catch + try { + BolusProgressDialog().also { + it.setInsulin(insulin) + it.setId(id) + it.show(fragmentManager, "BolusProgress") + } + } catch (_: Exception) { + // do nothing } } @@ -198,7 +203,7 @@ class UiInteractionImpl @Inject constructor( rxBus.send(EventNewNotification(NotificationWithAction(injector, nsAlarm))) } - override fun addNotificationWithAction(id: Int, text: String, level: Int, buttonText: Int, action: Runnable, validityCheck: (() -> Boolean)?, @RawRes soundId: Int?, date: Long) { + override fun addNotificationWithAction(id: Int, text: String, level: Int, buttonText: Int, action: Runnable, validityCheck: (() -> Boolean)?, @RawRes soundId: Int?, date: Long, validTo: Long) { rxBus.send( EventNewNotification( NotificationWithAction(injector = injector, id = id, text = text, level = level, validityCheck = validityCheck) diff --git a/app/src/main/kotlin/app/aaps/receivers/KeepAliveWorker.kt b/app/src/main/kotlin/app/aaps/receivers/KeepAliveWorker.kt index 97e813ab884..c665ed1b4de 100644 --- a/app/src/main/kotlin/app/aaps/receivers/KeepAliveWorker.kt +++ b/app/src/main/kotlin/app/aaps/receivers/KeepAliveWorker.kt @@ -168,13 +168,13 @@ class KeepAliveWorker( // IOB displayed in NS private fun checkAPS() { var shouldUploadStatus = false - if (config.NSCLIENT) return + if (config.AAPSCLIENT) return if (config.PUMPCONTROL) shouldUploadStatus = true else if (!loop.isEnabled() || iobCobCalculator.ads.actualBg() == null) shouldUploadStatus = true else if (dateUtil.isOlderThan(activePlugin.activeAPS.lastAPSRun, 5)) shouldUploadStatus = true if (dateUtil.isOlderThan(lastIobUpload, IOB_UPDATE_FREQUENCY_IN_MINUTES) && shouldUploadStatus) { lastIobUpload = dateUtil.now() - loop.buildAndStoreDeviceStatus("KeepAliveWorker") + loop.scheduleBuildAndStoreDeviceStatus("KeepAliveWorker") } } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index bff577ec52b..e5bc632bf8b 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget object Versions { - const val appVersion = "3.3.0.0" + const val appVersion = "3.3.1.0" const val versionCode = 1500 const val ndkVersion = "21.1.6352462" diff --git a/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts b/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts index 687daa82f44..0fec0b17ee1 100644 --- a/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts +++ b/buildSrc/src/main/kotlin/test-app-dependencies.gradle.kts @@ -13,7 +13,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.11.3") testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.3") testImplementation("org.json:json:20230618") - testImplementation("org.mockito:mockito-junit-jupiter:5.14.2") + testImplementation("org.mockito:mockito-junit-jupiter:5.15.2") testImplementation("org.mockito.kotlin:mockito-kotlin:5.1.0") testImplementation("joda-time:joda-time:2.13.0") testImplementation("com.google.truth:truth:1.1.5") diff --git a/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts b/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts index e8dd46cd3e7..93902cc5f78 100644 --- a/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts +++ b/buildSrc/src/main/kotlin/test-module-dependencies.gradle.kts @@ -13,7 +13,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.11.3") testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.3") testImplementation("org.json:json:20230618") - testImplementation("org.mockito:mockito-junit-jupiter:5.14.2") + testImplementation("org.mockito:mockito-junit-jupiter:5.15.2") testImplementation("org.mockito.kotlin:mockito-kotlin:5.1.0") testImplementation("joda-time:joda-time:2.13.0") testImplementation("com.google.truth:truth:1.1.5") @@ -24,8 +24,8 @@ dependencies { androidTestImplementation("androidx.test:rules:1.6.1") androidTestImplementation("com.google.truth:truth:1.1.5") androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0") - androidTestImplementation("org.mockito:mockito-core:5.14.2") - androidTestImplementation("org.mockito:mockito-android:5.14.2") + androidTestImplementation("org.mockito:mockito-core:5.15.2") + androidTestImplementation("org.mockito:mockito-android:5.15.2") androidTestImplementation("org.mockito.kotlin:mockito-kotlin:5.1.0") } diff --git a/core/data/src/main/kotlin/app/aaps/core/data/model/SourceSensor.kt b/core/data/src/main/kotlin/app/aaps/core/data/model/SourceSensor.kt index eb705625c05..0d5d8921991 100644 --- a/core/data/src/main/kotlin/app/aaps/core/data/model/SourceSensor.kt +++ b/core/data/src/main/kotlin/app/aaps/core/data/model/SourceSensor.kt @@ -28,7 +28,8 @@ enum class SourceSensor(val text: String) { LIBRE_1_BUBBLE("Bubble"), LIBRE_1_ATOM("Bubble"), LIBRE_1_GLIMP("Glimp"), - LIBRE_2_NATIVE("Libre2"), + LIBRE_2("Libre2"), + LIBRE_2_NATIVE("Libre2 Native"), LIBRE_3("Libre3"), POCTECH_NATIVE("Poctech"), GLUNOVO_NATIVE("Glunovo"), diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/APS.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/APS.kt index 8d41f212990..a8b7f3b375d 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/APS.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/APS.kt @@ -32,6 +32,12 @@ interface APS : ConfigExportImport { */ fun supportsDynamicIc(): Boolean = false + /** + * Dedicated string for Sensitivity OKDialog in overview on ISF calculation ? + * @return string or null if nothing to show + */ + fun getSensitivityOverviewString(): String? = null + /** * Calculate current ISF * @param profile Actual profile to get multiplier form [ProfileSealed.EPS] diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/AutosensData.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/AutosensData.kt index 43b6a185204..a6d5dd288f4 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/AutosensData.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/AutosensData.kt @@ -20,7 +20,7 @@ interface AutosensData { var deviation: Double var validDeviation: Boolean var activeCarbsList: MutableList - var absorbed: Double + var this5MinAbsorption: Double var carbsFromBolus: Double var cob: Double var bgi: Double @@ -43,6 +43,10 @@ interface AutosensData { var autosensResult: AutosensResult fun cloneCarbsList(): MutableList + + /** + * Deduct this 5 min absorption from the active carbs list from oldest to newest. + */ fun deductAbsorbedCarbs() fun removeOldCarbs(toTime: Long, isAAPSOrWeighted: Boolean) } \ No newline at end of file diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/Loop.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/Loop.kt index 79d08dac322..ff8c057bbf9 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/Loop.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/aps/Loop.kt @@ -38,23 +38,81 @@ interface Loop { * Last APS run result */ var lastRun: LastRun? + + /** + * Variable to store reasons of disabled loop + */ var closedLoopEnabled: Constraint? + + /** + * Is loop suspended? + */ val isSuspended: Boolean + + /** + * Is Low Glucose Suspended mode set? + */ val isLGS: Boolean + + /** + * Is Superbolus running? + */ val isSuperBolus: Boolean + + /** + * Is pump disconnected? + */ val isDisconnected: Boolean + /** + * Timestamp of last loop run triggered by new BG + */ var lastBgTriggeredRun: Long + /** + * Invoke new loop run + * + * @param initiator Identifies who triggered the run + * @param allowNotification Allow notification to be sent (false in open loop mode) + * @param tempBasalFallback true if called from failed SMB + */ fun invoke(initiator: String, allowNotification: Boolean, tempBasalFallback: Boolean = false) + /** + * Open loop mode trigger + */ fun acceptChangeRequest() + + /** + * Returns minutes to end of suspended loop + */ fun minutesToEndOfSuspend(): Int + + /** + * Simulate pump disconnection + */ fun goToZeroTemp(durationInMinutes: Int, profile: Profile, reason: OE.Reason, action: Action, source: Sources, listValues: List = listOf()) + + /** + * Suspend loop + */ fun suspendLoop(durationInMinutes: Int, action: Action, source: Sources, note: String? = null, listValues: List) fun disableCarbSuggestions(durationMinutes: Int) - fun buildAndStoreDeviceStatus(reason: String) + /** + * Schedule building of device status before sending to NS + * + * @param reason Initiator + */ + fun scheduleBuildAndStoreDeviceStatus(reason: String) + + /** + * UI loop modes + */ fun entries(): Array + + /** + * loop modes + */ fun entryValues(): Array } \ No newline at end of file diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/automation/AutomationEvent.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/automation/AutomationEvent.kt index 268d864802f..05d6363df0a 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/automation/AutomationEvent.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/automation/AutomationEvent.kt @@ -1,9 +1,12 @@ package app.aaps.core.interfaces.automation +import androidx.annotation.DrawableRes + interface AutomationEvent { var isEnabled: Boolean var title: String fun canRun(): Boolean fun preconditionCanRun(): Boolean + @DrawableRes fun firstActionIcon(): Int? } \ No newline at end of file diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/configuration/Config.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/configuration/Config.kt index 632dbb88615..32a281dfa63 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/configuration/Config.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/configuration/Config.kt @@ -5,9 +5,9 @@ interface Config { val SUPPORTED_NS_VERSION: Int val APS: Boolean - val NSCLIENT: Boolean // aapsclient || aapsclient2 - val NSCLIENT1: Boolean // aapsclient - val NSCLIENT2: Boolean // aapsclient2 + val AAPSCLIENT: Boolean // aapsclient || aapsclient2 + val AAPSCLIENT1: Boolean // aapsclient + val AAPSCLIENT2: Boolean // aapsclient2 val PUMPCONTROL: Boolean val PUMPDRIVERS: Boolean val FLAVOR: String diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/pump/PumpSync.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/pump/PumpSync.kt index 1d45d28c85b..cf28fd00da1 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/pump/PumpSync.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/pump/PumpSync.kt @@ -7,9 +7,10 @@ import app.aaps.core.data.model.TE import app.aaps.core.data.pump.defs.PumpType import app.aaps.core.data.time.T import app.aaps.core.data.ue.Sources +import app.aaps.core.interfaces.R import app.aaps.core.interfaces.profile.Profile +import app.aaps.core.interfaces.resources.ResourceHelper import app.aaps.core.interfaces.utils.DateUtil -import app.aaps.core.interfaces.utils.DecimalFormatter import kotlin.math.max import kotlin.math.min import kotlin.math.roundToInt @@ -95,18 +96,14 @@ interface PumpSync { if (isAbsolute) rate else profile.getBasal(time) * rate / 100 - fun toStringFull(dateUtil: DateUtil, decimalFormatter: DecimalFormatter): String { + fun toStringFull(dateUtil: DateUtil, rh: ResourceHelper): String { return when { isAbsolute -> { - decimalFormatter.to2Decimal(rate) + "U/h @" + - dateUtil.timeString(timestamp) + - " " + getPassedDurationToTimeInMinutes(dateUtil.now()) + "/" + durationInMinutes + "'" + rh.gs(R.string.temp_basal_absolute_rate, rate, dateUtil.timeString(timestamp), getPassedDurationToTimeInMinutes(dateUtil.now()), durationInMinutes) } else -> { // percent - rate.toString() + "% @" + - dateUtil.timeString(timestamp) + - " " + getPassedDurationToTimeInMinutes(dateUtil.now()) + "/" + durationInMinutes + "'" + rh.gs(R.string.temp_basal_percent_rate, rate, dateUtil.timeString(timestamp), getPassedDurationToTimeInMinutes(dateUtil.now()), durationInMinutes) } } } @@ -138,10 +135,8 @@ interface PumpSync { private fun getPassedDurationToTimeInMinutes(time: Long): Int = ((min(time, end) - timestamp) / 60.0 / 1000).roundToInt() - fun toStringFull(dateUtil: DateUtil, decimalFormatter: DecimalFormatter): String = - "E " + decimalFormatter.to2Decimal(rate) + "U/h @" + - dateUtil.timeString(timestamp) + - " " + getPassedDurationToTimeInMinutes(dateUtil.now()) + "/" + T.msecs(duration).mins() + "min" + fun toStringFull(dateUtil: DateUtil, rh: ResourceHelper): String = + rh.gs(R.string.temp_basal_extended_bolus, rate, dateUtil.timeString(timestamp), getPassedDurationToTimeInMinutes(dateUtil.now()), T.msecs(duration).mins()) } data class Bolus(val timestamp: Long, val amount: Double) diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CwfMetaDataKey.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CwfMetaDataKey.kt index c6a45ddbb66..1f1f7e57d7f 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CwfMetaDataKey.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/rx/weardata/CwfMetaDataKey.kt @@ -30,7 +30,8 @@ enum class CwfMetadataKey(val key: String, @StringRes val label: Int, val isPref CWF_PREF_WATCH_SHOW_BG("key_show_bg", R.string.pref_show_bg, true), CWF_PREF_WATCH_SHOW_LOOP_STATUS("key_show_loop_status", R.string.pref_show_loop_status, true), CWF_PREF_WATCH_SHOW_WEEK_NUMBER("key_show_week_number", R.string.pref_show_week_number, true), - CWF_PREF_WATCH_SHOW_DATE("key_show_date", R.string.pref_show_date, true); + CWF_PREF_WATCH_SHOW_DATE("key_show_date", R.string.pref_show_date, true), + CWF_PREF_WATCH_SHOW_SECONDS("key_show_seconds", R.string.pref_show_seconds, true); companion object { 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 b2fc6b8dad8..50f9f751d1f 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 @@ -93,7 +93,7 @@ interface UiInteraction { 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(nsAlarm: NSAlarm) - fun addNotificationWithAction(id: Int, text: String, level: Int, @StringRes buttonText: Int, action: Runnable, validityCheck: (() -> Boolean)?, @RawRes soundId: Int? = null, date: Long = System.currentTimeMillis()) + fun addNotificationWithAction(id: Int, text: String, level: Int, @StringRes buttonText: Int, action: Runnable, validityCheck: (() -> Boolean)?, @RawRes soundId: Int? = null, date: Long = System.currentTimeMillis(), validTo: Long = 0) /** * Add notification that shows dialog after clicking button diff --git a/core/interfaces/src/main/res/values-cs-rCZ/strings.xml b/core/interfaces/src/main/res/values-cs-rCZ/strings.xml index 41fb4f8e467..78abd2c5d76 100644 --- a/core/interfaces/src/main/res/values-cs-rCZ/strings.xml +++ b/core/interfaces/src/main/res/values-cs-rCZ/strings.xml @@ -61,8 +61,12 @@ Zobrazit aktualizováno před Zobrazit číslo týdne Zobrazit datum + Zobrazovat sekundy Výchozí ciferník. Můžete kliknout na tlačítko EXPORTOVAT CIFERNÍK pro vygenerování šablony Výchozí ciferník včetně externích zobrazení pro sledující, chcete-li vygenerovat šablonu, můžete kliknout na tlačítko EXPORTOVAT CIFERNÍK Výchozí ciferník Další ciferníky + %1$.2f U/h @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + E %1$.2f U/h @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values-es-rES/strings.xml b/core/interfaces/src/main/res/values-es-rES/strings.xml index 48d26f5d99d..9afe90129a6 100644 --- a/core/interfaces/src/main/res/values-es-rES/strings.xml +++ b/core/interfaces/src/main/res/values-es-rES/strings.xml @@ -61,8 +61,12 @@ Mostrar \"hace\" Mostrar número de semana Mostrar fecha + Mostrar segundos Esfera predeterminada, puedes hacer clic en el botón EXPORTAR ESFERA para generar una plantilla Esfera de reloj predeterminada que incluye vistas externas para los seguidores. Puedes hacer clic en el botón EXPORTAR WATCHFACE para generar una plantilla Esfera por defecto Más esferas + %1$.2f U/h @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + E %1$.2f U/h @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values-fr-rFR/strings.xml b/core/interfaces/src/main/res/values-fr-rFR/strings.xml index 49f155c192d..93d2fb77f70 100644 --- a/core/interfaces/src/main/res/values-fr-rFR/strings.xml +++ b/core/interfaces/src/main/res/values-fr-rFR/strings.xml @@ -61,8 +61,12 @@ Afficher Min Passées Afficher numéro semaine Afficher la date + Afficher les secondes Cadran par défaut, vous pouvez cliquer sur le bouton EXPORTER WATCHFACE pour générer un modèle Cadran par défaut incluant les vues externes pour les suiveurs, vous pouvez cliquer sur le bouton EXPORTER LE MODÈLE pour générer un modèle Cadran par défaut Plus de cadrans + %1$.2f U/h @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + E %1$.2f U/h @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values-it-rIT/strings.xml b/core/interfaces/src/main/res/values-it-rIT/strings.xml index a51992490d5..97e78c03bcb 100644 --- a/core/interfaces/src/main/res/values-it-rIT/strings.xml +++ b/core/interfaces/src/main/res/values-it-rIT/strings.xml @@ -61,8 +61,12 @@ Mostra Indietro Mostra numeri della settimana Mostra la data + Mostra i Secondi Watchface predefinita, puoi fare click sul tasto ESPORTA WATCHFACE per generare un template La watchface predefinita include le viste esterne per i follower, è possibile fare clic sul pulsante ESPORTA WATCHFACE per generare un modello Watchface predefinita Più quadranti + %1$.2f U/h @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + E %1$.2f U/h @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values-iw-rIL/strings.xml b/core/interfaces/src/main/res/values-iw-rIL/strings.xml index aef92df21ec..962b26a0738 100644 --- a/core/interfaces/src/main/res/values-iw-rIL/strings.xml +++ b/core/interfaces/src/main/res/values-iw-rIL/strings.xml @@ -59,6 +59,7 @@ הצג עבר הצג מספר שבוע הצג תאריך + הצג שניות ברירת המחדל של פני השעון, ניתן ללחוץ על כפתור ייצוא פני שעון כדי ליצור תבנית ברירת מחדל פני שעון עוד פני שעון diff --git a/core/interfaces/src/main/res/values-lt-rLT/strings.xml b/core/interfaces/src/main/res/values-lt-rLT/strings.xml index f99e4a6ff84..fd276e1b5de 100644 --- a/core/interfaces/src/main/res/values-lt-rLT/strings.xml +++ b/core/interfaces/src/main/res/values-lt-rLT/strings.xml @@ -62,6 +62,7 @@ Rodyti savaitės numerį Rodyti datą Numatytasis ekranas. Paspaudus EKSPORTUOTI, bus sukurtas ruošinys + Numatytasis laikrodžio ciferblatas, įskaitant peržiūrą sekėjams. Galite spustelėti mygtuką EKSPORTUOTI CIFERBLATĄ, kad sugeneruotumėte šabloną Numatytasis ekranas Daugiau ciferblatų diff --git a/core/interfaces/src/main/res/values-nb-rNO/strings.xml b/core/interfaces/src/main/res/values-nb-rNO/strings.xml index f34a27c4220..5a9c367838b 100644 --- a/core/interfaces/src/main/res/values-nb-rNO/strings.xml +++ b/core/interfaces/src/main/res/values-nb-rNO/strings.xml @@ -46,23 +46,27 @@ Vis IOB Vis detaljert IOB Vis COB - Vis Delta - Vis detaljert Delta - Vis Gj. snitt Delta + Vis delta + Vis detaljert delta + Vis gj.snittsdelta Vis midlertidig mål Vis reservoarnivå Vis telefonbatteri Vis riggens batteri Vis basaldose - Vis loop status + Vis loopstatus Vis BS Vis BGI Vis retningspil Vis tid siden Vis ukenummer Vis dato + Vis sekunder Standard urskive, du kan klikke på EKSPORTER MAL for å lage en mal Standard urskive inkludert eksterne visninger for følgere, du kan klikke på knappen EKSPORTER URSKIVE for å generere en mal Standard urskive Flere urskiver + %1$.2f E/t @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + F %1$.2f E/t @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values-sk-rSK/strings.xml b/core/interfaces/src/main/res/values-sk-rSK/strings.xml index c9e3e6d523e..400d49507ba 100644 --- a/core/interfaces/src/main/res/values-sk-rSK/strings.xml +++ b/core/interfaces/src/main/res/values-sk-rSK/strings.xml @@ -61,8 +61,12 @@ Zobraziť aktualizované pred Zobraziť číslo týždňa Zobraziť dátum + Zobraziť sekundy Predvolený ciferník. Môžete kliknúť na tlačítko EXPORTOVAŤ CIFERNÍK pre vygenerovanie šablóny Predvolený ciferník vrátane externých zobrazení pre sledovateľov, môžete kliknúť na tlačidlo EXPORTOVAŤ CIFERNÍK ak chcete vygenerovať šablónu Predvolený ciferník Ďalšie ciferníky + %1$.2f JI/h @%2$s %3$d/%4$d + %1$.2f%% @%2$s %3$d/%4$d + E %1$.2f JI/h @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values-zh-rTW/strings.xml b/core/interfaces/src/main/res/values-zh-rTW/strings.xml index 8a4243e7e74..6d4e899719f 100644 --- a/core/interfaces/src/main/res/values-zh-rTW/strings.xml +++ b/core/interfaces/src/main/res/values-zh-rTW/strings.xml @@ -61,8 +61,12 @@ 顯示前 顯示週數 顯示日期 + 顯示秒數 預設錶盤,您可以點擊匯出錶盤按鈕來生成模板 預設錶盤包含外部視圖供追蹤者使用,您可以點擊匯出錶盤按鈕來生成模板 預設錶盤 更多錶盤 + %1$.2f U/h @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + E %1$.2f U/h @%2$s %3$d/%4$d min diff --git a/core/interfaces/src/main/res/values/strings.xml b/core/interfaces/src/main/res/values/strings.xml index 1815ce63f3c..6d54fef4c0f 100644 --- a/core/interfaces/src/main/res/values/strings.xml +++ b/core/interfaces/src/main/res/values/strings.xml @@ -65,9 +65,13 @@ Show Ago Show Week number Show Date + Show Seconds Default watchface, you can click on EXPORT WATCHFACE button to generate a template Default watchface including external views for followers, you can click on EXPORT WATCHFACE button to generate a template Default Watchface More watchfaces + %1$.2f U/h @%2$s %3$d/%4$d\' + %1$.2f%% @%2$s %3$d/%4$d\' + E %1$.2f U/h @%2$s %3$d/%4$d min diff --git a/core/keys/src/main/kotlin/app/aaps/core/keys/UnitDoubleKey.kt b/core/keys/src/main/kotlin/app/aaps/core/keys/UnitDoubleKey.kt index 75d12c03211..1ce6dbcb856 100644 --- a/core/keys/src/main/kotlin/app/aaps/core/keys/UnitDoubleKey.kt +++ b/core/keys/src/main/kotlin/app/aaps/core/keys/UnitDoubleKey.kt @@ -19,6 +19,6 @@ enum class UnitDoubleKey( OverviewHypoTarget("hypo_target", 160.0, 108, 180, defaultedBySM = true), OverviewLowMark("low_mark", 72.0, 25, 160, showInNsClientMode = false, hideParentScreenIfHidden = true), OverviewHighMark("high_mark", 180.0, 90, 250, showInNsClientMode = false), - ApsLgsThreshold("lgsThreshold", 65.0, 65, 120, defaultedBySM = true, dependency = BooleanKey.ApsUseDynamicSensitivity), + ApsLgsThreshold("lgsThreshold", 65.0, 60, 100, defaultedBySM = true, dependency = BooleanKey.ApsUseDynamicSensitivity), ApsAutoIsfSmbDeliveryRatioBgRange("openapsama_smb_delivery_ratio_bg_range", 0.0, 0, 100, defaultedBySM = true) } \ No newline at end of file diff --git a/core/objects/src/main/kotlin/app/aaps/core/objects/profile/ProfileSealed.kt b/core/objects/src/main/kotlin/app/aaps/core/objects/profile/ProfileSealed.kt index 6bfa4ed28a9..5d1b6a0dd6a 100644 --- a/core/objects/src/main/kotlin/app/aaps/core/objects/profile/ProfileSealed.kt +++ b/core/objects/src/main/kotlin/app/aaps/core/objects/profile/ProfileSealed.kt @@ -276,7 +276,7 @@ sealed class ProfileSealed( else getProfileIsfMgdl() override fun getIsfMgdlForCarbs(timestamp: Long, caller: String, config: Config, processedDeviceStatusData: ProcessedDeviceStatusData): Double = - if (config.NSCLIENT) { + if (config.AAPSCLIENT) { processedDeviceStatusData.getAPSResult()?.isfMgdlForCarbs ?: toMgdl(isfBlocks.blockValueBySeconds(MidnightUtils.secondsFromMidnight(timestamp), 100.0 / percentage, timeshift), units) } else { if (aps?.supportsDynamicIsf() ?: error("APS not defined")) diff --git a/core/objects/src/main/kotlin/app/aaps/core/objects/wizard/BolusWizard.kt b/core/objects/src/main/kotlin/app/aaps/core/objects/wizard/BolusWizard.kt index 29f87a91f0b..c9845038568 100644 --- a/core/objects/src/main/kotlin/app/aaps/core/objects/wizard/BolusWizard.kt +++ b/core/objects/src/main/kotlin/app/aaps/core/objects/wizard/BolusWizard.kt @@ -370,7 +370,7 @@ class BolusWizard @Inject constructor( rh.gs(app.aaps.core.ui.R.string.bolus_constraint_applied_warn, calculatedTotalInsulin, insulinAfterConstraints) .formatColor(context, rh, app.aaps.core.ui.R.attr.warningColor) ) - if (config.NSCLIENT && insulinAfterConstraints > 0) + if (config.AAPSCLIENT && insulinAfterConstraints > 0) actions.add(rh.gs(app.aaps.core.ui.R.string.bolus_recorded_only).formatColor(context, rh, app.aaps.core.ui.R.attr.warningColor)) if (useAlarm && !advisor && carbs > 0 && carbTime > 0) actions.add(rh.gs(app.aaps.core.ui.R.string.alarminxmin, carbTime).formatColor(context, rh, app.aaps.core.ui.R.attr.infoColor)) diff --git a/core/objects/src/main/res/drawable/ic_as_above.xml b/core/objects/src/main/res/drawable/ic_as_above.xml new file mode 100644 index 00000000000..0dd8653eda0 --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_as_above.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/core/objects/src/main/res/drawable/ic_as_below.xml b/core/objects/src/main/res/drawable/ic_as_below.xml new file mode 100644 index 00000000000..e1f2a846ff6 --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_as_below.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/core/objects/src/main/res/drawable/ic_cp_announcement_24dp.xml b/core/objects/src/main/res/drawable/ic_cp_announcement_24dp.xml new file mode 100644 index 00000000000..b3819278249 --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_cp_announcement_24dp.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/core/objects/src/main/res/drawable/ic_cp_exercise_24dp.xml b/core/objects/src/main/res/drawable/ic_cp_exercise_24dp.xml new file mode 100644 index 00000000000..4ec6304e7fc --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_cp_exercise_24dp.xml @@ -0,0 +1,13 @@ + + + + diff --git a/core/objects/src/main/res/drawable/ic_cp_note.xml b/core/objects/src/main/res/drawable/ic_cp_note.xml index 9ce6ccdec55..7d2de0a7082 100644 --- a/core/objects/src/main/res/drawable/ic_cp_note.xml +++ b/core/objects/src/main/res/drawable/ic_cp_note.xml @@ -6,4 +6,4 @@ - + \ No newline at end of file diff --git a/core/objects/src/main/res/drawable/ic_cp_note_24dp.xml b/core/objects/src/main/res/drawable/ic_cp_note_24dp.xml new file mode 100644 index 00000000000..3801324a6c1 --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_cp_note_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/core/objects/src/main/res/drawable/ic_cp_question_24dp.xml b/core/objects/src/main/res/drawable/ic_cp_question_24dp.xml new file mode 100644 index 00000000000..112d6b836ca --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_cp_question_24dp.xml @@ -0,0 +1,13 @@ + + + + diff --git a/core/objects/src/main/res/drawable/ic_temptarget_high_24dp.xml b/core/objects/src/main/res/drawable/ic_temptarget_high_24dp.xml new file mode 100644 index 00000000000..bf83cda5c30 --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_temptarget_high_24dp.xml @@ -0,0 +1,13 @@ + + + + diff --git a/core/objects/src/main/res/drawable/ic_x_as_above.xml b/core/objects/src/main/res/drawable/ic_x_as_above.xml new file mode 100644 index 00000000000..71fc9a46992 --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_x_as_above.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/core/objects/src/main/res/drawable/ic_x_as_below.xml b/core/objects/src/main/res/drawable/ic_x_as_below.xml new file mode 100644 index 00000000000..866e0d61edd --- /dev/null +++ b/core/objects/src/main/res/drawable/ic_x_as_below.xml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/core/ui/src/main/res/color/button_tint.xml b/core/ui/src/main/res/color/button_tint.xml new file mode 100644 index 00000000000..dd4f8b0d589 --- /dev/null +++ b/core/ui/src/main/res/color/button_tint.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_actions_profileswitch.xml b/core/ui/src/main/res/drawable/ic_actions_profileswitch_24dp.xml similarity index 89% rename from app/src/main/res/drawable/ic_actions_profileswitch.xml rename to core/ui/src/main/res/drawable/ic_actions_profileswitch_24dp.xml index 6f16a3bf096..454354960d1 100644 --- a/app/src/main/res/drawable/ic_actions_profileswitch.xml +++ b/core/ui/src/main/res/drawable/ic_actions_profileswitch_24dp.xml @@ -1,9 +1,10 @@ + android:fillColor="#FF000000"/> diff --git a/core/ui/src/main/res/drawable/ic_user_options.xml b/core/ui/src/main/res/drawable/ic_user_options.xml index f65abd71393..2442f7ae991 100644 --- a/core/ui/src/main/res/drawable/ic_user_options.xml +++ b/core/ui/src/main/res/drawable/ic_user_options.xml @@ -3,10 +3,10 @@ android:height="48dp" android:viewportWidth="24" android:viewportHeight="24"> - - - + + + \ No newline at end of file diff --git a/core/ui/src/main/res/drawable/ic_user_options_24dp.xml b/core/ui/src/main/res/drawable/ic_user_options_24dp.xml new file mode 100644 index 00000000000..72084b11479 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_user_options_24dp.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/core/ui/src/main/res/values-cs-rCZ/strings.xml b/core/ui/src/main/res/values-cs-rCZ/strings.xml index deb337cfd1f..ba836aff355 100644 --- a/core/ui/src/main/res/values-cs-rCZ/strings.xml +++ b/core/ui/src/main/res/values-cs-rCZ/strings.xml @@ -413,6 +413,12 @@ %1$.0f%% Bazál Bazál % + Citlivost + ISF pro kalkulačku a absorbci sacharidů: %1$.1f + Hodnota Autosense: %.0f%% + AS: %.0f%% + Detekce citlivosti algoritmu: %.0f%% + Alg: %.0f%% soubor uživatel diff --git a/core/ui/src/main/res/values-es-rES/strings.xml b/core/ui/src/main/res/values-es-rES/strings.xml index a7a8ad356c3..d45465d91d3 100644 --- a/core/ui/src/main/res/values-es-rES/strings.xml +++ b/core/ui/src/main/res/values-es-rES/strings.xml @@ -413,6 +413,12 @@ %1$.0f%% Basal Basal % + Sensibilidad + ISF para Calculadora y Absorción de Carbohidratos: %1$.1f + Valor de Autosens: %.0f%% + AS: %.0f%% + Autosens en algoritmo: %.0f%% + Alg: %.0f%% Archivo Usuario diff --git a/core/ui/src/main/res/values-fr-rFR/strings.xml b/core/ui/src/main/res/values-fr-rFR/strings.xml index e4c3bc005e6..d8396419195 100644 --- a/core/ui/src/main/res/values-fr-rFR/strings.xml +++ b/core/ui/src/main/res/values-fr-rFR/strings.xml @@ -413,6 +413,12 @@ %1$.0f%% Basal Basal % + Sensibilité + SI pour l\'Assistant et le calcul GA: %1$.1f + Valeur Autosens: %.0f%% + AS: %.0f%% + Autosens dans l\'algorithme: %.0f%% + Alg: %.0f%% fichier utilisateur diff --git a/core/ui/src/main/res/values-it-rIT/strings.xml b/core/ui/src/main/res/values-it-rIT/strings.xml index ff8f08e11fc..2c301bac318 100644 --- a/core/ui/src/main/res/values-it-rIT/strings.xml +++ b/core/ui/src/main/res/values-it-rIT/strings.xml @@ -413,6 +413,12 @@ %1$.0f%% Basale % basale + Sensibilità + ISF per Calcolatrice e Assorbimento di Carbo: %1$.1f + Valore Autosens: %.0f%% + AS: %.0f%% + Autosens nell\'algoritmo: %.0f%% + Alg: %.0f%% file utente diff --git a/core/ui/src/main/res/values-lt-rLT/protection.xml b/core/ui/src/main/res/values-lt-rLT/protection.xml index d0fc73cb53d..9ebecd3a734 100644 --- a/core/ui/src/main/res/values-lt-rLT/protection.xml +++ b/core/ui/src/main/res/values-lt-rLT/protection.xml @@ -20,6 +20,7 @@ Nesaugus atsarginis įrašas Saugumui užtikrinti, biometrinei apsaugai reikia pagrindinio slaptažodžio atsarginiam įrašui.\n\nĮveskite pagrindinį slaptažodį! Slaptažodis nustatytas! + Išsaugotas slaptažodis išvalytas! PIN nustatytas! Slaptažodis nenustatytas PIN nenustatytas diff --git a/core/ui/src/main/res/values-lt-rLT/strings.xml b/core/ui/src/main/res/values-lt-rLT/strings.xml index 6dcd93cd608..72185c6758f 100644 --- a/core/ui/src/main/res/values-lt-rLT/strings.xml +++ b/core/ui/src/main/res/values-lt-rLT/strings.xml @@ -169,11 +169,13 @@ Įkelti pompos statusą į NS arba Tidepool Ciklas išjungtas/sustabdytas Aktyvus insulinas organizme (AIO) + TIKSLAI: OAPS REZULTATAS: %1$.2f vv ( %2$.2f vv/h ) %1$.2f vv/val (%2$.2fE) @%3$s %1$.2f vv/val @%2$s %1$.0f%% @%2$s + E %1$.2f vv/h @%2$s %3$s/%4$s min %1$.2f vv/h %2$s/%3$s\' Eksportuoti nustatymus Vietos nustatymo leidimas nesuteiktas. Suteikite leidimą Android nustatymuose. @@ -349,6 +351,7 @@ IMPORTUOTI NUSTATYMUS KATALOGO PARINKIMAS IŠVALYTI DUOMENŲ BAZES + APS REZULTATŲ NUSTATYMAS IŠ NAUJO IŠVALYTI DUOMBAZĘ EKSPORTUOTI DUOMENŲ BAZES IMPORTUOTI DUOMENŲ BAZES @@ -589,4 +592,8 @@ %1$.1f V %1$.2f V + Dydis: %1$.2f%% (%2$.2f vv/val) Trukmė: %3$d min + Dydis: %1$.2f vv/val. (%2$.2f%%) Trukmė: %3$d min + Dydis: %1$.2f%% (%2$.2f vv/val.)
Trukmė: %3$d min
]]>
+ Dydis: %1$.2f vv/val. (%2$.2f%%)
Trukmė: %3$d min
]]>
diff --git a/core/ui/src/main/res/values-nb-rNO/strings.xml b/core/ui/src/main/res/values-nb-rNO/strings.xml index 3142d1aa8d7..061cb28231f 100644 --- a/core/ui/src/main/res/values-nb-rNO/strings.xml +++ b/core/ui/src/main/res/values-nb-rNO/strings.xml @@ -413,6 +413,12 @@ %1$.0f%% Basal Basal % + Sensitivitet + ISF for kalkulator og karboabsorpsjon: %1$.1f + Autosens-verdi: %.0f%% + AS: %.0f%% + TDD-basert \"autosens\" i algoritmen: %.0f%% + Alg: %.0f%% fil bruker diff --git a/core/ui/src/main/res/values-night/colors.xml b/core/ui/src/main/res/values-night/colors.xml index 3b2cdf38981..2398d68306d 100644 --- a/core/ui/src/main/res/values-night/colors.xml +++ b/core/ui/src/main/res/values-night/colors.xml @@ -299,4 +299,7 @@ #FF8C00 #03A9F4 + + #FF8B00 + diff --git a/core/ui/src/main/res/values-night/styles.xml b/core/ui/src/main/res/values-night/styles.xml index 5d80a20fcd4..d1234291dd4 100644 --- a/core/ui/src/main/res/values-night/styles.xml +++ b/core/ui/src/main/res/values-night/styles.xml @@ -145,6 +145,7 @@ @color/errorAlertBackground @color/black @color/black_alpha_40 + @color/actionColor @color/errorAlertBackground @@ -429,4 +430,13 @@ center #ff0000 + + + + + diff --git a/core/ui/src/main/res/values-sk-rSK/strings.xml b/core/ui/src/main/res/values-sk-rSK/strings.xml index 73786981237..bee6153dddd 100644 --- a/core/ui/src/main/res/values-sk-rSK/strings.xml +++ b/core/ui/src/main/res/values-sk-rSK/strings.xml @@ -413,6 +413,12 @@ %1$.0f%% Bazál Bazál % + Citlivosť + ISF pre kalkulačku a vstrebávanie sacharidov: %1$.1f + Hodnota Autosense: %.0f%% + AS: %.0f%% + Detekcia citlivosti algoritmu: %.0f%% + Alg: %.0f%% súbor používateľ diff --git a/core/ui/src/main/res/values/attrs.xml b/core/ui/src/main/res/values/attrs.xml index b46603151d9..ef80aa97e3b 100644 --- a/core/ui/src/main/res/values/attrs.xml +++ b/core/ui/src/main/res/values/attrs.xml @@ -124,6 +124,7 @@ + diff --git a/core/ui/src/main/res/values/colors.xml b/core/ui/src/main/res/values/colors.xml index df4abdd40bf..8a9b23c97a8 100644 --- a/core/ui/src/main/res/values/colors.xml +++ b/core/ui/src/main/res/values/colors.xml @@ -378,4 +378,7 @@ #FF8C00 #03A9F4 + + #FF8B00 + diff --git a/core/ui/src/main/res/values/strings.xml b/core/ui/src/main/res/values/strings.xml index 2473c2343cc..8ca726110d2 100644 --- a/core/ui/src/main/res/values/strings.xml +++ b/core/ui/src/main/res/values/strings.xml @@ -430,6 +430,12 @@ %1$.0f%% Basal Basal % + Sensitivity + ISF for Calculator and Carbs Absorption: %1$.1f + Autosens Value: %.0f%% + AS: %.0f%% + Autosens in algorithm: %.0f%% + Alg: %.0f%% file user diff --git a/core/ui/src/main/res/values/styles.xml b/core/ui/src/main/res/values/styles.xml index dd8e587a8d8..b175e9b619b 100644 --- a/core/ui/src/main/res/values/styles.xml +++ b/core/ui/src/main/res/values/styles.xml @@ -148,6 +148,7 @@ @color/errorAlertBackground @color/black @color/black_alpha_40 + @color/actionColor @color/errorAlertBackground @@ -441,4 +442,12 @@ #ff0000 + + + + diff --git a/database/impl/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt b/database/impl/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt index ffb04f741fa..a096f2ebc62 100644 --- a/database/impl/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt +++ b/database/impl/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt @@ -95,6 +95,7 @@ data class GlucoseValue( LIBRE_1_BUBBLE, LIBRE_1_ATOM, LIBRE_1_GLIMP, + LIBRE_2, LIBRE_2_NATIVE, LIBRE_3, POCTECH_NATIVE, diff --git a/database/persistence/src/main/kotlin/app/aaps/database/persistence/PersistenceLayerImpl.kt b/database/persistence/src/main/kotlin/app/aaps/database/persistence/PersistenceLayerImpl.kt index 3ffb2839f70..ca098fe2b22 100644 --- a/database/persistence/src/main/kotlin/app/aaps/database/persistence/PersistenceLayerImpl.kt +++ b/database/persistence/src/main/kotlin/app/aaps/database/persistence/PersistenceLayerImpl.kt @@ -135,7 +135,7 @@ class PersistenceLayerImpl @Inject constructor( fun log(entries: List) { compositeDisposable += insertUserEntries(entries).subscribe() } - if (config.NSCLIENT.not()) + if (config.AAPSCLIENT.not()) log(listOf(UE(timestamp = timestamp, action = action, source = source, note = note ?: "", values = listValues.toList()))) } @@ -408,7 +408,7 @@ class PersistenceLayerImpl @Inject constructor( } override fun syncNsCarbs(carbs: List): Single> = - repository.runTransactionForResult(SyncNsCarbsTransaction(carbs.asSequence().map { it.toDb() }.toList(), config.NSCLIENT)) + repository.runTransactionForResult(SyncNsCarbsTransaction(carbs.asSequence().map { it.toDb() }.toList(), config.AAPSCLIENT)) .doOnError { aapsLogger.error(LTag.DATABASE, "Error while saving carbs", it) } .map { result -> val transactionResult = PersistenceLayer.TransactionResult() @@ -729,7 +729,7 @@ class PersistenceLayerImpl @Inject constructor( .map { result -> val transactionResult = PersistenceLayer.TransactionResult() result.inserted.forEach { - if (config.NSCLIENT.not()) + if (config.AAPSCLIENT.not()) log( timestamp = dateUtil.now(), action = Action.PROFILE_SWITCH, @@ -741,7 +741,7 @@ class PersistenceLayerImpl @Inject constructor( transactionResult.inserted.add(it.fromDb()) } result.invalidated.forEach { - if (config.NSCLIENT.not()) + if (config.AAPSCLIENT.not()) log( timestamp = dateUtil.now(), action = Action.PROFILE_SWITCH_REMOVED, @@ -833,7 +833,7 @@ class PersistenceLayerImpl @Inject constructor( .map { result -> val transactionResult = PersistenceLayer.TransactionResult() result.inserted.forEach { - if (config.NSCLIENT.not()) + if (config.AAPSCLIENT.not()) log( timestamp = dateUtil.now(), action = Action.PROFILE_SWITCH, @@ -845,7 +845,7 @@ class PersistenceLayerImpl @Inject constructor( transactionResult.inserted.add(it.fromDb()) } result.invalidated.forEach { - if (config.NSCLIENT.not()) + if (config.AAPSCLIENT.not()) log( timestamp = dateUtil.now(), action = Action.PROFILE_SWITCH_REMOVED, @@ -919,7 +919,7 @@ class PersistenceLayerImpl @Inject constructor( } override fun syncNsTemporaryBasals(temporaryBasals: List): Single> = - repository.runTransactionForResult(SyncNsTemporaryBasalTransaction(temporaryBasals.asSequence().map { it.toDb() }.toList(), config.NSCLIENT)) + repository.runTransactionForResult(SyncNsTemporaryBasalTransaction(temporaryBasals.asSequence().map { it.toDb() }.toList(), config.AAPSCLIENT)) .doOnError { aapsLogger.error(LTag.DATABASE, "Error while saving TemporaryBasal", it) } .map { result -> val transactionResult = PersistenceLayer.TransactionResult() @@ -1108,7 +1108,7 @@ class PersistenceLayerImpl @Inject constructor( } override fun syncNsExtendedBoluses(extendedBoluses: List): Single> = - repository.runTransactionForResult(SyncNsExtendedBolusTransaction(extendedBoluses.asSequence().map { it.toDb() }.toList(), config.NSCLIENT)) + repository.runTransactionForResult(SyncNsExtendedBolusTransaction(extendedBoluses.asSequence().map { it.toDb() }.toList(), config.AAPSCLIENT)) .doOnError { aapsLogger.error(LTag.DATABASE, "Error while saving ExtendedBolus", it) } .map { result -> val transactionResult = PersistenceLayer.TransactionResult() @@ -1376,7 +1376,7 @@ class PersistenceLayerImpl @Inject constructor( } override fun syncNsTherapyEvents(therapyEvents: List): Single> = - repository.runTransactionForResult(SyncNsTherapyEventTransaction(therapyEvents.asSequence().map { it.toDb() }.toList(), config.NSCLIENT)) + repository.runTransactionForResult(SyncNsTherapyEventTransaction(therapyEvents.asSequence().map { it.toDb() }.toList(), config.AAPSCLIENT)) .doOnError { aapsLogger.error(LTag.DATABASE, "Error while saving TherapyEvent", it) } .map { result -> val transactionResult = PersistenceLayer.TransactionResult() @@ -1499,7 +1499,7 @@ class PersistenceLayerImpl @Inject constructor( } override fun syncNsOfflineEvents(offlineEvents: List): Single> = - repository.runTransactionForResult(SyncNsOfflineEventTransaction(offlineEvents.asSequence().map { it.toDb() }.toList(), config.NSCLIENT)) + repository.runTransactionForResult(SyncNsOfflineEventTransaction(offlineEvents.asSequence().map { it.toDb() }.toList(), config.AAPSCLIENT)) .doOnError { aapsLogger.error(LTag.DATABASE, "Error while saving OfflineEvent", it) } .map { result -> val transactionResult = PersistenceLayer.TransactionResult() diff --git a/database/persistence/src/main/kotlin/app/aaps/database/persistence/converters/SourceSensorExtension.kt b/database/persistence/src/main/kotlin/app/aaps/database/persistence/converters/SourceSensorExtension.kt index 7387d6d423f..a1ffcbf97fe 100644 --- a/database/persistence/src/main/kotlin/app/aaps/database/persistence/converters/SourceSensorExtension.kt +++ b/database/persistence/src/main/kotlin/app/aaps/database/persistence/converters/SourceSensorExtension.kt @@ -32,6 +32,7 @@ fun GlucoseValue.SourceSensor.fromDb(): SourceSensor = GlucoseValue.SourceSensor.LIBRE_1_BUBBLE -> SourceSensor.LIBRE_1_BUBBLE GlucoseValue.SourceSensor.LIBRE_1_ATOM -> SourceSensor.LIBRE_1_ATOM GlucoseValue.SourceSensor.LIBRE_1_GLIMP -> SourceSensor.LIBRE_1_GLIMP + GlucoseValue.SourceSensor.LIBRE_2 -> SourceSensor.LIBRE_2 GlucoseValue.SourceSensor.LIBRE_2_NATIVE -> SourceSensor.LIBRE_2_NATIVE GlucoseValue.SourceSensor.LIBRE_3 -> SourceSensor.LIBRE_3 GlucoseValue.SourceSensor.POCTECH_NATIVE -> SourceSensor.POCTECH_NATIVE @@ -81,6 +82,7 @@ fun SourceSensor.toDb(): GlucoseValue.SourceSensor = SourceSensor.LIBRE_1_BUBBLE -> GlucoseValue.SourceSensor.LIBRE_1_BUBBLE SourceSensor.LIBRE_1_ATOM -> GlucoseValue.SourceSensor.LIBRE_1_ATOM SourceSensor.LIBRE_1_GLIMP -> GlucoseValue.SourceSensor.LIBRE_1_GLIMP + SourceSensor.LIBRE_2 -> GlucoseValue.SourceSensor.LIBRE_2 SourceSensor.LIBRE_2_NATIVE -> GlucoseValue.SourceSensor.LIBRE_2_NATIVE SourceSensor.LIBRE_3 -> GlucoseValue.SourceSensor.LIBRE_3 SourceSensor.POCTECH_NATIVE -> GlucoseValue.SourceSensor.POCTECH_NATIVE diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index ff509992943..30278c10fb7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ kotlin = "2.1.0" wearable = "2.9.0" room = "2.6.1" dagger = "2.54" -mockito = "5.14.2" +mockito = "5.15.2" junit = "5.11.4" okhttp = "4.12.0" retrofit = "2.11.0" @@ -114,7 +114,7 @@ com-squareup-retrofit2-adapter-rxjava3 = { group = "com.squareup.retrofit2", nam com-squareup-retrofit2-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } org-apache-commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = "3.17.0" } -org-mozilla-rhino = { group = "org.mozilla", name = "rhino", version = "1.7.15" } +org-mozilla-rhino = { group = "org.mozilla", name = "rhino", version = "1.8.0" } org-mockito-android = { group = "org.mockito", name = "mockito-android", version.ref = "mockito" } org-mockito-core = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" } @@ -131,7 +131,7 @@ com-madgag-spongycastle = { group = "com.madgag.spongycastle", name = "core", ve com-caverock-androidsvg = { group = "com.caverock", name = "androidsvg", version = "1.4" } net-danlew-android-joda = { group = "net.danlew", name = "android.joda", version = "2.13.0" } joda-time = { group = "joda-time", name = "joda-time", version = "2.13.0" } -org-json = { group = "org.json", name = "json", version = "20240303" } +org-json = { group = "org.json", name = "json", version = "20241224" } org-skyscreamer-jsonassert = { group = "org.skyscreamer", name = "jsonassert", version = "1.5.3" } com-scottyab-rootbeer-lib = { group = "com.scottyab", name = "rootbeer-lib", version = "0.1.1" } com-eatthepath-java-otp = { group = "com.eatthepath", name = "java-otp", version = "0.4.0" } diff --git a/implementation/src/main/kotlin/app/aaps/implementation/iob/AutosensDataObject.kt b/implementation/src/main/kotlin/app/aaps/implementation/iob/AutosensDataObject.kt index f6dd75d7c3f..a9e6878b543 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/iob/AutosensDataObject.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/iob/AutosensDataObject.kt @@ -23,7 +23,7 @@ class AutosensDataObject( override var deviation = 0.0 override var validDeviation = false override var activeCarbsList: MutableList = ArrayList() - override var absorbed = 0.0 + override var this5MinAbsorption = 0.0 override var carbsFromBolus = 0.0 override var cob = 0.0 override var bgi = 0.0 @@ -62,7 +62,7 @@ class AutosensDataObject( bgi, deviation, avgDeviation, - absorbed, + this5MinAbsorption, carbsFromBolus, cob, autosensResult.ratio, @@ -98,7 +98,7 @@ class AutosensDataObject( } override fun deductAbsorbedCarbs() { - var ac = absorbed + var ac = this5MinAbsorption var i = 0 while (i < activeCarbsList.size && ac > 0) { val c = activeCarbsList[i] diff --git a/implementation/src/main/kotlin/app/aaps/implementation/profile/ProfileFunctionImpl.kt b/implementation/src/main/kotlin/app/aaps/implementation/profile/ProfileFunctionImpl.kt index 8b3ba024393..9f722965f4b 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/profile/ProfileFunctionImpl.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/profile/ProfileFunctionImpl.kt @@ -114,7 +114,7 @@ class ProfileFunctionImpl @Inject constructor( // Try to get it from device status // Remove this code after switch to api v3 // ps == null - if (config.NSCLIENT) { + if (config.AAPSCLIENT) { processedDeviceStatusData.pumpData?.activeProfileName?.let { activeProfile -> activePlugin.activeProfileSource.profile?.getSpecificProfile(activeProfile)?.let { ap -> val sealed = ProfileSealed.Pure(ap, activePlugin) diff --git a/implementation/src/main/kotlin/app/aaps/implementation/queue/CommandQueueImplementation.kt b/implementation/src/main/kotlin/app/aaps/implementation/queue/CommandQueueImplementation.kt index 06c61b0afb8..6985708267a 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/queue/CommandQueueImplementation.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/queue/CommandQueueImplementation.kt @@ -123,7 +123,7 @@ class CommandQueueImplementation @Inject constructor( .observeOn(aapsSchedulers.io) .throttleLatest(3L, TimeUnit.SECONDS) .subscribe({ - if (config.NSCLIENT) { // Effective profileswitch should be synced over NS, do not create EffectiveProfileSwitch here + if (config.AAPSCLIENT) { // Effective profileswitch should be synced over NS, do not create EffectiveProfileSwitch here return@subscribe } aapsLogger.debug(LTag.PROFILE, "onEventProfileSwitchChanged") diff --git a/implementation/src/main/kotlin/app/aaps/implementation/queue/commands/CommandSetProfile.kt b/implementation/src/main/kotlin/app/aaps/implementation/queue/commands/CommandSetProfile.kt index d8de50e89d8..3caa979b840 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/queue/commands/CommandSetProfile.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/queue/commands/CommandSetProfile.kt @@ -50,7 +50,7 @@ class CommandSetProfile( callback?.result(r)?.run() // Send SMS notification if ProfileSwitch is coming from NS val profileSwitch = persistenceLayer.getEffectiveProfileSwitchActiveAt(dateUtil.now()) - if (profileSwitch != null && r.enacted && hasNsId && !config.NSCLIENT) { + if (profileSwitch != null && r.enacted && hasNsId && !config.AAPSCLIENT) { if (smsCommunicator.isEnabled() && !config.doNotSendSmsOnProfileChange()) smsCommunicator.sendNotificationToAllNumbers(rh.gs(app.aaps.core.ui.R.string.profile_set_ok)) } diff --git a/implementation/src/main/kotlin/app/aaps/implementation/resources/IconsProviderImplementation.kt b/implementation/src/main/kotlin/app/aaps/implementation/resources/IconsProviderImplementation.kt index 28ab5256bcc..2ed0c7335f6 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/resources/IconsProviderImplementation.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/resources/IconsProviderImplementation.kt @@ -11,15 +11,15 @@ class IconsProviderImplementation @Inject constructor(private val config: Config override fun getIcon(): Int = when { - config.NSCLIENT2 -> app.aaps.core.ui.R.mipmap.ic_blueowl - config.NSCLIENT1 -> app.aaps.core.ui.R.mipmap.ic_yellowowl + config.AAPSCLIENT2 -> app.aaps.core.ui.R.mipmap.ic_blueowl + config.AAPSCLIENT1 -> app.aaps.core.ui.R.mipmap.ic_yellowowl config.PUMPCONTROL -> app.aaps.core.ui.R.mipmap.ic_pumpcontrol else -> app.aaps.core.ui.R.mipmap.ic_launcher } override fun getNotificationIcon(): Int = when { - config.NSCLIENT -> R.drawable.ic_notif_nsclient + config.AAPSCLIENT -> R.drawable.ic_notif_nsclient config.PUMPCONTROL -> R.drawable.ic_notif_pumpcontrol else -> app.aaps.core.objects.R.drawable.ic_notif_aaps } diff --git a/implementation/src/main/kotlin/app/aaps/implementation/sharedPreferences/PreferencesImpl.kt b/implementation/src/main/kotlin/app/aaps/implementation/sharedPreferences/PreferencesImpl.kt index 7c9b1dbcb1b..1a2e51696de 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/sharedPreferences/PreferencesImpl.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/sharedPreferences/PreferencesImpl.kt @@ -42,7 +42,7 @@ class PreferencesImpl @Inject constructor( override val simpleMode: Boolean get() = sp.getBoolean(BooleanKey.GeneralSimpleMode.key, BooleanKey.GeneralSimpleMode.defaultValue) override val apsMode: Boolean = config.APS - override val nsclientMode: Boolean = config.NSCLIENT + override val nsclientMode: Boolean = config.AAPSCLIENT override val pumpControlMode: Boolean = config.PUMPCONTROL private val prefsList: MutableList> = @@ -55,9 +55,16 @@ class PreferencesImpl @Inject constructor( IntentKey::class.java, ) + private fun isHidden(key: PreferenceKey) : Boolean = + if (apsMode && key.showInApsMode == false) true + else if (nsclientMode && key.showInNsClientMode == false) true + else if (pumpControlMode && key.showInPumpControlMode == false) true + else false + override fun get(key: BooleanPreferenceKey): Boolean = if (!config.isEngineeringMode() && key.engineeringModeOnly) key.defaultValue - else if (simpleMode && key.defaultedBySM) key.defaultValue + else if (simpleMode && key.defaultedBySM) calculatedDefaultValue(key) + else if (key.calculatedDefaultValue && isHidden(key)) calculatedDefaultValue(key) else sp.getBoolean(key.key, calculatedDefaultValue(key)) override fun getIfExists(key: BooleanPreferenceKey): Boolean? = @@ -115,7 +122,7 @@ class PreferencesImpl @Inject constructor( override fun get(key: IntPreferenceKey): Int = if (!config.isEngineeringMode() && key.engineeringModeOnly) key.defaultValue else if (simpleMode && key.defaultedBySM) calculatedDefaultValue(key) - else if (key.engineeringModeOnly && !config.isEngineeringMode()) calculatedDefaultValue(key) + else if (key.calculatedDefaultValue && isHidden(key)) calculatedDefaultValue(key) else sp.getInt(key.key, calculatedDefaultValue(key)) override fun getIfExists(key: IntPreferenceKey): Int? = @@ -128,7 +135,7 @@ class PreferencesImpl @Inject constructor( override fun get(key: LongPreferenceKey): Long = if (!config.isEngineeringMode() && key.engineeringModeOnly) key.defaultValue else if (simpleMode && key.defaultedBySM) calculatedDefaultValue(key) - else if (key.engineeringModeOnly && !config.isEngineeringMode()) calculatedDefaultValue(key) + else if (key.calculatedDefaultValue && isHidden(key)) calculatedDefaultValue(key) else sp.getLong(key.key, calculatedDefaultValue(key)) override fun getIfExists(key: LongPreferenceKey): Long? = @@ -195,9 +202,9 @@ class PreferencesImpl @Inject constructor( private fun calculatedDefaultValue(key: BooleanPreferenceKey): Boolean = if (key.calculatedDefaultValue) when (key) { - BooleanKey.OverviewKeepScreenOn -> config.NSCLIENT - BooleanKey.NsClientNotificationsFromAlarms -> config.NSCLIENT - BooleanKey.NsClientNotificationsFromAnnouncements -> config.NSCLIENT + BooleanKey.OverviewKeepScreenOn -> config.AAPSCLIENT + BooleanKey.NsClientNotificationsFromAlarms -> config.AAPSCLIENT + BooleanKey.NsClientNotificationsFromAnnouncements -> config.AAPSCLIENT BooleanKey.NsClientLogAppStart -> config.APS BooleanKey.NsClientCreateAnnouncementsFromErrors -> config.APS BooleanKey.NsClientCreateAnnouncementsFromCarbsReq -> config.APS diff --git a/implementation/src/main/kotlin/app/aaps/implementation/stats/DexcomTirImpl.kt b/implementation/src/main/kotlin/app/aaps/implementation/stats/DexcomTirImpl.kt index 00fab023fb5..3c5564800b7 100644 --- a/implementation/src/main/kotlin/app/aaps/implementation/stats/DexcomTirImpl.kt +++ b/implementation/src/main/kotlin/app/aaps/implementation/stats/DexcomTirImpl.kt @@ -81,7 +81,7 @@ class DexcomTirImpl : DexcomTIR { (10 * (mean() + 46.7) / 28.7).roundToInt() / 10.0 + "%" + " (" + (((mean() + 46.7) / 28.7 - 2.15) * 10.929).roundToInt() + - " mmol/L)" + " mmol/mol)" setTypeface(typeface, Typeface.NORMAL) gravity = Gravity.CENTER_HORIZONTAL } diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/loop/LoopPlugin.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/loop/LoopPlugin.kt index 70aa3efa48b..5978f144aaf 100644 --- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/loop/LoopPlugin.kt +++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/loop/LoopPlugin.kt @@ -314,7 +314,7 @@ class LoopPlugin @Inject constructor( lastRun.lastTBRRequest = 0 lastRun.lastSMBEnact = 0 lastRun.lastSMBRequest = 0 - buildAndStoreDeviceStatus("APS result") + scheduleBuildAndStoreDeviceStatus("APS result") if (isSuspended) { aapsLogger.debug(LTag.APS, rh.gs(app.aaps.core.ui.R.string.loopsuspended)) @@ -427,20 +427,25 @@ class LoopPlugin @Inject constructor( // executing TBR may take some time thus give more time to SMB resultAfterConstraints.deliverAt = lastRun.lastTBREnact rxBus.send(EventLoopUpdateGui()) - applySMBRequest(resultAfterConstraints, object : Callback() { - override fun run() { - // Callback is only called if a bolus was actually requested - if (result.enacted || result.success) { - lastRun.smbSetByPump = result - lastRun.lastSMBRequest = lastRun.lastAPSRun - lastRun.lastSMBEnact = dateUtil.now() - } else { - handler?.postDelayed({ invoke("tempBasalFallback", allowNotification, true) }, 1000) + if (resultAfterConstraints.isBolusRequested) + applySMBRequest(resultAfterConstraints, object : Callback() { + override fun run() { + // Callback is only called if a bolus was actually requested + if (result.enacted || result.success) { + lastRun.smbSetByPump = result + lastRun.lastSMBRequest = lastRun.lastAPSRun + lastRun.lastSMBEnact = dateUtil.now() + scheduleBuildAndStoreDeviceStatus("applySMBRequest") + } else { + handler?.postDelayed({ invoke("tempBasalFallback", allowNotification, true) }, 1000) + } + rxBus.send(EventLoopUpdateGui()) } - rxBus.send(EventLoopUpdateGui()) - } - }) - buildAndStoreDeviceStatus("applyTBRRequest") + }) + else { + aapsLogger.debug(LTag.APS, "No SMB requested") + scheduleBuildAndStoreDeviceStatus("applyTBRRequest") + } } else { lastRun.tbrSetByPump = result lastRun.lastTBRRequest = lastRun.lastAPSRun @@ -538,7 +543,7 @@ class LoopPlugin @Inject constructor( lastRun.lastTBRRequest = lastRun.lastAPSRun lastRun.lastTBREnact = dateUtil.now() lastRun.lastOpenModeAccept = dateUtil.now() - buildAndStoreDeviceStatus("acceptChangeRequest") + scheduleBuildAndStoreDeviceStatus("acceptChangeRequest") sp.incInt(app.aaps.core.utils.R.string.key_ObjectivesmanualEnacts) } rxBus.send(EventAcceptOpenLoopChange()) @@ -650,10 +655,6 @@ class LoopPlugin @Inject constructor( } private fun applySMBRequest(request: APSResult, callback: Callback?) { - if (!request.isBolusRequested) { - aapsLogger.debug(LTag.APS, "No SMB requested") - return - } val pump = activePlugin.activePump val lastBolusTime = persistenceLayer.getNewestBolus()?.timestamp ?: 0L if (lastBolusTime != 0L && lastBolusTime + T.mins(preferences.get(IntKey.ApsMaxSmbFrequency).toLong()).msecs() > dateUtil.now()) { @@ -752,7 +753,22 @@ class LoopPlugin @Inject constructor( }) } - override fun buildAndStoreDeviceStatus(reason: String) { + var task: Runnable? = null + + override fun scheduleBuildAndStoreDeviceStatus(reason: String) { + class UpdateRunnable : Runnable { + + override fun run() { + buildAndStoreDeviceStatus(reason) + task = null + } + } + task?.let { handler?.removeCallbacks(it) } + task = UpdateRunnable() + task?.let { handler?.postDelayed(it, 5000) } + } + + fun buildAndStoreDeviceStatus(reason: String) { aapsLogger.debug(LTag.NSCLIENT, "Building DeviceStatus for $reason") val version = config.VERSION_NAME + "-" + config.BUILD_VERSION val profile = profileFunction.getProfile() ?: return diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.kt index 6e345b7d35d..339ee51aa24 100644 --- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.kt +++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAMA/OpenAPSAMAPlugin.kt @@ -109,8 +109,12 @@ class OpenAPSAMAPlugin @Inject constructor( } override fun specialShowInListCondition(): Boolean { - val pump = activePlugin.activePump - return pump.pumpDescription.isTempBasalCapable + try { + val pump = activePlugin.activePump + return pump.pumpDescription.isTempBasalCapable + } catch (_: Exception) { + return true + } } override fun invoke(initiator: String, tempBasalFallback: Boolean) { diff --git a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAutoISF/OpenAPSAutoISFPlugin.kt b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAutoISF/OpenAPSAutoISFPlugin.kt index 75fc9d36695..2c7538f7f98 100644 --- a/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAutoISF/OpenAPSAutoISFPlugin.kt +++ b/plugins/aps/src/main/kotlin/app/aaps/plugins/aps/openAPSAutoISF/OpenAPSAutoISFPlugin.kt @@ -194,6 +194,8 @@ open class OpenAPSAutoISFPlugin @Inject constructor( return sensitivity } + override fun getSensitivityOverviewString(): String? = null // placeholder for Auto ISF Detailed information for overview + override fun specialEnableCondition(): Boolean { return config.isEngineeringMode() && config.isDev() && try { @@ -205,8 +207,12 @@ open class OpenAPSAutoISFPlugin @Inject constructor( } override fun specialShowInListCondition(): Boolean { - val pump = activePlugin.activePump - return pump.pumpDescription.isTempBasalCapable + try { + val pump = activePlugin.activePump + return pump.pumpDescription.isTempBasalCapable + } catch (_: Exception) { + return true + } } override fun preprocessPreferences(preferenceFragment: PreferenceFragmentCompat) { 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 5e665157f2b..7d8ebf383d2 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 @@ -178,8 +178,12 @@ open class OpenAPSSMBPlugin @Inject constructor( } override fun specialShowInListCondition(): Boolean { - val pump = activePlugin.activePump - return pump.pumpDescription.isTempBasalCapable + try { + val pump = activePlugin.activePump + return pump.pumpDescription.isTempBasalCapable + } catch (_: Exception) { + return true + } } override fun preprocessPreferences(preferenceFragment: PreferenceFragmentCompat) { diff --git a/plugins/aps/src/main/res/layout/autotune_fragment.xml b/plugins/aps/src/main/res/layout/autotune_fragment.xml index 105c3009446..2f39b25220a 100644 --- a/plugins/aps/src/main/res/layout/autotune_fragment.xml +++ b/plugins/aps/src/main/res/layout/autotune_fragment.xml @@ -111,6 +111,7 @@ + Įjungti BPD pagrįstą jautrumo santykį bazės ir glikemijos tikslo koregavimui + Naudoja paskutinių 24 val. BPD/7D BPD duomenis jautrumo santykio apskaičiavimui, kuris taikomas bazinio insulino didinimui arba mažinimui, taip pat koreguojant glikemijos tikslą. Jei šios parinktys įjungtos, atliekamos tokiu pačiu būdu kaip tai daro Autosens. Rekomenduojama pradėti su išjungta šia parinktimi + Dinaminio JIF derinimo faktorius % + Dinaminio JIF derinimo faktorius. Nustatykite daugiau nei 100% agresyvesniam koregavimui arba mažiau nei 100% švelnesniam koregavimui. Intensyvus laikinas tikslas didina jautrumą = 100]]> Pasyvus laikinas tikslas mažina jautrumą OpenAPS SMB Dinaminis JIF + Automatinis JIF Kaip dažnai SMB bus leidžiami, min. Rezistencija mažina tikslą Kai aptinkama rezistencija insulinui, tikslinė glikemija sumažinama @@ -16,6 +21,7 @@ Nėra glikemijos duomenų Nėra autosens duomenų DYNISF + AUTOISF Vykdoma OpenAPS AMA %1$d elementų masyvas. \naktuali vertė: @@ -23,6 +29,7 @@ 2017 m. algoritmas Naujausias algoritmas patyrusiems naudotojams Naujausias algoritmas patyrusiems naudotojams su dinaminiu/automatiniu JIF + Naujausias algoritmas patyrusiems naudotojams su automatiniu JIF Atidėjimo po boluso IVT daliklis Paleisti dabar Paskutinis veiksmas @@ -59,7 +66,9 @@ Naudoti Super Mikro Bolusus vietoj laikinos bazės greitesniam veikimui Nedeklaruoto maisto (NDM) aptikimas Įjungti SMB visada + Leisti SMB visada, nepriklausomai nuo AAO, laikinų tikslų ir bolusų. Galimas tik naudojant patikimų, filtruotų glikemijos duomenų šaltinį Įjungti SMB po angliavandenių + Leisti SMB iki 6 val. po angliavandenių įvedimo, net jei AAO yra 0. Įmanoma tik naudojant patikimų, filtruotų glikemijos duomenų šaltinį Įjungti SMB su AAO Įjungti SMB, kai yra AAO. Įjungti SMB su laikinais tikslais @@ -79,6 +88,8 @@ SMB išjungti nustatymuose NDM nustatymas išjungtas nustatymuose Autosens funkcija išjungta nustatymuose + Įjungti dinaminį jautrumą + Pritaikyti algoritmą naudoti dinaminį jautrumą vietoje profilio reikšmės Ribojamas AIO iki %1$.1f V dėl %2$s Maksimali reikšmė nustatymuose @@ -111,7 +122,9 @@ Minimalaus pokyčio užklausa [%] Atviras Ciklas parodys naujų pakeitimų užklausą tik tada, kai pokytis bus didesnis nei ši vertė %. Numatytoji vertė yra 20% Grįžtama prie SMB. Nepakanka BPD duomenų. + Grįžtama į profilio nustatytą jautrumą. Nepakanka duomenų. Priežastis: %1$s + Pagalba galimiems profilio koregavimams (JIF, angliavandenių santykis ir valandinė bazė) AT Autotune nustatymai Automatizuotas profilio keitimas @@ -151,5 +164,44 @@ Atnaujinti %1$s profilį pagal Autotune profilį? Atstatyti %1$s profilį į įkeltą profilį? Profilis negalioja + Nepasiekiama + Pompa atjungta + Pusė bazinio insulino fizinio krūvio metu + Nustatykite skaičių, pvz., 8,0, kuris reiškia, kad kai laikinas tikslas yra 8,0 mmol/l ir aukštas laikinas tikslas padidina jautrumą = TAIP, nustatykite 50% laikiną bazę šiame lygyje (6,0 = 75%; 4,8 = 60%). + Automatinio JIF nustatymai + Automatinis JIF leidžia koreguoti insulino jautrumo faktorių (JIF) įvairiose glikemijos elgsenos situacijose\n\nJis taip pat gali koreguoti SMB suleidimo nustatymus + SMB suleidimo nustatymai + Parinkčių rinkinys, skirtas padidinti faktinį SMB, kuris gali būti suleistas situacijose, kai JIF sustiprintas, t. y. gana žemas JIF skaičius.\n\nNAUDOTI ATSARGIAI + Įjungti JIF adaptaciją pagal KG pokyčius + Panašiai kaip autosens_max, ši parinktis nustato, koks stiprus gali tapti JIF.\n\nNumatytoji reikšmė 1,0 faktiškai išjungia šį efektą.\n\nĮSPĖJIMAS: Būkite itin atsargūs naudodami reikšmes, didesnes nei 2,5 + Panašiai kaip autosens_min, šis parametras apibrėžia, kiek silpnas gali tapti JIF.\n\n Numatytoji reikšmė 1,0 iš esmės išjungia šį efektą. + Tai svoris, kuris taikomas per ilgesnės trukmės aukštą glikemiją, ir kuris stiprina JIF, taip potencialiai didindamas insulino suleidimą.\n\nNumatytoji reikšmė 0,0 iš esmės išjungia šį efektą. + Tai svoris, kuris taikomas, kai glikemija yra mažesnė už tikslinę, ir kuris silpnina JIF, taip potencialiai mažindamas insulino suleidimą.\n\nNumatytoji reikšmė 0,0 iš esmės išjungia šį efektą. + Tai svoris, kuris taikomas, kai glikemija didesnė už tikslinę, ir kuris stiprina JIF, taip potencialiai didindamas insulino suleidimą.\n\nNumatytoji reikšmė 0,0 iš esmės išjungia šį efektą. + Tai svoris, kuris taikomas, kai glikemija kyla, ir kuris stiprina JIF, taip potencialiai didindamas insulino suleidimą.\n\nNumatytoji reikšmė 0,0 iš esmės išjungia šį efektą. + Tai svoris, kuris taikomas, kai glikemija sparčiai kyla, ir kuris stiprina JIF, taip potencialiai didindamas insulino suleidimą.\n\nNumatytoji reikšmė 0,0 iš esmės išjungia šį efektą. + Tai svoris, kuris taikomas, kai glikemija mažėja, ir kuris silpnina JIF, taip potencialiai mažindamas insulino suleidimą.\n\nNumatytoji reikšmė 0,0 iš esmės išjungia šį efektą. + Maks. autoJIF dydis\n(autoISF_max) + Min. autoJIF dydis\n(autoISF_min) + žemesnio JIF-diapazono svoris\n(lower_ISFrange_weight) + aukštesnio JIF-diapazono svoris\n(higher_ISFrange_weight) + JIF-diapazono svoris po valgio\n(pp_ISF_weight) + Svoris, kai KG aktyviai kyla\n(bgAccel_ISF_weight) + Svoris, kai KG kilimas sulėtėja\n(bgBrake_ISF_weight) + dura_ISF svoris\n(dura_ISF_weight) + fiksuotas SMB suleidimo dydis\n(smb_delivery_ratio) + kintamas SMB suleidimo dydis, apatinė riba\n(smb_delivery_ratio_min) + kintamas SMB suleidimo dydis, viršutinė riba\n(smb_delivery_ratio_max) + kintamas SMB suleidimo dydis, susietas su gliukozės diapazonu\n(smb_delivery_ratio_bg_range) + SMB/NDM maksimalaus dydžio prailginimas\n(smb_max_range_extension) + Numatytoji reikšmė: 0,5. Tai yra dar vienas svarbus OpenAPS saugos apribojimas, kuris nurodo, kokią dalį viso reikalingo insulino galima skirti kaip SMB. Šis apribojimas skirtas išvengti pavojingų situacijų, kai SMB užklausos siunčiamos tuo pačiu metu sekėjo globėjo telefono. Šią eksperimentinę reikšmę didinkite lėtai ir atsargiai. + Numatytoji reikšmė: 0,5. Tai yra apatinė ribinė reikšmė, naudojama linijiniam santykiui didinti, o ne fiksuota reikšmė, kaip nurodyta aukščiau. + Numatytoji reikšmė: 0,5. Tai yra viršutinė ribinė reikšmė, naudojama linijiniam santykiui didinti, o ne fiksuota reikšmė, kaip nurodyta aukščiau. + Numatytoji reikšmė: 0. Linijiškai didėjantis SMB leidimo santykis yra susietas su gliukozės diapazonu [target_bg, target_bg+bg_range].\nTies target_bg SMB dydis yra smb_delivery_ratio_min, ties target_bg+bg_range yra smb_delivery_ratio_max\nTies 0, linijiškai didėjantis SMB leidimo santykis yra išjungiamas ir naudojamas fiksuotas smb_delivery_ratio dydis. + Numatytoji reikšmė: 1. Tai dar vienas svarbus OpenAPS saugos apribojimas, kuris nurodo, kiek kartų galite viršyti įprastą 120 maxSMB/maxNDM minučių ribą. Šią eksperimentinę reikšmę didinkite lėtai ir atsargiai. + Įjungti alternatyvų SMB aktyvavimą, priklausomą nuo to, ar aktyvi tikslinė glikemija yra lyginis skaičius + \nįjungta ...\njei aktyvaus tikslo (mmol/L) dešimtainė dalis yra lyginė\narba aktyvus tikslas (mg/dl) yra lyginis skaičius\n\nkitu atveju - išjungta + Didžiausio AIO procentas, virš kurio SMB yra išjungiami.\nNumatytoji reikšmė: 100%\nEsant 100%, ši funkcija yra išjungta. + Didžiausio AIO ribos procentas SMB\n(iob_threshold_percent) diff --git a/plugins/aps/src/main/res/values-nb-rNO/strings.xml b/plugins/aps/src/main/res/values-nb-rNO/strings.xml index 0c05631979c..cf4cbd4adcc 100644 --- a/plugins/aps/src/main/res/values-nb-rNO/strings.xml +++ b/plugins/aps/src/main/res/values-nb-rNO/strings.xml @@ -50,7 +50,7 @@ Denne verdien kalles Maks IOB av OpenAPS\nAAPS vil ikke gi mere insulin hvis mengden insulin ombord (IOB) overstiger denne verdien. Standard verdi: sann\nGir autosens tillatelse til å justere BS-mål, i tillegg til ISF og basaler. Autosens justerer også BS målverdier - Standardverdi er: 3.0 (AMA) eller 8.0 (SMB). Dette er grunninnstillingen for KH-opptak per 5 minutt. Den påvirker hvor raskt COB skal reduseres, og benyttes i beregning av fremtidig BS-kurve når BS enten synker eller øker mer enn forventet. Standardverdi er 3mg/dl/5 min. + Standardverdi: 3.0 (AMA) eller 8.0 (SMB). Dette er en innstilling for standard karboabsorpsjonsvirkning per 5 minutter. Standard forventet er 3mg/dl/5min. Dette påvirker hvor raskt COB avtar, og hvor mye karboabsorpsjon antas ved beregning av fremtidig forventet BS, når BS faller mer enn forventet, eller når det ikke stiger så mye som forventet. Standardverdi: 3 Dette er en viktig OpenAPS sikkerhetsbegrensning. Dette begrenser dine basaler til maks 3x av din høyeste basalverdi. Du vil trolig ikke behøve å endre denne verdien, men les og forstå hva som menes med \"3x max daglig; 4x gjeldende\" som sikkerhetsinnstilling. Standardverdi: 4 Dette er en viktig OpenAPS sikkerhetsbegrensning. Dette begrenser dine temp basal til max 4 ganger din nåværende basal dose, uansett hva som er maks basal i pumpen. Dette er for å unngå at man setter farlige høye maks basaldoser uten at man har forstått algoritmene. Når du taket i denne begrensningen bør du i stedet fokusere på å endre andre innstillinger. Standard verdi: 2\nBolus-slumre er aktivt etter at du har gitt en måltidsbolus slik at loop ikke skal forsøke å sette lav-temp når du nettopp har spist. I dette eksempelet brukes standardverdi på 2, så med en DIA på 3 timer vil bolus-slumre begrensningen gradvis forsvinne etter 1.5 timer (3DIA / 2). diff --git a/plugins/aps/src/main/res/values-zh-rTW/strings.xml b/plugins/aps/src/main/res/values-zh-rTW/strings.xml index b84594263ba..44052eac5a5 100644 --- a/plugins/aps/src/main/res/values-zh-rTW/strings.xml +++ b/plugins/aps/src/main/res/values-zh-rTW/strings.xml @@ -8,7 +8,7 @@ 高臨時目標提高敏感度 = 100,提高靈敏度]]> 低臨時目標降低靈敏度 - + OpenAPS SMB 動態ISF 自動ISF @@ -35,7 +35,7 @@ 最後執行 輸入參數 血糖狀態 - 目前溫度 + 目前臨時基礎率 IOB資料 檔案 餐飲資料 @@ -89,7 +89,7 @@ 偏好設定中已停用UAM 偏好設定中已停用自動靈敏度 啟用動態靈敏度 - 調整算法以使用動態靈敏度而不是檔案值 + 調整算法使用動態靈敏度,而不是設定檔中的 ISF 值 限制IOB到 %1$.1f U,因為 %2$s 偏好設定中的最大值 diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationEvent.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationEventObject.kt similarity index 97% rename from plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationEvent.kt rename to plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationEventObject.kt index 21f3fcb9c29..2d05debbe4e 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationEvent.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationEventObject.kt @@ -37,6 +37,7 @@ class AutomationEventObject(private val injector: HasAndroidInjector) : Automati override fun canRun(): Boolean = trigger.shouldRun() override fun preconditionCanRun(): Boolean = getPreconditions().shouldRun() + override fun firstActionIcon(): Int? = actions.firstOrNull()?.icon() internal fun getPreconditions(): TriggerConnector { val trigger = TriggerConnector(injector, TriggerConnector.Type.AND) diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt index cd1415729b2..dce50cfe382 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt @@ -73,6 +73,7 @@ import app.aaps.plugins.automation.triggers.TriggerPumpLastConnection import app.aaps.plugins.automation.triggers.TriggerRecurringTime import app.aaps.plugins.automation.triggers.TriggerReservoirLevel import app.aaps.plugins.automation.triggers.TriggerSensorAge +import app.aaps.plugins.automation.triggers.TriggerStepsCount import app.aaps.plugins.automation.triggers.TriggerTempTarget import app.aaps.plugins.automation.triggers.TriggerTempTargetValue import app.aaps.plugins.automation.triggers.TriggerTime @@ -145,7 +146,7 @@ class AutomationPlugin @Inject constructor( } } - override fun specialEnableCondition(): Boolean = !config.NSCLIENT + override fun specialEnableCondition(): Boolean = !config.AAPSCLIENT override fun onStart() { handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) @@ -420,7 +421,8 @@ class AutomationPlugin @Inject constructor( TriggerHeartRate(injector), TriggerSensorAge(injector), TriggerCannulaAge(injector), - TriggerReservoirLevel(injector) + TriggerReservoirLevel(injector), + TriggerStepsCount(injector) ) val pump = activePlugin.activePump diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitch.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitch.kt index 49331f23f6f..eed2000047f 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitch.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitch.kt @@ -28,7 +28,7 @@ class ActionProfileSwitch(injector: HasAndroidInjector) : Action(injector) { override fun friendlyName(): Int = R.string.profilename override fun shortDescription(): String = rh.gs(R.string.changengetoprofilename, inputProfileName.value) - @DrawableRes override fun icon(): Int = app.aaps.core.ui.R.drawable.ic_actions_profileswitch + @DrawableRes override fun icon(): Int = app.aaps.core.ui.R.drawable.ic_actions_profileswitch_24dp override fun doAction(callback: Callback) { val activeProfileName = profileFunction.getProfileName() diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercent.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercent.kt index 4d13e4a6865..5b5175c2343 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercent.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercent.kt @@ -31,7 +31,7 @@ class ActionProfileSwitchPercent(injector: HasAndroidInjector) : Action(injector if (duration.value == 0) rh.gs(R.string.startprofileforever, pct.value.toInt()) else rh.gs(app.aaps.core.ui.R.string.startprofile, pct.value.toInt(), duration.value) - @DrawableRes override fun icon(): Int = app.aaps.core.ui.R.drawable.ic_actions_profileswitch + @DrawableRes override fun icon(): Int = app.aaps.core.ui.R.drawable.ic_actions_profileswitch_24dp init { precondition = TriggerProfilePercent(injector, 100.0, Comparator.Compare.IS_EQUAL) diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionRunAutotune.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionRunAutotune.kt index 9cdfff789f4..cb583481270 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionRunAutotune.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionRunAutotune.kt @@ -38,7 +38,7 @@ class ActionRunAutotune(injector: HasAndroidInjector) : Action(injector) { override fun friendlyName(): Int = R.string.autotune_run override fun shortDescription(): String = resourceHelper.gs(R.string.autotune_profile_name, inputProfileName.value) - @DrawableRes override fun icon(): Int = app.aaps.core.ui.R.drawable.ic_actions_profileswitch + @DrawableRes override fun icon(): Int = app.aaps.core.ui.R.drawable.ic_actions_profileswitch_24dp override fun doAction(callback: Callback) { val autoSwitch = preferences.get(BooleanKey.AutotuneAutoSwitchProfile) diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTarget.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTarget.kt index d01feaa118b..7a8400d6915 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTarget.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTarget.kt @@ -49,7 +49,7 @@ class ActionStartTempTarget(injector: HasAndroidInjector) : Action(injector) { override fun friendlyName(): Int = R.string.starttemptarget override fun shortDescription(): String = rh.gs(R.string.starttemptarget) + ": " + tt().friendlyDescription(value.units, rh, profileUtil) - @DrawableRes override fun icon(): Int = app.aaps.core.objects.R.drawable.ic_temptarget_high + @DrawableRes override fun icon(): Int = app.aaps.core.objects.R.drawable.ic_temptarget_high_24dp override fun doAction(callback: Callback) { disposable += persistenceLayer.insertAndCancelCurrentTemporaryTarget( diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt index a4bcd909f2f..94b30a68e60 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt @@ -50,6 +50,7 @@ import app.aaps.plugins.automation.triggers.TriggerPumpLastConnection import app.aaps.plugins.automation.triggers.TriggerRecurringTime import app.aaps.plugins.automation.triggers.TriggerReservoirLevel import app.aaps.plugins.automation.triggers.TriggerSensorAge +import app.aaps.plugins.automation.triggers.TriggerStepsCount import app.aaps.plugins.automation.triggers.TriggerTempTarget import app.aaps.plugins.automation.triggers.TriggerTempTargetValue import app.aaps.plugins.automation.triggers.TriggerTime @@ -103,6 +104,7 @@ abstract class AutomationModule { @ContributesAndroidInjector abstract fun triggerTime(): TriggerTime @ContributesAndroidInjector abstract fun triggerTimeRangeInjector(): TriggerTimeRange @ContributesAndroidInjector abstract fun triggerWifiSsidInjector(): TriggerWifiSsid + @ContributesAndroidInjector abstract fun triggerStepsCountInjector(): TriggerStepsCount @ContributesAndroidInjector abstract fun actionInjector(): Action @ContributesAndroidInjector abstract fun actionStopProcessingInjector(): ActionStopProcessing diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/elements/InputCarePortalMenu.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/elements/InputCarePortalMenu.kt index ebd509a73cb..1ac0d84b7c5 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/elements/InputCarePortalMenu.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/elements/InputCarePortalMenu.kt @@ -36,10 +36,10 @@ class InputCarePortalMenu(private val rh: ResourceHelper) : Element { } @get:DrawableRes val drawableRes: Int get() = when (this) { - NOTE -> app.aaps.core.objects.R.drawable.ic_cp_note - EXERCISE -> app.aaps.core.objects.R.drawable.ic_cp_exercise - QUESTION -> app.aaps.core.objects.R.drawable.ic_cp_question - ANNOUNCEMENT -> app.aaps.core.objects.R.drawable.ic_cp_announcement + NOTE -> app.aaps.core.objects.R.drawable.ic_cp_note_24dp + EXERCISE -> app.aaps.core.objects.R.drawable.ic_cp_exercise_24dp + QUESTION -> app.aaps.core.objects.R.drawable.ic_cp_question_24dp + ANNOUNCEMENT -> app.aaps.core.objects.R.drawable.ic_cp_announcement_24dp } companion object { diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt index 7a3744e5580..5a0fd63fb53 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt @@ -116,6 +116,7 @@ abstract class Trigger(val injector: HasAndroidInjector) { TriggerTime::class.java.simpleName -> TriggerTime(injector).fromJSON(data.toString()) TriggerTimeRange::class.java.simpleName -> TriggerTimeRange(injector).fromJSON(data.toString()) TriggerWifiSsid::class.java.simpleName -> TriggerWifiSsid(injector).fromJSON(data.toString()) + TriggerStepsCount::class.java.simpleName -> TriggerStepsCount(injector).fromJSON(data.toString()) else -> TriggerConnector(injector) } diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerSensorAge.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerSensorAge.kt index 5127bab56bf..80806a48377 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerSensorAge.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerSensorAge.kt @@ -18,7 +18,7 @@ import java.util.Optional class TriggerSensorAge(injector: HasAndroidInjector) : Trigger(injector) { - var sensorAgeHours: InputDouble = InputDouble(0.0, 0.0, 336.0, 0.1, DecimalFormat("0.1")) + var sensorAgeHours: InputDouble = InputDouble(0.0, 0.0, 720.0, 0.1, DecimalFormat("0.1")) var comparator: Comparator = Comparator(rh) private constructor(injector: HasAndroidInjector, triggerSensorAge: TriggerSensorAge) : this(injector) { diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerStepsCount.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerStepsCount.kt new file mode 100644 index 00000000000..d51ca90783c --- /dev/null +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerStepsCount.kt @@ -0,0 +1,101 @@ +package app.aaps.plugins.automation.triggers + +import android.widget.LinearLayout +import androidx.annotation.VisibleForTesting +import app.aaps.core.interfaces.logging.LTag +import app.aaps.core.utils.JsonHelper +import app.aaps.plugins.automation.R +import app.aaps.plugins.automation.elements.Comparator +import app.aaps.plugins.automation.elements.InputDouble +import app.aaps.plugins.automation.elements.InputDropdownMenu +import app.aaps.plugins.automation.elements.LabelWithElement +import app.aaps.plugins.automation.elements.LayoutBuilder +import app.aaps.plugins.automation.elements.StaticLabel +import dagger.android.HasAndroidInjector +import org.json.JSONObject +import java.text.DecimalFormat +import java.util.Optional + +class TriggerStepsCount(injector: HasAndroidInjector) : Trigger(injector) { + var measurementDuration: InputDropdownMenu = InputDropdownMenu(rh, "5") + var stepsCount: InputDouble = InputDouble(100.0, 0.0, 20000.0, 10.0, DecimalFormat("1")) + var comparator: Comparator = Comparator(rh).apply { + value = Comparator.Compare.IS_EQUAL_OR_GREATER + } + + override fun shouldRun(): Boolean { + if (comparator.value == Comparator.Compare.IS_NOT_AVAILABLE) { + aapsLogger.info(LTag.AUTOMATION, "Steps count ready, no limit set ${friendlyDescription()}") + return true + } + + + // Steps count entries update every 1-1.5 minutes on my watch, + // so we must get some entries from the last 5 minutes. + val start = dateUtil.now() - 5 * 60 * 1000L + val measurements = persistenceLayer.getStepsCountFromTime(start) + val lastSC = measurements.lastOrNull { it.duration == measurementDuration.value.toInt() * 60 * 1000L } + if (lastSC == null) { + aapsLogger.info(LTag.AUTOMATION, "No steps count measurements available - ${friendlyDescription()}") + return false + } + + var lastStepsCount: Int? = when (measurementDuration.value) { + "5" -> lastSC.steps5min + "10" -> lastSC.steps10min + "15" -> lastSC.steps15min + "30" -> lastSC.steps30min + "60" -> lastSC.steps60min + "180" -> lastSC.steps180min + else -> null + } + + if (lastStepsCount == null) { + aapsLogger.info(LTag.AUTOMATION, "No steps count measurements available in selected period - ${friendlyDescription()}") + return false + } + + return comparator.value.check(lastStepsCount.toDouble(), stepsCount.value).also { + aapsLogger.info(LTag.AUTOMATION, "Steps count ${if (it) "" else "not "}ready for $lastStepsCount in ${measurementDuration.value} minutes for ${friendlyDescription()}") + } + } + + override fun dataJSON(): JSONObject = + JSONObject() + .put("stepsCount", stepsCount.value) + .put("measurementDuration", measurementDuration.value) + .put("comparator", comparator.value.toString()) + + override fun fromJSON(data: String): Trigger { + val d = JSONObject(data) + stepsCount.setValue(JsonHelper.safeGetDouble(d, "stepsCount")) + measurementDuration.setValue(JsonHelper.safeGetString(d, "measurementDuration", "5")) + comparator.setValue(Comparator.Compare.valueOf(JsonHelper.safeGetString(d, "comparator")!!)) + return this + } + + override fun friendlyName(): Int = R.string.triggerStepsCountLabel + + override fun friendlyDescription(): String = + rh.gs(R.string.triggerStepsCountDesc, measurementDuration.value, rh.gs(comparator.value.stringRes), stepsCount.value) + + override fun icon(): Optional = Optional.of(app.aaps.core.objects.R.drawable.ic_cp_exercise) + + override fun duplicate(): Trigger { + return TriggerStepsCount(injector).also { o -> + o.stepsCount.setValue(stepsCount.value) + o.measurementDuration.setValue(measurementDuration.value) + o.comparator.setValue(comparator.value) + } + } + + override fun generateDialog(root: LinearLayout) { + measurementDuration.setList(arrayListOf("5", "10", "15", "30", "60", "180")) + LayoutBuilder() + .add(StaticLabel(rh, R.string.triggerStepsCountLabel, this)) + .add(LabelWithElement(rh, rh.gs(R.string.triggerStepsCountDropdownLabel) + ": ", rh.gs(app.aaps.core.interfaces.R.string.unit_minutes), measurementDuration)) + .add(comparator) + .add(LabelWithElement(rh, rh.gs(R.string.triggerStepsCountLabel) + ": ", "", stepsCount)) + .build(root) + } +} diff --git a/plugins/automation/src/main/res/drawable/ic_action_orange_48dp.xml b/plugins/automation/src/main/res/drawable/ic_action_orange_48dp.xml index 07e8c306a8a..ba3a3bd8e1f 100644 --- a/plugins/automation/src/main/res/drawable/ic_action_orange_48dp.xml +++ b/plugins/automation/src/main/res/drawable/ic_action_orange_48dp.xml @@ -1,5 +1,10 @@ - - + + diff --git a/plugins/automation/src/main/res/layout/automation_dialog_event.xml b/plugins/automation/src/main/res/layout/automation_dialog_event.xml index a47c9f4ddf5..4c89cc4c47d 100644 --- a/plugins/automation/src/main/res/layout/automation_dialog_event.xml +++ b/plugins/automation/src/main/res/layout/automation_dialog_event.xml @@ -31,13 +31,14 @@ android:layout_gravity="center" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" + android:layout_weight="1" android:text="@string/automation_event" android:textAlignment="center" - android:layout_weight="1" android:textAppearance="?android:attr/textAppearanceLarge" /> @@ -73,6 +74,7 @@ diff --git a/plugins/automation/src/main/res/layout/automation_event_item.xml b/plugins/automation/src/main/res/layout/automation_event_item.xml index 3190d300836..19ab3afa784 100644 --- a/plugins/automation/src/main/res/layout/automation_event_item.xml +++ b/plugins/automation/src/main/res/layout/automation_event_item.xml @@ -15,6 +15,7 @@ %1$d محدد
+ diff --git a/plugins/automation/src/main/res/values-bg-rBG/strings.xml b/plugins/automation/src/main/res/values-bg-rBG/strings.xml index 94871299050..6d64b201ac6 100644 --- a/plugins/automation/src/main/res/values-bg-rBG/strings.xml +++ b/plugins/automation/src/main/res/values-bg-rBG/strings.xml @@ -120,4 +120,5 @@ Стартиране на Autotune и автоматична смяна на профила Възникна грешка по време на последното стартиране на Autotune Друго стартиране на Autotune е засечено, текущото е отказано + diff --git a/plugins/automation/src/main/res/values-ca-rES/strings.xml b/plugins/automation/src/main/res/values-ca-rES/strings.xml index 644f1f862e0..489bf937d60 100644 --- a/plugins/automation/src/main/res/values-ca-rES/strings.xml +++ b/plugins/automation/src/main/res/values-ca-rES/strings.xml @@ -105,4 +105,5 @@ Hora d’aplicar bolus!\nExecuteu l\'assistent de bolus i torneu a fer els càlculs. + diff --git a/plugins/automation/src/main/res/values-cs-rCZ/strings.xml b/plugins/automation/src/main/res/values-cs-rCZ/strings.xml index b1cc8286771..bf3c40ec24c 100644 --- a/plugins/automation/src/main/res/values-cs-rCZ/strings.xml +++ b/plugins/automation/src/main/res/values-cs-rCZ/strings.xml @@ -137,4 +137,8 @@ Autotune spuštěno a profil automaticky přepnut Chyba při posledním spuštění Autotune Byla zjištěna jiná běžící úloha Autotune, spuštění zrušeno + + Počet kroků + Počet kroků za %1$s minut %2$s %3$.0f + Délka měření diff --git a/plugins/automation/src/main/res/values-da-rDK/strings.xml b/plugins/automation/src/main/res/values-da-rDK/strings.xml index 0e78d09289a..b63128ca946 100644 --- a/plugins/automation/src/main/res/values-da-rDK/strings.xml +++ b/plugins/automation/src/main/res/values-da-rDK/strings.xml @@ -120,4 +120,5 @@ Autotune kørte og profilen blev automatisk skiftet Fejl under sidste Autotune kørsel Autotune kører allerede, annulleret + diff --git a/plugins/automation/src/main/res/values-de-rDE/strings.xml b/plugins/automation/src/main/res/values-de-rDE/strings.xml index 04f6826c36a..2f31b651cc0 100644 --- a/plugins/automation/src/main/res/values-de-rDE/strings.xml +++ b/plugins/automation/src/main/res/values-de-rDE/strings.xml @@ -120,4 +120,5 @@ Autotune ausgeführt und Profil wurde automatisch gewechselt Fehler beim letzten Autotune Lauf Ein weiterer Lauf von Autotune wurde erkannt, Lauf abgebrochen + diff --git a/plugins/automation/src/main/res/values-el-rGR/strings.xml b/plugins/automation/src/main/res/values-el-rGR/strings.xml index 45ba2db3f94..e27b9d3dc89 100644 --- a/plugins/automation/src/main/res/values-el-rGR/strings.xml +++ b/plugins/automation/src/main/res/values-el-rGR/strings.xml @@ -120,4 +120,5 @@ Το Autotune έτρεξε έγινε αυτόματη αλλαγή προφίλ Σφάλμα κατά την τελευταία εκτέλεση του Autotune Εντοπίστηκε μια άλλη εκτέλεση του Autotune, η εκτέλεση ακυρώθηκε + diff --git a/plugins/automation/src/main/res/values-es-rES/strings.xml b/plugins/automation/src/main/res/values-es-rES/strings.xml index 1d1c15f8a00..e3b2998ee93 100644 --- a/plugins/automation/src/main/res/values-es-rES/strings.xml +++ b/plugins/automation/src/main/res/values-es-rES/strings.xml @@ -137,4 +137,8 @@ Ejecutar Autotune y cambiar de perfil automáticamente Error durante la última ejecución de Autotune Se ha detectado otra ejecución de Autotune, ejecución cancelada + + Número de pasos + Número de pasos por %1$s minutos %2$s %3$.0f + Duración de la medición diff --git a/plugins/automation/src/main/res/values-fr-rFR/strings.xml b/plugins/automation/src/main/res/values-fr-rFR/strings.xml index 61a09c088d2..1c1dff8b007 100644 --- a/plugins/automation/src/main/res/values-fr-rFR/strings.xml +++ b/plugins/automation/src/main/res/values-fr-rFR/strings.xml @@ -137,4 +137,8 @@ Autotune exécuté et le profil automatiquement activé Erreur lors de la dernière exécution d\'Autotune Une autre exécution d\'Autotune est détectée, l\'exécution est annulée + + Compteur de pas + Nombre de pas par %1$s minutes %2$s %3$.0f + Durée de la mesure diff --git a/plugins/automation/src/main/res/values-hr-rHR/strings.xml b/plugins/automation/src/main/res/values-hr-rHR/strings.xml index 44543475e88..37ab7360ad9 100644 --- a/plugins/automation/src/main/res/values-hr-rHR/strings.xml +++ b/plugins/automation/src/main/res/values-hr-rHR/strings.xml @@ -15,4 +15,5 @@ Autotune je pokrenut i profil se automatski promijenio Pogreška tijekom zadnjeg pokretanja automatskog podešavanja Otkriveno je još jedno pokretanje Autotunea, pokretanje je otkazano + diff --git a/plugins/automation/src/main/res/values-hu-rHU/strings.xml b/plugins/automation/src/main/res/values-hu-rHU/strings.xml index 12b0155c73e..1a1f344b089 100644 --- a/plugins/automation/src/main/res/values-hu-rHU/strings.xml +++ b/plugins/automation/src/main/res/values-hu-rHU/strings.xml @@ -23,4 +23,5 @@ %1$d kiválasztva + diff --git a/plugins/automation/src/main/res/values-it-rIT/strings.xml b/plugins/automation/src/main/res/values-it-rIT/strings.xml index 9edc185f616..8df1f957645 100644 --- a/plugins/automation/src/main/res/values-it-rIT/strings.xml +++ b/plugins/automation/src/main/res/values-it-rIT/strings.xml @@ -137,4 +137,8 @@ Autotune eseguito e profilo cambiato automaticamente Errore durante l\'ultima esecuzione di Autotune È stata rilevata un\'altra esecuzione di Autotune, esecuzione annullata + + Conteggio Passi + Conteggio passi per %1$s minuti %2$s %3$.0f + Durata Della Misurazione diff --git a/plugins/automation/src/main/res/values-iw-rIL/strings.xml b/plugins/automation/src/main/res/values-iw-rIL/strings.xml index f9ccce82097..8a62601be64 100644 --- a/plugins/automation/src/main/res/values-iw-rIL/strings.xml +++ b/plugins/automation/src/main/res/values-iw-rIL/strings.xml @@ -121,4 +121,5 @@ כוונון אוטומטי הופעל והפרופיל הוחלף אוטומטית שגיאה במהלך הכיוונון האוטומטי האחרון נמצאה הפעלה נוספת של הכוונון האוטומטי ברקע, ההפעלה בוטלה + diff --git a/plugins/automation/src/main/res/values-ko-rKR/strings.xml b/plugins/automation/src/main/res/values-ko-rKR/strings.xml index 9b0adf2c734..3b8da2a28eb 100644 --- a/plugins/automation/src/main/res/values-ko-rKR/strings.xml +++ b/plugins/automation/src/main/res/values-ko-rKR/strings.xml @@ -120,4 +120,5 @@ Autotune 및 프로파일 자동 전환이 실행되었습니다 마지막 Autotune 실행시 오류가 발생했습니다 Autotune의 또 다른 실행이 감지되었습니다, 실행이 취소되었습니다 + diff --git a/plugins/automation/src/main/res/values-lt-rLT/strings.xml b/plugins/automation/src/main/res/values-lt-rLT/strings.xml index c212e08b5f3..a098b449a22 100644 --- a/plugins/automation/src/main/res/values-lt-rLT/strings.xml +++ b/plugins/automation/src/main/res/values-lt-rLT/strings.xml @@ -6,6 +6,8 @@ Įveskite užduoties pavadinimą. Nurodykite mažiausiai vieną sąlygą. Nurodykite mažiausiai vieną veiksmą. + Nustatymų eksportas: %1$s + Tekstas terapijoje: Aliarmas: %1$s Aliarmas: Žin: @@ -87,9 +89,20 @@ AAO %1$s %2$.0f Pulsas Pulsas %1$s %2$.0f + Sensoriaus laikas + Sensoriaus laikas %1$s %2$.1f val. + Kateterio laikas + Kateterio laikas %1$s %2$.1f val. Pod aktyvavimas Pod aktyvuotas Insulino laikas + Insulino laikas %1$s %2$.1f val. + Pompos baterijos laikas + Pompos baterijos laikas %1$s %2$.1f val. + Rezervuaro lygis + Rezervuaro lygis %1$s %2$.0f + Pompos baterijos lygis + Pompos baterijos lygis %1$s %2$.0f AIO [U]: Atstumas [m]: Pasikartojantis laikas @@ -118,9 +131,11 @@ Laikas bolusui!\nĮjunkite Skaičiuotuvą ir pakartokite skaičiavimus. Klaida nustatant ateities perspėjimus + Autotune profilis %1$s Paleisti Autotune Autotune veikė be profilio keitimo Autotune veikė ir profilis automatiškai pakeistas Paskutinio Autotune klaida Nustatytas kitas Autotune veikimas, jis atšauktas + diff --git a/plugins/automation/src/main/res/values-nb-rNO/strings.xml b/plugins/automation/src/main/res/values-nb-rNO/strings.xml index 2112c7b0811..d222e32ece4 100644 --- a/plugins/automation/src/main/res/values-nb-rNO/strings.xml +++ b/plugins/automation/src/main/res/values-nb-rNO/strings.xml @@ -137,4 +137,8 @@ Autotune utført og profil ble automatisk skiftet ut Feil oppdaget under siste Autotune kjøring Autotune kjører allerede. Kjøring avbrutt + + Antall skritt + Antall skritt per %1$s minutter %2$s %3$.0f + Varighet for måling diff --git a/plugins/automation/src/main/res/values-nl-rNL/strings.xml b/plugins/automation/src/main/res/values-nl-rNL/strings.xml index f1bb6d44f03..9d474693c67 100644 --- a/plugins/automation/src/main/res/values-nl-rNL/strings.xml +++ b/plugins/automation/src/main/res/values-nl-rNL/strings.xml @@ -137,4 +137,6 @@ Autotune uitgevoerd en profiel automatisch gewisseld Fout tijdens laatste Autotune uitvoeren Een ander Autotune proces loopt nog, de uitvoering is geannuleerd + + Aantal stappen per %1$s minuten %2$s %3$.0f diff --git a/plugins/automation/src/main/res/values-pl-rPL/strings.xml b/plugins/automation/src/main/res/values-pl-rPL/strings.xml index a7b4a77d353..437e835a74f 100644 --- a/plugins/automation/src/main/res/values-pl-rPL/strings.xml +++ b/plugins/automation/src/main/res/values-pl-rPL/strings.xml @@ -137,4 +137,5 @@ W wyniku uruchomienia Autotune profil został automatycznie przełączony Błąd podczas ostatniego uruchomienia Autotune Wykryto Autotune w toku, anulowano próbę kolejnego uruchomienia + diff --git a/plugins/automation/src/main/res/values-pt-rBR/strings.xml b/plugins/automation/src/main/res/values-pt-rBR/strings.xml index 972f13015fc..5d1e1229f61 100644 --- a/plugins/automation/src/main/res/values-pt-rBR/strings.xml +++ b/plugins/automation/src/main/res/values-pt-rBR/strings.xml @@ -120,4 +120,5 @@ Autotune executado e perfil alterado automaticamente Erro durante a última execução do Autotune Outra execução de Autotune foi detectada, execução cancelada + diff --git a/plugins/automation/src/main/res/values-pt-rPT/strings.xml b/plugins/automation/src/main/res/values-pt-rPT/strings.xml index 26cc745e824..b9ee2a9f318 100644 --- a/plugins/automation/src/main/res/values-pt-rPT/strings.xml +++ b/plugins/automation/src/main/res/values-pt-rPT/strings.xml @@ -115,4 +115,5 @@ Hora de fazer o bólus!\nExecute o assistente de bólus e faça o cálculo novamente. Erro ao configurar alarme futuro + diff --git a/plugins/automation/src/main/res/values-ro-rRO/strings.xml b/plugins/automation/src/main/res/values-ro-rRO/strings.xml index 7eb5e427610..d2812bd835e 100644 --- a/plugins/automation/src/main/res/values-ro-rRO/strings.xml +++ b/plugins/automation/src/main/res/values-ro-rRO/strings.xml @@ -120,4 +120,5 @@ Autotune a rulat și profilul a fost automat schimbat Eroare în timpul ultimei rulări Autotune O altă rulare Autotune este detectată, rularea este anulată + diff --git a/plugins/automation/src/main/res/values-ru-rRU/strings.xml b/plugins/automation/src/main/res/values-ru-rRU/strings.xml index 2fff07c2d38..77a9f01f350 100644 --- a/plugins/automation/src/main/res/values-ru-rRU/strings.xml +++ b/plugins/automation/src/main/res/values-ru-rRU/strings.xml @@ -137,4 +137,5 @@ Autotune выполнен и профиль переключён автоматически Ошибка во время последнего выполнения Autotune Обнаружен другой запуск Autotune, выполнение отменено + diff --git a/plugins/automation/src/main/res/values-sk-rSK/strings.xml b/plugins/automation/src/main/res/values-sk-rSK/strings.xml index eaa934cb038..53ef796a167 100644 --- a/plugins/automation/src/main/res/values-sk-rSK/strings.xml +++ b/plugins/automation/src/main/res/values-sk-rSK/strings.xml @@ -137,4 +137,8 @@ Autotune spustený a profil automaticky prepnutý Chyba pri poslednom spustení Autotune Bola zistená iná spustená úloha Autotune, spustenie zrušené + + Počet krokov + Počet krokov za %1$s minút %2$s %3$.0f + Trvanie merania diff --git a/plugins/automation/src/main/res/values-sr-rCS/strings.xml b/plugins/automation/src/main/res/values-sr-rCS/strings.xml index 77fc473ba74..70e5fb24b0b 100644 --- a/plugins/automation/src/main/res/values-sr-rCS/strings.xml +++ b/plugins/automation/src/main/res/values-sr-rCS/strings.xml @@ -5,4 +5,5 @@ %1$d izabrano + diff --git a/plugins/automation/src/main/res/values-sv-rSE/strings.xml b/plugins/automation/src/main/res/values-sv-rSE/strings.xml index 8dba0d477b9..179a81b2d46 100644 --- a/plugins/automation/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/automation/src/main/res/values-sv-rSE/strings.xml @@ -120,4 +120,5 @@ Autotune körde och profilen byttes automatiskt Fel under senaste körning av Autotune En annan Autotune-körning upptäcktes, körning avbruten + diff --git a/plugins/automation/src/main/res/values-tr-rTR/strings.xml b/plugins/automation/src/main/res/values-tr-rTR/strings.xml index 49911aa2ac7..4f24581a7e9 100644 --- a/plugins/automation/src/main/res/values-tr-rTR/strings.xml +++ b/plugins/automation/src/main/res/values-tr-rTR/strings.xml @@ -137,4 +137,5 @@ OtoAyar çalıştı ve profil otomatik olarak değiştirildi Son OtoAyar çalışması sırasında hata oluştu Başka bir OtoAyar çalıştırması tespit edildi, çalıştırma iptal edildi + diff --git a/plugins/automation/src/main/res/values-uk-rUA/strings.xml b/plugins/automation/src/main/res/values-uk-rUA/strings.xml index 8925bfc3c2f..33ed7c19882 100644 --- a/plugins/automation/src/main/res/values-uk-rUA/strings.xml +++ b/plugins/automation/src/main/res/values-uk-rUA/strings.xml @@ -11,4 +11,5 @@ Autotune запущений і профіль автоматично перемикається Помилка при останньому запуску Autotune Виявлено ще один запуск Autotune, запуск скасовано + diff --git a/plugins/automation/src/main/res/values-zh-rCN/strings.xml b/plugins/automation/src/main/res/values-zh-rCN/strings.xml index 38daa1af40d..f41e6bb5f4f 100644 --- a/plugins/automation/src/main/res/values-zh-rCN/strings.xml +++ b/plugins/automation/src/main/res/values-zh-rCN/strings.xml @@ -114,4 +114,5 @@ 运行 Autotune 并自动切换配置文件 上次 Autotune 运行期间出错 检测到另一次自动调试运行,本次运行已取消 + diff --git a/plugins/automation/src/main/res/values-zh-rTW/strings.xml b/plugins/automation/src/main/res/values-zh-rTW/strings.xml index 1cc8e2a084a..b057fe71c7b 100644 --- a/plugins/automation/src/main/res/values-zh-rTW/strings.xml +++ b/plugins/automation/src/main/res/values-zh-rTW/strings.xml @@ -23,7 +23,7 @@ 最後連線幫浦 [分鐘前] 最後連線幫浦 %1$s %2$s 分鐘前 已設置 - 檔案百分比 + 設定檔百分比 啟動檔案 %1$d%% 百分比 [%]: 發送簡訊:%1$s @@ -42,7 +42,7 @@ 臨時目標不存在 臨時目標 %1$s %2$.0f %3$s 臨時目標 %1$s %2$.1f %3$s - 檔案百分比 %1$s %2$d + 設定檔百分比 %1$s %2$d IOB %1$s %2$.1f 互斥或 @@ -137,4 +137,8 @@ 自動調整運行並自動切換檔案 上次自動調整運行時出錯 偵測到另一個自動調整運行,運行已取消 + + 步數統計 + 每 %1$s 分鐘的步數統計 %2$s %3$.0f + 測量持續時間 diff --git a/plugins/automation/src/main/res/values/strings.xml b/plugins/automation/src/main/res/values/strings.xml index df3f1681020..33786f8fe4f 100644 --- a/plugins/automation/src/main/res/values/strings.xml +++ b/plugins/automation/src/main/res/values/strings.xml @@ -140,4 +140,10 @@ Error during last Autotune run Another run of Autotune is detected, run cancelled + + + Steps Count + Steps count per %1$s minutes %2$s %3$.0f + Measurement Duration + \ No newline at end of file diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionCarePortalEventTest.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionCarePortalEventTest.kt index 52cd5f2618f..8598427b4f3 100644 --- a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionCarePortalEventTest.kt +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionCarePortalEventTest.kt @@ -45,7 +45,7 @@ class ActionCarePortalEventTest : ActionsTestBase() { } @Test fun iconTest() { - assertThat(sut.icon()).isEqualTo(app.aaps.core.objects.R.drawable.ic_cp_note) + assertThat(sut.icon()).isEqualTo(app.aaps.core.objects.R.drawable.ic_cp_note_24dp) } @Test fun doActionTest() { diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercentTest.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercentTest.kt index 04ad27ac5be..ca5b7eda9de 100644 --- a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercentTest.kt +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchPercentTest.kt @@ -37,7 +37,7 @@ class ActionProfileSwitchPercentTest : ActionsTestBase() { } @Test fun iconTest() { - assertThat(sut.icon()).isEqualTo(app.aaps.core.ui.R.drawable.ic_actions_profileswitch) + assertThat(sut.icon()).isEqualTo(app.aaps.core.ui.R.drawable.ic_actions_profileswitch_24dp) } @Test fun doActionTest() { diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchTest.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchTest.kt index bb53f762347..8c5342e8bcc 100644 --- a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchTest.kt +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionProfileSwitchTest.kt @@ -107,6 +107,6 @@ class ActionProfileSwitchTest : ActionsTestBase() { } @Test fun iconTest() { - assertThat(sut.icon()).isEqualTo(app.aaps.core.ui.R.drawable.ic_actions_profileswitch) + assertThat(sut.icon()).isEqualTo(app.aaps.core.ui.R.drawable.ic_actions_profileswitch_24dp) } } diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTargetTest.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTargetTest.kt index 440ce1ab9fd..d93f560a4ed 100644 --- a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTargetTest.kt +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionStartTempTargetTest.kt @@ -39,7 +39,7 @@ class ActionStartTempTargetTest : ActionsTestBase() { } @Test fun iconTest() { - assertThat(sut.icon()).isEqualTo(app.aaps.core.objects.R.drawable.ic_temptarget_high) + assertThat(sut.icon()).isEqualTo(app.aaps.core.objects.R.drawable.ic_temptarget_high_24dp) } @Test fun doActionTest() { diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionsTestBase.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionsTestBase.kt index da4ad7e602b..31e95da2564 100644 --- a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionsTestBase.kt +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/actions/ActionsTestBase.kt @@ -51,7 +51,7 @@ ActionsTestBase : TestBaseWithProfile() { override fun goToZeroTemp(durationInMinutes: Int, profile: Profile, reason: OE.Reason, action: app.aaps.core.data.ue.Action, source: Sources, listValues: List) {} override fun suspendLoop(durationInMinutes: Int, action: app.aaps.core.data.ue.Action, source: Sources, note: String?, listValues: List) {} override fun disableCarbSuggestions(durationMinutes: Int) {} - override fun buildAndStoreDeviceStatus(reason: String) {} + override fun scheduleBuildAndStoreDeviceStatus(reason: String) {} override fun entries(): Array = emptyArray() override fun entryValues(): Array = emptyArray() diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerStepsCountTest.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerStepsCountTest.kt new file mode 100644 index 00000000000..6d4600d1f5a --- /dev/null +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerStepsCountTest.kt @@ -0,0 +1,117 @@ +package app.aaps.plugins.automation.triggers + +import app.aaps.core.data.model.SC +import app.aaps.plugins.automation.R +import app.aaps.plugins.automation.elements.Comparator +import com.google.common.truth.Truth.assertThat +import org.json.JSONObject +import org.junit.jupiter.api.Test +import org.mockito.Mockito.verify +import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.Mockito.`when` +import org.skyscreamer.jsonassert.JSONAssert + +class TriggerStepsCountTest : TriggerTestBase() { + + @Test + fun friendlyName() { + assertThat(TriggerStepsCount(injector).friendlyName()).isEqualTo(R.string.triggerStepsCountLabel) + } + + @Test + fun friendlyDescription() { + val t = TriggerStepsCount(injector) + `when`(rh.gs(Comparator.Compare.IS_EQUAL_OR_GREATER.stringRes)).thenReturn(">") + `when`(rh.gs(R.string.triggerStepsCountDesc, "5", ">", 100.0)).thenReturn("test") + + assertThat(t.friendlyDescription()).isEqualTo("test") + } + + @Test + fun duplicate() { + val t = TriggerStepsCount(injector).apply { + stepsCount.value = 100.0 + measurementDuration.value = "5" + comparator.value = Comparator.Compare.IS_GREATER + } + val dup = t.duplicate() as TriggerStepsCount + assertThat(dup).isNotSameInstanceAs(t) + assertThat(dup.stepsCount.value).isWithin(0.01).of(100.0) + assertThat(dup.measurementDuration.value).isEqualTo("5") + assertThat(dup.comparator.value).isEqualTo(Comparator.Compare.IS_GREATER) + } + + @Test + fun shouldRunNotAvailable() { + val t = TriggerStepsCount(injector).apply { comparator.value = Comparator.Compare.IS_NOT_AVAILABLE } + assertThat(t.shouldRun()).isTrue() + verifyNoMoreInteractions(persistenceLayer) + } + + @Test + fun shouldRunNoStepsAvailable() { + val t = TriggerStepsCount(injector).apply { + stepsCount.value = 100.0 + measurementDuration.value = "5" + comparator.value = Comparator.Compare.IS_GREATER + } + `when`(persistenceLayer.getStepsCountFromTime(now - 300000L)).thenReturn(emptyList()) + assertThat(t.shouldRun()).isFalse() + verify(persistenceLayer).getStepsCountFromTime(now - 300000L) + verifyNoMoreInteractions(persistenceLayer) + } + + @Test + fun shouldRunBelowThreshold() { + val t = TriggerStepsCount(injector).apply { + stepsCount.value = 100.0 + measurementDuration.value = "5" + comparator.value = Comparator.Compare.IS_GREATER + } + val scs = listOf(SC(duration = 300_000, timestamp = now, steps5min = 80, steps10min = 110, steps15min = 0, steps30min = 0, steps60min = 0, steps180min = 0, device = "test")) + + `when`(persistenceLayer.getStepsCountFromTime(now - 300000L)).thenReturn(scs) + assertThat(t.shouldRun()).isFalse() + verify(persistenceLayer).getStepsCountFromTime(now - 300000L) + verifyNoMoreInteractions(persistenceLayer) + } + + @Test + fun shouldRunTrigger() { + val t = TriggerStepsCount(injector).apply { + stepsCount.value = 100.0 + measurementDuration.value = "5" + comparator.value = Comparator.Compare.IS_GREATER + } + val scs = listOf(SC(duration = 300_000, timestamp = now, steps5min = 112, steps10min = 110, steps15min = 0, steps30min = 0, steps60min = 0, steps180min = 0, device = "test")) + + `when`(persistenceLayer.getStepsCountFromTime(now - 300000L)).thenReturn(scs) + assertThat(t.shouldRun()).isTrue() + verify(persistenceLayer).getStepsCountFromTime(now - 300000L) + verifyNoMoreInteractions(persistenceLayer) + } + + @Test + fun toJSON() { + val t = TriggerStepsCount(injector).apply { + stepsCount.value = 110.0 + measurementDuration.value = "15" + comparator.value = Comparator.Compare.IS_GREATER + } + assertThat(t.comparator.value).isEqualTo(Comparator.Compare.IS_GREATER) + + JSONAssert.assertEquals("""{"data":{"comparator":"IS_GREATER","stepsCount":110,"measurementDuration":"15"},"type":"TriggerStepsCount"}""", t.toJSON(), true) + } + + @Test + fun fromJSON() { + val t = TriggerDummy(injector).instantiate( + JSONObject( + """{"data":{"comparator":"IS_GREATER","stepsCount":110,"measurementDuration":"10"},"type":"TriggerStepsCount"}""" + ) + ) as TriggerStepsCount + assertThat(t.comparator.value).isEqualTo(Comparator.Compare.IS_GREATER) + assertThat(t.stepsCount.value).isWithin(0.01).of(110.0) + assertThat(t.measurementDuration.value).isEqualTo("10") + } +} diff --git a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/ConfigBuilderFragment.kt b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/ConfigBuilderFragment.kt index 6e831767b50..542aca7701b 100644 --- a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/ConfigBuilderFragment.kt +++ b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/ConfigBuilderFragment.kt @@ -103,7 +103,7 @@ class ConfigBuilderFragment : DaggerFragment() { activity = requireActivity(), parent = binding.categories ) - if (!config.NSCLIENT) { + if (!config.AAPSCLIENT) { configBuilder.createViewsForPlugins( title = R.string.configbuilder_bgsource, description = R.string.configbuilder_bgsource_description, @@ -202,7 +202,7 @@ class ConfigBuilderFragment : DaggerFragment() { if (isLocked && !queryingProtection) { activity?.let { activity -> queryingProtection = true - val doUpdate = { activity.runOnUiThread { queryingProtection = false; updateProtectedUi() } } + val doUpdate = { activity.runOnUiThread { queryingProtection = false; if (_binding != null) updateProtectedUi() } } protectionCheck.queryProtection(activity, PREFERENCES, doUpdate, doUpdate, doUpdate) } } diff --git a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/RunningConfigurationImpl.kt b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/RunningConfigurationImpl.kt index 696029194c9..8eb84e17d0b 100644 --- a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/RunningConfigurationImpl.kt +++ b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/configBuilder/RunningConfigurationImpl.kt @@ -80,7 +80,7 @@ class RunningConfigurationImpl @Inject constructor( // called in NSClient mode only override fun apply(configuration: NSDeviceStatus.Configuration) { - assert(config.NSCLIENT) + assert(config.AAPSCLIENT) configuration.version?.let { rxBus.send(EventNSClientNewLog("◄ VERSION", "Received AAPS version $it")) diff --git a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenanceFragment.kt b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenanceFragment.kt index 8753cce7849..ddba638c2fe 100644 --- a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenanceFragment.kt +++ b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenanceFragment.kt @@ -172,8 +172,7 @@ class MaintenanceFragment : DaggerFragment() { } } binding.directory.setOnClickListener { - uel.log(Action.SELECT_DIRECTORY, Sources.Maintenance) - (requireActivity() as DaggerAppCompatActivityWithResult).accessTree?.launch(null) + maintenancePlugin.selectAapsDirectory(requireActivity() as DaggerAppCompatActivityWithResult) } binding.navLogsettings.setOnClickListener { startActivity(Intent(activity, LogSettingActivity::class.java)) } binding.exportCsv.setOnClickListener { diff --git a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenancePlugin.kt b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenancePlugin.kt index 9ad1c1002b0..aefeed19a88 100644 --- a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenancePlugin.kt +++ b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/MaintenancePlugin.kt @@ -8,9 +8,12 @@ import androidx.preference.PreferenceCategory import androidx.preference.PreferenceManager import androidx.preference.PreferenceScreen import app.aaps.core.data.plugin.PluginType +import app.aaps.core.data.ue.Action +import app.aaps.core.data.ue.Sources import app.aaps.core.interfaces.configuration.Config import app.aaps.core.interfaces.logging.AAPSLogger import app.aaps.core.interfaces.logging.LoggerUtils +import app.aaps.core.interfaces.logging.UserEntryLogger import app.aaps.core.interfaces.maintenance.FileListProvider import app.aaps.core.interfaces.nsclient.NSSettingsStatus import app.aaps.core.interfaces.plugin.PluginBase @@ -20,12 +23,14 @@ import app.aaps.core.keys.BooleanKey import app.aaps.core.keys.IntKey import app.aaps.core.keys.Preferences import app.aaps.core.keys.StringKey +import app.aaps.core.ui.toast.ToastUtils import app.aaps.core.validators.DefaultEditTextValidator import app.aaps.core.validators.EditTextValidator import app.aaps.core.validators.preferences.AdaptiveIntPreference import app.aaps.core.validators.preferences.AdaptiveStringPreference import app.aaps.core.validators.preferences.AdaptiveSwitchPreference import app.aaps.plugins.configuration.R +import app.aaps.plugins.configuration.activities.DaggerAppCompatActivityWithResult import java.io.BufferedInputStream import java.io.BufferedOutputStream import java.io.File @@ -47,7 +52,8 @@ class MaintenancePlugin @Inject constructor( aapsLogger: AAPSLogger, private val config: Config, private val fileListProvider: FileListProvider, - private val loggerUtils: LoggerUtils + private val loggerUtils: LoggerUtils, + private val uel: UserEntryLogger ) : PluginBase( PluginDescription() .mainType(PluginType.GENERAL) @@ -188,7 +194,7 @@ class MaintenancePlugin @Inject constructor( builder.append("you have to do it manually)" + System.lineSeparator()) builder.append("-------------------------------------------------------" + System.lineSeparator()) builder.append(rh.gs(config.appName) + " " + config.VERSION + System.lineSeparator()) - if (config.NSCLIENT) builder.append("NSCLIENT" + System.lineSeparator()) + if (config.AAPSCLIENT) builder.append("NSCLIENT" + System.lineSeparator()) builder.append("Build: " + config.BUILD_VERSION + System.lineSeparator()) builder.append("Remote: " + config.REMOTE + System.lineSeparator()) builder.append("Flavor: " + config.FLAVOR + config.BUILD_TYPE + System.lineSeparator()) @@ -229,6 +235,15 @@ class MaintenancePlugin @Inject constructor( return emailIntent } + fun selectAapsDirectory(activity: DaggerAppCompatActivityWithResult) { + try { + uel.log(Action.SELECT_DIRECTORY, Sources.Maintenance) + activity.accessTree?.launch(null) + } catch (_: Exception) { + ToastUtils.errorToast(activity, "Unable to launch activity. This is an Android issue") + } + } + override fun addPreferenceScreen(preferenceManager: PreferenceManager, parent: PreferenceScreen, context: Context, requiredKey: String?) { if (requiredKey != null && !(requiredKey == "data_choice_setting" || requiredKey == "unattended_export_setting")) return val category = PreferenceCategory(context) diff --git a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/activities/PrefImportListActivity.kt b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/activities/PrefImportListActivity.kt index 2db0090d7e8..4c864c33f32 100644 --- a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/activities/PrefImportListActivity.kt +++ b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/maintenance/activities/PrefImportListActivity.kt @@ -49,7 +49,7 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() { with(maintenanceImportListItemBinding) { root.isClickable = true maintenanceImportListItemBinding.root.setOnClickListener { - val prefFile = filelistName.tag as PrefsFile + val prefFile = prefFileList[filelistName.tag as Int] val i = Intent() i.putExtra(PrefsFileContract.OUTPUT_PARAM, prefFile) @@ -73,7 +73,7 @@ class PrefImportListActivity : TranslatedDaggerAppCompatActivity() { val prefFile = prefFileList[position] with(holder.maintenanceImportListItemBinding) { filelistName.text = prefFile.name - filelistName.tag = prefFile + filelistName.tag = position metalineName.visibility = View.VISIBLE metaDateTimeIcon.visibility = View.VISIBLE diff --git a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/setupwizard/SWDefinition.kt b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/setupwizard/SWDefinition.kt index 9d78daa7e8e..21d9330c500 100644 --- a/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/setupwizard/SWDefinition.kt +++ b/plugins/configuration/src/main/kotlin/app/aaps/plugins/configuration/setupwizard/SWDefinition.kt @@ -41,6 +41,7 @@ import app.aaps.core.objects.profile.ProfileSealed import app.aaps.core.utils.isRunningTest import app.aaps.plugins.configuration.R import app.aaps.plugins.configuration.activities.DaggerAppCompatActivityWithResult +import app.aaps.plugins.configuration.maintenance.MaintenancePlugin import app.aaps.plugins.configuration.setupwizard.elements.SWBreak import app.aaps.plugins.configuration.setupwizard.elements.SWButton import app.aaps.plugins.configuration.setupwizard.elements.SWEditEncryptedPassword @@ -75,7 +76,8 @@ class SWDefinition @Inject constructor( private val cryptoUtil: CryptoUtil, private val config: Config, private val hardLimits: HardLimits, - private val uiInteraction: UiInteraction + private val uiInteraction: UiInteraction, + private val maintenancePlugin: MaintenancePlugin ) { lateinit var activity: AppCompatActivity @@ -86,7 +88,7 @@ class SWDefinition @Inject constructor( when { config.APS -> swDefinitionFull() config.PUMPCONTROL -> swDefinitionPumpControl() - config.NSCLIENT -> swDefinitionNSClient() + config.AAPSCLIENT -> swDefinitionNSClient() } } return screens @@ -172,7 +174,7 @@ class SWDefinition @Inject constructor( .add(SWButton(injector) .text(R.string.aaps_directory) .visibility { preferences.getIfExists(StringKey.AapsDirectoryUri) == null } - .action { (activity as DaggerAppCompatActivityWithResult).accessTree?.launch(null) }) + .action { maintenancePlugin.selectAapsDirectory(activity as DaggerAppCompatActivityWithResult) }) .add(SWBreak(injector)) .add(SWEventListener(injector, EventAAPSDirectorySelected::class.java).label(app.aaps.core.ui.R.string.settings).initialStatus(preferences.get(StringKey.AapsDirectoryUri))) .add(SWBreak(injector)) diff --git a/plugins/configuration/src/main/res/layout/configbuilder_single_category.xml b/plugins/configuration/src/main/res/layout/configbuilder_single_category.xml index dc97fc35683..f4efdd9db1a 100644 --- a/plugins/configuration/src/main/res/layout/configbuilder_single_category.xml +++ b/plugins/configuration/src/main/res/layout/configbuilder_single_category.xml @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="4dp" - android:importantForAccessibility="no" + android:contentDescription="@string/expand_category" app:srcCompat="@drawable/ic_expand_more_24" app:tint="?android:attr/colorAccent" /> @@ -47,7 +47,7 @@ android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="4dp" - android:importantForAccessibility="no" + android:contentDescription="@string/collapse_category" app:srcCompat="@drawable/ic_expand_less_24" app:tint="?android:attr/colorAccent" /> diff --git a/plugins/configuration/src/main/res/layout/configbuilder_single_plugin.xml b/plugins/configuration/src/main/res/layout/configbuilder_single_plugin.xml index 397c755aba8..4de86b66b40 100644 --- a/plugins/configuration/src/main/res/layout/configbuilder_single_plugin.xml +++ b/plugins/configuration/src/main/res/layout/configbuilder_single_plugin.xml @@ -9,6 +9,7 @@ diff --git a/plugins/configuration/src/main/res/layout/logsettings_item.xml b/plugins/configuration/src/main/res/layout/logsettings_item.xml index 5a64ac9b081..409a011431d 100644 --- a/plugins/configuration/src/main/res/layout/logsettings_item.xml +++ b/plugins/configuration/src/main/res/layout/logsettings_item.xml @@ -15,6 +15,7 @@ diff --git a/plugins/configuration/src/main/res/values-cs-rCZ/strings.xml b/plugins/configuration/src/main/res/values-cs-rCZ/strings.xml index bc7871bf889..e4e71aa522a 100644 --- a/plugins/configuration/src/main/res/values-cs-rCZ/strings.xml +++ b/plugins/configuration/src/main/res/values-cs-rCZ/strings.xml @@ -81,6 +81,8 @@ POZOR: Pokud aktivuje a připojíte skutečnou pumpu, AAPS nakopíruje (a bude udržovat) nastavení bazálu z aktivního profilu do pumpy. Nastavení bazálu v pumpě bude přepsáno. Pokud si nejste jistí nebo nechcete přepsat bazály v pumpě, stiskněte Zrušit a opakujte přepnutí na jinou pumpu později. otevřít nastavení Verze AAPSClienta se neshoduje s verzí AAPS. Aktualizujte prosím. + Rozbalit kategorii + Sbalit kategorii Nastavení Zobrazí se výzva k zadání hlavního hesla, které bude použito k šifrování exportovaných předvoleb. diff --git a/plugins/configuration/src/main/res/values-es-rES/strings.xml b/plugins/configuration/src/main/res/values-es-rES/strings.xml index 3db77517e80..7c2d8d8deb4 100644 --- a/plugins/configuration/src/main/res/values-es-rES/strings.xml +++ b/plugins/configuration/src/main/res/values-es-rES/strings.xml @@ -81,6 +81,8 @@ Atención: Si activas y conectas una bomba con AAPS, AAPS copiará la configuración basal del perfil a la bomba, sobreescribiendo el perfil basal previo que tuviera almacenado la bomba. Asegúrate de que la configuración del perfil basal en AAPS es correcto. Si no estás seguro o no quieres sobreescribir la configuración del perfil basal de tu bomba, presiona cancelar y vincula la bomba más adelante. abrir ajustes La versión de AAPSClient no coincide con la versión de AAPS. Por favor, actualízala. + Expandir categoría + Contraer categoría Preferencias Se le solicitará la contraseña maestra, que se utilizará para cifrar los ajustes exportados diff --git a/plugins/configuration/src/main/res/values-fr-rFR/strings.xml b/plugins/configuration/src/main/res/values-fr-rFR/strings.xml index e6ba5223df7..8be3c823ac5 100644 --- a/plugins/configuration/src/main/res/values-fr-rFR/strings.xml +++ b/plugins/configuration/src/main/res/values-fr-rFR/strings.xml @@ -82,6 +82,8 @@ L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME S ATTENTION : Si vous activez et connectez à une vraie pompe, AAPS copiera les paramètres basals du profil vers la pompe, écrasant le taux basal existant stocké sur la pompe. Assurez-vous d\'avoir correctement saisi et réglé les paramètres basal dans AAPS. Si vous ne savez pas ou si ne voulez pas écraser les paramètres basal sur votre pompe, appuyez sur Annuler et reporter la selection de la pompe à une date ultérieure. ouvrir les paramètres La version AAPSClient ne correspond pas à AAPS. Faites une mise à jour. + Développer la catégorie + Replier la catégorie Préférences Le mot de passe principal vous sera demandé pour crypter les préférences exportées. diff --git a/plugins/configuration/src/main/res/values-it-rIT/strings.xml b/plugins/configuration/src/main/res/values-it-rIT/strings.xml index 0f381257dbf..db2f5f5f0a5 100644 --- a/plugins/configuration/src/main/res/values-it-rIT/strings.xml +++ b/plugins/configuration/src/main/res/values-it-rIT/strings.xml @@ -80,6 +80,8 @@ Attenzione: se attivi e connetti un micro, AAPS copierà le impostazioni della basale dal profilo al micro, sovrascrivendo la velocità basale esistente memorizzata sul micro. Assicurati di avere la giusta impostazione della basale in AAPS. Se non sei sicuro o non vuoi sovrascrivere le impostazioni della basale sul micro, premi annulla e ripeti il processo in un altro momento. apri impostazioni La versione di AAPSClient non corrisponde alla versione di AAPS. Aggiorna. + Espandi categoria + Comprimi categoria Preferenze Ti verrà richiesta la password master, che verrà usata per crittografare le preferenze esportate. diff --git a/plugins/configuration/src/main/res/values-lt-rLT/strings.xml b/plugins/configuration/src/main/res/values-lt-rLT/strings.xml index 34b18f44a1f..dca26f4c143 100644 --- a/plugins/configuration/src/main/res/values-lt-rLT/strings.xml +++ b/plugins/configuration/src/main/res/values-lt-rLT/strings.xml @@ -19,6 +19,7 @@ Leidimas Programai reikalingas leidimas rodyti virš kitų programų Programai reikia vietos nustatymo leidimo, kad būtų galima naudoti Bluetooth ir WiFi + Aplikacijai reikalingas foninis vietos nustatymo leidimas automatizacijai Programai reikia leidimo prieigai prie saugyklos, kad būtų išsaugomi žurnalo įrašai ir nustatymų eksportai Prašyti leidimo Įtraukite %1$s į baterijos optimizavimo išimčių sąrašą tinkamam veikimui užtikrinti @@ -36,6 +37,7 @@ Praleisti sąrankos vedlį Paspauskite mygtuką žemiau, norėdami leisti AndroidAPS patarti/atlikti bazės pakeitimus Jautrumo įskiepis yra naudojamas jautrumo aptikimui ir AAO skaičiavimams. Daugiau informacijos: + https://wiki.aaps.app/en/latest/DailyLifeWithAaps/SensitivityDetectionAndCob.html Pasirinkite vieną iš esamų algoritmų. Jie yra išdėstyti nuo seniausio iki naujausio. Naujesni algoritmai yra galingesni ir agresyvesni. Taigi jei esate naujas vartotojas, geriau pradėti nuo AMA, o ne naujesnio. Nepamirškite perskaityti dokumentaciją ir sukonfigūruoti jį prieš naudojant. Nustatykite RileyLink. Pasirinkę RileyLink, galėsite tęsti sąranką, kai tik RileyLink statusas bus „Prisijungta“. Tai gali užtrukti apie minutę.\n Pastaba: Sąranką galėsite tęsti, kai prijungsite pompą.\n @@ -44,6 +46,8 @@ Statuso nuskaitymas Duomenų pasirinkimas Duomenų perdavimas kūrėjams + Automatinis nustatymų eksportavimas + Įjungus šią parinktį, jūsų slaptažodis bus saugiai saugomas jūsų telefone Identifikacija (el. paštas, FB, Discord slapyvardis ar kt.) Užklausa DKS režimas @@ -77,6 +81,8 @@ Dėmesio: jei aktyvuosite ir prijungsite realią pompą, AAPS nukopijuos bazės nustatymus iš profilio į pompą, todėl nustatymai pompoje gali pasikeisti. Įsitikinkite, kad bazės nustatymai AAPS yra teisingi. Jei nesate tikri arba nenorite keisti bazės nustatymų jūsų pompoje, paspauskite Atšaukti ir atlikite prijungimą prie pompos vėliau. atidaryti nustatymus AAPSClient ir AAPS versijos nesutampa. Atnaujinkite. + Išplėsti kategoriją + Sutraukti kategoriją Nustatymai Jūsų paprašys nustatyti slaptažodį, kuris bus naudojamas užšifruojant eksportuojamus nustatymus. @@ -88,6 +94,8 @@ Importas Importuoti vistiek (PAVOJINGA!) Importuoti nustatymus + AAPS katalogas + Pasirinkite AAPS katalogą eksportavimams, konfigūracijoms ir kt. saugoti. Prašom patikrinti nustatymus prieš importuojant: Nustatymai negali būti importuoti! Nustatymai neturėtų būti importuoti! @@ -98,17 +106,20 @@ Šis failas buvo eksportuotas ir užšifruotas su kitokiu pagrindiniu slaptažodžiu. Įveskite senąjį pagrindinį slaptažodį dešifruoti failui. Sėkmingas importavimas reiškia, kad dabartinis pagrindinis slaptažodis BUS PAKEISTAS senuoju pagrindiniu slaptažodžiu! Nustatymai eksportuoti + Nustatymų eksportavimas nepavyko! Failas nerastas Prašome grįžti į pagrindinį ekraną ir bandyti dar kartą. Uždarant aplikaciją, taikyti nustatymus. Naudotojo įrašai eksportuoti Apsauga + Pagrindinis slaptažodis nėra nustatytas!\n\nPrašome nustatyti savo pagrindinį slaptažodį Nustatymuose (%1$s) Servisas Serv Pateikia keletą serviso funkcijų (pvz., žurnalo įrašų siuntimas ar ištrynimas). Duomenų bazės valymas Ar tikrai norite iš naujo nustatyti duomenų bazę? + Ar tikrai norite iš naujo nustatyti išsaugotus APS rezultatus? Serviso nustatymai Gavėjo el. paštas Siunčiamų įrašų skaičius @@ -155,4 +166,6 @@ Failo šifravimas Naujas šifruotas formatas Nežinomas eksporto formatas + Iš naujo nustatyti APS rezultatus + Klaida pasiekiant failų sistemą. Tinkamai pasirinkite AAPS katalogą. diff --git a/plugins/configuration/src/main/res/values-nb-rNO/strings.xml b/plugins/configuration/src/main/res/values-nb-rNO/strings.xml index 9892a240ee4..740383d2bf0 100644 --- a/plugins/configuration/src/main/res/values-nb-rNO/strings.xml +++ b/plugins/configuration/src/main/res/values-nb-rNO/strings.xml @@ -81,6 +81,8 @@ Varsel: Hvis du aktiverer og kobler til en pumpe, så vil AndroidAPS kopiere basalinnstillinger fra din profil over til pumpen og overskrive verdiene som er lagret i pumpen. Sjekk at du har riktige basalverdier i AndroidAPS. Hvis du ikke er sikker eller ikke ønsker å overskrive basalverdiene i pumpen, trykk avbryt og koble til pumpen senere. åpne innstillinger AAPSClient-versjonen samsvarer ikke med AAPS-versjonen. Vennligst oppdater. + Utvid kategori + Kollaps kategori Innstillinger Du må angi et hovedpassord som vil bli brukt til å kryptere dine eksporterte innstillinger. Husk dette! diff --git a/plugins/configuration/src/main/res/values-sk-rSK/strings.xml b/plugins/configuration/src/main/res/values-sk-rSK/strings.xml index 1ee19c71905..03ca701a867 100644 --- a/plugins/configuration/src/main/res/values-sk-rSK/strings.xml +++ b/plugins/configuration/src/main/res/values-sk-rSK/strings.xml @@ -81,6 +81,8 @@ POZOR: Pokiaľ aktivujete a pripojíte skutočnú pumpu, AndroidAPS nakopíruje nastavenie bazálu z aktívneho profilu do pumpy. Overte si, že máte v AAPS korektný bazálny profil. Pokiaľ si nieste istí, alebo nechcete prepísať bazály v pumpe, stlačte Zrušiť a opakujte prepnutie na inú pumpu neskôr. otvoriť nastavenia Verzia NSClienta nesúhlasí z verziou AndroidAPS. Prosím aktualizujte si ju. + Rozbaliť kategóriu + Zbaliť kategóriu Nastavenia Budete vyzvaný na zadanie hlavného hesla, ktoré bude použité na dešifrovanie exportovaných nastavení. diff --git a/plugins/configuration/src/main/res/values-zh-rTW/strings.xml b/plugins/configuration/src/main/res/values-zh-rTW/strings.xml index 381f3a10ed6..a8395475c65 100644 --- a/plugins/configuration/src/main/res/values-zh-rTW/strings.xml +++ b/plugins/configuration/src/main/res/values-zh-rTW/strings.xml @@ -80,7 +80,9 @@ 用於配置活動外掛 注意:如果您啟用並連線到硬體幫浦,AAPS將從檔案中複製基礎設置到幫浦,覆蓋幫浦上存儲的現有基礎率。請確保您在AAPS中具有正確的基礎設置。如果您不確定或不想覆蓋幫浦上的基礎設置,請按取消並在稍後重複切換到幫浦。 打開設置 - AAPS客戶端版本與AAPS版本不匹配。請更新。 + AAPSClient 版本與 AAPS 版本不一致,請更新為一致版本。 + 展開分類 + 隱藏分類 偏好設定 您將被要求提供主密碼,該密碼將用於加密匯出的偏好設定。 diff --git a/plugins/configuration/src/main/res/values/strings.xml b/plugins/configuration/src/main/res/values/strings.xml index 4f74b4085b3..d5bbf9d7c8a 100644 --- a/plugins/configuration/src/main/res/values/strings.xml +++ b/plugins/configuration/src/main/res/values/strings.xml @@ -84,6 +84,8 @@ Attention: If you activate and connect to a hardware pump, AAPS will copy the basal settings from the profile to the pump, overwriting the existing basal rate stored on the pump. Make sure you have the correct basal setting in AAPS. If you are not sure or don\'t want to overwrite the basal settings on your pump, press cancel and repeat switching to the pump at a later time. open settings AAPSClient version doesn\'t match AAPS version. Please update. + Expand category + Collapse category Preferences diff --git a/plugins/configuration/src/test/kotlin/app/aaps/configuration/maintenance/MaintenancePluginTest.kt b/plugins/configuration/src/test/kotlin/app/aaps/configuration/maintenance/MaintenancePluginTest.kt index 3b749102476..c2b929c141a 100644 --- a/plugins/configuration/src/test/kotlin/app/aaps/configuration/maintenance/MaintenancePluginTest.kt +++ b/plugins/configuration/src/test/kotlin/app/aaps/configuration/maintenance/MaintenancePluginTest.kt @@ -2,6 +2,7 @@ package app.aaps.configuration.maintenance import android.content.SharedPreferences import app.aaps.core.interfaces.logging.LoggerUtils +import app.aaps.core.interfaces.logging.UserEntryLogger import app.aaps.core.interfaces.maintenance.FileListProvider import app.aaps.core.interfaces.nsclient.NSSettingsStatus import app.aaps.core.validators.preferences.AdaptiveIntPreference @@ -21,6 +22,7 @@ class MaintenancePluginTest : TestBaseWithProfile() { @Mock lateinit var loggerUtils: LoggerUtils @Mock lateinit var fileListProvider: FileListProvider @Mock lateinit var sharedPrefs: SharedPreferences + @Mock lateinit var uel: UserEntryLogger private lateinit var sut: MaintenancePlugin @@ -47,7 +49,7 @@ class MaintenancePluginTest : TestBaseWithProfile() { @BeforeEach fun mock() { - sut = MaintenancePlugin(context, rh, preferences, nsSettingsStatus, aapsLogger, config, fileListProvider, loggerUtils) + sut = MaintenancePlugin(context, rh, preferences, nsSettingsStatus, aapsLogger, config, fileListProvider, loggerUtils, uel) `when`(loggerUtils.suffix).thenReturn(".log.zip") `when`(loggerUtils.logDirectory).thenReturn("src/test/assets/logger") // Unknown solution after scoped access diff --git a/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/objectives/ObjectivesFragment.kt b/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/objectives/ObjectivesFragment.kt index fa136d15a6c..8c37e0954be 100644 --- a/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/objectives/ObjectivesFragment.kt +++ b/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/objectives/ObjectivesFragment.kt @@ -107,12 +107,12 @@ class ObjectivesFragment : DaggerFragment() { override fun onPause() { super.onPause() disposable.clear() + handler.removeCallbacksAndMessages(null) } @Synchronized override fun onDestroyView() { super.onDestroyView() - handler.removeCallbacks(objectiveUpdater) _binding = null } diff --git a/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersions.kt b/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersions.kt index 65127caf11b..78a118002fb 100644 --- a/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersions.kt +++ b/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersions.kt @@ -9,7 +9,7 @@ import java.time.LocalTime import java.time.ZoneId import java.time.format.DateTimeFormatter -class AllowedVersions { +object AllowedVersions { fun findByApi(definition: String?, api: Int): JSONObject? { if (definition == null) return null diff --git a/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/VersionCheckerUtilsImpl.kt b/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/VersionCheckerUtilsImpl.kt index aa007e63eb9..c171b8bcfa0 100644 --- a/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/VersionCheckerUtilsImpl.kt +++ b/plugins/constraints/src/main/kotlin/app/aaps/plugins/constraints/versionChecker/VersionCheckerUtilsImpl.kt @@ -49,14 +49,14 @@ class VersionCheckerUtilsImpl @Inject constructor( Thread { try { val definition: String = URL("https://raw.githubusercontent.com/nightscout/AndroidAPS/versions/definition.json").readText() - val version: String? = AllowedVersions().findByApi(definition, Build.VERSION.SDK_INT)?.optString("supported") - val newVersionAvailable = compareWithCurrentVersion(version, config.get().VERSION_NAME) + val version: String? = AllowedVersions.findByApi(definition, Build.VERSION.SDK_INT)?.optString("supported") + val newVersionByApi = compareWithCurrentVersion(version, config.get().VERSION_NAME) // App expiration - if (newVersionAvailable) { + if (newVersionByApi || config.get().isDev()) { var endDate = sp.getLong(rh.gs(app.aaps.core.utils.R.string.key_app_expiration) + "_" + config.get().VERSION_NAME, 0) - AllowedVersions().findByVersion(definition, config.get().VERSION_NAME)?.let { expirationJson -> - AllowedVersions().endDateToMilliseconds(expirationJson.getString("endDate"))?.let { ed -> + AllowedVersions.findByVersion(definition, config.get().VERSION_NAME)?.let { expirationJson -> + AllowedVersions.endDateToMilliseconds(expirationJson.getString("endDate"))?.let { ed -> endDate = ed + T.days(1).msecs() sp.putLong(rh.gs(app.aaps.core.utils.R.string.key_app_expiration) + "_" + config.get().VERSION_NAME, endDate) } diff --git a/plugins/constraints/src/main/res/layout/objectives_fragment.xml b/plugins/constraints/src/main/res/layout/objectives_fragment.xml index 97ce20de339..8176eab5de2 100644 --- a/plugins/constraints/src/main/res/layout/objectives_fragment.xml +++ b/plugins/constraints/src/main/res/layout/objectives_fragment.xml @@ -17,6 +17,7 @@ Kur galima ieškoti pagalbos su AndroidAPS? Galima kreiptis patarimo AAPS Users Facebook grupėje. Būtina skaityti (ir pakartotinai skaityti) AndroidAPS dokumentaciją. + Galima prašyti patarimo, aptarti ar registruoti techninę problemą ar funkciją AAPS Discord kanale. + Github galite pateikti problemas, tokias kaip klaidos ir funkcijų užklausos. Būtina kreiptis į savo diabeto kliniką/endokrinologą. https://wiki.aaps.app/en/latest/GettingHelp/WhereCanIGetHelp.html https://www.facebook.com/groups/AndroidAPSUsers/ diff --git a/plugins/constraints/src/main/res/values-lt-rLT/objectives.xml b/plugins/constraints/src/main/res/values-lt-rLT/objectives.xml index 5050e7bffe4..2dc3f32897d 100644 --- a/plugins/constraints/src/main/res/values-lt-rLT/objectives.xml +++ b/plugins/constraints/src/main/res/values-lt-rLT/objectives.xml @@ -13,6 +13,7 @@ Atviras ciklas gali būti naudojamas rekomendacijoms gauti, kol neturite tinkamos pompos arba nesate pasiruošę uždaram ciklui. Perpraskite atvirojo ciklo veikimą bei laikinos bazės rekomendacijas Remdamiesi šia patirtimi, nuspręskite, koks turėtų būti maksimalus bazės dydis bei įveskite jį pompoje ir programos Nustatymuose + Atlikite veiksmą, kad įvykdytumėte rekomendaciją Būkite dėmesingi nustatydami saugumo parametrus ir derinkite juos, kai reikia. Pradėkite uždaro ciklo režimą su pompos stabdymu esant žemai glikemijai Keletą dienų praleiskite uždaro ciklo režime su kuo mažiau hipoglikemijų, kai AIO = 0 @@ -27,6 +28,7 @@ Norėdami, kad SMB veiktų gerai, turite perskaityti dokumentaciją ir padidinti maks AIO! Pradžiai patartina skaičiuoti taip: maksAIO=(didžiausia valandinė bazė x 3) + vidutinis bolusas SMB yra Jūsų tikslas. Oref1 algoritmas sukurtas taip, kad taptų Jums pagalba su bolusavimu. Jūs galite nesileisti viso boluso maistui, susileiskite dalį, o AAPS padarys likusį darbą, jei reikės. Taip išvengsite klaidų dėl neteisingai apskaičiuotų AV. Ar žinote, kad galite skaičiuotuve nurodyti, kiek % apskaičiuoto boluso suleisti? Automatizavimo įjungimas + Perskaitykite dokumentaciją apie tai, kaip veikia automatizacija. Nustatykite savo pirmąsias paprastas taisykles. Vietoje veiksmo leiskite AAPS rodyti tik pranešimą. Kai būsite tikri, kad automatizacija suveikia tinkamu laiku, pakeiskite pranešimą tikru veiksmu. (https://wiki.aaps.app/en/latest/DailyLifeWithAaps/Automations.html) Automatizacija gali būti lazda su dviem galais. Nepiktnaudžiaukite. Nebandykite keisti ją aprašančių algoritmų. Prieš įgalindami veiksmą, išbandykite rezultatą su pranešimu. Rezultatas labai priklauso nuo sąlygų eiliškumo. Glikemija matoma NS arba Tidepool Pompos statusas matomas NS arba Tidepool @@ -73,10 +75,13 @@ Kitas neužbaigtas Paprašyti kodo: %1$s (pasirinkite visus teisingus atsakymus) + https://wiki.aaps.app/en/latest/UsefulLinks/FAQ.html#what-to-do-when-taking-a-shower-or-bath + https://wiki.aaps.app/en/latest/DailyLifeWithAaps/AapsScreens.html#the-homescreen https://wiki.aaps.app/en/latest/SettingUpAaps/ConfigBuilder.html https://wiki.aaps.app/en/latest/DailyLifeWithAaps/AapsScreens.html#the-homescreen Neprisijungta prie interneto Nepavyko nuskaityti laiko Tikslo reikalavimai neįvykdyti Ką išmokote: + Patikrinkite, ar žinote pagrindinį slaptažodį diff --git a/plugins/constraints/src/main/res/values-lt-rLT/strings.xml b/plugins/constraints/src/main/res/values-lt-rLT/strings.xml index 2453a86b212..fb5fe676618 100644 --- a/plugins/constraints/src/main/res/values-lt-rLT/strings.xml +++ b/plugins/constraints/src/main/res/values-lt-rLT/strings.xml @@ -4,6 +4,7 @@ Laiko persukimas įvyks po 24 val. ar mažiau Laiko persukimas įvyko prieš mažiau nei 3 val. - Uždaras ciklas išjungtas + Laiko pasukimas įvyko mažiau nei prieš 3 valandas. Uždaras ciklas laikinai išjungtas, automatiškai vėl įsijungs po 3 valandų nuo laiko pasukimo Atlaisvinkite ne mažiau kaip %1$d MB vidinėje atmintyje! Ciklas išjungtas! diff --git a/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersionsTest.kt b/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersionsTest.kt index 6e0479dc813..8a45cb0f04f 100644 --- a/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersionsTest.kt +++ b/plugins/constraints/src/test/kotlin/app/aaps/plugins/constraints/versionChecker/AllowedVersionsTest.kt @@ -51,40 +51,40 @@ class AllowedVersionsTest { @Test fun generateSupportedVersionsTest() { val definition = generateSupportedVersions() - assertThat(AllowedVersions().findByApi(definition, 0)).isNull() - assertThat(AllowedVersions().findByApi(definition, 1)!!.has("supported")).isFalse() - assertThat(AllowedVersions().findByApi(definition, 23)!!.has("supported")).isFalse() - assertThat(AllowedVersions().findByApi(definition, 24)!!.getString("supported")).isEqualTo("2.6.2") - assertThat(AllowedVersions().findByApi(definition, 25)!!.getString("supported")).isEqualTo("2.6.2") - assertThat(AllowedVersions().findByApi(definition, 26)!!.getString("supported")).isEqualTo("2.8.2") - assertThat(AllowedVersions().findByApi(definition, 27)!!.getString("supported")).isEqualTo("2.8.2") - assertThat(AllowedVersions().findByApi(definition, 28)!!.getString("supported")).isEqualTo("3.2.0.4") - assertThat(AllowedVersions().findByApi(definition, 29)!!.getString("supported")).isEqualTo("3.2.0.4") - assertThat(AllowedVersions().findByApi(definition, 30)!!.getString("supported")).isEqualTo("3.3.0") + assertThat(AllowedVersions.findByApi(definition, 0)).isNull() + assertThat(AllowedVersions.findByApi(definition, 1)!!.has("supported")).isFalse() + assertThat(AllowedVersions.findByApi(definition, 23)!!.has("supported")).isFalse() + assertThat(AllowedVersions.findByApi(definition, 24)!!.getString("supported")).isEqualTo("2.6.2") + assertThat(AllowedVersions.findByApi(definition, 25)!!.getString("supported")).isEqualTo("2.6.2") + assertThat(AllowedVersions.findByApi(definition, 26)!!.getString("supported")).isEqualTo("2.8.2") + assertThat(AllowedVersions.findByApi(definition, 27)!!.getString("supported")).isEqualTo("2.8.2") + assertThat(AllowedVersions.findByApi(definition, 28)!!.getString("supported")).isEqualTo("3.2.0.4") + assertThat(AllowedVersions.findByApi(definition, 29)!!.getString("supported")).isEqualTo("3.2.0.4") + assertThat(AllowedVersions.findByApi(definition, 30)!!.getString("supported")).isEqualTo("3.3.0") } @Test fun findByVersionTest() { - //val definition = AllowedVersions().generateSupportedVersions() + //val definition = AllowedVersions.generateSupportedVersions() val definition = "[{\"minAndroid\":1,\"maxAndroid\":23},{\"minAndroid\":24,\"maxAndroid\":25,\"supported\":\"2.6.2\"},{\"minAndroid\":26,\"maxAndroid\":27,\"supported\":\"2.8.2\"},{\"minAndroid\":28,\"maxAndroid\":29,\"supported\":\"3.2.0.4\"},{\"minAndroid\":30,\"maxAndroid\":99,\"supported\":\"3.3.0\"},{\"endDate\":\"2021-11-07\",\"version\":\"2.9.0-beta1\"},{\"endDate\":\"2021-11-02\",\"version\":\"3.0-beta1\"},{\"endDate\":\"2021-11-04\",\"version\":\"3.0-beta2\"},{\"endDate\":\"2021-11-10\",\"version\":\"3.0-beta3\"},{\"endDate\":\"2021-11-14\",\"version\":\"3.0-beta4\"}\n" + " ,{\"endDate\":\"2021-11-16\",\"version\":\"3.0-beta5\"}\n" + "]" - assertThat(AllowedVersions().findByVersion(definition, "2.6.0")).isNull() - assertThat(AllowedVersions().findByVersion(definition, "2.9.0-beta1")!!.has("endDate")).isTrue() - assertThat(AllowedVersions().findByVersion(definition, "2.9.0-beta1")!!.getString("endDate")).isEqualTo("2021-11-07") + assertThat(AllowedVersions.findByVersion(definition, "2.6.0")).isNull() + assertThat(AllowedVersions.findByVersion(definition, "2.9.0-beta1")!!.has("endDate")).isTrue() + assertThat(AllowedVersions.findByVersion(definition, "2.9.0-beta1")!!.getString("endDate")).isEqualTo("2021-11-07") } @Suppress("SpellCheckingInspection") @Test fun endDateToMilliseconds() { val definition = generateSupportedVersions() - val endDate = AllowedVersions().endDateToMilliseconds(AllowedVersions().findByVersion(definition, "2.9.0-beta1")?.getString("endDate") ?: "1000/01/01") ?: 0L + val endDate = AllowedVersions.endDateToMilliseconds(AllowedVersions.findByVersion(definition, "2.9.0-beta1")?.getString("endDate") ?: "1000/01/01") ?: 0L val dateTime = LocalDate.ofInstant(Instant.ofEpochMilli(endDate), ZoneId.systemDefault()) assertThat(dateTime.year).isEqualTo(2021) assertThat(dateTime.monthValue).isEqualTo(11) assertThat(dateTime.dayOfMonth).isEqualTo(7) - assertThat(AllowedVersions().endDateToMilliseconds("abdef")).isNull() + assertThat(AllowedVersions.endDateToMilliseconds("abdef")).isNull() } } diff --git a/plugins/insulin/src/main/kotlin/app/aaps/plugins/insulin/InsulinOrefBasePlugin.kt b/plugins/insulin/src/main/kotlin/app/aaps/plugins/insulin/InsulinOrefBasePlugin.kt index 1a1adfd4a01..c31c103e4ce 100644 --- a/plugins/insulin/src/main/kotlin/app/aaps/plugins/insulin/InsulinOrefBasePlugin.kt +++ b/plugins/insulin/src/main/kotlin/app/aaps/plugins/insulin/InsulinOrefBasePlugin.kt @@ -40,7 +40,7 @@ abstract class InsulinOrefBasePlugin( .pluginIcon(R.drawable.ic_insulin) .shortName(R.string.insulin_shortname) .visibleByDefault(false) - .neverVisible(config.NSCLIENT), + .neverVisible(config.AAPSCLIENT), aapsLogger, rh ), Insulin { diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/actions/ActionsFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/actions/ActionsFragment.kt index e16104c51ba..4ba34d7848d 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/actions/ActionsFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/actions/ActionsFragment.kt @@ -237,7 +237,7 @@ class ActionsFragment : DaggerFragment() { !pump.isSuspended() && !loop.isDisconnected).toVisibility() - if (!pump.pumpDescription.isExtendedBolusCapable || !pump.isInitialized() || pump.isSuspended() || loop.isDisconnected || pump.isFakingTempsByExtendedBoluses || config.NSCLIENT) { + if (!pump.pumpDescription.isExtendedBolusCapable || !pump.isInitialized() || pump.isSuspended() || loop.isDisconnected || pump.isFakingTempsByExtendedBoluses || config.AAPSCLIENT) { binding.extendedBolus.visibility = View.GONE binding.extendedBolusCancel.visibility = View.GONE } else { @@ -253,7 +253,7 @@ class ActionsFragment : DaggerFragment() { } } - if (!pump.pumpDescription.isTempBasalCapable || !pump.isInitialized() || pump.isSuspended() || loop.isDisconnected || config.NSCLIENT) { + if (!pump.pumpDescription.isTempBasalCapable || !pump.isInitialized() || pump.isSuspended() || loop.isDisconnected || config.AAPSCLIENT) { binding.setTempBasal.visibility = View.GONE binding.cancelTempBasal.visibility = View.GONE } else { @@ -283,7 +283,7 @@ class ActionsFragment : DaggerFragment() { cannulaUsageLabel.visibility = isPatchPump.not().toVisibility() cannulaUsage.visibility = isPatchPump.not().toVisibility() - if (!config.NSCLIENT) { + if (!config.AAPSCLIENT) { statusLightHandler.updateStatusLights( cannulaAge, cannulaUsage, insulinAge, reservoirLevel, sensorAge, sensorLevel, diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt index 97add21ed2c..27cb5eae8a0 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewFragment.kt @@ -5,6 +5,7 @@ import android.app.NotificationManager import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent +import android.graphics.Color import android.graphics.Paint import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter @@ -81,6 +82,7 @@ import app.aaps.core.interfaces.utils.DecimalFormatter import app.aaps.core.interfaces.utils.TrendCalculator import app.aaps.core.interfaces.utils.fabric.FabricPrivacy import app.aaps.core.keys.BooleanKey +import app.aaps.core.keys.DoubleKey import app.aaps.core.keys.Preferences import app.aaps.core.keys.UnitDoubleKey import app.aaps.core.objects.constraints.ConstraintObject @@ -192,8 +194,13 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList smallHeight = screenHeight <= Constants.SMALL_HEIGHT val landscape = screenHeight < screenWidth + if (config.AAPSCLIENT1) + binding.nsclientCard.setBackgroundColor(Color.argb(80, 0xE8, 0xC5, 0x0C)) + if (config.AAPSCLIENT2) + binding.nsclientCard.setBackgroundColor(Color.argb(80, 0x0F, 0xBB, 0xE0)) + skinProvider.activeSkin().preProcessLandscapeOverviewLayout(binding, landscape, rh.gb(app.aaps.core.ui.R.bool.isTablet), smallHeight) - binding.nsclientCard.visibility = config.NSCLIENT.toVisibility() + binding.nsclientCard.visibility = config.AAPSCLIENT.toVisibility() binding.notifications.setHasFixedSize(false) binding.notifications.layoutManager = LinearLayoutManager(view.context) @@ -606,12 +613,19 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList if (event.isEnabled && event.canRun()) { context?.let { context -> SingleClickButton(context, null, app.aaps.core.ui.R.attr.customBtnStyle).also { - it.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.treatmentButton)) + it.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.userOptionColor)) it.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10f) it.layoutParams = LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 0.5f).also { l -> - l.setMargins(0, 0, rh.dpToPx(-4), 0) + l.setMargins(rh.dpToPx(1), 0, rh.dpToPx(1), 0) } - it.setCompoundDrawablesWithIntrinsicBounds(null, rh.gd(app.aaps.core.ui.R.drawable.ic_user_options), null, null) + it.setPadding(rh.dpToPx(1), it.paddingTop, rh.dpToPx(1), it.paddingBottom) + it.setCompoundDrawablePadding(rh.dpToPx(-4)) + it.setCompoundDrawablesWithIntrinsicBounds( + null, + rh.gd(event.firstActionIcon() ?: app.aaps.core.ui.R.drawable.ic_user_options_24dp).also { + it?.setBounds(rh.dpToPx(20), rh.dpToPx(20), rh.dpToPx(20), rh.dpToPx(20)) + }, null, null + ) it.text = event.title it.setOnClickListener { OKDialog.showConfirmation(context, rh.gs(R.string.run_question, event.title), { handler.post { automation.processEvent(event) } }) @@ -906,7 +920,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList val useBatteryLevel = (pump.model() == PumpType.OMNIPOD_EROS) || (pump.model() != PumpType.ACCU_CHEK_COMBO && pump.model() != PumpType.OMNIPOD_DASH) pbLevel.visibility = useBatteryLevel.toVisibility() - statusLightsLayout.visibility = (preferences.get(BooleanKey.OverviewShowStatusLights) || config.NSCLIENT).toVisibility() + statusLightsLayout.visibility = (preferences.get(BooleanKey.OverviewShowStatusLights) || config.AAPSCLIENT).toVisibility() } statusLightHandler.updateStatusLights( binding.statusLightsLayout.cannulaAge, @@ -979,7 +993,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList // If the target is not the same as set in the profile then oref has overridden it val targetUsed = if (config.APS) loop.lastRun?.constraintsProcessed?.targetBG ?: 0.0 - else if (config.NSCLIENT) processedDeviceStatusData.getAPSResult()?.targetBG ?: 0.0 + else if (config.AAPSCLIENT) processedDeviceStatusData.getAPSResult()?.targetBG ?: 0.0 else 0.0 if (targetUsed != 0.0 && abs(profile.getTargetMgdl() - targetUsed) > 0.01) { @@ -1031,7 +1045,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList graphData.addTherapyEvents() if (menuChartSettings[0][OverviewMenus.CharType.ACT.ordinal]) graphData.addActivity(0.8) - if ((pump.pumpDescription.isTempBasalCapable || config.NSCLIENT) && menuChartSettings[0][OverviewMenus.CharType.BAS.ordinal]) + if ((pump.pumpDescription.isTempBasalCapable || config.AAPSCLIENT) && menuChartSettings[0][OverviewMenus.CharType.BAS.ordinal]) graphData.addBasals() graphData.addTargetLine() graphData.addNowLine(dateUtil.now()) @@ -1120,18 +1134,34 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList private fun updateSensitivity() { _binding ?: return val lastAutosensData = iobCobCalculator.ads.getLastAutosensData("Overview", aapsLogger, dateUtil) - if (config.NSCLIENT && sp.getBoolean(app.aaps.core.utils.R.string.key_used_autosens_on_main_phone, false) || - !config.NSCLIENT && constraintChecker.isAutosensModeEnabled().value() + val lastAutosensRatio = lastAutosensData?.let { it.autosensResult.ratio * 100 } + if (config.AAPSCLIENT && sp.getBoolean(app.aaps.core.utils.R.string.key_used_autosens_on_main_phone, false) || + !config.AAPSCLIENT && constraintChecker.isAutosensModeEnabled().value() ) { - binding.infoLayout.sensitivityIcon.setImageResource(app.aaps.core.objects.R.drawable.ic_swap_vert_black_48dp_green) + binding.infoLayout.sensitivityIcon.setImageResource( + lastAutosensRatio?.let { + when { + it > 100.0 -> app.aaps.core.objects.R.drawable.ic_as_above + it < 100.0 -> app.aaps.core.objects.R.drawable.ic_as_below + else -> app.aaps.core.objects.R.drawable.ic_swap_vert_black_48dp_green + } + } + ?: app.aaps.core.objects.R.drawable.ic_swap_vert_black_48dp_green + ) } else { - binding.infoLayout.sensitivityIcon.setImageResource(app.aaps.core.objects.R.drawable.ic_x_swap_vert) + binding.infoLayout.sensitivityIcon.setImageResource( + lastAutosensRatio?.let { + when { + it > 100.0 -> app.aaps.core.objects.R.drawable.ic_x_as_above + it < 100.0 -> app.aaps.core.objects.R.drawable.ic_x_as_below + else -> app.aaps.core.objects.R.drawable.ic_x_swap_vert + } + } + ?: app.aaps.core.objects.R.drawable.ic_x_swap_vert + ) } - binding.infoLayout.sensitivity.text = - lastAutosensData?.let { - String.format(Locale.ENGLISH, "AS: %.0f%%", it.autosensResult.ratio * 100) - } ?: "" + // Show variable sensitivity val profile = profileFunction.getProfile() val request = loop.lastRun?.request @@ -1139,21 +1169,50 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList val isfForCarbs = profile?.getIsfMgdlForCarbs(dateUtil.now(), "Overview", config, processedDeviceStatusData) val variableSens = if (config.APS) request?.variableSens ?: 0.0 - else if (config.NSCLIENT) processedDeviceStatusData.getAPSResult()?.variableSens ?: 0.0 + else if (config.AAPSCLIENT) processedDeviceStatusData.getAPSResult()?.variableSens ?: 0.0 else 0.0 val ratioUsed = request?.autosensResult?.ratio ?: 1.0 if (variableSens != isfMgdl && variableSens != 0.0 && isfMgdl != null) { - var text = if (ratioUsed != 1.0 && ratioUsed != lastAutosensData?.autosensResult?.ratio) String.format(Locale.getDefault(), "Alg: %.0f%%\n", ratioUsed * 100) else "" - text += String.format( - Locale.getDefault(), "%1$.1f→%2$.1f (%3$.1f)", - profileUtil.fromMgdlToUnits(isfMgdl, profileFunction.getUnits()), - profileUtil.fromMgdlToUnits(variableSens, profileFunction.getUnits()), - profileUtil.fromMgdlToUnits(isfForCarbs ?: 0.0, profileFunction.getUnits()) + val okDialogText: ArrayList = ArrayList() + val overViewText: ArrayList = ArrayList() + val autoSensHiddenRange = 0.0 //Hide Autosens value if equals 100% + val autoSensMax = 100.0 + (preferences.get(DoubleKey.AutosensMax) - 1.0) * autoSensHiddenRange * 100.0 + val autoSensMin = 100.0 + (preferences.get(DoubleKey.AutosensMin) - 1.0) * autoSensHiddenRange * 100.0 + lastAutosensRatio?.let { + if(it < autoSensMin || it > autoSensMax) + overViewText.add(rh.gs(app.aaps.core.ui.R.string.autosens_short, it)) + okDialogText.add(rh.gs(app.aaps.core.ui.R.string.autosens_long, it)) + } + overViewText.add( + String.format( + Locale.getDefault(), "%1$.1f→%2$.1f", + profileUtil.fromMgdlToUnits(isfMgdl, profileFunction.getUnits()), + profileUtil.fromMgdlToUnits(variableSens, profileFunction.getUnits()) + ) ) - binding.infoLayout.variableSensitivity.text = text - binding.infoLayout.variableSensitivity.visibility = View.VISIBLE - } else binding.infoLayout.variableSensitivity.visibility = View.GONE + binding.infoLayout.sensitivity.text = overViewText.joinToString("\n") + binding.infoLayout.sensitivity.visibility = View.VISIBLE + binding.infoLayout.variableSensitivity.visibility = View.GONE + if (ratioUsed != 1.0 && ratioUsed != lastAutosensData?.autosensResult?.ratio) + okDialogText.add(rh.gs(app.aaps.core.ui.R.string.algorithm_long, ratioUsed * 100)) + okDialogText.add(rh.gs(app.aaps.core.ui.R.string.isf_for_carbs, profileUtil.fromMgdlToUnits(isfForCarbs ?: 0.0, profileFunction.getUnits()))) + if (config.APS) { + val aps = activePlugin.activeAPS + aps.getSensitivityOverviewString()?.let { + okDialogText.add("$it") + } + } + binding.infoLayout.asLayout.setOnClickListener { activity?.let { OKDialog.show(it, rh.gs(app.aaps.core.ui.R.string.sensitivity), okDialogText.joinToString("\n")) } } + + } else { + binding.infoLayout.sensitivity.text = + lastAutosensData?.let { + rh.gs(app.aaps.core.ui.R.string.autosens_short,it.autosensResult.ratio * 100) + } ?: "" + binding.infoLayout.variableSensitivity.visibility = View.GONE + binding.infoLayout.sensitivity.visibility = View.VISIBLE + } } private fun updatePumpStatus() { diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt index eddffbd9b03..6241fbe62e3 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewMenusImpl.kt @@ -144,9 +144,9 @@ class OverviewMenusImpl @Inject constructor( chartButton.setOnClickListener { v: View -> var itemRow = 0 val predictionsAvailable: Boolean = when { - config.APS -> loop.lastRun?.request?.hasPredictions == true - config.NSCLIENT -> true - else -> false + config.APS -> loop.lastRun?.request?.hasPredictions == true + config.AAPSCLIENT -> true + else -> false } val popup = PopupWindow(v.context) popup.setBackgroundDrawable(ColorDrawable(rh.gac(chartButton.context, app.aaps.core.ui.R.attr.popupWindowBackground))) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewPlugin.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewPlugin.kt index c92e4bf97f8..4438cda256b 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewPlugin.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/OverviewPlugin.kt @@ -279,6 +279,8 @@ class OverviewPlugin @Inject constructor( addPreference(AdaptiveIntPreference(ctx = context, intKey = IntKey.OverviewResCritical, title = R.string.statuslights_res_critical)) addPreference(AdaptiveIntPreference(ctx = context, intKey = IntKey.OverviewBattWarning, title = R.string.statuslights_bat_warning)) addPreference(AdaptiveIntPreference(ctx = context, intKey = IntKey.OverviewBattCritical, title = R.string.statuslights_bat_critical)) + addPreference(AdaptiveIntPreference(ctx = context, intKey = IntKey.OverviewBageWarning, title = R.string.statuslights_bage_warning)) + addPreference(AdaptiveIntPreference(ctx = context, intKey = IntKey.OverviewBageCritical, title = R.string.statuslights_bage_critical)) addPreference(AdaptiveClickPreference(ctx = context, stringKey = StringKey.OverviewCopySettingsFromNs, title = R.string.statuslights_copy_ns, onPreferenceClickListener = { nsSettingStatus.copyStatusLightsNsSettings(context) diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/ui/StatusLightHandler.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/ui/StatusLightHandler.kt index e591634fe03..7fcf24d602f 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/ui/StatusLightHandler.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/general/overview/ui/StatusLightHandler.kt @@ -73,14 +73,14 @@ class StatusLightHandler @Inject constructor( if (cannulaUsage != null) scope.launch { handleUsage(cannulaUsage, insulinUnit) } handleLevel(reservoirLevel, IntKey.OverviewResCritical, IntKey.OverviewResWarning, pump.reservoirLevel, insulinUnit) } - if (!config.NSCLIENT) { + if (!config.AAPSCLIENT) { if (bgSource.sensorBatteryLevel != -1) handleLevel(sensorBatteryLevel, IntKey.OverviewSbatCritical, IntKey.OverviewSbatWarning, bgSource.sensorBatteryLevel.toDouble(), "%") else sensorBatteryLevel?.text = "" } - if (!config.NSCLIENT) { + if (!config.AAPSCLIENT) { // 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" // Pump instance check is needed because at startup, the pump can still be VirtualPumpPlugin and that will cause a crash diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinClassic.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinClassic.kt index 653f0b3f8f0..9fe30c2c021 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinClassic.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinClassic.kt @@ -15,6 +15,6 @@ class SkinClassic @Inject constructor(private val config: Config) : SkinInterfac override fun preProcessLandscapeOverviewLayout(binding: OverviewFragmentBinding, isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean) { super.preProcessLandscapeOverviewLayout(binding, isLandscape, isTablet, isSmallHeight) - if (!config.NSCLIENT && (isSmallHeight || isLandscape)) moveButtonsLayout(binding.root) + if (!config.AAPSCLIENT && (isSmallHeight || isLandscape)) moveButtonsLayout(binding.root) } } diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLargeDisplay.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLargeDisplay.kt index bc4750fd0b1..29e93be149f 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLargeDisplay.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLargeDisplay.kt @@ -15,6 +15,6 @@ class SkinLargeDisplay @Inject constructor(private val config: Config) : SkinInt override fun preProcessLandscapeOverviewLayout(binding: OverviewFragmentBinding, isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean) { super.preProcessLandscapeOverviewLayout(binding, isLandscape, isTablet, isSmallHeight) - if (!config.NSCLIENT && (isSmallHeight || isLandscape)) moveButtonsLayout(binding.root) + if (!config.AAPSCLIENT && (isSmallHeight || isLandscape)) moveButtonsLayout(binding.root) } } diff --git a/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLowRes.kt b/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLowRes.kt index 6ec62360f99..f046960c5d6 100644 --- a/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLowRes.kt +++ b/plugins/main/src/main/kotlin/app/aaps/plugins/main/skins/SkinLowRes.kt @@ -36,7 +36,7 @@ class SkinLowRes @Inject constructor(private val config: Config) : SkinInterface } override fun preProcessLandscapeOverviewLayout(binding: OverviewFragmentBinding, isLandscape: Boolean, isTablet: Boolean, isSmallHeight: Boolean) { - if (!config.NSCLIENT && isLandscape) moveButtonsLayout(binding.root) + if (!config.AAPSCLIENT && isLandscape) moveButtonsLayout(binding.root) binding.apply { infoCard.elevation = 0F diff --git a/plugins/main/src/main/res/layout/overview_buttons_layout.xml b/plugins/main/src/main/res/layout/overview_buttons_layout.xml index f9390c3d334..97e17daeb6f 100644 --- a/plugins/main/src/main/res/layout/overview_buttons_layout.xml +++ b/plugins/main/src/main/res/layout/overview_buttons_layout.xml @@ -22,8 +22,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="0dp" - android:paddingEnd="5dp"> + android:paddingStart="@dimen/gray_material_button_margin_horizontal" + android:paddingEnd="@dimen/gray_material_button_margin_horizontal"> diff --git a/plugins/main/src/main/res/layout/profile_fragment.xml b/plugins/main/src/main/res/layout/profile_fragment.xml index c3e923929a7..3cba27fda4d 100644 --- a/plugins/main/src/main/res/layout/profile_fragment.xml +++ b/plugins/main/src/main/res/layout/profile_fragment.xml @@ -219,7 +219,7 @@ android:layout_gravity="center" android:layout_margin="10dp" android:gravity="center" - android:text="@string/ic_dynamic_label" + android:text="@string/ic_dynamic_label_warning" android:textAppearance="?android:attr/textAppearanceSmall" /> DIA CÍL BAZ - Váš algoritmus může poskytnout dynamický výpočet ISF. Níže uvedené hodnoty jsou použity pouze jako záložní v případě chybějících údajů - Váš algoritmus může poskytnout dynamický výpočet IC. Níže uvedené hodnoty jsou použity pouze jako záložní v případě chybějících dat + Váš algoritmus dokáže poskytovat dynamický výpočet ISF. Níže uvedené hodnoty mohou být použity pouze jako záložní v případě chybějících údajů nebo jako referenční + Váš algoritmus dokáže poskytovat dynamický výpočet IC. Níže uvedené hodnoty mohou být použity pouze jako záložní v případě chybějících údajů nebo jako referenční Akce Tlačítka k běžně používaným úkonům diff --git a/plugins/main/src/main/res/values-es-rES/strings.xml b/plugins/main/src/main/res/values-es-rES/strings.xml index 194a403e16f..bfb06b7a40a 100644 --- a/plugins/main/src/main/res/values-es-rES/strings.xml +++ b/plugins/main/src/main/res/values-es-rES/strings.xml @@ -153,8 +153,8 @@ DIA OBJ BAS - El algoritmo puede proporcionar cálculos dinámicos de ISF. Los valores se utilizan sólo como un recurso en caso de falta de datos - El algoritmo puede proporcionar cálculos dinámicos de IC. Los valores se utilizan sólo como un recurso en caso de falta de datos + El algoritmo puede proporcionar un cálculo dinámico del ISF. Los valores mostrados se pueden utilizar sólo como alternativa en caso de que falten datos o como valor de referencia + Su algoritmo puede proporcionar un cálculo dinámico de IC. Los valores mostrados se pueden utilizar sólo como alternativa en caso de que falten datos o como valor de referencia Acciones Algunos botones para acceder rápidamente a funciones comunes diff --git a/plugins/main/src/main/res/values-fr-rFR/strings.xml b/plugins/main/src/main/res/values-fr-rFR/strings.xml index 127b020ff01..12947fd2bad 100644 --- a/plugins/main/src/main/res/values-fr-rFR/strings.xml +++ b/plugins/main/src/main/res/values-fr-rFR/strings.xml @@ -153,8 +153,8 @@ DAI CIBLE BAS - Votre algorithme peut fournir le calcul dynamique de la SI. Les valeurs ci-dessous ne sont utilisées que comme solution de secours en cas de données manquantes - Votre algorithme peut fournir le calcul dynamique de la G/I. Les valeurs ci-dessous ne sont utilisées que comme solution de secours en cas de données manquantes + Votre algorithme peut fournir le calcul dynamique de la SI. Les valeurs ci-dessous sont utilisées comme solution de secours en cas de données manquantes ou comme valeur de référence pour le calcul de la SI + Votre algorithme peut fournir le calcul dynamique de la G/I. Les valeurs ci-dessous sont utilisées comme solution de secours en cas de données manquantes ou comme valeur de référence pour le calcul de la G/I Actions Quelques boutons pour accéder rapidement aux fonctions communes diff --git a/plugins/main/src/main/res/values-it-rIT/strings.xml b/plugins/main/src/main/res/values-it-rIT/strings.xml index 8a3796e9288..cfb59c03fc0 100644 --- a/plugins/main/src/main/res/values-it-rIT/strings.xml +++ b/plugins/main/src/main/res/values-it-rIT/strings.xml @@ -153,8 +153,8 @@ DIA TARG BAS - Il tuo algoritmo può fornire il calcolo dinamico di ISF. I valori sottostanti sono utilizzati solo come fallback in caso di dati mancanti - Il tuo algoritmo può fornire il calcolo dinamico di ISF. I valori sottostanti sono utilizzati solo come fallback in caso di dati mancanti + Il tuo algoritmo può fornire il calcolo dinamico dell\'ISF. I valori sottostanti sono utilizzati solo come fallback in caso di dati mancanti + Il tuo algoritmo può fornire il calcolo dinamico dell\'IC. I valori sottostanti sono utilizzati solo come fallback in caso di dati mancanti Azioni Alcuni tasti per accedere rapidamente alle funzioni comuni diff --git a/plugins/main/src/main/res/values-iw-rIL/strings.xml b/plugins/main/src/main/res/values-iw-rIL/strings.xml index 2c4194f7ca9..9d274cc8652 100644 --- a/plugins/main/src/main/res/values-iw-rIL/strings.xml +++ b/plugins/main/src/main/res/values-iw-rIL/strings.xml @@ -153,8 +153,6 @@ DIA ע\' מטרה בזאלי - האלגוריתם שלכם יכול לספק חישוב דינמי של רגישות לאינסולין. הערכים הבאים יהיו בשימוש רק במקרה של מחסור במידע - האלגוריתם שלכם יכול לספק חישוב דינמי של יחס פחמימות לאינסולין. הערכים הבאים יהיו בשימוש רק במקרה של מחסור במידע פעולות לחצנים לגישה מהירה לפונקציות שימושיות diff --git a/plugins/main/src/main/res/values-lt-rLT/strings.xml b/plugins/main/src/main/res/values-lt-rLT/strings.xml index 66beee208ea..c2fc68fc634 100644 --- a/plugins/main/src/main/res/values-lt-rLT/strings.xml +++ b/plugins/main/src/main/res/values-lt-rLT/strings.xml @@ -39,6 +39,7 @@ Norėdami išjungti SMS nuotolinį valdymą, atsakykite kodu %1$s.\n\n Turėkite omenyje, kad jūs funkciją galėsite atnaujinti tik tiesiai iš AAPS pagrindinio telefono. SMS nuotolinio valdymo funkcija sustojo. Norėdami ją atnaujinti, naudokite AAPS pagrindinį išmanųjį telefoną. Norėdami nusiųsti kalibraciją %1$.2f, atsakykite kodu %2$s + Boluso leidimas nepavyko. Prieš siųsdami kitą komandą, patikrinkite realią būseną! Minimalus minučių skaičius, kuris turi praeiti nuo vieno nuotolinio boluso iki kito Kiek mažiausiai minučių turi praeiti tarp vieno ir kito boluso Jūsų saugumui, norėdami redaguoti šį pasirinkimą, jums reikia pridėti ne mažiau kaip 2 telefono numerius. @@ -188,7 +189,20 @@ Perspėjimo apie senkančią pompos bateriją slenkstis [%] Perspėjimo apie kritiškai senkančią pompos bateriją slenkstis [%] Kopijuoti nustatymus iš NS + 6h + 12h + 18h + 24h + 6 val. + 12 val. + 18 val. + 24 val. grafikas + parinkti grafiko mastelį + 6 valandų grafiko mastelis + 12 valandų grafiko mastelis + 18 valandų grafiko mastelis + 24 valandų grafiko mastelis insulinas Grafiko meniu glikemijos duomenų kokybė @@ -200,6 +214,8 @@ PRADŽIA Rodo dabartinę Ciklo būseną ir pagrindinių veiksmų mygtukus Mygtukai + Siunčia kalibraciją į xDrip+ (įsitikinkite, kad xDrip+ nustatymuose Inter-App modulyje yra įjungta „Priimti kalibravimus“). + Atidaro xDrip+ (mygtukas ATGAL gražina į AAPS). Nepavyko paleisti NGJ programos. Įsitikinkite, kad ji įdiegta. Nėra duomenų Apribojimų pažeidimas @@ -221,6 +237,12 @@ Trečias angliavandenių kiekio žingsnis NGJ Numatyti Laikini Tikslai + Netrukus valgysiu trukmė (minutėmis) + Netrukus valgysiu tikslinė reikšmė + Aktyvumo trukmė (minutėmis) + Aktyvumo tikslinė reikšmė + Hipoglikemijos trukmė (minutėmis) + Hipoglikemijos tikslinė reikšmė Standartiniai insulino kiekiai kateterio/kaniulės užpildymui Mygtukas 1 Mygtukas 2 @@ -247,11 +269,13 @@ Nuokrypiai Aktyvumas Glikemijos įtaka + Jautrumo keitimas Nuokrypiai Aktyvūs angliavandeniai Aktyvus insulinas organizme Bazė Insulinas absoliučiais vienetais + Kintamas jautrumas PROGN VB DEV @@ -261,8 +285,11 @@ DEVSLOPE ĮRAŠ ŠSD + JAUTR% + VSENS Grafiko mastelis Grafikas + T: Originali išvaizda Žemos rezoliucijos išvaizda @@ -274,4 +301,7 @@ Rodo atsinaujinančius pranešimus su trumpa Ciklo veiklos apžvalga SENI DUOMENYS + Žingsniai + ŽINGSNIAI + Paprastas režimas įjungtas diff --git a/plugins/main/src/main/res/values-nb-rNO/strings.xml b/plugins/main/src/main/res/values-nb-rNO/strings.xml index 9ce950de12a..1e829ee2892 100644 --- a/plugins/main/src/main/res/values-nb-rNO/strings.xml +++ b/plugins/main/src/main/res/values-nb-rNO/strings.xml @@ -153,8 +153,8 @@ DIA MÅL BAS - Algoritmen din kan gi dynamisk beregning av ISF. Verdiene nedenfor brukes bare som en reserveløsning i tilfelle av manglende data - Algoritmen din kan gi dynamisk beregning av IK. Verdiene nedenfor brukes bare som en reserveløsning i tilfelle av manglende data + Algoritmen din kan gi dynamisk beregning av ISF. Verdiene nedenfor brukes bare som en reserveløsning i tilfelle av manglende data eller bare som en referanseverdi + Algoritmen din kan gi dynamisk beregning av IK. Verdiene nedenfor brukes bare som en reserveløsning i tilfelle av manglende data eller bare som en referanseverdi Handlinger Hurtigknapper for rask tilgang til ofte brukte funksjoner @@ -276,8 +276,8 @@ Aktive KH (COB) Aktivt insulin (IOB) Basaler - Absolutt insulinmengde - Variabel sensitivitet + Absolutt insulin + Dynamisk ISF PRED BAS AVVIK @@ -288,7 +288,7 @@ BEH PULS SENS% - VSENS + DISF Graf-skala Graf M: diff --git a/plugins/main/src/main/res/values-nl-rNL/strings.xml b/plugins/main/src/main/res/values-nl-rNL/strings.xml index f772169fc6d..7f59f33d301 100644 --- a/plugins/main/src/main/res/values-nl-rNL/strings.xml +++ b/plugins/main/src/main/res/values-nl-rNL/strings.xml @@ -153,8 +153,6 @@ DIA DOEL BAS - Uw algoritme kan een dynamische berekening van ISF bieden. De waarden hieronder worden alleen gebruikt om op terug te vallen in geval van ontbrekende gegevens - Uw algoritme kan een dynamische berekening van IC bieden. De waarden hieronder worden alleen gebruikt om op terug te vallen in geval van ontbrekende gegevens Acties Een aantal knoppen voor snelle toegang tot algemene functies diff --git a/plugins/main/src/main/res/values-pl-rPL/strings.xml b/plugins/main/src/main/res/values-pl-rPL/strings.xml index 072de92c676..61a51daf6d4 100644 --- a/plugins/main/src/main/res/values-pl-rPL/strings.xml +++ b/plugins/main/src/main/res/values-pl-rPL/strings.xml @@ -153,8 +153,6 @@ DIA CEL BAS - Twój algorytm może dostarczyć dynamiczne obliczenia ISF. Wartości poniżej są używane tylko awaryjnie w przypadku braku danych - Twój algorytm może dostarczyć dynamiczne obliczenia IC. Wartości poniżej są używane tylko awaryjnie w przypadku braku danych Akcje Niektóre przyciski umożliwiające szybki dostęp do typowych funkcji diff --git a/plugins/main/src/main/res/values-ru-rRU/strings.xml b/plugins/main/src/main/res/values-ru-rRU/strings.xml index 5fbfc4b80d1..106ecb8a921 100644 --- a/plugins/main/src/main/res/values-ru-rRU/strings.xml +++ b/plugins/main/src/main/res/values-ru-rRU/strings.xml @@ -153,8 +153,6 @@ Время действия инсулина DIA ЦЕЛЬ БАЗАЛ - Алгоритм обеспечивает динамический расчет чувствительности к инсулину ISF. Значения ниже используются только в качестве запасного варианта при отсутствии данных - Алгоритм обеспечивает динамический расчет углеводного коэффициента IC. Значения ниже используются только в качестве запасного варианта при отсутствии данных Действия Кнопки быстрого доступа к некоторым распространенным настройкам diff --git a/plugins/main/src/main/res/values-sk-rSK/strings.xml b/plugins/main/src/main/res/values-sk-rSK/strings.xml index c33e81e0614..6b3874481ff 100644 --- a/plugins/main/src/main/res/values-sk-rSK/strings.xml +++ b/plugins/main/src/main/res/values-sk-rSK/strings.xml @@ -153,8 +153,8 @@ DIA CIEĽ BAZ - Váš algoritmus môže poskytnúť dynamický výpočet ISF. Nižšie uvedené hodnoty sú použité iba ako záložné v prípade chýbajúcich údajov - Váš algoritmus môže poskytnúť dynamický výpočet ISF. Nižšie uvedené hodnoty sú použité iba ako záložné v prípade chýbajúcich údajov + Váš algoritmus môže poskytnúť dynamický výpočet ISF. Nižšie uvedené hodnoty sú použité iba ako záložné v prípade chýbajúcich údajov, alebo iba ako referenčné hodnoty + Váš algoritmus môže poskytnúť dynamický výpočet ISF. Nižšie uvedené hodnoty sú použité iba ako záložné v prípade chýbajúcich údajov, alebo iba ako referenčné hodnoty Akcie Niektoré tlačidlá na rýchly prístup do spoločných funkcií diff --git a/plugins/main/src/main/res/values-tr-rTR/strings.xml b/plugins/main/src/main/res/values-tr-rTR/strings.xml index f7f7d20a868..ce3353746d4 100644 --- a/plugins/main/src/main/res/values-tr-rTR/strings.xml +++ b/plugins/main/src/main/res/values-tr-rTR/strings.xml @@ -153,8 +153,6 @@ İES HDF BAZ - Algoritmanız İDF\'nin dinamik hesaplamasını sağlayabilir. Aşağıdaki değerler yalnızca eksik veri olması durumunda geri dönüş olarak kullanılır - Algoritmanız Kİ\'nin dinamik hesaplamasını sağlayabilir. Aşağıdaki değerler yalnızca eksik veri olması durumunda geri dönüş olarak kullanılır Eylemler Ortak özelliklere hızlıca erişmek için bazı düğmeler diff --git a/plugins/main/src/main/res/values-zh-rTW/strings.xml b/plugins/main/src/main/res/values-zh-rTW/strings.xml index 8c09bc7bb80..72cf6002350 100644 --- a/plugins/main/src/main/res/values-zh-rTW/strings.xml +++ b/plugins/main/src/main/res/values-zh-rTW/strings.xml @@ -153,8 +153,8 @@ DIA 目標 基礎速率 - 你已啟用動態計算 ISF,以下數值僅在資料遺失時作為備用。 - 你已啟用動態計算 IC,以下數值僅在資料遺失時作為備用。 + 你的演算法可以動態計算 ISF(胰島素敏感因子)。以下數值僅在資料遺失時作為備援使用。 + 你的演算法可以動態計算 IC(碳水化合物比值)。以下數值僅在資料遺失時作為備援使用。 手動操作 一些快速查看常用功能的按鈕 diff --git a/plugins/main/src/main/res/values/strings.xml b/plugins/main/src/main/res/values/strings.xml index d1d78301e54..5ae39ca2fd7 100644 --- a/plugins/main/src/main/res/values/strings.xml +++ b/plugins/main/src/main/res/values/strings.xml @@ -163,8 +163,8 @@ DIA TARG BAS - Your algorithm can provide dynamic calculation of ISF. Values below are used only as a fallback in case of missing data - Your algorithm can provide dynamic calculation of IC. Values below are used only as a fallback in case of missing data + Your algorithm can provide dynamic calculation of ISF. Values below can be used only as a fallback in case of missing data or as a reference value only + Your algorithm can provide dynamic calculation of IC. Values below cen be used only as a fallback in case of missing data or as a reference value only Actions diff --git a/plugins/sensitivity/src/main/kotlin/app/aaps/plugins/sensitivity/SensitivityOref1Plugin.kt b/plugins/sensitivity/src/main/kotlin/app/aaps/plugins/sensitivity/SensitivityOref1Plugin.kt index eb0d6ec43ba..1e5db5c46f0 100644 --- a/plugins/sensitivity/src/main/kotlin/app/aaps/plugins/sensitivity/SensitivityOref1Plugin.kt +++ b/plugins/sensitivity/src/main/kotlin/app/aaps/plugins/sensitivity/SensitivityOref1Plugin.kt @@ -243,7 +243,7 @@ class SensitivityOref1Plugin @Inject constructor( key = "sensitivity_oref1_settings" title = rh.gs(R.string.absorption_settings_title) initialExpandedChildrenCount = 0 - addPreference(AdaptiveDoublePreference(ctx = context, doubleKey = DoubleKey.ApsAmaMin5MinCarbsImpact, dialogMessage = R.string.openapsama_min_5m_carb_impact_summary, title = R.string.openapsama_min_5m_carb_impact)) + addPreference(AdaptiveDoublePreference(ctx = context, doubleKey = DoubleKey.ApsSmbMin5MinCarbsImpact, dialogMessage = R.string.openapsama_min_5m_carb_impact_summary, title = R.string.openapsama_min_5m_carb_impact)) addPreference(AdaptiveDoublePreference(ctx = context, doubleKey = DoubleKey.AbsorptionCutOff, dialogMessage = R.string.absorption_cutoff_summary, title = R.string.absorption_cutoff_title)) addPreference(preferenceManager.createPreferenceScreen(context).apply { key = "absorption_oref1_advanced" diff --git a/plugins/sensitivity/src/main/res/values-nb-rNO/strings.xml b/plugins/sensitivity/src/main/res/values-nb-rNO/strings.xml index 0d1a525bf3b..47a8a9efc9f 100644 --- a/plugins/sensitivity/src/main/res/values-nb-rNO/strings.xml +++ b/plugins/sensitivity/src/main/res/values-nb-rNO/strings.xml @@ -17,7 +17,7 @@ Standardverdi: 0.7\nDette er en multiplikatorbegrensning for autosens-sikkerhet. Den begrenser autosens til å redusere basalverdier, og øke isulinssensitivitet (ISF) og BS mål med ikke mer enn enn 30%. Maks autosens ratio Minimum autosens ratio - Standardverdi er: 3.0 (AMA) eller 8.0 (SMB). Dette er grunninnstillingen for KH-opptak per 5 minutt. Den påvirker hvor raskt COB skal reduseres, og benyttes i beregning av fremtidig BS-kurve når BS enten synker eller øker mer enn forventet. Standardverdi er 3mg/dl/5 min. + Standardverdi: 3.0 (AMA) eller 8.0 (SMB). Dette er en innstilling for standard karboabsorpsjonsvirkning per 5 minutter. Standard forventet er 3mg/dl/5min. Dette påvirker hvor raskt COB avtar, og hvor mye karboabsorpsjon antas ved beregning av fremtidig forventet BS, når BS faller mer enn forventet, eller når det ikke stiger så mye som forventet. Maks absorpsjonstid for måltid [t] Etter denne tiden forventes det at måltidet er absorbert. Eventuelle gjenværende karbo vil tas ut av beregninger. diff --git a/plugins/source/src/main/kotlin/app/aaps/plugins/source/DexcomPlugin.kt b/plugins/source/src/main/kotlin/app/aaps/plugins/source/DexcomPlugin.kt index d1cdbbaee2f..c9699fd5064 100644 --- a/plugins/source/src/main/kotlin/app/aaps/plugins/source/DexcomPlugin.kt +++ b/plugins/source/src/main/kotlin/app/aaps/plugins/source/DexcomPlugin.kt @@ -56,7 +56,7 @@ class DexcomPlugin @Inject constructor( ), BgSource, DexcomBoyda { init { - if (!config.NSCLIENT) { + if (!config.AAPSCLIENT) { pluginDescription.setDefault() } } diff --git a/plugins/source/src/main/kotlin/app/aaps/plugins/source/NSClientSourcePlugin.kt b/plugins/source/src/main/kotlin/app/aaps/plugins/source/NSClientSourcePlugin.kt index 65845397ce4..0d0e9aef936 100644 --- a/plugins/source/src/main/kotlin/app/aaps/plugins/source/NSClientSourcePlugin.kt +++ b/plugins/source/src/main/kotlin/app/aaps/plugins/source/NSClientSourcePlugin.kt @@ -26,8 +26,8 @@ class NSClientSourcePlugin @Inject constructor( .pluginName(R.string.ns_client_bg) .shortName(R.string.ns_client_bg_short) .description(R.string.description_source_ns_client) - .alwaysEnabled(config.NSCLIENT) - .setDefault(config.NSCLIENT), + .alwaysEnabled(config.AAPSCLIENT) + .setDefault(config.AAPSCLIENT), aapsLogger, rh ), BgSource, NSClientSource { diff --git a/plugins/source/src/main/kotlin/app/aaps/plugins/source/XdripSourcePlugin.kt b/plugins/source/src/main/kotlin/app/aaps/plugins/source/XdripSourcePlugin.kt index d8b79158183..27eca1e4acb 100644 --- a/plugins/source/src/main/kotlin/app/aaps/plugins/source/XdripSourcePlugin.kt +++ b/plugins/source/src/main/kotlin/app/aaps/plugins/source/XdripSourcePlugin.kt @@ -62,6 +62,7 @@ class XdripSourcePlugin @Inject constructor( SourceSensor.DEXCOM_G6_NATIVE_XDRIP, SourceSensor.DEXCOM_G7_NATIVE_XDRIP, SourceSensor.DEXCOM_G7_XDRIP, + SourceSensor.LIBRE_2, SourceSensor.LIBRE_2_NATIVE, SourceSensor.LIBRE_3, ).any { it == glucoseValue.sourceSensor } diff --git a/plugins/source/src/main/res/values-lt-rLT/strings.xml b/plugins/source/src/main/res/values-lt-rLT/strings.xml index 19edfadb3a4..628d07c6522 100644 --- a/plugins/source/src/main/res/values-lt-rLT/strings.xml +++ b/plugins/source/src/main/res/values-lt-rLT/strings.xml @@ -29,6 +29,11 @@ Registruoti sensoriaus keitimą NS Sukurti įvykį \"Sensoriaus keitimas\" NS automatiškai, startavus sensorių kryptis + KG generavimo intervalas minutėmis + Ottai + Gauti KG duomenis iš Ottai + Syai Tag + Gauti KG duomenis iš Syai Tag diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NSClientFragment.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NSClientFragment.kt index 3dce431829b..26bc4878e18 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NSClientFragment.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NSClientFragment.kt @@ -221,6 +221,7 @@ class NSClientFragment : DaggerFragment(), MenuProvider, PluginFragment { override fun onPause() { super.onPause() disposable.clear() + handler.removeCallbacksAndMessages(null) } private fun updateQueue() { diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NsIncomingDataProcessor.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NsIncomingDataProcessor.kt index bd61b7c7379..12af391c883 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NsIncomingDataProcessor.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/NsIncomingDataProcessor.kt @@ -5,6 +5,7 @@ import app.aaps.core.data.model.FD import app.aaps.core.data.model.GV import app.aaps.core.data.model.IDs import app.aaps.core.data.model.SourceSensor +import app.aaps.core.data.model.TE import app.aaps.core.data.model.TrendArrow import app.aaps.core.data.time.T import app.aaps.core.interfaces.configuration.Config @@ -20,6 +21,7 @@ import app.aaps.core.interfaces.rx.events.EventDismissNotification import app.aaps.core.interfaces.rx.events.EventNSClientNewLog import app.aaps.core.interfaces.sharedPreferences.SP import app.aaps.core.interfaces.source.NSClientSource +import app.aaps.core.interfaces.ui.UiInteraction import app.aaps.core.interfaces.utils.DateUtil import app.aaps.core.keys.BooleanKey import app.aaps.core.keys.Preferences @@ -67,7 +69,8 @@ class NsIncomingDataProcessor @Inject constructor( private val storeDataForDb: StoreDataForDb, private val config: Config, private val instantiator: Instantiator, - private val profileSource: ProfileSource + private val profileSource: ProfileSource, + private val uiInteraction: UiInteraction ) { private fun toGv(jsonObject: JSONObject): GV? { @@ -89,11 +92,11 @@ class NsIncomingDataProcessor @Inject constructor( * @return true if there was an accepted SGV */ @Suppress("SpellCheckingInspection") - fun processSgvs(sgvs: Any): Boolean { + fun processSgvs(sgvs: Any, doFullSync: Boolean): Boolean { // Objective0 sp.putBoolean(app.aaps.core.utils.R.string.key_objectives_bg_is_available_in_ns, true) - if (!nsClientSource.isEnabled() && !preferences.get(BooleanKey.NsClientAcceptCgmData)) return false + if (!nsClientSource.isEnabled() && !preferences.get(BooleanKey.NsClientAcceptCgmData) && !doFullSync) return false var latestDateInReceivedData: Long = 0 aapsLogger.debug(LTag.NSCLIENT, "Received NS Data: $sgvs") @@ -137,7 +140,7 @@ class NsIncomingDataProcessor @Inject constructor( * * @return true if there was an accepted treatment */ - fun processTreatments(treatments: List): Boolean { + fun processTreatments(treatments: List, doFullSync: Boolean): Boolean { try { var latestDateInReceivedData: Long = 0 for (treatment in treatments) { @@ -147,15 +150,15 @@ class NsIncomingDataProcessor @Inject constructor( when (treatment) { is NSBolus -> - if (preferences.get(BooleanKey.NsClientAcceptInsulin) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptInsulin) || config.AAPSCLIENT || doFullSync) storeDataForDb.addToBoluses(treatment.toBolus()) is NSCarbs -> - if (preferences.get(BooleanKey.NsClientAcceptCarbs) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptCarbs) || config.AAPSCLIENT || doFullSync) storeDataForDb.addToCarbs(treatment.toCarbs()) is NSTemporaryTarget -> - if (preferences.get(BooleanKey.NsClientAcceptTempTarget) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptTempTarget) || config.AAPSCLIENT || doFullSync) { if (treatment.duration > 0L) { // not ending event if (treatment.targetBottomAsMgdl() < Constants.MIN_TT_MGDL @@ -172,18 +175,18 @@ class NsIncomingDataProcessor @Inject constructor( } is NSTemporaryBasal -> - if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.AAPSCLIENT || doFullSync) storeDataForDb.addToTemporaryBasals(treatment.toTemporaryBasal()) is NSEffectiveProfileSwitch -> - if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.AAPSCLIENT || doFullSync) { treatment.toEffectiveProfileSwitch(dateUtil)?.let { effectiveProfileSwitch -> storeDataForDb.addToEffectiveProfileSwitches(effectiveProfileSwitch) } } is NSProfileSwitch -> - if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.AAPSCLIENT || doFullSync) { treatment.toProfileSwitch(activePlugin, dateUtil)?.let { profileSwitch -> storeDataForDb.addToProfileSwitches(profileSwitch) } @@ -195,19 +198,32 @@ class NsIncomingDataProcessor @Inject constructor( } is NSTherapyEvent -> - if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.AAPSCLIENT || doFullSync) treatment.toTherapyEvent().let { therapyEvent -> storeDataForDb.addToTherapyEvents(therapyEvent) + if (therapyEvent.type == TE.Type.ANNOUNCEMENT && + preferences.get(BooleanKey.NsClientNotificationsFromAnnouncements) && + therapyEvent.timestamp + T.mins(60).msecs() > dateUtil.now()) + uiInteraction.addNotificationWithAction( + id = Notification.NS_ANNOUNCEMENT, + text = therapyEvent.note ?: "", + level = Notification.ANNOUNCEMENT, + buttonText = app.aaps.core.ui.R.string.snooze, + action = { }, + validityCheck = null, + soundId = app.aaps.core.ui.R.raw.alarm, + validTo = dateUtil.now() + T.mins(60).msecs() + ) } is NSOfflineEvent -> - if (preferences.get(BooleanKey.NsClientAcceptOfflineEvent) && config.isEngineeringMode() || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptOfflineEvent) && config.isEngineeringMode() || config.AAPSCLIENT || doFullSync) treatment.toOfflineEvent().let { offlineEvent -> storeDataForDb.addToOfflineEvents(offlineEvent) } is NSExtendedBolus -> - if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.AAPSCLIENT || doFullSync) treatment.toExtendedBolus().let { extendedBolus -> storeDataForDb.addToExtendedBoluses(extendedBolus) } @@ -263,8 +279,8 @@ class NsIncomingDataProcessor @Inject constructor( } } - fun processProfile(profileJson: JSONObject) { - if (preferences.get(BooleanKey.NsClientAcceptProfileStore) || config.NSCLIENT) { + fun processProfile(profileJson: JSONObject, doFullSync: Boolean) { + if (preferences.get(BooleanKey.NsClientAcceptProfileStore) || config.AAPSCLIENT || doFullSync) { val store = instantiator.provideProfileStore(profileJson) val createdAt = store.getStartDate() val lastLocalChange = sp.getLong(app.aaps.core.utils.R.string.key_local_profile_last_change, 0) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/StoreDataForDbImpl.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/StoreDataForDbImpl.kt index 46e07cd517c..fe1aea86954 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/StoreDataForDbImpl.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsShared/StoreDataForDbImpl.kt @@ -265,7 +265,7 @@ class StoreDataForDbImpl @Inject constructor( SystemClock.sleep(pause) synchronized(therapyEvents) { - if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.AAPSCLIENT) therapyEvents.filter { it.type == TE.Type.ANNOUNCEMENT }.forEach { if (it.timestamp > dateUtil.now() - 15 * 60 * 1000L && it.note?.isNotEmpty() == true && @@ -445,7 +445,7 @@ class StoreDataForDbImpl @Inject constructor( override fun updateDeletedTreatmentsInDb() { deleteTreatment.forEach { id -> - if (preferences.get(BooleanKey.NsClientAcceptInsulin) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptInsulin) || config.AAPSCLIENT) persistenceLayer.getBolusByNSId(id)?.let { bolus -> disposable += persistenceLayer.invalidateBolus( bolus.id, @@ -458,7 +458,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("Bolus", BS::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptCarbs) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptCarbs) || config.AAPSCLIENT) persistenceLayer.getCarbsByNSId(id)?.let { carb -> disposable += persistenceLayer.invalidateCarbs( carb.id, @@ -471,7 +471,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("Carbs", CA::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptTempTarget) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTempTarget) || config.AAPSCLIENT) persistenceLayer.getTemporaryTargetByNSId(id)?.let { tt -> disposable += persistenceLayer.invalidateTemporaryTarget( tt.id, @@ -484,7 +484,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("TemporaryTarget", TT::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.AAPSCLIENT) persistenceLayer.getTemporaryBasalByNSId(id)?.let { tb -> disposable += persistenceLayer.invalidateTemporaryBasal( tb.id, @@ -497,7 +497,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("TemporaryBasal", TB::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.AAPSCLIENT) persistenceLayer.getEffectiveProfileSwitchByNSId(id)?.let { eps -> disposable += persistenceLayer.invalidateEffectiveProfileSwitch( eps.id, @@ -510,7 +510,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("EffectiveProfileSwitch", EPS::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.AAPSCLIENT) persistenceLayer.getProfileSwitchByNSId(id)?.let { ps -> disposable += persistenceLayer.invalidateProfileSwitch( ps.id, @@ -535,7 +535,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("BolusCalculatorResult", BCR::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.AAPSCLIENT) persistenceLayer.getTherapyEventByNSId(id)?.let { te -> disposable += persistenceLayer.invalidateTherapyEvent( te.id, @@ -548,7 +548,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("TherapyEvent", TE::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptOfflineEvent) && config.isEngineeringMode() || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptOfflineEvent) && config.isEngineeringMode() || config.AAPSCLIENT) persistenceLayer.getOfflineEventByNSId(id)?.let { oe -> disposable += persistenceLayer.invalidateOfflineEvent( oe.id, @@ -561,7 +561,7 @@ class StoreDataForDbImpl @Inject constructor( sendLog("OfflineEvent", OE::class.java.simpleName) } } - if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.NSCLIENT) + if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.AAPSCLIENT) persistenceLayer.getExtendedBolusByNSId(id)?.let { eb -> disposable += persistenceLayer.invalidateExtendedBolus( eb.id, diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSDeviceStatusHandler.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSDeviceStatusHandler.kt index 0418e4ceb17..2d15b165b8f 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSDeviceStatusHandler.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSDeviceStatusHandler.kt @@ -86,13 +86,13 @@ class NSDeviceStatusHandler @Inject constructor( var configurationDetected = false for (i in deviceStatuses.size - 1 downTo 0) { val nsDeviceStatus = deviceStatuses[i] - if (config.NSCLIENT) { + if (config.AAPSCLIENT) { updatePumpData(nsDeviceStatus) updateDeviceData(nsDeviceStatus) updateOpenApsData(nsDeviceStatus) updateUploaderData(nsDeviceStatus) } - if (config.NSCLIENT && !configurationDetected) + if (config.AAPSCLIENT && !configurationDetected) nsDeviceStatus.configuration?.let { // copy configuration of Insulin and Sensitivity from main AAPS runningConfiguration.apply(it) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSSettingsStatusImpl.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSSettingsStatusImpl.kt index 7d5b75810a3..61170169f9d 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSSettingsStatusImpl.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/NSSettingsStatusImpl.kt @@ -156,7 +156,7 @@ class NSSettingsStatusImpl @Inject constructor( } data = status aapsLogger.debug(LTag.NSCLIENT, "Received status: $status") - if (config.NSCLIENT) copyStatusLightsNsSettings(null) + if (config.AAPSCLIENT) copyStatusLightsNsSettings(null) } override fun getVersion(): String = diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/ProcessedDeviceStatusDataImpl.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/ProcessedDeviceStatusDataImpl.kt index 6e947f5dbf1..f612a1dc748 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/ProcessedDeviceStatusDataImpl.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/data/ProcessedDeviceStatusDataImpl.kt @@ -78,12 +78,14 @@ class ProcessedDeviceStatusDataImpl @Inject constructor( val suggested = openAPSData.suggested if (enacted != null && openAPSData.clockEnacted != openAPSData.clockSuggested) string .append("") + .append("Enacted:
") .append(dateUtil.minAgo(rh, openAPSData.clockEnacted)) .append("
") .append(enacted.reason) .append("
") if (suggested != null) string .append("") + .append("Suggested:
") .append(dateUtil.minAgo(rh, openAPSData.clockSuggested)) .append("
") .append(suggested.reason) 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 36a8843d28b..9e3f4829436 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 @@ -466,7 +466,7 @@ class NSClientService : DaggerService() { // take the newest val profileStoreJson = profiles[profiles.length() - 1] as JSONObject rxBus.send(EventNSClientNewLog("◄ PROFILE", "profile received")) - nsIncomingDataProcessor.processProfile(profileStoreJson) + nsIncomingDataProcessor.processProfile(profileStoreJson, false) } } if (data.has("treatments")) { @@ -563,7 +563,7 @@ class NSClientService : DaggerService() { val sgvs = data.getJSONArray("sgvs") if (sgvs.length() > 0) { rxBus.send(EventNSClientNewLog("◄ DATA", "received " + sgvs.length() + " sgvs")) - nsIncomingDataProcessor.processSgvs(sgvs) + nsIncomingDataProcessor.processSgvs(sgvs, false) storeDataForDb.storeGlucoseValuesToDb() } } diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientAddUpdateWorker.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientAddUpdateWorker.kt index 2b9663aaa28..d843135feed 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientAddUpdateWorker.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientAddUpdateWorker.kt @@ -71,12 +71,12 @@ class NSClientAddUpdateWorker( if (mills != 0L && mills < dateUtil.now() && mills > latestDateInReceivedData) latestDateInReceivedData = mills - if (insulin > 0 && (preferences.get(BooleanKey.NsClientAcceptInsulin) || config.NSCLIENT)) { + if (insulin > 0 && (preferences.get(BooleanKey.NsClientAcceptInsulin) || config.AAPSCLIENT)) { BS.fromJson(json)?.let { bolus -> storeDataForDb.addToBoluses(bolus) } ?: aapsLogger.error("Error parsing bolus json $json") } - if (carbs != 0.0 && (preferences.get(BooleanKey.NsClientAcceptCarbs) || config.NSCLIENT)) { + if (carbs != 0.0 && (preferences.get(BooleanKey.NsClientAcceptCarbs) || config.AAPSCLIENT)) { CA.fromJson(json)?.let { carb -> storeDataForDb.addToCarbs(carb) } ?: aapsLogger.error("Error parsing bolus json $json") @@ -95,14 +95,14 @@ class NSClientAddUpdateWorker( when { insulin > 0 || carbs > 0 -> Any() eventType == TE.Type.TEMPORARY_TARGET.text -> - if (preferences.get(BooleanKey.NsClientAcceptTempTarget) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptTempTarget) || config.AAPSCLIENT) { TT.fromJson(json, profileUtil)?.let { temporaryTarget -> storeDataForDb.addToTemporaryTargets(temporaryTarget) } ?: aapsLogger.error("Error parsing TT json $json") } eventType == TE.Type.NOTE.text && json.isEffectiveProfileSwitch() -> // replace this by new Type when available in NS - if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.AAPSCLIENT) { EPS.fromJson(json, dateUtil)?.let { effectiveProfileSwitch -> storeDataForDb.addToEffectiveProfileSwitches(effectiveProfileSwitch) } ?: aapsLogger.error("Error parsing EffectiveProfileSwitch json $json") @@ -123,35 +123,35 @@ class NSClientAddUpdateWorker( eventType == TE.Type.EXERCISE.text || eventType == TE.Type.NOTE.text || eventType == TE.Type.PUMP_BATTERY_CHANGE.text -> - if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.AAPSCLIENT) { TE.fromJson(json)?.let { therapyEvent -> storeDataForDb.addToTherapyEvents(therapyEvent) } ?: aapsLogger.error("Error parsing TherapyEvent json $json") } eventType == TE.Type.COMBO_BOLUS.text -> - if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.AAPSCLIENT) { EB.extendedBolusFromJson(json)?.let { extendedBolus -> storeDataForDb.addToExtendedBoluses(extendedBolus) } ?: aapsLogger.error("Error parsing ExtendedBolus json $json") } eventType == TE.Type.TEMPORARY_BASAL.text -> - if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptTbrEb) || config.AAPSCLIENT) { TB.temporaryBasalFromJson(json)?.let { temporaryBasal -> storeDataForDb.addToTemporaryBasals(temporaryBasal) } ?: aapsLogger.error("Error parsing TemporaryBasal json $json") } eventType == TE.Type.PROFILE_SWITCH.text -> - if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptProfileSwitch) || config.AAPSCLIENT) { PS.fromJson(json, dateUtil, activePlugin)?.let { profileSwitch -> storeDataForDb.addToProfileSwitches(profileSwitch) } ?: aapsLogger.error("Error parsing ProfileSwitch json $json") } eventType == TE.Type.APS_OFFLINE.text -> - if (preferences.get(BooleanKey.NsClientAcceptOfflineEvent) && config.isEngineeringMode() || config.NSCLIENT) { + if (preferences.get(BooleanKey.NsClientAcceptOfflineEvent) && config.isEngineeringMode() || config.AAPSCLIENT) { OE.fromJson(json)?.let { offlineEvent -> storeDataForDb.addToOfflineEvents(offlineEvent) } ?: aapsLogger.error("Error parsing OfflineEvent json $json") diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientMbgWorker.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientMbgWorker.kt index 1db83afb0cf..e2a2d1752d1 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientMbgWorker.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclient/workers/NSClientMbgWorker.kt @@ -27,7 +27,7 @@ class NSClientMbgWorker( override suspend fun doWorkAndLog(): Result { val ret = Result.success() - val acceptNSData = preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.NSCLIENT + val acceptNSData = preferences.get(BooleanKey.NsClientAcceptTherapyEvent) || config.AAPSCLIENT if (!acceptNSData) return Result.success(workDataOf("Result" to "Sync not enabled")) val mbgArray = dataWorkerStorage.pickupJSONArray(inputData.getLong(DataWorkerStorage.STORE_KEY, -1)) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/DataSyncSelectorV3.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/DataSyncSelectorV3.kt index 09822b98ae6..b4877526e35 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/DataSyncSelectorV3.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/DataSyncSelectorV3.kt @@ -77,7 +77,7 @@ class DataSyncSelectorV3 @Inject constructor( override suspend fun doUpload() { rxBus.send(EventNSClientUpdateGuiStatus()) - if ((config.NSCLIENT || preferences.get(BooleanKey.NsClientUploadData)) && !isPaused) { + if ((config.AAPSCLIENT || preferences.get(BooleanKey.NsClientUploadData)) && !isPaused) { queueCounter.bolusesRemaining = (persistenceLayer.getLastBolusId() ?: 0L) - sp.getLong(R.string.key_ns_bolus_last_synced_id, 0) queueCounter.carbsRemaining = (persistenceLayer.getLastCarbsId() ?: 0L) - sp.getLong(R.string.key_ns_carbs_last_synced_id, 0) queueCounter.bcrRemaining = (persistenceLayer.getLastBolusCalculatorResultId() ?: 0L) - sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0) diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/NSClientV3Plugin.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/NSClientV3Plugin.kt index 5db278f4655..a7c8390a057 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/NSClientV3Plugin.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/NSClientV3Plugin.kt @@ -172,6 +172,19 @@ class NSClientV3Plugin @Inject constructor( internal var firstLoadContinueTimestamp = LastModified(LastModified.Collections()) // timestamp of last fetched data for every collection during initial load internal var initialLoadFinished = false + private val fullSyncSemaphore = Object() + /** + * Set to true if full sync is requested from fragment. + * In this case we must enable accepting all data from NS even when disabled in preferences + */ + private var fullSyncRequested: Boolean = false + + /** + * Full sync is performed right now + */ + var doingFullSync = false + private set + private val serviceConnection: ServiceConnection = object : ServiceConnection { override fun onServiceDisconnected(name: ComponentName) { aapsLogger.debug(LTag.NSCLIENT, "Service is disconnected") @@ -300,7 +313,7 @@ class NSClientV3Plugin @Inject constructor( handler?.post { executeLoop("REFRESH TOKEN", forceNew = true) } return } - if (config.NSCLIENT || nsClientSource.isEnabled()) { + if (config.AAPSCLIENT || nsClientSource.isEnabled()) { var origin = "5_MIN_AFTER_BG" var forceNew = true var toTime = lastLoadedSrvModified.collections.entries + T.mins(5).plus(T.secs(10)).msecs() @@ -404,6 +417,9 @@ class NSClientV3Plugin @Inject constructor( initialLoadFinished = false storeLastLoadedSrvModified() dataSyncSelectorV3.resetToNextFullSync() + synchronized(fullSyncSemaphore) { + fullSyncRequested = true + } } override fun handleClearAlarm(originalAlarm: NSAlarm, silenceTimeInMilliseconds: Long) { @@ -731,6 +747,13 @@ class NSClientV3Plugin @Inject constructor( while (workIsRunning()) Thread.sleep(5000) } rxBus.send(EventNSClientNewLog("● RUN", "Starting next round $origin")) + synchronized(fullSyncSemaphore) { + if (fullSyncRequested) { + fullSyncRequested = false + doingFullSync = true + rxBus.send(EventNSClientNewLog("● RUN", "Full sync is requested")) + } + } rxBus.send(EventNSClientUpdateGuiStatus()) WorkManager.getInstance(context) .beginUniqueWork( @@ -748,6 +771,12 @@ class NSClientV3Plugin @Inject constructor( .enqueue() } + fun endFullSync() { + synchronized(fullSyncSemaphore) { + doingFullSync = false + } + } + private fun executeUpload(origin: String, forceNew: Boolean) { if (sp.getBoolean(R.string.key_ns_paused, false)) { rxBus.send(EventNSClientNewLog("● RUN", "paused")) 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 4f7658473c0..cee8a68b6df 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 @@ -224,15 +224,15 @@ class NSClientV3Service : DaggerService() { when (collection) { "devicestatus" -> docString.toNSDeviceStatus().let { nsDeviceStatusHandler.handleNewData(arrayOf(it)) } "entries" -> docString.toNSSgvV3()?.let { - nsIncomingDataProcessor.processSgvs(listOf(it)) + nsIncomingDataProcessor.processSgvs(listOf(it), doFullSync = false) storeDataForDb.storeGlucoseValuesToDb() } "profile" -> - nsIncomingDataProcessor.processProfile(docJson) + nsIncomingDataProcessor.processProfile(docJson, doFullSync = false) "treatments" -> docString.toNSTreatment()?.let { - nsIncomingDataProcessor.processTreatments(listOf(it)) + nsIncomingDataProcessor.processTreatments(listOf(it), doFullSync = false) storeDataForDb.storeTreatmentsToDb() } diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/DataSyncWorker.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/DataSyncWorker.kt index f76156240ab..ec188e19f97 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/DataSyncWorker.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/DataSyncWorker.kt @@ -21,6 +21,10 @@ class DataSyncWorker( @Inject lateinit var nsClientV3Plugin: NSClientV3Plugin override suspend fun doWorkAndLog(): Result { + if (nsClientV3Plugin.doingFullSync) { + rxBus.send(EventNSClientNewLog("● RUN", "Full sync finished")) + nsClientV3Plugin.endFullSync() + } if (activePlugin.activeNsClient?.hasWritePermission == true || nsClientV3Plugin.nsClientV3Service?.wsConnected == true) { rxBus.send(EventNSClientNewLog("► UPL", "Start")) dataSyncSelectorV3.doUpload() diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadBgWorker.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadBgWorker.kt index 8a68a54d89b..36880cef482 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadBgWorker.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadBgWorker.kt @@ -35,7 +35,7 @@ class LoadBgWorker( @Inject lateinit var storeDataForDb: StoreDataForDb override suspend fun doWorkAndLog(): Result { - if (!nsClientSource.isEnabled() && !preferences.get(BooleanKey.NsClientAcceptCgmData)) + if (!nsClientSource.isEnabled() && !preferences.get(BooleanKey.NsClientAcceptCgmData) && !nsClientV3Plugin.doingFullSync) return Result.success(workDataOf("Result" to "Load not enabled")) val nsAndroidClient = nsClientV3Plugin.nsAndroidClient ?: return Result.failure(workDataOf("Error" to "AndroidClient is null")) @@ -63,7 +63,7 @@ class LoadBgWorker( val action = if (isFirstLoad) "RCV-F" else "RCV" rxBus.send(EventNSClientNewLog("◄ $action", "${sgvs.size} SVGs from ${dateUtil.dateAndTimeAndSecondsString(lastLoaded)}")) // Schedule processing of fetched data and continue of loading - continueLoading = response.code != 304 && nsIncomingDataProcessor.processSgvs(sgvs) + continueLoading = response.code != 304 && nsIncomingDataProcessor.processSgvs(sgvs, nsClientV3Plugin.doingFullSync) } else { // End first load if (isFirstLoad) { diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadProfileStoreWorker.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadProfileStoreWorker.kt index 79c6864548a..575e8049811 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadProfileStoreWorker.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadProfileStoreWorker.kt @@ -56,7 +56,7 @@ class LoadProfileStoreWorker( nsClientV3Plugin.storeLastLoadedSrvModified() aapsLogger.debug(LTag.NSCLIENT, "PROFILE: $profile") rxBus.send(EventNSClientNewLog("◄ RCV", "1 PROFILE from ${dateUtil.dateAndTimeAndSecondsString(lastLoaded)}")) - nsIncomingDataProcessor.processProfile(profile) + nsIncomingDataProcessor.processProfile(profile, nsClientV3Plugin.doingFullSync) } else { rxBus.send(EventNSClientNewLog("◄ RCV PROFILE END", "No new data from ${dateUtil.dateAndTimeAndSecondsString(lastLoaded)}")) } diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadTreatmentsWorker.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadTreatmentsWorker.kt index 3c3f49ffff3..9aaebd5f6ab 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadTreatmentsWorker.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/nsclientV3/workers/LoadTreatmentsWorker.kt @@ -59,7 +59,7 @@ class LoadTreatmentsWorker( rxBus.send(EventNSClientNewLog("◄ $action", "${treatments.size} TRs from ${dateUtil.dateAndTimeAndSecondsString(lastLoaded)}")) // Schedule processing of fetched data and continue of loading continueLoading = - response.code != 304 && nsIncomingDataProcessor.processTreatments(response.values) + response.code != 304 && nsIncomingDataProcessor.processTreatments(response.values, nsClientV3Plugin.doingFullSync) } else { // End first load if (isFirstLoad) { diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/WearPlugin.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/WearPlugin.kt index e85b2e2f861..86663c54705 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/WearPlugin.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/WearPlugin.kt @@ -132,7 +132,7 @@ class WearPlugin @Inject constructor( // AAPSClient want pass data to AAPS // AAPSClient2 want pass data to AAPS or AAPSClient 1 // ) do it here as the data is prepared - if (config.NSCLIENT && preferences.get(BooleanKey.WearBroadcastData)) broadcastData(it.payload) + if (config.AAPSCLIENT && preferences.get(BooleanKey.WearBroadcastData)) broadcastData(it.payload) } } @@ -167,7 +167,7 @@ class WearPlugin @Inject constructor( private fun broadcastData(payload: EventData) { // Identify and update source set before broadcast - val client = if (config.NSCLIENT1) 1 else if (config.NSCLIENT2) 2 else throw UnsupportedOperationException() + val client = if (config.AAPSCLIENT1) 1 else if (config.AAPSCLIENT2) 2 else throw UnsupportedOperationException() var dataToSend = when (payload) { is EventData.SingleBg -> payload.copy().apply { dataset = client } is EventData.Status -> payload.copy().apply { dataset = client } @@ -177,7 +177,7 @@ class WearPlugin @Inject constructor( Intent(Intents.AAPS_CLIENT_WEAR_DATA) .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES) .putExtras(Bundle().apply { - putInt(WearDataReceiver.CLIENT, if (config.NSCLIENT1) 1 else if (config.NSCLIENT2) 2 else throw UnsupportedOperationException()) + putInt(WearDataReceiver.CLIENT, if (config.AAPSCLIENT1) 1 else if (config.AAPSCLIENT2) 2 else throw UnsupportedOperationException()) putString(WearDataReceiver.DATA, dataToSend.serialize()) }) ) @@ -202,7 +202,7 @@ class WearPlugin @Inject constructor( title = rh.gs(R.string.wear_settings) initialExpandedChildrenCount = 0 addPreference(AdaptiveSwitchPreference(ctx = context, booleanKey = BooleanKey.WearControl, summary = R.string.wearcontrol_summary, title = R.string.wearcontrol_title)) - if (config.NSCLIENT) + if (config.AAPSCLIENT) addPreference(AdaptiveSwitchPreference(ctx = context, booleanKey = BooleanKey.WearBroadcastData, summary = R.string.wear_broadcast_data_summary, title = R.string.wear_broadcast_data)) addPreference(preferenceManager.createPreferenceScreen(context).apply { key = "wear_wizard_settings" diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/receivers/WearDataReceiver.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/receivers/WearDataReceiver.kt index 7ed9b6c49a2..dad9d1bc136 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/receivers/WearDataReceiver.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/receivers/WearDataReceiver.kt @@ -38,7 +38,7 @@ open class WearDataReceiver : DaggerBroadcastReceiver() { } // Check for allowed configuration if ( - config.NSCLIENT1 && client == 2 || + config.AAPSCLIENT1 && client == 2 || (config.APS || config.PUMPCONTROL) && (client == 1 || client == 2) ) { // Send to phone diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/wearintegration/DataHandlerMobile.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/wearintegration/DataHandlerMobile.kt index 4c1e68e9754..72cdb307d90 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/wearintegration/DataHandlerMobile.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/wear/wearintegration/DataHandlerMobile.kt @@ -1079,8 +1079,10 @@ class DataHandlerMobile @Inject constructor( processedTbrEbData.getTempBasalIncludingConvertedExtended(System.currentTimeMillis())?.toStringShort(rh) ?: rh.gs(app.aaps.core.ui.R.string.pump_base_basal_rate, profile.getBasal()) //bgi - val bgi = -(bolusIob.activity + basalIob.activity) * 5 * profileUtil.fromMgdlToUnits(profile.getIsfMgdl("DataHandlerMobile $caller")) - bgiString = "" + (if (bgi >= 0) "+" else "") + decimalFormatter.to1Decimal(bgi) + if (glucoseStatusProvider.glucoseStatusData != null) { + val bgi = -(bolusIob.activity + basalIob.activity) * 5 * profileUtil.fromMgdlToUnits(profile.getIsfMgdl("DataHandlerMobile $caller")) + bgiString = "" + (if (bgi >= 0) "+" else "") + decimalFormatter.to1Decimal(bgi) + } status = generateStatusString(profile) } @@ -1103,7 +1105,7 @@ class DataHandlerMobile @Inject constructor( // If the target is not the same as set in the profile then oref has overridden it val targetUsed = if (config.APS) loop.lastRun?.constraintsProcessed?.targetBG ?: 0.0 - else if (config.NSCLIENT) processedDeviceStatusData.getAPSResult()?.targetBG ?: 0.0 + else if (config.AAPSCLIENT) processedDeviceStatusData.getAPSResult()?.targetBG ?: 0.0 else 0.0 if (targetUsed != 0.0 && abs(profile.getTargetMgdl() - targetUsed) > 0.01) { diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripFragment.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripFragment.kt index 16aad382721..28897cd9964 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripFragment.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripFragment.kt @@ -105,6 +105,7 @@ class XdripFragment : DaggerFragment(), MenuProvider, PluginFragment { @Synchronized override fun onPause() { super.onPause() disposable.clear() + handler.removeCallbacksAndMessages(null) } private fun updateGui() { diff --git a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripPlugin.kt b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripPlugin.kt index 05d21ac5b70..b132986ac5e 100644 --- a/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripPlugin.kt +++ b/plugins/sync/src/main/kotlin/app/aaps/plugins/sync/xdrip/XdripPlugin.kt @@ -19,6 +19,7 @@ import app.aaps.core.data.plugin.PluginType import app.aaps.core.interfaces.aps.Loop import app.aaps.core.interfaces.configuration.Config import app.aaps.core.interfaces.db.ProcessedTbrEbData +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.logging.LTag @@ -90,7 +91,8 @@ class XdripPlugin @Inject constructor( private val dateUtil: DateUtil, aapsLogger: AAPSLogger, private val config: Config, - private val decimalFormatter: DecimalFormatter + private val decimalFormatter: DecimalFormatter, + private val glucoseStatusProvider: GlucoseStatusProvider ) : XDripBroadcast, Sync, PluginBase( PluginDescription() .mainType(PluginType.SYNC) @@ -259,7 +261,7 @@ class XdripPlugin @Inject constructor( .append("|") .append(decimalFormatter.to2Decimal(basalIob.basaliob)) .append(")") - if (preferences.get(BooleanKey.XdripSendBgi)) { + if (preferences.get(BooleanKey.XdripSendBgi) && glucoseStatusProvider.glucoseStatusData != null) { val bgi = -(bolusIob.activity + basalIob.activity) * 5 * profileUtil.fromMgdlToUnits(profile.getIsfMgdl("XdripPlugin")) status.append(" ") .append(if (bgi >= 0) "+" else "") diff --git a/plugins/sync/src/main/res/layout/activity_open_humans_login_new.xml b/plugins/sync/src/main/res/layout/activity_open_humans_login_new.xml index dd1b1002e88..36d6895f028 100644 --- a/plugins/sync/src/main/res/layout/activity_open_humans_login_new.xml +++ b/plugins/sync/src/main/res/layout/activity_open_humans_login_new.xml @@ -555,6 +555,7 @@ diff --git a/plugins/sync/src/main/res/values-lt-rLT/strings.xml b/plugins/sync/src/main/res/values-lt-rLT/strings.xml index c3d91754d8c..d84313ceace 100644 --- a/plugins/sync/src/main/res/values-lt-rLT/strings.xml +++ b/plugins/sync/src/main/res/values-lt-rLT/strings.xml @@ -13,6 +13,7 @@ Kurti pranešimus apie būtinų angliavandenių įspėjimus Kurti Nightscout pranešimus apie klaidas ir vietinius perspėjimus (matomus Terapijoje) Kurti NS pranešimus apie būtinų angliavandenių įspėjimus + Sinchronizuoja duomenis su Nightscout naudojant v1 API Sinchronizuoja duomenis su Nightscout naudojant V3 API Užblokuota dėl įkrovimo parinkčių Užblokuota dėl ryšio parinkčių @@ -23,10 +24,19 @@ NSClient sutrikimas. Reikėtų paleisti iš naujo NS ir NSClient. NSCLIENT neturi įrašymo teisių. Ar teisingai įvedėte API secret? + NSv3 NSClient + NSv1 URL: Paleisti iš naujo + NSClientV1 + NSClientV3 Nightscout URL + Įveskite savo Nightscout adresą (pvz., https://jusu_svetaine.jusu_platforma.com) + Nightscout API slaptažodis + Įveskite savo Nightscout API slaptažodį (mažiausiai 12 simbolių slaptažodis, įrašytas jūsų Nightscout nustatymuose) + Nightscout prieigos raktas + Įveskite savo administratoriaus prieigos raktą, sugeneruotą Nightscout administravimo įrankiuose (mažiausiai 17 simbolių, ne jūsų API slaptažodis!) Suleisti dabar Eilė: Statusas: @@ -96,10 +106,16 @@ Siųsti glikemijos ir terapijos duomenis į xDrip+. Turi būti pasirinktas duomenų šaltinis „xDrip+ Sync Follower“, o duomenų priėmimas turi būti įjungtas skiltyje Nustatymai – Programų sąveikos nustatymai – Priimti glikemiją/terapiją Įjungti duomenų perdavimą į xDrip+. + Samsung Tizen + TIZ + Duomenų siuntimas Samsung G-Watch Wear programėlei (Tizen OS) Garmin Susiejimas su Garmin (Fenix, Edge, …) + Vietinio HTTP serverio prievadas + Vietinis HTTP serveris + WEAR Stebėti ir kontroliuoti AndroidAPS naudojant WearOS laikrodį. (nėra prijungto laikrodžio) Pompos statusas @@ -107,6 +123,7 @@ Wizard asistento skaičiuotuvas:\nInsulinas: %1$.2fU\nAngliavandeniai: %2$dg Pasirinktas greitasis patarėjas nebepasiekiamas, atnaujinkite valdiklį QuickWizard asistentas: %1$s\nInsulinas: %2$.2fU\nAngliavandeniai: %3$dg + Pasirinktas naudotojo veiksmas %1$s nebepasiekiamas, atnaujinkite savo valdiklį Atšaukti laikinus tikslus? Laikrodyje ir telefone naudojami skirtingi vienetai! Zero-Temp-Target - atšaukti laikinus tikslus? @@ -119,6 +136,8 @@ Išmaniojo laikrodžio nustatymai Laikrodžio valdikliai Nustatyti laikinus tikslus ir įvesti bolusus bei AV iš laikrodžio. + Duomenų siuntimas + Duomenų siuntimas į AAPS ar AAPSClient Skaičiavimai, įtraukiami į rezultatą: Bendrieji nustatymai Pranešti apie SMB @@ -131,6 +150,7 @@ Ekrano info Eksportuoti šabloną Pasirinktinio ekrano šablonas eksportuotas + https://androidaps.readthedocs.io/en/latest/ExchangeSiteCustomWatchfaces/index.html Pakartotinai siųsti visus duomenis Atidaryti išmaniojo laikrodžio nustatymus Užrakintų nustatymų sąrašas @@ -162,4 +182,5 @@ %1$.2fv %1$.0f%% Šiandien svertinis + Vykdyti pilną sinchronizaciją? Tai gali užtrukti nemažai laiko ir kol ji nebus užbaigta, nematysite atnaujintų xDrip+. diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/nsclientV3/extensions/DeviceStatusExtensionKtTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/nsclientV3/extensions/DeviceStatusExtensionKtTest.kt index a30fbb33d2c..633d61dcb89 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/nsclientV3/extensions/DeviceStatusExtensionKtTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/nsclientV3/extensions/DeviceStatusExtensionKtTest.kt @@ -39,7 +39,7 @@ internal class DeviceStatusExtensionKtTest : TestBase() { fun setup() { processedDeviceStatusData = ProcessedDeviceStatusDataImpl(rh, dateUtil, preferences, instantiator) nsDeviceStatusHandler = NSDeviceStatusHandler(sp, config, dateUtil, runningConfiguration, processedDeviceStatusData, aapsLogger, persistenceLayer) - Mockito.`when`(config.NSCLIENT).thenReturn(true) + Mockito.`when`(config.AAPSCLIENT).thenReturn(true) } @Test diff --git a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/xdrip/XdripPluginTest.kt b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/xdrip/XdripPluginTest.kt index b5219e348ef..01bd4474d2c 100644 --- a/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/xdrip/XdripPluginTest.kt +++ b/plugins/sync/src/test/kotlin/app/aaps/plugins/sync/xdrip/XdripPluginTest.kt @@ -2,6 +2,7 @@ package app.aaps.plugins.sync.xdrip import android.content.SharedPreferences import app.aaps.core.interfaces.aps.Loop +import app.aaps.core.interfaces.iob.GlucoseStatusProvider import app.aaps.core.interfaces.ui.UiInteraction import app.aaps.core.validators.preferences.AdaptiveIntentPreference import app.aaps.core.validators.preferences.AdaptiveSwitchPreference @@ -17,6 +18,7 @@ class XdripPluginTest : TestBaseWithProfile() { @Mock lateinit var sharedPrefs: SharedPreferences @Mock lateinit var loop: Loop @Mock lateinit var uiInteraction: UiInteraction + @Mock lateinit var glucoseStatusProvider: GlucoseStatusProvider private lateinit var xdripPlugin: XdripPlugin private lateinit var rateLimit: RateLimit @@ -38,7 +40,7 @@ class XdripPluginTest : TestBaseWithProfile() { @BeforeEach fun prepare() { rateLimit = RateLimit(dateUtil) xdripPlugin = XdripPlugin( - preferences, profileFunction, profileUtil, rh, aapsSchedulers, context, fabricPrivacy, loop, iobCobCalculator, processedTbrEbData, rxBus, uiInteraction, dateUtil, aapsLogger, config, decimalFormatter + preferences, profileFunction, profileUtil, rh, aapsSchedulers, context, fabricPrivacy, loop, iobCobCalculator, processedTbrEbData, rxBus, uiInteraction, dateUtil, aapsLogger, config, decimalFormatter, glucoseStatusProvider ) } diff --git a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Fragment.kt b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Fragment.kt index 595e0625418..c592980b383 100644 --- a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Fragment.kt +++ b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Fragment.kt @@ -115,9 +115,9 @@ class ComboV2Fragment : DaggerFragment() { binding.combov2DriverState.setTextColor( when (connectionState) { - ComboV2Plugin.DriverState.Error -> rh.gac(app.aaps.core.ui.R.attr.warningColor) - ComboV2Plugin.DriverState.Suspended -> rh.gac(app.aaps.core.ui.R.attr.urgentColor) - else -> rh.gac(app.aaps.core.ui.R.attr.defaultTextColor) + ComboV2Plugin.DriverState.Error -> rh.gac(context, app.aaps.core.ui.R.attr.warningColor) + ComboV2Plugin.DriverState.Suspended -> rh.gac(context, app.aaps.core.ui.R.attr.urgentColor) + else -> rh.gac(context, app.aaps.core.ui.R.attr.defaultTextColor) } ) } @@ -149,17 +149,17 @@ class ComboV2Fragment : DaggerFragment() { BatteryState.NO_BATTERY -> { binding.combov2Battery.text = rh.gs(R.string.combov2_battery_empty_indicator) - binding.combov2Battery.setTextColor(rh.gac(app.aaps.core.ui.R.attr.warningColor)) + binding.combov2Battery.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.warningColor)) } BatteryState.LOW_BATTERY -> { binding.combov2Battery.text = rh.gs(R.string.combov2_battery_low_indicator) - binding.combov2Battery.setTextColor(rh.gac(app.aaps.core.ui.R.attr.urgentColor)) + binding.combov2Battery.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.urgentColor)) } BatteryState.FULL_BATTERY -> { binding.combov2Battery.text = rh.gs(R.string.combov2_battery_full_indicator) - binding.combov2Battery.setTextColor(rh.gac(app.aaps.core.ui.R.attr.defaultTextColor)) + binding.combov2Battery.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.defaultTextColor)) } } } @@ -174,10 +174,10 @@ class ComboV2Fragment : DaggerFragment() { binding.combov2Reservoir.setTextColor( when (reservoirLevel?.state) { - null -> rh.gac(app.aaps.core.ui.R.attr.defaultTextColor) - ReservoirState.EMPTY -> rh.gac(app.aaps.core.ui.R.attr.warningColor) - ReservoirState.LOW -> rh.gac(app.aaps.core.ui.R.attr.urgentColor) - ReservoirState.FULL -> rh.gac(app.aaps.core.ui.R.attr.defaultTextColor) + null -> rh.gac(context, app.aaps.core.ui.R.attr.defaultTextColor) + ReservoirState.EMPTY -> rh.gac(context, app.aaps.core.ui.R.attr.warningColor) + ReservoirState.LOW -> rh.gac(context, app.aaps.core.ui.R.attr.urgentColor) + ReservoirState.FULL -> rh.gac(context, app.aaps.core.ui.R.attr.defaultTextColor) } ) } @@ -248,17 +248,17 @@ class ComboV2Fragment : DaggerFragment() { in 0..60 -> { binding.combov2LastConnection.text = rh.gs(R.string.combov2_less_than_one_minute_ago) - binding.combov2LastConnection.setTextColor(rh.gac(app.aaps.core.ui.R.attr.defaultTextColor)) + binding.combov2LastConnection.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.defaultTextColor)) } in 60..(30 * 60) -> { binding.combov2LastConnection.text = rh.gs(app.aaps.core.interfaces.R.string.minago, secondsPassed / 60) - binding.combov2LastConnection.setTextColor(rh.gac(app.aaps.core.ui.R.attr.defaultTextColor)) + binding.combov2LastConnection.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.defaultTextColor)) } else -> { binding.combov2LastConnection.text = rh.gs(R.string.combov2_no_connection_for_n_mins, secondsPassed / 60) - binding.combov2LastConnection.setTextColor(rh.gac(app.aaps.core.ui.R.attr.warningColor)) + binding.combov2LastConnection.setTextColor(rh.gac(context, app.aaps.core.ui.R.attr.warningColor)) } } } diff --git a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt index 188d3e3fcdc..27717cd0a7a 100644 --- a/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt +++ b/pump/combov2/src/main/kotlin/info/nightscout/pump/combov2/ComboV2Plugin.kt @@ -1487,7 +1487,7 @@ class ComboV2Plugin @Inject constructor( temporaryBasal?.let { lines += rh.gs( R.string.combov2_short_status_temp_basal, - it.toStringFull(dateUtil, decimalFormatter) + it.toStringFull(dateUtil, rh) ) } diff --git a/pump/combov2/src/main/res/values-nb-rNO/strings.xml b/pump/combov2/src/main/res/values-nb-rNO/strings.xml index b246ec706d9..561d42f3f73 100644 --- a/pump/combov2/src/main/res/values-nb-rNO/strings.xml +++ b/pump/combov2/src/main/res/values-nb-rNO/strings.xml @@ -107,7 +107,7 @@ knappene samtidig for å avbryte parringen)\n Siste tilkobling: %1$d min siden Varsel: %s LastBolus: %1$s E @ %2$s - Temp: %s + Midl. basal: %s Reservoar: %d E tom lavt diff --git a/pump/dana/src/main/res/layout/danar_user_options_activity.xml b/pump/dana/src/main/res/layout/danar_user_options_activity.xml index 2ca66db2bb4..ede13cde917 100644 --- a/pump/dana/src/main/res/layout/danar_user_options_activity.xml +++ b/pump/dana/src/main/res/layout/danar_user_options_activity.xml @@ -97,18 +97,21 @@ diff --git a/pump/dana/src/main/res/values-lt-rLT/strings.xml b/pump/dana/src/main/res/values-lt-rLT/strings.xml index 8a04b8c441f..4996d68aeae 100644 --- a/pump/dana/src/main/res/values-lt-rLT/strings.xml +++ b/pump/dana/src/main/res/values-lt-rLT/strings.xml @@ -102,6 +102,7 @@ DanaR Bluetooth įrenginys Pompos slaptažodis (tik v1) Pompos slaptažodis + Naudoti ištęstinį bolusą >200% Boluso greitis Pasirinkta pompa Įrašyti rezervuaro keitimą diff --git a/pump/danar/src/main/kotlin/app/aaps/pump/danar/AbstractDanaRPlugin.kt b/pump/danar/src/main/kotlin/app/aaps/pump/danar/AbstractDanaRPlugin.kt index 642128f2291..8ee65d8225e 100644 --- a/pump/danar/src/main/kotlin/app/aaps/pump/danar/AbstractDanaRPlugin.kt +++ b/pump/danar/src/main/kotlin/app/aaps/pump/danar/AbstractDanaRPlugin.kt @@ -433,10 +433,10 @@ abstract class AbstractDanaRPlugin protected constructor( } val (temporaryBasal, extendedBolus) = pumpSync.expectedPumpState() if (temporaryBasal != null) { - ret += "Temp: ${temporaryBasal.toStringFull(dateUtil, decimalFormatter)}\n" + ret += "Temp: ${temporaryBasal.toStringFull(dateUtil, rh)}\n" } if (extendedBolus != null) { - ret += "Extended: ${extendedBolus.toStringFull(dateUtil, decimalFormatter)}\n" + ret += "Extended: ${extendedBolus.toStringFull(dateUtil, rh)}\n" } if (!veryShort) { ret += "TDD: ${decimalFormatter.to0Decimal(danaPump.dailyTotalUnits)} / ${danaPump.maxDailyTotalUnits} U\n" diff --git a/pump/diaconn/src/main/res/layout/diaconn_g8_user_options_activity.xml b/pump/diaconn/src/main/res/layout/diaconn_g8_user_options_activity.xml index cac939ef9fa..947f7cfb6d8 100644 --- a/pump/diaconn/src/main/res/layout/diaconn_g8_user_options_activity.xml +++ b/pump/diaconn/src/main/res/layout/diaconn_g8_user_options_activity.xml @@ -117,18 +117,21 @@ @@ -193,18 +196,21 @@ diff --git a/pump/equil/src/main/kotlin/app/aaps/pump/equil/EquilPumpPlugin.kt b/pump/equil/src/main/kotlin/app/aaps/pump/equil/EquilPumpPlugin.kt index 80625aa86cf..a8a1d4ee66e 100644 --- a/pump/equil/src/main/kotlin/app/aaps/pump/equil/EquilPumpPlugin.kt +++ b/pump/equil/src/main/kotlin/app/aaps/pump/equil/EquilPumpPlugin.kt @@ -343,10 +343,10 @@ import javax.inject.Singleton } val (temporaryBasal, extendedBolus, _, profile) = pumpSync.expectedPumpState() if (temporaryBasal != null && profile != null) { - ret += rh.gs(R.string.equil_common_short_status_temp_basal, temporaryBasal.toStringFull(dateUtil, decimalFormatter) + "\n") + ret += rh.gs(R.string.equil_common_short_status_temp_basal, temporaryBasal.toStringFull(dateUtil, rh) + "\n") } if (extendedBolus != null) { - ret += rh.gs(R.string.equil_common_short_status_extended_bolus, extendedBolus.toStringFull(dateUtil, decimalFormatter) + "\n") + ret += rh.gs(R.string.equil_common_short_status_extended_bolus, extendedBolus.toStringFull(dateUtil, rh) + "\n") } ret += rh.gs(R.string.equil_common_short_status_reservoir, reservoirLevel) return ret.trim { it <= ' ' } diff --git a/pump/equil/src/main/res/values-lt-rLT/strings.xml b/pump/equil/src/main/res/values-lt-rLT/strings.xml index 6627f899869..c3a8c406630 100644 --- a/pump/equil/src/main/res/values-lt-rLT/strings.xml +++ b/pump/equil/src/main/res/values-lt-rLT/strings.xml @@ -1,6 +1,177 @@ + Equil Patch 5.3 ar naujesnė pompa + Bazinis insulinas + %1$.3f vv / %2$.3f vv suleista + Atšaukti + Reikia + Praleisti + Paskutinis prisijungimas + Rezervuaro keitimas + Stūmoklis automatiškai perkeliamas į rezervuaro dugną. Pasiekus dugną, jis automatiškai sustos. Jei reikia, spustelėkite „Stop“, kad nutrauktumėte veiksmą. + Atlikta + Toliau + Ši operacija sustabdys insulino leidimą ir inicijuos pompos stūmoklio atitraukimą iki apačios! + Istorija + Insulino rezervuaras + Darbinis režimas + Vykdoma + Sustabdyta + Pristabdyta + Įrenginio numeris + Stop + Sėkmingai + Pakeiskite rezervuarą + Istorijos įrašai + Patarimai + Perspėjimo tonas + Nutildyti + Tik vibravimas + Tik garsas + Vibracija ir garsas + %1$s vv + %1$s vv/val. + Šis veiksmas sustabdys insulino leidimą ir atitrauks pompos stūmoklį į apačią! Taip pat bus ištrinta susiejimo būsena! + Įrenginių nėra + Suporuoti Equil patch pompą + Sujungimo klaida + Pakeisti pompą + Atjunkite pompą nuo jos pagrindo. + Ar tikrai norite atsisakyti kontrolės per %1$s? + Įrenginio numeris + Valandinė bazė  %1$s vv/val. + Laikina valandinė bazė %1$s vv/val. + Bolusas %1$s vv + TBR trukmė turi būti didesnė už nulį ir būti %1$s minučių kartotinis. + Rezervuare nepakanka insulino + Žemas baterijos lygis + Rezervuare nepakanka insulino + Pompa neaktyvi + Poravimas + Poravimo klaida + Kartoti + Užpildymas + Išleisti orą + Laikina bazė + Iš viso suleista + Paskutinis bolusas + Programinės įrangos versija + Equil atsijungs automatiškai + Equil automatinis atsijungimas + Dydis: %1$.2f vv/val,trukmė: %2$d minutės + %1$.2f vv + Tipas: + Nustatyti bolusą + Atšaukti bolusą + Nustatyti laikiną bazę + Atšaukti laikiną bazę + Nustatyti bazės tvarkaraštį + Nustatyti laiką + Sustabdyti suleidimą + Atnaujinti suleidimą + Suporuoti Equil + Įvesti kaniulę + Panaikinti Equil suporavimą + Aliarmas + Nustatyti ištęstą bolusą + Atšaukti ištęstą bolusą + Stūmoklio atitraukimas pompoje + Konfigūruoti tik pranešimo garsui + Konfigūruoti tik vibracijai + Konfigūruoti tyliajam režimui + Konfigūruoti pranešimo garsui ir vibracijai + Nuskaityti įrenginio informaciją + Užpildyti + Rankinis patvirtinimas + Įrenginiai nerasti + Pompos prisijungimo klaida + Nėra atsakymo iš pompos + Nežinoma komandos būklė + Įvesti pompą į kūną + Nustatymai + Įspėjimas apie senkančią bateriją + Įspėjimas apie mažą insulino likutį + Rezervuaro inicijavimas nebaigtas + Visi + Poravimas + Bolusai + Bazė + Nustatymai + Įvykiai + Equil istorija + Equil suporavimo slaptažodis netinkamas + nėra + Rezervuaras - žemas insulino lygis + Rezervuaras - tuščias rezervuaras + Aptiktas suleidimo blokavimas + Aptiktas variklio atbulinis judėjimas + Aptiktas variklio gedimas + Pradėtas suleidimo stabdymas + Suleidimas sustabdytas + Artėja automatinis išjungimas + Automatinis išsijungimas! + Rezervuaro užpildymas + Pompos atitraukimas + Paleistas greitasis bolusas + Laikinos bazės pradžia + Laikinos bazės pabaiga + Įspėjimas apie senkančią bateriją + Baterija tuščia! + Įjungimo atstatymas + Neįprastas suleidimas sustabdytas + Pask. prijung: prieš %1$d min + Pask. Bolusas: %1$s @ %2$s + Laik. bazė: %1$s + Ištęstas: %1$s + Rezervuaras: %1$svv + Sustabdyti + Atnaujinti suleidimą + %1$.2fvv/val @%2$s (%3$d/%4$d min) + Neseniai + Mažiau nei prieš minutę + prieš %1$s + %1$s ir %2$s + Užbaigti + Toliau + Dar nesate užbaigę visų žingsnių. Ar tikrai norite išeiti? + Išeiti + + %1$d minutė + %1$d minutės + %1$d minutės + %1$d min. + + + %1$d valanda + %1$d valandos + %1$d valandų + %1$d val. + + + %1$d diena + %1$d dienos + %1$d d. + %1$d d. + + Programinės įrangos versija per žema. Nepalaikoma + Prašome nustatyti naują slaptažodį poravimui su Equil v5.3 pompa. Šis slaptažodis taip pat bus naudojamas ateityje norint atsieti nuo dabartinės pompos, todėl įsitikinkite, kad jį prisiminsite. Slaptažodžio taisyklė: jis turi būti 4 simbolių ilgio, pasirinktas iš ABCDEF0123456789. + Ištrinti + Nustatyti suporavimo slaptažodį + Po to, kai uždėsite pompą ant pagrindo plokštės, pasirinkite, ar norite išstumti orą iš įvestos adatos. + Atsieti įrenginį + Prašome surinkti pompą, pripildytą rezervuarą ir įkrautą bateriją + Įveskite naujos pompos ID + Prašome užpildyti rezervuarą iki kol ant adatos galo pasirodys insulino lašelis + Pompa neturi būti ant pompos pagrindo. + Prijunkite pompą prie jos pagrindo + Užpildyti kaniulę + Nuimkite pompą nuo jos pagrindo + Deaktyvuoti seną pompą%1$s? + Pompa atnaujinta + Didžiausias leistinas bolusas pompoje [%1$svv] + Rezervuaras tuščias. Pakeiskite rezervuarą + Turi būti 6 simboliai iš ABCDEF0123456789 diff --git a/pump/insight/src/main/java/app/aaps/pump/insight/utils/ConnectionEstablisher.java b/pump/insight/src/main/java/app/aaps/pump/insight/utils/ConnectionEstablisher.java index 35a5ca097a2..d7e3ceefa19 100644 --- a/pump/insight/src/main/java/app/aaps/pump/insight/utils/ConnectionEstablisher.java +++ b/pump/insight/src/main/java/app/aaps/pump/insight/utils/ConnectionEstablisher.java @@ -52,7 +52,7 @@ public void run() { try { socket.connect(); if (!isInterrupted()) callback.onConnectionSucceed(); - } catch (IOException e) { + } catch (IOException | SecurityException e) { if (!isInterrupted()) callback.onConnectionFail(e, System.currentTimeMillis() - connectionStart); } } diff --git a/pump/insight/src/main/kotlin/app/aaps/pump/insight/app_layer/activities/InsightPairingActivity.kt b/pump/insight/src/main/kotlin/app/aaps/pump/insight/app_layer/activities/InsightPairingActivity.kt index 094b627ddfc..434ef8661e3 100644 --- a/pump/insight/src/main/kotlin/app/aaps/pump/insight/app_layer/activities/InsightPairingActivity.kt +++ b/pump/insight/src/main/kotlin/app/aaps/pump/insight/app_layer/activities/InsightPairingActivity.kt @@ -41,6 +41,7 @@ class InsightPairingActivity : DaggerAppCompatActivity(), InsightConnectionServi private lateinit var binding: ActivityInsightPairingBinding private var scanning = false private val deviceAdapter = DeviceAdapter() + private var isBound = false private var service: InsightConnectionService? = null private val serviceConnection: ServiceConnection = object : ServiceConnection { @@ -54,10 +55,13 @@ class InsightPairingActivity : DaggerAppCompatActivity(), InsightConnectionServi onStateChanged(it.state) pumpSync.connectNewPump() } + isBound = true } } - override fun onServiceDisconnected(name: ComponentName) {} + override fun onServiceDisconnected(name: ComponentName) { + isBound =false + } } override fun onCreate(savedInstanceState: Bundle?) { @@ -83,7 +87,8 @@ class InsightPairingActivity : DaggerAppCompatActivity(), InsightConnectionServi unregisterStateCallback(this@InsightPairingActivity) unregisterExceptionCallback(this@InsightPairingActivity) } - unbindService(serviceConnection) + if (isBound) + unbindService(serviceConnection) super.onDestroy() } diff --git a/pump/medtronic/src/main/kotlin/app/aaps/pump/medtronic/MedtronicFragment.kt b/pump/medtronic/src/main/kotlin/app/aaps/pump/medtronic/MedtronicFragment.kt index 66fa7dfdf20..bb614eba1e7 100644 --- a/pump/medtronic/src/main/kotlin/app/aaps/pump/medtronic/MedtronicFragment.kt +++ b/pump/medtronic/src/main/kotlin/app/aaps/pump/medtronic/MedtronicFragment.kt @@ -67,7 +67,7 @@ class MedtronicFragment : DaggerFragment() { private var disposable: CompositeDisposable = CompositeDisposable() private val handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) - private lateinit var refreshLoop: Runnable + private var refreshLoop: Runnable init { refreshLoop = Runnable { diff --git a/pump/medtrum/src/main/res/values-lt-rLT/strings.xml b/pump/medtrum/src/main/res/values-lt-rLT/strings.xml index e8038b23e49..6598a5649de 100644 --- a/pump/medtrum/src/main/res/values-lt-rLT/strings.xml +++ b/pump/medtrum/src/main/res/values-lt-rLT/strings.xml @@ -12,6 +12,7 @@ Pompa sustabdyta dėl viršyto paros insulino limito Rezervuaras neaktyvus Naudotojo nustatymai neįrašyti! + Klaida sinchronizuojant istoriją iš pompos, įrašas buvo praleistas. Patikrinkite terapijos skirtuką, kad įsitikintumėte, ar bolusas buvo teisingai sinchronizuotas. Atidėkite pranešimą, ir, jei klaida pasikartos, pakeiskite pompos pagrindą ar pleistrą. BLE statusas Pask. prijungimas @@ -77,6 +78,7 @@ Neprijunkite pagrindo prie rezervuaro iki kito žingsnio! Prijunkite pompos pagrindą prie naujo rezervuaro, pašalinkite orą ir užpildykite insulinu, tada spauskite Kitas. Svarbu: būtina užpildyti bent 70 v. + Rezervuaras: %.2f vv Kol kas neklijuokite pompos prie kūno. Spustelėkite adatos mygtuką. Spauskite Kitas pildymui pradėti. Palaukite, kol baigsis pildymas. @@ -87,6 +89,7 @@ Palaukite, kol bus aktyvuota pompa ir nustatyta pradinė bazė. Aktyvavimas nepavyko, spauskite Kartoti. Naujas rezervuaras įjungtas. Yra %.2f v insulino. + Galite eksportuoti nustatymus, kad vėliau galėtumėte atkurti šios pompos sesiją. Norėdanu grįžti į pradžios ekraną, spauskite OK. Ar tikrai norite išjungti rezervuarą? Ar tikrai norite nutraukti įjungimą? @@ -101,21 +104,37 @@ Norėdami atnaujinti aktyvavimą, spauskite Kitas, norėdami atšaukti, spauskite Baigti naudoti. Palaukite, nuskaitomas pompos aktyvavimo statusas. + Nepasiekiamumo įspėjimas priverstinai įjungtas, nes Medtrum pompa gali tapti nepasiekiama. + Rekomenduotina nustatyti į 30 minučių, nes Medtrum pompa gali tapti nepasiekiama. Serijos numeris Įveskite pompos pagrindo serijos numerį. Neteisingas serijos numeris! + Pompa netestuota: %1$s! Susisiekite su mumis Discord arba Github kanalais Aliarmų nustatymai Pasirinkite pompos aliarmų nustatymus + Pompos pranešimas apie įspėjimą + Rodyti pranešimą apie nekritinius pompos įspėjimus: senkanti baterija, tuščias rezervuaras (20 vv) ir artėjantis galiojimo laikas. Rekomenduojama palikti įjungtus, ypač kai pompos signalai nustatyti tyliajame režime. + Įspėjimas apie pompos galiojimo laiką [valandos] + Rodyti pranešimą nurodytą valandą po aktyvavimo. Rezervuaras išsijungs Įgalinus, rezervuaras išsijungs po 3 parų ir 8 val. Valandos insulino limitas Nustatykite maksimalų insulino kiekį valandai. Jį viršijus pompa bus sustabdyta. Paros insulino limitas Nustatykite maksimalų insulino kiekį parai. Jį viršijus pompa bus sustabdyta. + Skenuoti, jei kyla ryšio klaida + ĮSPĖJIMAS: Įjunkite tik tuo atveju, jei patiriate ryšio nesklandumų. Jei įjungta, tvarkyklė vėl nuskenuos pompą prieš bandydama prisijungti iš naujo. Įsitikinkite, kad vietos nustatymo leidimas nustatytas į „Visada leisti“ Gaunamas pompos statusas + Sinchronizuojami įrašai, liko %1$d Gaunamas boluso statusas Gaunamas laikinos bazės statusas Naudotojo nustatymai + Vartotojas atšaukė bolusą + Pompa neprijungta + Bolusas leidžiamas + Negalima nusiųsti komandos suleisti bolusą + Nepavyko nustatyti boluso būsenos dėl laiko limito + Pompos klaida diff --git a/pump/omnipod-common/src/main/res/values-bg-rBG/strings.xml b/pump/omnipod-common/src/main/res/values-bg-rBG/strings.xml index 3bc998dd83a..f3d7060bd6e 100644 --- a/pump/omnipod-common/src/main/res/values-bg-rBG/strings.xml +++ b/pump/omnipod-common/src/main/res/values-bg-rBG/strings.xml @@ -158,7 +158,6 @@ Няма активен под Последно свързване: преди %1$d минути - Болус: %1$s @ %2$s Врем базал: %1$s Удължен: %1$s Рез.: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-ca-rES/strings.xml b/pump/omnipod-common/src/main/res/values-ca-rES/strings.xml index 73a53bfce61..bf2d0341554 100644 --- a/pump/omnipod-common/src/main/res/values-ca-rES/strings.xml +++ b/pump/omnipod-common/src/main/res/values-ca-rES/strings.xml @@ -156,7 +156,6 @@ Cap pod actiu Darrera connexió: fa %1$d min - Darrer bolus: %1$s @ %2$s Temp: %1$s Estès: %1$s Reservori.: %1$s U diff --git a/pump/omnipod-common/src/main/res/values-cs-rCZ/strings.xml b/pump/omnipod-common/src/main/res/values-cs-rCZ/strings.xml index 04db381f821..b73d08f93d6 100644 --- a/pump/omnipod-common/src/main/res/values-cs-rCZ/strings.xml +++ b/pump/omnipod-common/src/main/res/values-cs-rCZ/strings.xml @@ -164,7 +164,7 @@ Žádný aktivní Pod Poslední spoj: před %1$d min - Poslední bolus: %1$s @ %2$s + Poslední bolus: %1$sU @ %2$s Doč. bazál: %1$s Prodl. bolus: %1$s Zásobník: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-da-rDK/strings.xml b/pump/omnipod-common/src/main/res/values-da-rDK/strings.xml index 078545b5d6e..9601548202d 100644 --- a/pump/omnipod-common/src/main/res/values-da-rDK/strings.xml +++ b/pump/omnipod-common/src/main/res/values-da-rDK/strings.xml @@ -162,7 +162,6 @@ Ingen aktiv pod Seneste forb: %1$d min siden - Sidste bolus: %1$s @ %2$s Midl: %1$s Forlænget: %1$s Reservoir: %1$sIE diff --git a/pump/omnipod-common/src/main/res/values-de-rDE/strings.xml b/pump/omnipod-common/src/main/res/values-de-rDE/strings.xml index 04d461c2910..8350e0f96e0 100644 --- a/pump/omnipod-common/src/main/res/values-de-rDE/strings.xml +++ b/pump/omnipod-common/src/main/res/values-de-rDE/strings.xml @@ -157,7 +157,6 @@ Kein aktiver Pod Letzte Verb.: vor %1$d min - Letzter Bolus: %1$s @ %2$s Temp: %1$s Verlängert: %1$s Reserv: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-el-rGR/strings.xml b/pump/omnipod-common/src/main/res/values-el-rGR/strings.xml index 63370e9d6e5..c732758a314 100644 --- a/pump/omnipod-common/src/main/res/values-el-rGR/strings.xml +++ b/pump/omnipod-common/src/main/res/values-el-rGR/strings.xml @@ -163,7 +163,6 @@ Δεν Υπάρχει Ενεργό Pod Τελευταία Σύνδεση: %1$d λεπτά πριν - Τελευταίο Bolus: %1$s @ %2$s Προσωρινός Ρυθμός: %1$s Εκτεταμένο bolus: %1$s Δεξαμενή: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-es-rES/strings.xml b/pump/omnipod-common/src/main/res/values-es-rES/strings.xml index f71016fbdba..aceeb73b935 100644 --- a/pump/omnipod-common/src/main/res/values-es-rES/strings.xml +++ b/pump/omnipod-common/src/main/res/values-es-rES/strings.xml @@ -165,7 +165,7 @@ Ningún Pod Activo ÚltimaConexión: hace %1$d minutos - ÚltimoBolo: %1$s @ %2$s + ÚltimoBolo: %1$s U @ %2$s Temp: %1$s Extendido: %1$s Reservorio: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-fr-rFR/strings.xml b/pump/omnipod-common/src/main/res/values-fr-rFR/strings.xml index 4e5374fd1ca..938f5023e8c 100644 --- a/pump/omnipod-common/src/main/res/values-fr-rFR/strings.xml +++ b/pump/omnipod-common/src/main/res/values-fr-rFR/strings.xml @@ -164,7 +164,7 @@ Pas de Pod actif Dernière connexion : il y a %1$d min - Dernier bolus : %1$s @ %2$s + Dernier bolus: %1$sU @ %2$s Temps : %1$s Étendu : %1$s Réserve : %1$sU diff --git a/pump/omnipod-common/src/main/res/values-it-rIT/strings.xml b/pump/omnipod-common/src/main/res/values-it-rIT/strings.xml index 6daff6b2651..5b860b7e0fe 100644 --- a/pump/omnipod-common/src/main/res/values-it-rIT/strings.xml +++ b/pump/omnipod-common/src/main/res/values-it-rIT/strings.xml @@ -164,7 +164,7 @@ Nessun pod attivo Ultima conn.: %1$d min fa - Ultimo bolo: %1$s @ %2$s + Ultimo Bolo: %1$sU @ %2$s Temp: %1$s Esteso: %1$s Serb: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-iw-rIL/strings.xml b/pump/omnipod-common/src/main/res/values-iw-rIL/strings.xml index 88fd3fae796..59200c2a91e 100644 --- a/pump/omnipod-common/src/main/res/values-iw-rIL/strings.xml +++ b/pump/omnipod-common/src/main/res/values-iw-rIL/strings.xml @@ -163,7 +163,6 @@ אין פוד פעיל חיבור אחרון: לפני %1$d דקות - בולוס אחרון: %1$s ב-%2$s בזאלי זמני: %1$s ממושך: %1$s מכל: %1$s יח\' diff --git a/pump/omnipod-common/src/main/res/values-ko-rKR/strings.xml b/pump/omnipod-common/src/main/res/values-ko-rKR/strings.xml index 97e48a8d4ef..f263a33c5b7 100644 --- a/pump/omnipod-common/src/main/res/values-ko-rKR/strings.xml +++ b/pump/omnipod-common/src/main/res/values-ko-rKR/strings.xml @@ -157,7 +157,6 @@ 활성화된 Pod 없음 마지막 연결: %1$d 분 전 - 마지막 bolus: %1$s @ %2$s 임시: %1$s 확장: %1$s 잔여 인슐린 양: %1$s U diff --git a/pump/omnipod-common/src/main/res/values-lt-rLT/strings.xml b/pump/omnipod-common/src/main/res/values-lt-rLT/strings.xml index 6189aa85df9..080ae479a4d 100644 --- a/pump/omnipod-common/src/main/res/values-lt-rLT/strings.xml +++ b/pump/omnipod-common/src/main/res/values-lt-rLT/strings.xml @@ -164,7 +164,6 @@ Nėra aktyvaus Pod Pask. prijung: prieš %1$d min - PaskBolusas: %1$s @ %2$s Laik.bazė: %1$s Ištęstas: %1$s Rezerv: %1$svv diff --git a/pump/omnipod-common/src/main/res/values-nb-rNO/strings.xml b/pump/omnipod-common/src/main/res/values-nb-rNO/strings.xml index d0510d1eeb8..2d7824b3e4f 100644 --- a/pump/omnipod-common/src/main/res/values-nb-rNO/strings.xml +++ b/pump/omnipod-common/src/main/res/values-nb-rNO/strings.xml @@ -164,8 +164,8 @@ Ingen aktiv Pod Siste tilkobling: %1$d min siden - Siste bolus: %1$s @ %2$s - Temp: %1$s + Siste bolus: %1$s E @%2$s + Midl. basal: %1$s Forlenget: %1$s Reservoar: %1$s E diff --git a/pump/omnipod-common/src/main/res/values-nl-rNL/strings.xml b/pump/omnipod-common/src/main/res/values-nl-rNL/strings.xml index 0ab1eccd3a4..e47e076549b 100644 --- a/pump/omnipod-common/src/main/res/values-nl-rNL/strings.xml +++ b/pump/omnipod-common/src/main/res/values-nl-rNL/strings.xml @@ -164,7 +164,6 @@ Geen actieve Pod Laatste verbinding: %1$d min geleden - Laatste bolus: %1$s @ %2$s Tijdelijk: %1$s Verlengd: %1$s Reservoir: %1$sE diff --git a/pump/omnipod-common/src/main/res/values-pl-rPL/strings.xml b/pump/omnipod-common/src/main/res/values-pl-rPL/strings.xml index 25a5237a3a7..1a23fb41e3f 100644 --- a/pump/omnipod-common/src/main/res/values-pl-rPL/strings.xml +++ b/pump/omnipod-common/src/main/res/values-pl-rPL/strings.xml @@ -164,7 +164,6 @@ Brak akt. Poda Ost.Poł.: %1$d m. temu - Ost.Bolus: %1$s @ %2$s Tymcz.: %1$s Rozsz.: %1$s Zbior.: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-pt-rBR/strings.xml b/pump/omnipod-common/src/main/res/values-pt-rBR/strings.xml index 09699019655..5cf0d2fb719 100644 --- a/pump/omnipod-common/src/main/res/values-pt-rBR/strings.xml +++ b/pump/omnipod-common/src/main/res/values-pt-rBR/strings.xml @@ -157,7 +157,6 @@ Nenhum Pod Ativo Última conexão: %1$d minutos atrás - Último bolus: %1$s @ %2$s AlvoTemporário: %1$s Estendido: %1$s Reservatório: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-pt-rPT/strings.xml b/pump/omnipod-common/src/main/res/values-pt-rPT/strings.xml index 1b5ff3971bc..85aa0f04651 100644 --- a/pump/omnipod-common/src/main/res/values-pt-rPT/strings.xml +++ b/pump/omnipod-common/src/main/res/values-pt-rPT/strings.xml @@ -158,7 +158,6 @@ Nenhum Pod Activo ÚltimaLig: %1$d min. atrás - ÚltimoBólus: %1$s @ %2$s Temp: %1$s Estendido: %1$s Reserv: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-ro-rRO/strings.xml b/pump/omnipod-common/src/main/res/values-ro-rRO/strings.xml index 251db93f7dc..38a848a7131 100644 --- a/pump/omnipod-common/src/main/res/values-ro-rRO/strings.xml +++ b/pump/omnipod-common/src/main/res/values-ro-rRO/strings.xml @@ -164,7 +164,6 @@ Niciun Pod activ UltimaConexiune: acum %1$d min - UltimulBolus: %1$s @ %2$s BazalaTemporara: %1$s BolusExtins: %1$s Rezervor: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-ru-rRU/strings.xml b/pump/omnipod-common/src/main/res/values-ru-rRU/strings.xml index 083dc5518c7..3e148d37857 100644 --- a/pump/omnipod-common/src/main/res/values-ru-rRU/strings.xml +++ b/pump/omnipod-common/src/main/res/values-ru-rRU/strings.xml @@ -164,7 +164,6 @@ Нет активных Pod Предыдущее соединение: %1$d мин. назад - Предыдущий болюс: %1$s @ %2$s Временн %1$s Пролонгированный: %1$s Резервуар: %1$sед diff --git a/pump/omnipod-common/src/main/res/values-sk-rSK/strings.xml b/pump/omnipod-common/src/main/res/values-sk-rSK/strings.xml index a1798fa88e2..77f3ed17540 100644 --- a/pump/omnipod-common/src/main/res/values-sk-rSK/strings.xml +++ b/pump/omnipod-common/src/main/res/values-sk-rSK/strings.xml @@ -164,7 +164,7 @@ Žiadny aktívny Pod Posledné spoj: pred %1$d min - Posledný Bolus: %1$s @ %2$s + Posledný bolus: %1$s JI @ %2$s Doč. bazál: %1$s Predl. bolus: %1$s Zásobník: %1$sJI diff --git a/pump/omnipod-common/src/main/res/values-sv-rSE/strings.xml b/pump/omnipod-common/src/main/res/values-sv-rSE/strings.xml index 9e05a882500..dafb39aaa98 100644 --- a/pump/omnipod-common/src/main/res/values-sv-rSE/strings.xml +++ b/pump/omnipod-common/src/main/res/values-sv-rSE/strings.xml @@ -157,7 +157,6 @@ Ingen aktiv pod Sen ansl: %1$d min sedan - Sen Bolus: %1$s @ %2$s Temp: %1$s Förl: %1$s Res: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-tr-rTR/strings.xml b/pump/omnipod-common/src/main/res/values-tr-rTR/strings.xml index 39fb3b22b8e..c8f601eb905 100644 --- a/pump/omnipod-common/src/main/res/values-tr-rTR/strings.xml +++ b/pump/omnipod-common/src/main/res/values-tr-rTR/strings.xml @@ -164,7 +164,6 @@ Aktif Pod Yok Son bağl: %1$d dak. önce - SonBolus: %1$s @ %2$s Geçici: %1$s Yayma: %1$s Rezerv: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-zh-rCN/strings.xml b/pump/omnipod-common/src/main/res/values-zh-rCN/strings.xml index fc2ecd0e496..d69a97ed2b4 100644 --- a/pump/omnipod-common/src/main/res/values-zh-rCN/strings.xml +++ b/pump/omnipod-common/src/main/res/values-zh-rCN/strings.xml @@ -157,7 +157,6 @@ 没有活动的 Pod 上次连接: %1$d 分钟以前 - 上传大剂量: %1$s @ %2$s 临时: %1$s 扩展: %1$s 储药器v: %1$sU diff --git a/pump/omnipod-common/src/main/res/values-zh-rTW/strings.xml b/pump/omnipod-common/src/main/res/values-zh-rTW/strings.xml index 16ef5a5c4bd..f7ee106f08e 100644 --- a/pump/omnipod-common/src/main/res/values-zh-rTW/strings.xml +++ b/pump/omnipod-common/src/main/res/values-zh-rTW/strings.xml @@ -164,7 +164,7 @@ 無可用的 Pod 最後連線:%1$d 分鐘前 - 最後劑量:%1$s @ %2$s + 最後注射:%1$s U @ %2$s 臨時基礎率:%1$s 延長劑量:%1$s 儲存槽:%1$sU diff --git a/pump/omnipod-common/src/main/res/values/strings.xml b/pump/omnipod-common/src/main/res/values/strings.xml index 21af59b636a..c52a9e0ab03 100644 --- a/pump/omnipod-common/src/main/res/values/strings.xml +++ b/pump/omnipod-common/src/main/res/values/strings.xml @@ -196,7 +196,7 @@ No Active Pod LastConn: %1$d min ago - LastBolus: %1$s @ %2$s + LastBolus: %1$s U @ %2$s Temp: %1$s Extended: %1$s Reserv: %1$sU diff --git a/pump/omnipod-dash/src/main/kotlin/app/aaps/pump/omnipod/dash/OmnipodDashPumpPlugin.kt b/pump/omnipod-dash/src/main/kotlin/app/aaps/pump/omnipod/dash/OmnipodDashPumpPlugin.kt index 56a4b57df5c..b0ae8ad9256 100644 --- a/pump/omnipod-dash/src/main/kotlin/app/aaps/pump/omnipod/dash/OmnipodDashPumpPlugin.kt +++ b/pump/omnipod-dash/src/main/kotlin/app/aaps/pump/omnipod/dash/OmnipodDashPumpPlugin.kt @@ -1060,7 +1060,7 @@ class OmnipodDashPumpPlugin @Inject constructor( temporaryBasal?.run { ret += rh.gs( app.aaps.pump.omnipod.common.R.string.omnipod_common_short_status_temp_basal, - this.toStringFull(dateUtil, decimalFormatter) + this.toStringFull(dateUtil, rh) ) + "\n" } ret += rh.gs( diff --git a/pump/omnipod-dash/src/main/res/values-zh-rTW/strings.xml b/pump/omnipod-dash/src/main/res/values-zh-rTW/strings.xml index ba10a09d1ab..2e7ad91b9b0 100644 --- a/pump/omnipod-dash/src/main/res/values-zh-rTW/strings.xml +++ b/pump/omnipod-dash/src/main/res/values-zh-rTW/strings.xml @@ -45,7 +45,8 @@ 設置新的基礎率設定檔失敗。輸送已暫停 設置基礎率設定檔可能失敗。輸送可能已暫停!請手動從 Omnipod 頁面重新整理幫浦狀態,並視需要恢復輸送。 注射狀態不確定。請重新整理幫浦狀態,以確認狀態。 - 臨時基礎率狀態不如預期!如果之前有運行臨時基礎率已被取消。請檢查已輸送的胰島素和幫浦歷史紀錄 + 臨時基礎率狀態不如預期!如果之前有運行臨時基礎率已被取消。請檢查已輸送的胰島素和幫浦歷史紀錄 +(請確認AAPS與幫浦在可連線的距離內) 檢查輸送狀態 設置臨時基礎率可能失敗。如果之前有運行臨時基礎率已被取消。請手動從 Omnipod 頁面重新整理幫浦狀態。 取消臨時基礎率的結果不確定 diff --git a/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/OmnipodErosPumpPlugin.java b/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/OmnipodErosPumpPlugin.java index ad5a68c745b..4dda23f821a 100644 --- a/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/OmnipodErosPumpPlugin.java +++ b/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/OmnipodErosPumpPlugin.java @@ -826,10 +826,10 @@ public String shortStatus(boolean veryShort) { } PumpSync.PumpState pumpState = pumpSync.expectedPumpState(); if (pumpState.getTemporaryBasal() != null && pumpState.getProfile() != null) { - ret += rh.gs(app.aaps.pump.omnipod.common.R.string.omnipod_common_short_status_temp_basal, pumpState.getTemporaryBasal().toStringFull(dateUtil, decimalFormatter) + "\n"); + ret += rh.gs(app.aaps.pump.omnipod.common.R.string.omnipod_common_short_status_temp_basal, pumpState.getTemporaryBasal().toStringFull(dateUtil, rh) + "\n"); } if (pumpState.getExtendedBolus() != null) { - ret += rh.gs(app.aaps.pump.omnipod.common.R.string.omnipod_common_short_status_extended_bolus, pumpState.getExtendedBolus().toStringFull(dateUtil, decimalFormatter) + "\n"); + ret += rh.gs(app.aaps.pump.omnipod.common.R.string.omnipod_common_short_status_extended_bolus, pumpState.getExtendedBolus().toStringFull(dateUtil, rh) + "\n"); } ret += rh.gs(app.aaps.pump.omnipod.common.R.string.omnipod_common_short_status_reservoir, (getReservoirLevel() > OmnipodConstants.MAX_RESERVOIR_READING ? "50+" : decimalFormatter.to0Decimal(getReservoirLevel()))) + "\n"; if (isUseRileyLinkBatteryLevel()) { diff --git a/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt b/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt index 2078acc6d61..41084c80503 100644 --- a/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt +++ b/pump/omnipod-eros/src/main/java/app/aaps/pump/omnipod/eros/ui/OmnipodErosOverviewFragment.kt @@ -89,7 +89,7 @@ class OmnipodErosOverviewFragment : DaggerFragment() { private var disposables: CompositeDisposable = CompositeDisposable() private val handler = Handler(HandlerThread(this::class.simpleName + "Handler").also { it.start() }.looper) - private lateinit var refreshLoop: Runnable + private var refreshLoop: Runnable init { refreshLoop = Runnable { diff --git a/pump/pump-common/src/main/kotlin/app/aaps/pump/common/PumpPluginAbstract.kt b/pump/pump-common/src/main/kotlin/app/aaps/pump/common/PumpPluginAbstract.kt index 97ff6cd6e06..948b73c9a57 100644 --- a/pump/pump-common/src/main/kotlin/app/aaps/pump/common/PumpPluginAbstract.kt +++ b/pump/pump-common/src/main/kotlin/app/aaps/pump/common/PumpPluginAbstract.kt @@ -292,8 +292,8 @@ abstract class PumpPluginAbstract protected constructor( ret += "LastBolus: ${decimalFormatter.to2Decimal(pumpStatusData.lastBolusAmount!!)}U @${DateFormat.format("HH:mm", it)}\n" } } - pumpSync.expectedPumpState().temporaryBasal?.let { ret += "Temp: ${it.toStringFull(dateUtil, decimalFormatter)}\n" } - pumpSync.expectedPumpState().extendedBolus?.let { ret += "Extended: ${it.toStringFull(dateUtil, decimalFormatter)}\n" } + pumpSync.expectedPumpState().temporaryBasal?.let { ret += "Temp: ${it.toStringFull(dateUtil, rh)}\n" } + pumpSync.expectedPumpState().extendedBolus?.let { ret += "Extended: ${it.toStringFull(dateUtil, rh)}\n" } ret += "IOB: ${pumpStatusData.iob}U\n" ret += "Reserv: ${decimalFormatter.to0Decimal(pumpStatusData.reservoirRemainingUnits)}U\n" ret += "Batt: ${pumpStatusData.batteryRemaining}\n" diff --git a/pump/pump-common/src/main/kotlin/app/aaps/pump/common/ble/BondStateReceiver.kt b/pump/pump-common/src/main/kotlin/app/aaps/pump/common/ble/BondStateReceiver.kt deleted file mode 100644 index 81090d9412c..00000000000 --- a/pump/pump-common/src/main/kotlin/app/aaps/pump/common/ble/BondStateReceiver.kt +++ /dev/null @@ -1,73 +0,0 @@ -package app.aaps.pump.common.ble - -import android.bluetooth.BluetoothDevice -import android.content.Context -import android.content.Intent -import androidx.annotation.StringRes -import app.aaps.core.interfaces.logging.AAPSLogger -import app.aaps.core.interfaces.logging.LTag -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.utils.extensions.safeGetParcelableExtra -import com.google.gson.Gson -import dagger.android.DaggerBroadcastReceiver -import javax.inject.Inject - -class BondStateReceiver( - @StringRes var deviceAddress: Int, - @StringRes var bondedFlag: Int, - private var targetDevice: String, - private var targetState: Int -) : DaggerBroadcastReceiver() { - - @Inject lateinit var sp: SP - @Inject lateinit var context: Context - @Inject lateinit var rh: ResourceHelper - @Inject lateinit var aapsLogger: AAPSLogger - @Inject lateinit var rxBus: RxBus - - var gson = Gson() - - override fun onReceive(context: Context, intent: Intent) { - super.onReceive(context, intent) - val action = intent.action - val device = intent.safeGetParcelableExtra(BluetoothDevice.EXTRA_DEVICE, BluetoothDevice::class.java) - aapsLogger.info(LTag.PUMPBTCOMM, "in onReceive: INTENT" + gson.toJson(intent)) - if (device == null) { - aapsLogger.error(LTag.PUMPBTCOMM, "onReceive. Device is null. Exiting.") - return - } else { - if (device.address != targetDevice) { - aapsLogger.error(LTag.PUMPBTCOMM, "onReceive. Device is not the same as targetDevice. Exiting.") - return - } - } - - // Check if action is valid - if (action == null) return - - // Take action depending on new bond state - if (action == BluetoothDevice.ACTION_BOND_STATE_CHANGED) { - val bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR) - val previousBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1) - aapsLogger.info(LTag.PUMPBTCOMM, "in onReceive: bondState=$bondState, previousBondState=$previousBondState") - if (bondState == targetState) { - aapsLogger.info(LTag.PUMPBTCOMM, "onReceive: found targeted state: $targetState") - val currentDeviceSettings = sp.getString(deviceAddress, "") - if (currentDeviceSettings == targetDevice) { - if (targetState == 12) { - sp.putBoolean(bondedFlag, true) - } else if (targetState == 10) { - sp.putBoolean(bondedFlag, false) - } - context.unregisterReceiver(this) - } else { - aapsLogger.error(LTag.PUMPBTCOMM, "onReceive: Device stored in SP is not the same as target device, process interrupted") - } - } else { - aapsLogger.info(LTag.PUMPBTCOMM, "onReceive: currentBondState=$bondState, targetBondState=$targetState") - } - } - } -} \ No newline at end of file diff --git a/pump/virtual/src/main/kotlin/app/aaps/pump/virtual/VirtualPumpPlugin.kt b/pump/virtual/src/main/kotlin/app/aaps/pump/virtual/VirtualPumpPlugin.kt index e9450b94643..d6fed8eeb2f 100644 --- a/pump/virtual/src/main/kotlin/app/aaps/pump/virtual/VirtualPumpPlugin.kt +++ b/pump/virtual/src/main/kotlin/app/aaps/pump/virtual/VirtualPumpPlugin.kt @@ -85,7 +85,7 @@ open class VirtualPumpPlugin @Inject constructor( .preferencesId(PluginDescription.PREFERENCE_SCREEN) .description(R.string.description_pump_virtual) .setDefault() - .neverVisible(config.NSCLIENT), + .neverVisible(config.AAPSCLIENT), aapsLogger, rh, commandQueue ), Pump, VirtualPump { @@ -134,7 +134,7 @@ open class VirtualPumpPlugin @Inject constructor( } override val isFakingTempsByExtendedBoluses: Boolean - get() = config.NSCLIENT && fakeDataDetected + get() = config.AAPSCLIENT && fakeDataDetected override var fakeDataDetected = false override fun loadTDDs(): PumpEnactResult { //no result, could read DB in the future? @@ -175,7 +175,7 @@ open class VirtualPumpPlugin @Inject constructor( override val reservoirLevel: Double get() = - if (config.NSCLIENT) processedDeviceStatusData.pumpData?.reservoir ?: -1.0 + if (config.AAPSCLIENT) processedDeviceStatusData.pumpData?.reservoir ?: -1.0 else reservoirInUnits.toDouble() override val batteryLevel: Int @@ -215,7 +215,7 @@ open class VirtualPumpPlugin @Inject constructor( rxBus.send(EventVirtualPumpUpdateGui()) lastDataTime = System.currentTimeMillis() if (detailedBolusInfo.insulin > 0) { - if (config.NSCLIENT) // do not store pump serial (record will not be marked PH) + if (config.AAPSCLIENT) // do not store pump serial (record will not be marked PH) disposable += persistenceLayer.insertOrUpdateBolus( bolus = detailedBolusInfo.createBolus(), action = Action.BOLUS, diff --git a/shared/impl/src/main/kotlin/app/aaps/shared/impl/utils/DateUtilImpl.kt b/shared/impl/src/main/kotlin/app/aaps/shared/impl/utils/DateUtilImpl.kt index 8ac207940eb..5985666bec3 100644 --- a/shared/impl/src/main/kotlin/app/aaps/shared/impl/utils/DateUtilImpl.kt +++ b/shared/impl/src/main/kotlin/app/aaps/shared/impl/utils/DateUtilImpl.kt @@ -1,8 +1,6 @@ package app.aaps.shared.impl.utils import android.content.Context -import android.os.Build -import androidx.annotation.RequiresApi import androidx.collection.LongSparseArray import app.aaps.core.data.time.T import app.aaps.core.interfaces.R @@ -21,6 +19,9 @@ import java.text.SimpleDateFormat import java.time.Instant import java.time.ZoneId import java.time.ZoneOffset +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle import java.util.Calendar import java.util.Date import java.util.EnumSet @@ -109,8 +110,9 @@ class DateUtilImpl @Inject constructor(private val context: Context) : DateUtil } override fun dateString(mills: Long): String { - val df = DateFormat.getDateInstance(DateFormat.SHORT) - return df.format(mills) + val zonedTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(mills), ZoneId.systemDefault()) + val dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) + return zonedTime.format(dateFormatter) } override fun dateStringRelative(mills: Long, rh: ResourceHelper): String { @@ -418,7 +420,6 @@ class DateUtilImpl @Inject constructor(private val context: Context) : DateUtil return df.format(hour.toLong()) + ":" + df.format(minutes.toLong()) } - @RequiresApi(Build.VERSION_CODES.O) override fun timeZoneByOffset(offsetInMilliseconds: Long): TimeZone = TimeZone.getTimeZone( if (offsetInMilliseconds == 0L) ZoneId.of("UTC") diff --git a/shared/impl/src/main/res/values-lt-rLT/strings.xml b/shared/impl/src/main/res/values-lt-rLT/strings.xml index 42dfff51b14..d7b8c22dee7 100644 --- a/shared/impl/src/main/res/values-lt-rLT/strings.xml +++ b/shared/impl/src/main/res/values-lt-rLT/strings.xml @@ -7,16 +7,36 @@ Laisvas tekstas 2 Laisvas tekstas 3 Laisvas tekstas 4 + Paciento vardas (iš AAPSClient ar AAPSClient2) + AIO žyma arba bendras AIO, jei pasirinktas detalus (iš AAPSClient arba AAPSClient2) + Bendras AIO arba (Bolus_IOB|Basal_IOB) jei pasirinktas detalus (iš AAPSClient ar AAPSClient2) + AAO reikšmė (iš AAPSClient ar AAPSClient2) + Trumpa KG delta (iš AAPSClient ar AAPSClient2) + Vidutinė KG delta (15min) (iš AAPSClient ar AAPSClient2) + Laikinas tikslas arba Laikino Tikslo apatinė ir viršutinė ribos (iš AAPSClient arba AAPSClient2) + Rezervuaro lygis (iš AAPSClient ar AAPSClient2) + Bendras sistemos baterijos lygis (%) (iš AAPSClient ar AAPSClient2) + Valandinė bazė (iš AAPSClient ar AAPSClient2) + KG poveikio reikšmė (iš AAPSClient ar AAPSClient2) + Apibendrinta būsena (iš AAPSClient ar AAPSClient2) + Ciklo būklė ir praėjęs laikas (iš AAPSClient ar AAPSClient2) + Tendencijos kryptis (iš AAPSClient ar AAPSClient2) + Paskutinės gautos KG laikas, minutėmis (iš AAPSClient arba AAPSClient2) + KG reikšmė (iš AAPSClient ar AAPSClient2) + Paciento vardas Sudėtinis arba detalus AIO Sudėtinis arba detalus (Boluso_AIO|Bazės_AIO) AIO AAO žyma AAO vertė Trumpo laikotarpio pokytis Vidutinis pokytis (15 min) + Laikinas tikslas arba Laikino tikslo apatinė ir viršutinė ribos + Rezervuaro lygis Telefono baterija (%) Baterija (%) Bazė BGI vertė + Apibendrinta būsena Laikas (val:min arba val:min:sek) Val. Min. diff --git a/ui/src/main/kotlin/app/aaps/ui/dialogs/CarbsDialog.kt b/ui/src/main/kotlin/app/aaps/ui/dialogs/CarbsDialog.kt index b4afc60fc4c..1f6b5d8f183 100644 --- a/ui/src/main/kotlin/app/aaps/ui/dialogs/CarbsDialog.kt +++ b/ui/src/main/kotlin/app/aaps/ui/dialogs/CarbsDialog.kt @@ -169,7 +169,7 @@ class CarbsDialog : DialogFragmentWithDate() { } val plus3text = toSignedString(preferences.get(IntKey.OverviewCarbsButtonIncrement3)) binding.plus3.text = plus3text - binding.plus2.contentDescription = rh.gs(app.aaps.core.ui.R.string.carbs) + " " + plus3text + binding.plus3.contentDescription = rh.gs(app.aaps.core.ui.R.string.carbs) + " " + plus3text binding.plus3.setOnClickListener { binding.carbs.value = max(0.0, binding.carbs.value + preferences.get(IntKey.OverviewCarbsButtonIncrement3)) validateInputs() diff --git a/ui/src/main/kotlin/app/aaps/ui/dialogs/InsulinDialog.kt b/ui/src/main/kotlin/app/aaps/ui/dialogs/InsulinDialog.kt index 617c86d46ef..e4331696a61 100644 --- a/ui/src/main/kotlin/app/aaps/ui/dialogs/InsulinDialog.kt +++ b/ui/src/main/kotlin/app/aaps/ui/dialogs/InsulinDialog.kt @@ -124,7 +124,7 @@ class InsulinDialog : DialogFragmentWithDate() { super.onViewCreated(view, savedInstanceState) val pump = activePlugin.activePump - if (config.NSCLIENT) { + if (config.AAPSCLIENT) { binding.recordOnly.isChecked = true binding.recordOnly.isEnabled = false } diff --git a/ui/src/main/kotlin/app/aaps/ui/dialogs/TreatmentDialog.kt b/ui/src/main/kotlin/app/aaps/ui/dialogs/TreatmentDialog.kt index 8b40adcdf90..0f15592974d 100644 --- a/ui/src/main/kotlin/app/aaps/ui/dialogs/TreatmentDialog.kt +++ b/ui/src/main/kotlin/app/aaps/ui/dialogs/TreatmentDialog.kt @@ -104,7 +104,7 @@ class TreatmentDialog : DialogFragmentWithDate() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (config.NSCLIENT) { + if (config.AAPSCLIENT) { binding.recordOnly.isChecked = true binding.recordOnly.isEnabled = false } diff --git a/ui/src/main/kotlin/app/aaps/ui/widget/Widget.kt b/ui/src/main/kotlin/app/aaps/ui/widget/Widget.kt index f5ff2192175..4b6390e773d 100644 --- a/ui/src/main/kotlin/app/aaps/ui/widget/Widget.kt +++ b/ui/src/main/kotlin/app/aaps/ui/widget/Widget.kt @@ -35,10 +35,12 @@ import app.aaps.core.interfaces.ui.UiInteraction import app.aaps.core.interfaces.utils.DateUtil import app.aaps.core.interfaces.utils.DecimalFormatter import app.aaps.core.interfaces.utils.TrendCalculator +import app.aaps.core.keys.DoubleKey import app.aaps.core.objects.extensions.directionToIcon import app.aaps.core.objects.extensions.displayText import app.aaps.core.objects.extensions.round import app.aaps.core.objects.profile.ProfileSealed +import app.aaps.core.ui.dialogs.OKDialog import app.aaps.core.ui.extensions.toVisibility import app.aaps.core.ui.extensions.toVisibilityKeepSpace import app.aaps.ui.R @@ -120,7 +122,12 @@ class Widget : AppWidgetProvider() { val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT) // Widgets allow click handlers to only launch pending intents views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent) - views.setInt(R.id.widget_layout, "setBackgroundColor", Color.argb(alpha, 0, 0, 0)) + if (config.APS) + views.setInt(R.id.widget_layout, "setBackgroundColor", Color.argb(alpha, 0, 0, 0)) + if (config.AAPSCLIENT1) + views.setInt(R.id.widget_layout, "setBackgroundColor", Color.argb(alpha, 0xE8, 0xC5, 0x0C)) + if (config.AAPSCLIENT2) + views.setInt(R.id.widget_layout, "setBackgroundColor", Color.argb(alpha, 0x0F, 0xBB, 0xE0)) handler.post { if (config.appInitialized) { @@ -274,12 +281,33 @@ class Widget : AppWidgetProvider() { private fun updateSensitivity(views: RemoteViews) { val lastAutosensData = iobCobCalculator.ads.getLastAutosensData("Widget", aapsLogger, dateUtil) + val lastAutosensRatio = lastAutosensData?.let { it.autosensResult.ratio * 100 } if (constraintChecker.isAutosensModeEnabled().value()) - views.setImageViewResource(R.id.sensitivity_icon, app.aaps.core.objects.R.drawable.ic_swap_vert_black_48dp_green) + views.setImageViewResource( + R.id.sensitivity_icon, + lastAutosensRatio?.let { + when { + it > 100.0 -> app.aaps.core.objects.R.drawable.ic_as_above + it < 100.0 -> app.aaps.core.objects.R.drawable.ic_as_below + else -> app.aaps.core.objects.R.drawable.ic_swap_vert_black_48dp_green + } + } + ?: app.aaps.core.objects.R.drawable.ic_swap_vert_black_48dp_green + ) else - views.setImageViewResource(R.id.sensitivity_icon, app.aaps.core.objects.R.drawable.ic_x_swap_vert) + views.setImageViewResource( + R.id.sensitivity_icon, + lastAutosensRatio?.let { + when { + it > 100.0 -> app.aaps.core.objects.R.drawable.ic_x_as_above + it < 100.0 -> app.aaps.core.objects.R.drawable.ic_x_as_below + else -> app.aaps.core.objects.R.drawable.ic_x_swap_vert + } + } + ?: app.aaps.core.objects.R.drawable.ic_x_swap_vert + ) views.setTextViewText(R.id.sensitivity, lastAutosensData?.let { - String.format(Locale.ENGLISH, "%.0f%%", it.autosensResult.ratio * 100) + rh.gs(app.aaps.core.ui.R.string.autosens_short, it.autosensResult.ratio * 100) } ?: "") // Show variable sensitivity @@ -287,17 +315,20 @@ class Widget : AppWidgetProvider() { val isfMgdl = profileFunction.getProfile()?.getProfileIsfMgdl() val variableSens = if (config.APS) request?.variableSens ?: 0.0 - else if (config.NSCLIENT) processedDeviceStatusData.getAPSResult()?.variableSens ?: 0.0 + else if (config.AAPSCLIENT) processedDeviceStatusData.getAPSResult()?.variableSens ?: 0.0 else 0.0 val ratioUsed = request?.autosensResult?.ratio ?: 1.0 if (variableSens != isfMgdl && variableSens != 0.0 && isfMgdl != null) { - var text = if (ratioUsed != 1.0 && ratioUsed != lastAutosensData?.autosensResult?.ratio) String.format(Locale.getDefault(), "%.0f%%\n", ratioUsed * 100) else "" - text += String.format( - Locale.getDefault(), "%1$.1f→%2$.1f", - profileUtil.fromMgdlToUnits(isfMgdl, profileFunction.getUnits()), - profileUtil.fromMgdlToUnits(variableSens, profileFunction.getUnits()) + val overViewText: ArrayList = ArrayList() + if (ratioUsed != 1.0 && ratioUsed != lastAutosensData?.autosensResult?.ratio) overViewText.add(rh.gs(app.aaps.core.ui.R.string.algorithm_short,ratioUsed * 100)) + overViewText.add( + String.format( + Locale.getDefault(), "%1$.1f→%2$.1f", + profileUtil.fromMgdlToUnits(isfMgdl, profileFunction.getUnits()), + profileUtil.fromMgdlToUnits(variableSens, profileFunction.getUnits()) + ) ) - views.setTextViewText(R.id.variable_sensitivity, text) + views.setTextViewText(R.id.variable_sensitivity, overViewText.joinToString("\n")) views.setViewVisibility(R.id.variable_sensitivity, View.VISIBLE) } else views.setViewVisibility(R.id.variable_sensitivity, View.GONE) } diff --git a/ui/src/main/res/layout/dialog_carbs.xml b/ui/src/main/res/layout/dialog_carbs.xml index cc6f92e1a39..71d83a7833e 100644 --- a/ui/src/main/res/layout/dialog_carbs.xml +++ b/ui/src/main/res/layout/dialog_carbs.xml @@ -53,6 +53,7 @@ @@ -106,6 +109,7 @@ diff --git a/ui/src/main/res/layout/dialog_edit_quickwizard.xml b/ui/src/main/res/layout/dialog_edit_quickwizard.xml index 0dcbf03b606..4d64fb78568 100644 --- a/ui/src/main/res/layout/dialog_edit_quickwizard.xml +++ b/ui/src/main/res/layout/dialog_edit_quickwizard.xml @@ -72,6 +72,7 @@ diff --git a/ui/src/main/res/layout/dialog_insulin.xml b/ui/src/main/res/layout/dialog_insulin.xml index d62dd001d96..8def614042b 100644 --- a/ui/src/main/res/layout/dialog_insulin.xml +++ b/ui/src/main/res/layout/dialog_insulin.xml @@ -55,6 +55,7 @@ diff --git a/ui/src/main/res/layout/dialog_profileswitch.xml b/ui/src/main/res/layout/dialog_profileswitch.xml index 3fc1703b59f..ec08f01fd1d 100644 --- a/ui/src/main/res/layout/dialog_profileswitch.xml +++ b/ui/src/main/res/layout/dialog_profileswitch.xml @@ -210,6 +210,7 @@ Aktyvumo stebėjimas Ar norite iš naujo nustatyti aktyvumo statistiką? + Ar norite iš perskaičiuoti BPD statistiką? Statistika Skaičiuojama Neteisingas amžiaus įrašas @@ -121,6 +122,21 @@ tik laikrodyje tik telefone Greitojo patarėjo nustatymai + Mygtuko tekstas Galioja: + Tik teigiamas AIO + Superbolusas + Procentas per aukštas! nutempti ir padėti + Pridėti ištęstus angliavandenius + Naudota skaičiavimams: + Apribojimų pažeidimas + Pakeiskite įvestus duomenis! + Patvirtinkite terapiją + Perskaičiuoti + + Abu + Tik teigiamas + Tik neigiamas + diff --git a/ui/src/main/res/values-nb-rNO/strings.xml b/ui/src/main/res/values-nb-rNO/strings.xml index 24646c52f56..a50b189b622 100644 --- a/ui/src/main/res/values-nb-rNO/strings.xml +++ b/ui/src/main/res/values-nb-rNO/strings.xml @@ -73,7 +73,7 @@ Resultat: %1$s %2$s Mangler %1$d g nåværende blodsukker - Karbo-tid + Karbotid angi nedtellingsalarm for karbo Vis beregning diff --git a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt index d07ae74538e..6955d6d9d5c 100644 --- a/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt +++ b/wear/src/main/kotlin/app/aaps/wear/watchfaces/CustomWatchface.kt @@ -232,7 +232,7 @@ class CustomWatchface : BaseWatchFace() { DynProvider.init(this, json) } - enableSecond = json.optBoolean(JsonKeys.ENABLESECOND.key) && sp.getBoolean(R.string.key_show_seconds, true) + enableSecond = json.optBoolean(JsonKeys.ENABLESECOND.key) && sp.getBoolean(PrefMap.SHOW_SECOND.prefKey, PrefMap.SHOW_SECOND.defaultValue as Boolean) pointSize = json.optInt(JsonKeys.POINTSIZE.key, 2) dayNameFormat = json.optString(JsonKeys.DAYNAMEFORMAT.key, "E").takeIf { it.matches(Regex("E{1,4}")) } ?: "E" monthFormat = json.optString(JsonKeys.MONTHFORMAT.key, "MMM").takeIf { it.matches(Regex("M{1,4}")) } ?: "MMM" @@ -447,7 +447,7 @@ class CustomWatchface : BaseWatchFace() { private enum class ViewMap( val key: String, @IdRes val id: Int, - @StringRes val pref: Int? = null, + val pref: PrefMap? = null, // PreMap key should be typeBool == true to manage visibility of associated View @IdRes val defaultDrawable: Int? = null, val customDrawable: ResFileMap? = null, val customHigh: ResFileMap? = null, @@ -476,66 +476,66 @@ class CustomWatchface : BaseWatchFace() { FREETEXT3(ViewKeys.FREETEXT3.key, R.id.freetext3), FREETEXT4(ViewKeys.FREETEXT4.key, R.id.freetext4), PATIENT_NAME_EXT1(ViewKeys.PATIENT_NAME_EXT1.key, R.id.patient_name_ext1, external = 1), - IOB1_EXT1(ViewKeys.IOB1_EXT1.key, R.id.iob1_ext1, R.string.key_show_iob, external = 1), - IOB2_EXT1(ViewKeys.IOB2_EXT1.key, R.id.iob2_ext1, R.string.key_show_iob, external = 1), - COB1_EXT1(ViewKeys.COB1_EXT1.key, R.id.cob1_ext1, R.string.key_show_cob, external = 1), - COB2_EXT1(ViewKeys.COB2_EXT1.key, R.id.cob2_ext1, R.string.key_show_cob, external = 1), - DELTA_EXT1(ViewKeys.DELTA_EXT1.key, R.id.delta_ext1, R.string.key_show_delta, external = 1), - AVG_DELTA_EXT1(ViewKeys.AVG_DELTA_EXT1.key, R.id.avg_delta_ext1, R.string.key_show_avg_delta, external = 1), - TEMP_TARGET_EXT1(ViewKeys.TEMP_TARGET_EXT1.key, R.id.temp_target_ext1, R.string.key_show_temp_target, external = 1), - RESERVOIR_EXT1(ViewKeys.RESERVOIR_EXT1.key, R.id.reservoir_ext1, R.string.key_show_reservoir_level, external = 1), - RIG_BATTERY_EXT1(ViewKeys.RIG_BATTERY_EXT1.key, R.id.rig_battery_ext1, R.string.key_show_rig_battery, external = 1), - BASALRATE_EXT1(ViewKeys.BASALRATE_EXT1.key, R.id.basalRate_ext1, R.string.key_show_temp_basal, external = 1), - BGI_EXT1(ViewKeys.BGI_EXT1.key, R.id.bgi_ext1, R.string.key_show_bgi, external = 1), - STATUS_EXT1(ViewKeys.STATUS_EXT1.key, R.id.status_ext1, R.string.key_show_external_status, external = 1), - LOOP_EXT1(ViewKeys.LOOP_EXT1.key, R.id.loop_ext1, R.string.key_show_external_status, external = 1), - DIRECTION_EXT1(ViewKeys.DIRECTION_EXT1.key, R.id.direction_ext1, R.string.key_show_direction, external = 1), - TIMESTAMP_EXT1(ViewKeys.TIMESTAMP_EXT1.key, R.id.timestamp_ext1, R.string.key_show_ago, external = 1), - SGV_EXT1(ViewKeys.SGV_EXT1.key, R.id.sgv_ext1, R.string.key_show_bg, external = 1), + IOB1_EXT1(ViewKeys.IOB1_EXT1.key, R.id.iob1_ext1, PrefMap.SHOW_IOB, external = 1), + IOB2_EXT1(ViewKeys.IOB2_EXT1.key, R.id.iob2_ext1, PrefMap.SHOW_IOB, external = 1), + COB1_EXT1(ViewKeys.COB1_EXT1.key, R.id.cob1_ext1,PrefMap.SHOW_COB, external = 1), + COB2_EXT1(ViewKeys.COB2_EXT1.key, R.id.cob2_ext1,PrefMap.SHOW_COB, external = 1), + DELTA_EXT1(ViewKeys.DELTA_EXT1.key, R.id.delta_ext1,PrefMap.SHOW_DELTA, external = 1), + AVG_DELTA_EXT1(ViewKeys.AVG_DELTA_EXT1.key, R.id.avg_delta_ext1, PrefMap.SHOW_AVG_DELTA, external = 1), + TEMP_TARGET_EXT1(ViewKeys.TEMP_TARGET_EXT1.key, R.id.temp_target_ext1, PrefMap.SHOW_TEMP_TARGET, external = 1), + RESERVOIR_EXT1(ViewKeys.RESERVOIR_EXT1.key, R.id.reservoir_ext1, PrefMap.SHOW_RESERVOIR_LEVEL, external = 1), + RIG_BATTERY_EXT1(ViewKeys.RIG_BATTERY_EXT1.key, R.id.rig_battery_ext1, PrefMap.SHOW_RIG_BATTERY, external = 1), + BASALRATE_EXT1(ViewKeys.BASALRATE_EXT1.key, R.id.basalRate_ext1, PrefMap.SHOW_TEMP_BASAL, external = 1), + BGI_EXT1(ViewKeys.BGI_EXT1.key, R.id.bgi_ext1, PrefMap.SHOW_BGI, external = 1), + STATUS_EXT1(ViewKeys.STATUS_EXT1.key, R.id.status_ext1, PrefMap.SHOW_LOOP_STATUS, external = 1), + LOOP_EXT1(ViewKeys.LOOP_EXT1.key, R.id.loop_ext1, PrefMap.SHOW_LOOP_STATUS, external = 1), + DIRECTION_EXT1(ViewKeys.DIRECTION_EXT1.key, R.id.direction_ext1, PrefMap.SHOW_DIRECTION, external = 1), + TIMESTAMP_EXT1(ViewKeys.TIMESTAMP_EXT1.key, R.id.timestamp_ext1, PrefMap.SHOW_AGO, external = 1), + SGV_EXT1(ViewKeys.SGV_EXT1.key, R.id.sgv_ext1, PrefMap.SHOW_BG, external = 1), PATIENT_NAME_EXT2(ViewKeys.PATIENT_NAME_EXT2.key, R.id.patient_name_ext2, external = 2), - IOB1_EXT2(ViewKeys.IOB1_EXT2.key, R.id.iob1_ext2, R.string.key_show_iob, external = 2), - IOB2_EXT2(ViewKeys.IOB2_EXT2.key, R.id.iob2_ext2, R.string.key_show_iob, external = 2), - COB1_EXT2(ViewKeys.COB1_EXT2.key, R.id.cob1_ext2, R.string.key_show_cob, external = 2), - COB2_EXT2(ViewKeys.COB2_EXT2.key, R.id.cob2_ext2, R.string.key_show_cob, external = 2), - DELTA_EXT2(ViewKeys.DELTA_EXT2.key, R.id.delta_ext2, R.string.key_show_delta, external = 2), - AVG_DELTA_EXT2(ViewKeys.AVG_DELTA_EXT2.key, R.id.avg_delta_ext2, R.string.key_show_avg_delta, external = 2), - TEMP_TARGET_EXT2(ViewKeys.TEMP_TARGET_EXT2.key, R.id.temp_target_ext2, R.string.key_show_temp_target, external = 2), - RESERVOIR_EXT2(ViewKeys.RESERVOIR_EXT2.key, R.id.reservoir_ext2, R.string.key_show_reservoir_level, external = 2), - RIG_BATTERY_EXT2(ViewKeys.RIG_BATTERY_EXT2.key, R.id.rig_battery_ext2, R.string.key_show_rig_battery, external = 2), - BASALRATE_EXT2(ViewKeys.BASALRATE_EXT2.key, R.id.basalRate_ext2, R.string.key_show_temp_basal, external = 2), - BGI_EXT2(ViewKeys.BGI_EXT2.key, R.id.bgi_ext2, R.string.key_show_bgi, external = 2), - STATUS_EXT2(ViewKeys.STATUS_EXT2.key, R.id.status_ext2, R.string.key_show_external_status, external = 2), - LOOP_EXT2(ViewKeys.LOOP_EXT2.key, R.id.loop_ext2, R.string.key_show_external_status, external = 2), - DIRECTION_EXT2(ViewKeys.DIRECTION_EXT2.key, R.id.direction_ext2, R.string.key_show_direction, external = 2), - TIMESTAMP_EXT2(ViewKeys.TIMESTAMP_EXT2.key, R.id.timestamp_ext2, R.string.key_show_ago, external = 2), - SGV_EXT2(ViewKeys.SGV_EXT2.key, R.id.sgv_ext2, R.string.key_show_bg, external = 2), + IOB1_EXT2(ViewKeys.IOB1_EXT2.key, R.id.iob1_ext2, PrefMap.SHOW_IOB, external = 2), + IOB2_EXT2(ViewKeys.IOB2_EXT2.key, R.id.iob2_ext2, PrefMap.SHOW_IOB, external = 2), + COB1_EXT2(ViewKeys.COB1_EXT2.key, R.id.cob1_ext2, PrefMap.SHOW_COB, external = 2), + COB2_EXT2(ViewKeys.COB2_EXT2.key, R.id.cob2_ext2, PrefMap.SHOW_COB, external = 2), + DELTA_EXT2(ViewKeys.DELTA_EXT2.key, R.id.delta_ext2, PrefMap.SHOW_DELTA, external = 2), + AVG_DELTA_EXT2(ViewKeys.AVG_DELTA_EXT2.key, R.id.avg_delta_ext2, PrefMap.SHOW_AVG_DELTA, external = 2), + TEMP_TARGET_EXT2(ViewKeys.TEMP_TARGET_EXT2.key, R.id.temp_target_ext2, PrefMap.SHOW_TEMP_TARGET, external = 2), + RESERVOIR_EXT2(ViewKeys.RESERVOIR_EXT2.key, R.id.reservoir_ext2, PrefMap.SHOW_RESERVOIR_LEVEL, external = 2), + RIG_BATTERY_EXT2(ViewKeys.RIG_BATTERY_EXT2.key, R.id.rig_battery_ext2, PrefMap.SHOW_RIG_BATTERY, external = 2), + BASALRATE_EXT2(ViewKeys.BASALRATE_EXT2.key, R.id.basalRate_ext2, PrefMap.SHOW_TEMP_BASAL, external = 2), + BGI_EXT2(ViewKeys.BGI_EXT2.key, R.id.bgi_ext2, PrefMap.SHOW_BGI, external = 2), + STATUS_EXT2(ViewKeys.STATUS_EXT2.key, R.id.status_ext2, PrefMap.SHOW_LOOP_STATUS, external = 2), + LOOP_EXT2(ViewKeys.LOOP_EXT2.key, R.id.loop_ext2, PrefMap.SHOW_LOOP_STATUS, external = 2), + DIRECTION_EXT2(ViewKeys.DIRECTION_EXT2.key, R.id.direction_ext2, PrefMap.SHOW_DIRECTION, external = 2), + TIMESTAMP_EXT2(ViewKeys.TIMESTAMP_EXT2.key, R.id.timestamp_ext2, PrefMap.SHOW_AGO, external = 2), + SGV_EXT2(ViewKeys.SGV_EXT2.key, R.id.sgv_ext2, PrefMap.SHOW_BG, external = 2), PATIENT_NAME(ViewKeys.PATIENT_NAME.key, R.id.patient_name), - IOB1(ViewKeys.IOB1.key, R.id.iob1, R.string.key_show_iob), - IOB2(ViewKeys.IOB2.key, R.id.iob2, R.string.key_show_iob), - COB1(ViewKeys.COB1.key, R.id.cob1, R.string.key_show_cob), - COB2(ViewKeys.COB2.key, R.id.cob2, R.string.key_show_cob), - DELTA(ViewKeys.DELTA.key, R.id.delta, R.string.key_show_delta), - AVG_DELTA(ViewKeys.AVG_DELTA.key, R.id.avg_delta, R.string.key_show_avg_delta), - TEMP_TARGET(ViewKeys.TEMP_TARGET.key, R.id.temp_target, R.string.key_show_temp_target), - RESERVOIR(ViewKeys.RESERVOIR.key, R.id.reservoir, R.string.key_show_reservoir_level), - UPLOADER_BATTERY(ViewKeys.UPLOADER_BATTERY.key, R.id.uploader_battery, R.string.key_show_uploader_battery), - RIG_BATTERY(ViewKeys.RIG_BATTERY.key, R.id.rig_battery, R.string.key_show_rig_battery), - BASALRATE(ViewKeys.BASALRATE.key, R.id.basalRate, R.string.key_show_temp_basal), - BGI(ViewKeys.BGI.key, R.id.bgi, R.string.key_show_bgi), - STATUS(ViewKeys.STATUS.key, R.id.status, R.string.key_show_external_status), + IOB1(ViewKeys.IOB1.key, R.id.iob1, PrefMap.SHOW_IOB), + IOB2(ViewKeys.IOB2.key, R.id.iob2, PrefMap.SHOW_IOB), + COB1(ViewKeys.COB1.key, R.id.cob1, PrefMap.SHOW_COB), + COB2(ViewKeys.COB2.key, R.id.cob2, PrefMap.SHOW_COB), + DELTA(ViewKeys.DELTA.key, R.id.delta, PrefMap.SHOW_DELTA), + AVG_DELTA(ViewKeys.AVG_DELTA.key, R.id.avg_delta, PrefMap.SHOW_AVG_DELTA), + TEMP_TARGET(ViewKeys.TEMP_TARGET.key, R.id.temp_target, PrefMap.SHOW_TEMP_TARGET), + RESERVOIR(ViewKeys.RESERVOIR.key, R.id.reservoir, PrefMap.SHOW_RESERVOIR_LEVEL), + UPLOADER_BATTERY(ViewKeys.UPLOADER_BATTERY.key, R.id.uploader_battery, PrefMap.SHOW_UPLOADER_BATTERY), + RIG_BATTERY(ViewKeys.RIG_BATTERY.key, R.id.rig_battery, PrefMap.SHOW_RIG_BATTERY), + BASALRATE(ViewKeys.BASALRATE.key, R.id.basalRate, PrefMap.SHOW_TEMP_BASAL), + BGI(ViewKeys.BGI.key, R.id.bgi, PrefMap.SHOW_BGI), + STATUS(ViewKeys.STATUS.key, R.id.status, PrefMap.SHOW_LOOP_STATUS), TIME(ViewKeys.TIME.key, R.id.time), HOUR(ViewKeys.HOUR.key, R.id.hour), MINUTE(ViewKeys.MINUTE.key, R.id.minute), - SECOND(ViewKeys.SECOND.key, R.id.second, R.string.key_show_seconds), + SECOND(ViewKeys.SECOND.key, R.id.second, PrefMap.SHOW_SECOND), TIMEPERIOD(ViewKeys.TIMEPERIOD.key, R.id.timePeriod), - DAY_NAME(ViewKeys.DAY_NAME.key, R.id.day_name, R.string.key_show_date), - DAY(ViewKeys.DAY.key, R.id.day, R.string.key_show_date), - WEEK_NUMBER(ViewKeys.WEEK_NUMBER.key, R.id.week_number, R.string.key_show_week_number), - MONTH(ViewKeys.MONTH.key, R.id.month, R.string.key_show_date), - LOOP(ViewKeys.LOOP.key, R.id.loop, R.string.key_show_external_status), - DIRECTION(ViewKeys.DIRECTION.key, R.id.direction, R.string.key_show_direction), - TIMESTAMP(ViewKeys.TIMESTAMP.key, R.id.timestamp, R.string.key_show_ago), - SGV(ViewKeys.SGV.key, R.id.sgv, R.string.key_show_bg), + DAY_NAME(ViewKeys.DAY_NAME.key, R.id.day_name, PrefMap.SHOW_DATE), + DAY(ViewKeys.DAY.key, R.id.day, PrefMap.SHOW_DATE), + WEEK_NUMBER(ViewKeys.WEEK_NUMBER.key, R.id.week_number, PrefMap.SHOW_WEEK_NUMBER), + MONTH(ViewKeys.MONTH.key, R.id.month, PrefMap.SHOW_DATE), + LOOP(ViewKeys.LOOP.key, R.id.loop, PrefMap.SHOW_LOOP_STATUS), + DIRECTION(ViewKeys.DIRECTION.key, R.id.direction, PrefMap.SHOW_DIRECTION), + TIMESTAMP(ViewKeys.TIMESTAMP.key, R.id.timestamp, PrefMap.SHOW_AGO), + SGV(ViewKeys.SGV.key, R.id.sgv, PrefMap.SHOW_BG), COVER_PLATE( key = ViewKeys.COVER_PLATE.key, id = R.id.cover_plate, @@ -563,7 +563,7 @@ class CustomWatchface : BaseWatchFace() { SECOND_HAND( key = ViewKeys.SECOND_HAND.key, id = R.id.second_hand, - pref = R.string.key_show_seconds, + pref = PrefMap.SHOW_SECOND, defaultDrawable = R.drawable.second_hand, customDrawable = ResFileMap.SECOND_HAND, customHigh = ResFileMap.SECOND_HAND_HIGH, @@ -615,7 +615,7 @@ class CustomWatchface : BaseWatchFace() { var twinView: ViewMap? = null get() = field ?: viewJson?.let { viewJson -> ViewMap.fromKey(viewJson.optString(JsonKeys.TWINVIEW.key)).also { twinView = it } } - fun visibility(): Boolean = this.pref?.let { cwf.sp.getBoolean(it, true) } != false + fun visibility(): Boolean = this.pref?.let { cwf.sp.getBoolean(it.prefKey, it.defaultValue as Boolean) } != false fun textDrawable(): Drawable? = textDrawable ?: cwf.resDataMap[viewJson?.optString(JsonKeys.BACKGROUND.key)]?.toDrawable(cwf.resources, width, height)?.also { textDrawable = it } @@ -814,29 +814,32 @@ class CustomWatchface : BaseWatchFace() { } // This class containt mapping between keys used within json of Custom Watchface and preferences - private enum class PrefMap(val key: String, @StringRes val prefKey: Int, val typeBool: Boolean) { - - SHOW_IOB(CwfMetadataKey.CWF_PREF_WATCH_SHOW_IOB.key, R.string.key_show_iob, true), - SHOW_DETAILED_IOB(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DETAILED_IOB.key, R.string.key_show_detailed_iob, true), - SHOW_COB(CwfMetadataKey.CWF_PREF_WATCH_SHOW_COB.key, R.string.key_show_cob, true), - SHOW_DELTA(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DELTA.key, R.string.key_show_delta, true), - SHOW_AVG_DELTA(CwfMetadataKey.CWF_PREF_WATCH_SHOW_AVG_DELTA.key, R.string.key_show_avg_delta, true), - SHOW_TEMP_TARGET(CwfMetadataKey.CWF_PREF_WATCH_SHOW_TEMP_TARGET.key, R.string.key_show_temp_target, true), - SHOW_RESERVOIR_LEVEL(CwfMetadataKey.CWF_PREF_WATCH_SHOW_RESERVOIR_LEVEL.key, R.string.key_show_reservoir_level, true), - SHOW_DETAILED_DELTA(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DETAILED_DELTA.key, R.string.key_show_detailed_delta, true), - SHOW_UPLOADER_BATTERY(CwfMetadataKey.CWF_PREF_WATCH_SHOW_UPLOADER_BATTERY.key, R.string.key_show_uploader_battery, true), - SHOW_RIG_BATTERY(CwfMetadataKey.CWF_PREF_WATCH_SHOW_RIG_BATTERY.key, R.string.key_show_rig_battery, true), - SHOW_TEMP_BASAL(CwfMetadataKey.CWF_PREF_WATCH_SHOW_TEMP_BASAL.key, R.string.key_show_temp_basal, true), - SHOW_DIRECTION(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DIRECTION.key, R.string.key_show_direction, true), - SHOW_AGO(CwfMetadataKey.CWF_PREF_WATCH_SHOW_AGO.key, R.string.key_show_ago, true), - SHOW_BG(CwfMetadataKey.CWF_PREF_WATCH_SHOW_BG.key, R.string.key_show_bg, true), - SHOW_BGI(CwfMetadataKey.CWF_PREF_WATCH_SHOW_BGI.key, R.string.key_show_bgi, true), - SHOW_LOOP_STATUS(CwfMetadataKey.CWF_PREF_WATCH_SHOW_LOOP_STATUS.key, R.string.key_show_external_status, true), - SHOW_WEEK_NUMBER(CwfMetadataKey.CWF_PREF_WATCH_SHOW_WEEK_NUMBER.key, R.string.key_show_week_number, true), - SHOW_DATE(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DATE.key, R.string.key_show_date, true), - PREF_UNITS(JsonKeyValues.PREF_UNITS.key, R.string.key_units_mgdl, true), - PREF_DARK(JsonKeyValues.PREF_DARK.key, R.string.key_dark, true), - PREF_MATCH_DIVIDER(JsonKeyValues.PREF_MATCH_DIVIDER.key, R.string.key_match_divider, true); + // Note defaultValue should be identical to default value in xml file, + // defaultValue Type set to Any for future updates (Boolean or String) (key_digital_style_frame_style, key_digital_style_frame_color are strings...) + private enum class PrefMap(val key: String, @StringRes val prefKey: Int, val defaultValue: Any, val typeBool: Boolean) { + + SHOW_IOB(CwfMetadataKey.CWF_PREF_WATCH_SHOW_IOB.key, R.string.key_show_iob, true, true), + SHOW_DETAILED_IOB(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DETAILED_IOB.key, R.string.key_show_detailed_iob, false, true), + SHOW_COB(CwfMetadataKey.CWF_PREF_WATCH_SHOW_COB.key, R.string.key_show_cob, true, true), + SHOW_DELTA(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DELTA.key, R.string.key_show_delta, true, true), + SHOW_AVG_DELTA(CwfMetadataKey.CWF_PREF_WATCH_SHOW_AVG_DELTA.key, R.string.key_show_avg_delta, true, true), + SHOW_TEMP_TARGET(CwfMetadataKey.CWF_PREF_WATCH_SHOW_TEMP_TARGET.key, R.string.key_show_temp_target, true, true), + SHOW_RESERVOIR_LEVEL(CwfMetadataKey.CWF_PREF_WATCH_SHOW_RESERVOIR_LEVEL.key, R.string.key_show_reservoir_level, true, true), + SHOW_DETAILED_DELTA(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DETAILED_DELTA.key, R.string.key_show_detailed_delta, false, true), + SHOW_UPLOADER_BATTERY(CwfMetadataKey.CWF_PREF_WATCH_SHOW_UPLOADER_BATTERY.key, R.string.key_show_uploader_battery, true, true), + SHOW_RIG_BATTERY(CwfMetadataKey.CWF_PREF_WATCH_SHOW_RIG_BATTERY.key, R.string.key_show_rig_battery, false, true), + SHOW_TEMP_BASAL(CwfMetadataKey.CWF_PREF_WATCH_SHOW_TEMP_BASAL.key, R.string.key_show_temp_basal, true, true), + SHOW_DIRECTION(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DIRECTION.key, R.string.key_show_direction, true, true), + SHOW_AGO(CwfMetadataKey.CWF_PREF_WATCH_SHOW_AGO.key, R.string.key_show_ago, true, true), + SHOW_BG(CwfMetadataKey.CWF_PREF_WATCH_SHOW_BG.key, R.string.key_show_bg, true, true), + SHOW_BGI(CwfMetadataKey.CWF_PREF_WATCH_SHOW_BGI.key, R.string.key_show_bgi, false, true), + SHOW_LOOP_STATUS(CwfMetadataKey.CWF_PREF_WATCH_SHOW_LOOP_STATUS.key, R.string.key_show_external_status, true, true), + SHOW_WEEK_NUMBER(CwfMetadataKey.CWF_PREF_WATCH_SHOW_WEEK_NUMBER.key, R.string.key_show_week_number, false, true), + SHOW_DATE(CwfMetadataKey.CWF_PREF_WATCH_SHOW_DATE.key, R.string.key_show_date, false, true), + SHOW_SECOND(CwfMetadataKey.CWF_PREF_WATCH_SHOW_SECONDS.key, R.string.key_show_seconds, true, true), + PREF_UNITS(JsonKeyValues.PREF_UNITS.key, R.string.key_units_mgdl, true, true), + PREF_DARK(JsonKeyValues.PREF_DARK.key, R.string.key_dark, true, true), + PREF_MATCH_DIVIDER(JsonKeyValues.PREF_MATCH_DIVIDER.key, R.string.key_match_divider, false, true); var value: String = "" @@ -1141,7 +1144,7 @@ class CustomWatchface : BaseWatchFace() { val prefKey = json.optString(JsonKeys.PREFKEY.key) PrefMap.fromKey(prefKey)?.let { prefMap -> val value = valPref[prefMap.key] - ?: (if (prefMap.typeBool) sp.getBoolean(prefMap.prefKey, false).toString() else sp.getString(prefMap.prefKey, "")).also { + ?: (if (prefMap.typeBool) sp.getBoolean(prefMap.prefKey, prefMap.defaultValue as Boolean).toString() else sp.getString(prefMap.prefKey, prefMap.defaultValue as String)).also { valPref[prefMap.key] = it } json.optJSONObject(value)?.let { nextJson -> @@ -1169,7 +1172,7 @@ class CustomWatchface : BaseWatchFace() { } private fun checkPref() = valPref.any { (prefMap, s) -> - s != PrefMap.fromKey(prefMap)?.let { if (it.typeBool) sp.getBoolean(it.prefKey, false).toString() else sp.getString(it.prefKey, "") } + s != PrefMap.fromKey(prefMap)?.let { if (it.typeBool) sp.getBoolean(it.prefKey, it.defaultValue as Boolean).toString() else sp.getString(it.prefKey, it.defaultValue as String) } } } diff --git a/wear/src/main/res/values-cs-rCZ/strings.xml b/wear/src/main/res/values-cs-rCZ/strings.xml index 0ea6fd40c0f..32be55175de 100644 --- a/wear/src/main/res/values-cs-rCZ/strings.xml +++ b/wear/src/main/res/values-cs-rCZ/strings.xml @@ -217,6 +217,7 @@ Kompletní stav (obráceně) Glykémie Bazál, COB & IOB + Bazál & IOB COB & IOB Ikona COB Detailní COB diff --git a/wear/src/main/res/values-es-rES/strings.xml b/wear/src/main/res/values-es-rES/strings.xml index 8bf1ea28810..96c1d7732b0 100644 --- a/wear/src/main/res/values-es-rES/strings.xml +++ b/wear/src/main/res/values-es-rES/strings.xml @@ -217,6 +217,7 @@ Estado completo (invertido) Glucosa en sangre BR, COB & IOB + BR & IOB COB & IOB Icono COB COB detallado diff --git a/wear/src/main/res/values-fr-rFR/strings.xml b/wear/src/main/res/values-fr-rFR/strings.xml index ac39887cdeb..83d4522cbdb 100644 --- a/wear/src/main/res/values-fr-rFR/strings.xml +++ b/wear/src/main/res/values-fr-rFR/strings.xml @@ -217,6 +217,7 @@ État complet (transposé) Glycémie DB, GA & IA + Basal & IA GA & IA Icône GA GA détaillés diff --git a/wear/src/main/res/values-it-rIT/strings.xml b/wear/src/main/res/values-it-rIT/strings.xml index c8f42284441..591c39ae364 100644 --- a/wear/src/main/res/values-it-rIT/strings.xml +++ b/wear/src/main/res/values-it-rIT/strings.xml @@ -217,6 +217,7 @@ Stato completo (capovolto) Glicemia BR, CoB & IoB + BR & IoB CoB & IoB Icona CoB Cob Dettagliato diff --git a/wear/src/main/res/values-lt-rLT/strings.xml b/wear/src/main/res/values-lt-rLT/strings.xml index aa434cbe12d..b00c33c983a 100644 --- a/wear/src/main/res/values-lt-rLT/strings.xml +++ b/wear/src/main/res/values-lt-rLT/strings.xml @@ -8,6 +8,7 @@ AAPS(Veiksmai) AAPS(laikinas tikslas) AAPS(greitas vedlys) + AAPS (Vartotojo Veiksmai) Nėra duomenų! Seni duomenys! Nuo %1$s @@ -31,6 +32,8 @@ Rodyti telefono bateriją Rodyti įrenginio bateriją Rodyti valandinę bazę + Rodyti Laikiną Tikslą + Rodyti rezervuaro lygį Rodyti Ciklo statusą Rodyti KG Rodyti GĮ @@ -49,6 +52,10 @@ 3 val. 4 val. 5 val. + išjungta + 5 min + 10 min + 15 min Įvesties Dizainas Numatytasis Greitai dešinėn @@ -86,6 +93,7 @@ Trukmė Laikino tikslo užklausa Greitojo vedlio užklausa + Reikalingas vartotojo veiksmas Terapijos užklausa Boluso užklausa Skaičiavimo užklausa @@ -143,6 +151,8 @@ Rodyti tik laiką ir KG Vibruoti kas valandą Rodyti savaitės numerį + Įtraukti išorines peržiūras į šabloną + Įjungti išorinius duomenis ciferblate Rodyti sekundes Jūsų stilius: jokio stiliaus @@ -189,4 +199,29 @@ !senas! !klaida! Pulsas + Širdies ritmo glodinimas + Įjungti žingsnių skaičiavimą + Laikinas tikslas 1 + Laikinas tikslas 2 + Laikinas tikslas 3 + Laikinas tikslas 4 + Veiksmas 1 + Veiksmas 2 + Veiksmas 3 + Veiksmas 4 + Duomenų perdavimas priekinio plano režimu + AAPS veikia pagrindiniame režime. Norėdami paslėpti pranešimą, eikite į Kūrėjo nustatymus, Programų pranešimus, Leidžiamas peržiūros programas, pasirinkite AAPS, Išjunkite paslaugų kanalų pranešimus pagrindiniame režime. + ĮJUNGTA + IŠJUNGTA + Pilna informacija apie būklę + Pilna informacija apie būklę (atvirkščiai) + Kraujo glikemija + VB, AAO & AIO + VB & AIO + AAO & AIO + AAO ikonėlė + AAO detaliau + AIO ikonėlė + AIO detaliau + Telefono baterija diff --git a/wear/src/main/res/values-nb-rNO/strings.xml b/wear/src/main/res/values-nb-rNO/strings.xml index cd97477903c..9287e5b3356 100644 --- a/wear/src/main/res/values-nb-rNO/strings.xml +++ b/wear/src/main/res/values-nb-rNO/strings.xml @@ -26,21 +26,21 @@ Vis IOB Vis detaljert IOB Vis COB - Vis Delta - Vis detaljert Delta - Vis Gj.snittDelta + Vis delta + Vis detaljert delta + Vis gj.snittsdelta Vis telefonbatteri Vis riggens batteri Vis basaldose Vis midlertidig mål Vis reservoarnivå - Vis loop status + Vis loopstatus Vis BS Vis BGI Vis retningspil Vis siden Vis midl. basal - Vis Bolus & SMB + Vis bolus & SMB Vis rutenett Mørkt Marker basaler @@ -56,7 +56,7 @@ 5 min 10 min 15 min - Innlesing design + Inndatadesign Standard Raskt høyre Raskt venstre @@ -217,6 +217,7 @@ Full status (omvendt) Blodsukker BR, COB & IOB + BR & IoB COB & IOB COB-ikon COB-detaljert diff --git a/wear/src/main/res/values-nl-rNL/strings.xml b/wear/src/main/res/values-nl-rNL/strings.xml index 47a5e99e86a..228ed71abb4 100644 --- a/wear/src/main/res/values-nl-rNL/strings.xml +++ b/wear/src/main/res/values-nl-rNL/strings.xml @@ -217,6 +217,7 @@ Volledige status (omgedraaid) Bloed glucose BR, CoB & IoB + BR & IOB CoB & IoB CoB icoon Gedetailleerde CoB diff --git a/wear/src/main/res/values-pl-rPL/strings.xml b/wear/src/main/res/values-pl-rPL/strings.xml index ad2ffea705a..33fddda16c5 100644 --- a/wear/src/main/res/values-pl-rPL/strings.xml +++ b/wear/src/main/res/values-pl-rPL/strings.xml @@ -217,6 +217,7 @@ Pełny status (odwrócony) Glikemia Baza, CoB & IoB + BR & IoB CoB & IoB Ikona CoB Szczegółowe CoB diff --git a/wear/src/main/res/values-sk-rSK/strings.xml b/wear/src/main/res/values-sk-rSK/strings.xml index 4e3955779ca..55221344d03 100644 --- a/wear/src/main/res/values-sk-rSK/strings.xml +++ b/wear/src/main/res/values-sk-rSK/strings.xml @@ -217,6 +217,7 @@ Kompletní stav (opačne) Glykémia Bazál, COB & IOB + Bazál & IOB COB & IOB Ikona COB Detailný COB diff --git a/wear/src/main/res/values-tr-rTR/strings.xml b/wear/src/main/res/values-tr-rTR/strings.xml index 4307cc54893..c010bec2b8c 100644 --- a/wear/src/main/res/values-tr-rTR/strings.xml +++ b/wear/src/main/res/values-tr-rTR/strings.xml @@ -217,6 +217,7 @@ Tam durum (çevrilmiş) Kan Şekeri Nabız, AKRB & AİNS + Nabız & AiNS AKRB & AİNS AKRB simgesi Detaylı AKRB diff --git a/wear/src/main/res/values-zh-rTW/strings.xml b/wear/src/main/res/values-zh-rTW/strings.xml index 9d305f35ddb..ee509a51b01 100644 --- a/wear/src/main/res/values-zh-rTW/strings.xml +++ b/wear/src/main/res/values-zh-rTW/strings.xml @@ -217,6 +217,7 @@ 完整狀態(翻轉) 血糖 BR、CoB及IoB + BR & IoB BR、CoB及IoB CoB圖示 CoB 詳細 diff --git a/workflow/src/main/kotlin/app/aaps/workflow/PreparePredictionsWorker.kt b/workflow/src/main/kotlin/app/aaps/workflow/PreparePredictionsWorker.kt index 9517824508d..07cbc197b87 100644 --- a/workflow/src/main/kotlin/app/aaps/workflow/PreparePredictionsWorker.kt +++ b/workflow/src/main/kotlin/app/aaps/workflow/PreparePredictionsWorker.kt @@ -48,7 +48,7 @@ class PreparePredictionsWorker( ?: return Result.failure(workDataOf("Error" to "missing input data")) val apsResult = if (config.APS) loop.lastRun?.constraintsProcessed else processedDeviceStatusData.getAPSResult() - val predictionsAvailable = if (config.APS) loop.lastRun?.request?.hasPredictions == true else config.NSCLIENT + val predictionsAvailable = if (config.APS) loop.lastRun?.request?.hasPredictions == true else config.AAPSCLIENT val menuChartSettings = overviewMenus.setting // align to hours val calendar = Calendar.getInstance().also { diff --git a/workflow/src/main/kotlin/app/aaps/workflow/iob/CarbsInPastExtension.kt b/workflow/src/main/kotlin/app/aaps/workflow/iob/CarbsInPastExtension.kt index 491cc13d95e..993c7a2fba8 100644 --- a/workflow/src/main/kotlin/app/aaps/workflow/iob/CarbsInPastExtension.kt +++ b/workflow/src/main/kotlin/app/aaps/workflow/iob/CarbsInPastExtension.kt @@ -11,23 +11,26 @@ import app.aaps.core.interfaces.utils.DateUtil import app.aaps.core.keys.DoubleKey import app.aaps.core.keys.Preferences -fun fromCarbs(t: CA, isAAPSOrWeighted: Boolean, profileFunction: ProfileFunction, aapsLogger: AAPSLogger, dateUtil: DateUtil, preferences: Preferences, config: Config, processedDeviceStatusData: ProcessedDeviceStatusData): AutosensData.CarbsInPast { +fun fromCarbs( + t: CA, + isOref1: Boolean, + isAAPSOrWeighted: Boolean, + sens: Double, + ic: Double, + aapsLogger: AAPSLogger, + dateUtil: DateUtil, + preferences: Preferences +): AutosensData.CarbsInPast { val time = t.timestamp val carbs = t.amount val remaining = t.amount val min5minCarbImpact: Double - val profile = profileFunction.getProfile(t.timestamp) - if (isAAPSOrWeighted && profile != null) { + if (isAAPSOrWeighted) { val maxAbsorptionHours = preferences.get(DoubleKey.AbsorptionMaxTime) - val sens = profile.getIsfMgdlForCarbs(t.timestamp, "fromCarbs", config, processedDeviceStatusData) - val ic = profile.getIc(t.timestamp) min5minCarbImpact = t.amount / (maxAbsorptionHours * 60 / 5) * sens / ic - aapsLogger.debug( - LTag.AUTOSENS, - """Min 5m carbs impact for ${carbs}g @${dateUtil.dateAndTimeString(t.timestamp)} for ${maxAbsorptionHours}h calculated to $min5minCarbImpact ISF: $sens IC: $ic""" - ) + aapsLogger.debug(LTag.AUTOSENS, "Min 5m carbs impact for ${carbs}g @${dateUtil.dateAndTimeString(t.timestamp)} for ${maxAbsorptionHours}h calculated to $min5minCarbImpact ISF: $sens IC: $ic") } else { - min5minCarbImpact = preferences.get(DoubleKey.ApsAmaMin5MinCarbsImpact) + min5minCarbImpact = if (isOref1) preferences.get(DoubleKey.ApsSmbMin5MinCarbsImpact) else preferences.get(DoubleKey.ApsAmaMin5MinCarbsImpact) } return AutosensData.CarbsInPast(time, carbs, min5minCarbImpact, remaining) } diff --git a/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOref1Worker.kt b/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOref1Worker.kt index 1131dd66214..0be5d85f972 100644 --- a/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOref1Worker.kt +++ b/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOref1Worker.kt @@ -193,8 +193,11 @@ class IobCobOref1Worker( for (recentCarbTreatment in recentCarbTreatments) { autosensData.carbsFromBolus += recentCarbTreatment.amount val isAAPSOrWeighted = activePlugin.activeSensitivity.isMinCarbsAbsorptionDynamic - if (recentCarbTreatment.amount > 0) - autosensData.activeCarbsList.add(fromCarbs(recentCarbTreatment, isAAPSOrWeighted, profileFunction, aapsLogger, dateUtil, preferences, config, processedDeviceStatusData)) + if (recentCarbTreatment.amount > 0) { + val sens = profile.getIsfMgdlForCarbs(recentCarbTreatment.timestamp, "fromCarbs", config, processedDeviceStatusData) + val ic = profile.getIc(recentCarbTreatment.timestamp) + autosensData.activeCarbsList.add(fromCarbs(recentCarbTreatment, isOref1 = true, isAAPSOrWeighted, sens, ic, aapsLogger, dateUtil, preferences)) + } autosensData.pastSensitivity += "[" + decimalFormatter.to0Decimal(recentCarbTreatment.amount) + "g]" } @@ -207,9 +210,9 @@ class IobCobOref1Worker( // but always assume at least 3mg/dL/5m (default) absorption per active treatment val ci = max(deviation, totalMinCarbsImpact) if (ci != deviation) autosensData.failOverToMinAbsorptionRate = true - autosensData.absorbed = ci * profile.getIc(bgTime) / sens + autosensData.this5MinAbsorption = ci * profile.getIc(bgTime) / sens // and add that to the running total carbsAbsorbed - autosensData.cob = max(previous.cob - autosensData.absorbed, 0.0) + autosensData.cob = max(previous.cob - autosensData.this5MinAbsorption, 0.0) autosensData.mealCarbs = previous.mealCarbs autosensData.deductAbsorbedCarbs() autosensData.usedMinCarbsImpact = totalMinCarbsImpact diff --git a/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOrefWorker.kt b/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOrefWorker.kt index bc553a08dd0..6cfff4d3f1f 100644 --- a/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOrefWorker.kt +++ b/workflow/src/main/kotlin/app/aaps/workflow/iob/IobCobOrefWorker.kt @@ -188,8 +188,11 @@ class IobCobOrefWorker @Inject internal constructor( for (recentCarbTreatment in recentCarbTreatments) { autosensData.carbsFromBolus += recentCarbTreatment.amount val isAAPSOrWeighted = activePlugin.activeSensitivity.isMinCarbsAbsorptionDynamic - if (recentCarbTreatment.amount > 0) - autosensData.activeCarbsList.add(fromCarbs(recentCarbTreatment, isAAPSOrWeighted, profileFunction, aapsLogger, dateUtil, preferences, config, processedDeviceStatusData)) + if (recentCarbTreatment.amount > 0) { + val sens = profile.getIsfMgdlForCarbs(recentCarbTreatment.timestamp, "fromCarbs", config, processedDeviceStatusData) + val ic = profile.getIc(recentCarbTreatment.timestamp) + autosensData.activeCarbsList.add(fromCarbs(recentCarbTreatment, isOref1 = false, isAAPSOrWeighted, sens, ic, aapsLogger, dateUtil, preferences)) + } autosensData.pastSensitivity += "[" + decimalFormatter.to0Decimal(recentCarbTreatment.amount) + "g]" } @@ -212,9 +215,9 @@ class IobCobOrefWorker @Inject internal constructor( // but always assume at least 3mg/dL/5m (default) absorption per active treatment val ci = max(deviation, totalMinCarbsImpact) if (ci != deviation) autosensData.failOverToMinAbsorptionRate = true - autosensData.absorbed = ci * profile.getIc(bgTime) / sens + autosensData.this5MinAbsorption = ci * profile.getIc(bgTime) / sens // and add that to the running total carbsAbsorbed - autosensData.cob = max(previous.cob - autosensData.absorbed, 0.0) + autosensData.cob = max(previous.cob - autosensData.this5MinAbsorption, 0.0) autosensData.deductAbsorbedCarbs() autosensData.usedMinCarbsImpact = totalMinCarbsImpact }