diff --git a/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt b/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt index 858b68244b..81a292aa12 100644 --- a/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt +++ b/app-wear-shared/shared/src/main/java/info/nightscout/rx/weardata/EventData.kt @@ -17,12 +17,15 @@ sealed class EventData : Event() { @ExperimentalSerializationApi fun serializeByte() = ProtoBuf.encodeToByteArray(serializer(), this) + companion object { + fun deserialize(json: String) = try { Json.decodeFromString(serializer(), json) } catch (ignored: Exception) { Error(System.currentTimeMillis()) } + @ExperimentalSerializationApi fun deserializeByte(byteArray: ByteArray) = try { ProtoBuf.decodeFromByteArray(serializer(), byteArray) @@ -105,7 +108,9 @@ sealed class EventData : Event() { val duration: Long, val timestamp: Long, val beatsPerMinute: Double, - val device: String): EventData() { + val device: String + ) : EventData() { + override fun toString() = "HR ${beatsPerMinute.toInt()} at ${DateTime(timestamp)} for ${duration / 1000.0}sec $device" } @@ -167,7 +172,7 @@ sealed class EventData : Event() { data class BolusProgress(val percent: Int, val status: String) : EventData() @Serializable - data class SingleBg @JvmOverloads constructor( + data class SingleBg( var timeStamp: Long, val sgvString: String = "---", val glucoseUnits: String = "-", @@ -282,6 +287,7 @@ sealed class EventData : Event() { val validTo: Int ) : EventData() } + @Serializable data class ActionSetCustomWatchface( val customWatchfaceData: CwfData diff --git a/app-wear-shared/shared/src/main/res/values-lt-rLT/strings.xml b/app-wear-shared/shared/src/main/res/values-lt-rLT/strings.xml index fc26b15329..fe0de7ae63 100644 --- a/app-wear-shared/shared/src/main/res/values-lt-rLT/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-lt-rLT/strings.xml @@ -40,6 +40,7 @@ Failo pavadinimas: %1$s Įskiepio versija: %1$s Pavadinimas: %1$s (%2$s) + Komentaras: %1$s Rodyti AIO Rodyti detalų AIO Rodyti AAO @@ -58,12 +59,18 @@ Numatytasis ekranas Fono paveiksliukas Grafikai (glikemija, bazė, prognozės...) + Paveiksliukas už teksto ir prieš grafiką Laisvas tekstas 1 Laisvas tekstas 2 Laisvas tekstas 3 Laisvas tekstas 4 + Sudėtinis arba detalus AIO + Sudėtinis arba detalus (Boluso_AIO|Bazės_AIO) AIO AAO vertė + Trumpo laikotarpio pokytis + Vidutinis pokytis (15 min) Telefono baterija (%) + Baterija (%) Bazė KGI vertė Laikas (val:min arba val:min:sek) @@ -78,4 +85,8 @@ Tendencijos rodyklė Prieš kiek minučių nuskaityta glikemija Glikemija + Paveiksliukas prieš tekstą (skambučius...) + Analoginio laikrodžio valandinė rodyklė + Analoginio laikrodžio minutinė rodyklė + Analoginio laikrodžio sekundinė rodyklė diff --git a/app-wear-shared/shared/src/main/res/values-sv-rSE/strings.xml b/app-wear-shared/shared/src/main/res/values-sv-rSE/strings.xml index 5d66f1de86..52cb885bbc 100644 --- a/app-wear-shared/shared/src/main/res/values-sv-rSE/strings.xml +++ b/app-wear-shared/shared/src/main/res/values-sv-rSE/strings.xml @@ -4,6 +4,10 @@ %1$dm sedan %1$d minuter sedan %1$.1f tim sedan + %1$.1f dagar sedan + %1$.0f dagar sedan + om %1$.0f dagar + om %1$.0f dagar h dagar timmar @@ -19,6 +23,10 @@ veckor m d + Senare idag + Imorgon + Idag + Igår Ansluter (%1$d s) Anslutningen verifieras @@ -26,4 +34,59 @@ Kopplar från Väntar på frånkoppling + Skapad den: %1$s + Skapad av: %1$s + Namn: %1$s + Filnamn: %1$s + Plugin-version: %1$s + Namn: %1$s (%2$s) + Visa IOB + Visa detaljerad IOB + Visa COB + Visa delta + Visa detaljerad delta + Visa genomsnittlig delta + Visa telefonens batterinivå + Visa riggens batterinivå + Visa basaldos + Visa loop-status + Visa BG + Visa BGI + Visa riktningspil + Visa tid sedan + Standard-urtavla - du kan klicka på EXPORTERA URTAVLA för att generera en mall + Standard-urtavla + Bakgrundsbild + Grafer (BG, basal, prognoslinjer...) + Bild framför graf och bakom textfält + Fritext 1 + Fritext 2 + Fritext 3 + Fritext 4 + IOB-etikett. Total IOB om detaljerad + Total IOB. (Bolus_IOB|Basal_IOB) om detaljerad + COB-etikett + COB-värde + Kort BG-delta + Genomsnittligt BG-delta (15min) + Telefonens batterinivå (%) + Globalt loop-batteri (%) + Basaldos + BGI-värde + Tid (HH:MM eller HH:MM:SS) + Timme (HH) + Minut (MM) + Sekund (SS) + AM eller PM + Namn på veckodagen + Dag (DD) + Månadens namn (kort) + Loop status och tid + Visa riktningspil + Minuter sedan senast mottaget BG + BG-värde + Omslagsbild framför text (visare...) + Bild för timvisare (analog klocka) + Bild för minutvisare (analog klocka) + Bild för sekundvisare (analog klocka) diff --git a/app-wear-shared/shared/src/test/java/info/nightscout/androidaps/TestBase.kt b/app-wear-shared/shared/src/test/java/info/nightscout/androidaps/TestBase.kt new file mode 100644 index 0000000000..4fd2aef548 --- /dev/null +++ b/app-wear-shared/shared/src/test/java/info/nightscout/androidaps/TestBase.kt @@ -0,0 +1,37 @@ +package info.nightscout.androidaps + +import info.nightscout.rx.AapsSchedulers +import info.nightscout.rx.TestAapsSchedulers +import info.nightscout.rx.logging.AAPSLoggerTest +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.extension.ExtendWith +import org.mockito.Mockito +import org.mockito.junit.jupiter.MockitoExtension +import org.mockito.junit.jupiter.MockitoSettings +import org.mockito.quality.Strictness +import java.util.Locale + +@ExtendWith(MockitoExtension::class) +@MockitoSettings(strictness = Strictness.LENIENT) +open class TestBase { + + val aapsLogger = AAPSLoggerTest() + val aapsSchedulers: AapsSchedulers = TestAapsSchedulers() + + @BeforeEach + fun setupLocale() { + Locale.setDefault(Locale.ENGLISH) + System.setProperty("disableFirebase", "true") + } + + // Workaround for Kotlin nullability. + // https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791 + // https://stackoverflow.com/questions/30305217/is-it-possible-to-use-mockito-in-kotlin + fun anyObject(): T { + Mockito.any() + return uninitialized() + } + + @Suppress("Unchecked_Cast") + fun uninitialized(): T = null as T +} \ No newline at end of file diff --git a/app-wear-shared/shared/src/test/java/info/nightscout/rx/weardata/EventDataTest.kt b/app-wear-shared/shared/src/test/java/info/nightscout/rx/weardata/EventDataTest.kt new file mode 100644 index 0000000000..bd81d3d5cd --- /dev/null +++ b/app-wear-shared/shared/src/test/java/info/nightscout/rx/weardata/EventDataTest.kt @@ -0,0 +1,193 @@ +package info.nightscout.rx.weardata + +import info.nightscout.androidaps.TestBase +import kotlinx.serialization.ExperimentalSerializationApi +import org.junit.jupiter.api.Assertions + +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test + +@ExperimentalSerializationApi +class EventDataTest : TestBase() { + + @BeforeEach + fun setUp() { + } + + @Test + fun serializationTest() { + EventData.ActionPong(1, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.WearException(1, byteArrayOf(0xAA.toByte()), "board", "fingerprint", "sdk", "model", "manufacturer", "product").let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.Error(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.CancelBolus(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionResendData("data").let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionPumpStatus(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionLoopStatus(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionTddStatus(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionECarbsPreCheck(1, 2, 3).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionBolusPreCheck(1.0, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionFillPreCheck(1.0).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionFillPresetPreCheck(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionProfileSwitchSendInitialData(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionProfileSwitchPreCheck(1, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionWizardPreCheck(1, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionQuickWizardPreCheck("guid").let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionHeartRate(1, 2, 3.0, "device").let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionTempTargetPreCheck(EventData.ActionTempTargetPreCheck.TempTargetCommand.CANCEL).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionWizardConfirmed(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionTempTargetConfirmed(false).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionBolusConfirmed(1.0, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionECarbsConfirmed(1, 2, 3).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionFillConfirmed(1.0).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionProfileSwitchConfirmed(1, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.OpenLoopRequestConfirmed(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.CancelNotification(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + // EventData.ActionGetCustomWatchface(EventData.ActionSetCustomWatchface(CwfData())).let { + // Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + // Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + // } + EventData.ActionPing(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.OpenSettings(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.BolusProgress(1, "status").let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.GraphData(arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0))).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.TreatmentData( + arrayListOf(EventData.TreatmentData.TempBasal(1, 2.0, 3, 4.0, 5.0)), + arrayListOf(EventData.TreatmentData.Basal(1, 2, 3.0)), + arrayListOf(EventData.TreatmentData.Treatment(1, 2.0, 3.0, true, true)), + arrayListOf(EventData.SingleBg(1, sgv = 2.0, high = 3.0, low = 4.0)) + ).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.Preferences(1, true, true, 2, 3, 4.0, 5.0, 6.0, 7, 8).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.QuickWizard(arrayListOf(EventData.QuickWizard.QuickWizardEntry("1", "2", 3, 4, 5))).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + // EventData.ActionSetCustomWatchface().let { + // Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + // Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + // } + EventData.ActionrequestCustomWatchface(true).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionrequestSetDefaultWatchface(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ActionProfileSwitchOpenActivity(1, 2).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.OpenLoopRequest("1", "2", null).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.ConfirmAction("1", "2", null).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + EventData.SnoozeAlert(1).let { + Assertions.assertEquals(it, EventData.deserializeByte(it.serializeByte())) + Assertions.assertEquals(it, EventData.deserialize(it.serialize())) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index ba3dc7d31d..50207e44d9 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -33,6 +33,8 @@ Varna om kolhydrater behövs Öppna menyn Stäng menyn + Ta bort objekt + Sortera objekt Behandlingsdata ofullständigt En behandling (insulin: %1$.2f, kolhydrater: %2$d, tid: %3$s) kunde inte läggas till listan i Behandlingar. Vänligen kontrollera och lägg till en post manuellt vid behov. eCarbs: %1$d g (%2$d h), fördröjd i %3$d m @@ -46,8 +48,13 @@ Rensa filter Kanyl E-postadress + Ta bort BG-värden Identifiering inte angiven i dev-läge dialog Okänt kommando: + Ta bort valda objekt + %1$d valda + Sortera + Sök diff --git a/build.gradle b/build.gradle index 5c274053d9..d53dc4cb3f 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { rxkotlin_version = '3.0.1' room_version = '2.5.2' lifecycle_version = '2.6.1' - dagger_version = '2.47' + dagger_version = '2.48' coroutines_version = '1.7.3' activity_version = '1.7.2' fragmentktx_version = '1.6.1' @@ -48,10 +48,10 @@ buildscript { replayshare_version = '2.2.0' wearable_version = '2.9.0' - play_services_wearable_version = '18.0.0' + play_services_wearable_version = '18.1.0' play_services_location_version = '21.0.1' - kotlinx_datetime_version = '0.4.0' + kotlinx_datetime_version = '0.4.1' kotlinx_serialization_version = '1.6.0' caverock_androidsvg_version = '1.4' diff --git a/core/graph/src/main/java/info/nightscout/core/graph/OverviewData.kt b/core/graph/src/main/java/info/nightscout/core/graph/OverviewData.kt index 0a9269e559..77b3709317 100644 --- a/core/graph/src/main/java/info/nightscout/core/graph/OverviewData.kt +++ b/core/graph/src/main/java/info/nightscout/core/graph/OverviewData.kt @@ -47,6 +47,15 @@ interface OverviewData { * BG */ + /** + * Get newest glucose value from bucketed data. + * If there are less than 3 glucose values, bucketed data is not created. + * In this case take newest [GlucoseValue] from db and convert it to [InMemoryGlucoseValue] + * + * Intended for display on screen only + * + * @return newest glucose value + */ fun lastBg(autosensDataStore: AutosensDataStore): InMemoryGlucoseValue? fun isLow(autosensDataStore: AutosensDataStore): Boolean fun isHigh(autosensDataStore: AutosensDataStore): Boolean diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/profile/ProfileSource.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/profile/ProfileSource.kt index 207bdfbc9f..f25c97cff9 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/profile/ProfileSource.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/profile/ProfileSource.kt @@ -5,6 +5,9 @@ import org.json.JSONArray interface ProfileSource { + /** + * SingleProfile stores a name of a profile in addition to PureProfile + */ class SingleProfile( var name: String, var mgdl: Boolean, @@ -31,11 +34,41 @@ interface ProfileSource { val profile: ProfileStore? val profileName: String? fun addProfile(p: SingleProfile) + + /** + * Convert [PureProfile] to [SingleProfile] + * + * @param pureProfile PureProfile + * @param newName Name + * @return SingleProfile + */ fun copyFrom(pureProfile: PureProfile, newName: String): SingleProfile + /** + * Currently edited profile in store as index + */ var currentProfileIndex: Int + + /** + * Get currently edited profile from store as [SingleProfile] + * + * @return currently selected profile + */ fun currentProfile(): SingleProfile? - fun storeSettings(activity: FragmentActivity? = null, emptyCreated: Boolean = false) + + /** + * Store active [ProfileStore] to SharedPreferences + * + * @param activity context for error dialog + * @param timestamp timestamp of latest change + */ + fun storeSettings(activity: FragmentActivity? = null, timestamp: Long) + + /** + * Import [ProfileStore] to memory and and save to SharedPreferences + * + * @param store ProfileStore to import + */ fun loadFromStore(store: ProfileStore) } \ No newline at end of file diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/source/BgSource.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/source/BgSource.kt index 35a326c040..5cf2991dec 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/source/BgSource.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/source/BgSource.kt @@ -1,7 +1,5 @@ package info.nightscout.interfaces.source -import info.nightscout.database.entities.GlucoseValue - interface BgSource { /** @@ -18,12 +16,4 @@ interface BgSource { */ val sensorBatteryLevel: Int get() = -1 - - /** - * Decide if GlucoseValue should be uploaded to NS - * - * @param glucoseValue glucose value - * @return true if GlucoseValue should be uploaded to NS (supported by plugin and enabled in preferences) - */ - fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean } \ No newline at end of file diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/source/DoingOwnUploadSource.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/source/DoingOwnUploadSource.kt deleted file mode 100644 index c44c70ff22..0000000000 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/source/DoingOwnUploadSource.kt +++ /dev/null @@ -1,3 +0,0 @@ -package info.nightscout.interfaces.source - -interface DoingOwnUploadSource \ No newline at end of file diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/source/XDrip.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/source/XDripSource.kt similarity index 75% rename from core/interfaces/src/main/java/info/nightscout/interfaces/source/XDrip.kt rename to core/interfaces/src/main/java/info/nightscout/interfaces/source/XDripSource.kt index efa60ce74f..121f67e2cd 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/source/XDrip.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/source/XDripSource.kt @@ -1,5 +1,5 @@ package info.nightscout.interfaces.source -interface XDrip { +interface XDripSource { fun isEnabled(): Boolean } \ No newline at end of file diff --git a/core/interfaces/src/main/java/info/nightscout/interfaces/sync/DataSyncSelector.kt b/core/interfaces/src/main/java/info/nightscout/interfaces/sync/DataSyncSelector.kt index 9a434d2ea6..8fc30f615b 100644 --- a/core/interfaces/src/main/java/info/nightscout/interfaces/sync/DataSyncSelector.kt +++ b/core/interfaces/src/main/java/info/nightscout/interfaces/sync/DataSyncSelector.kt @@ -44,4 +44,13 @@ interface DataSyncSelector { fun resetToNextFullSync() suspend fun doUpload() + + /** + * This function called when new profile is received from NS + * Plugin should update internal timestamp to not send Profile back as a new/updated + * + * @param timestamp received timestamp of profile + * + */ + fun profileReceived(timestamp: Long) } \ No newline at end of file diff --git a/core/main/src/main/java/info/nightscout/core/extensions/ExtendedBolusExtension.kt b/core/main/src/main/java/info/nightscout/core/extensions/ExtendedBolusExtension.kt index a8e18acdbf..55f593ec82 100644 --- a/core/main/src/main/java/info/nightscout/core/extensions/ExtendedBolusExtension.kt +++ b/core/main/src/main/java/info/nightscout/core/extensions/ExtendedBolusExtension.kt @@ -6,6 +6,7 @@ import info.nightscout.database.entities.TemporaryBasal import info.nightscout.database.entities.interfaces.end import info.nightscout.interfaces.aps.AutosensResult import info.nightscout.interfaces.insulin.Insulin +import info.nightscout.interfaces.iob.Iob import info.nightscout.interfaces.iob.IobTotal import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.utils.DecimalFormatter @@ -45,6 +46,7 @@ fun ExtendedBolus.toTemporaryBasal(profile: Profile): TemporaryBasal = ) fun ExtendedBolus.iobCalc(time: Long, profile: Profile, insulinInterface: Insulin): IobTotal { + if (!isValid) return IobTotal(time) val result = IobTotal(time) val realDuration = getPassedDurationToTimeInMinutes(time) if (realDuration > 0) { diff --git a/core/ui/src/main/res/values-sv-rSE/protection.xml b/core/ui/src/main/res/values-sv-rSE/protection.xml index 5208d878de..da9daa1377 100644 --- a/core/ui/src/main/res/values-sv-rSE/protection.xml +++ b/core/ui/src/main/res/values-sv-rSE/protection.xml @@ -6,15 +6,26 @@ Skydd för app Bolusskydd Lösenord för inställningar + Inställningar PIN-kod Lösenord för app + PIN-kod för appen Lösenord för bolus + PIN-kod för bolus + Lösenord och PIN-lagring [s] + Tid innan lösenord eller PIN-kod måste anges Biometri Eget lösenord + Egen PIN-kod Inget skydd Osäker alternativ autentisering Biometrisk verifiering kräver att huvudlösenordet är inställt (som reservlösning).\n\nVänligen sätt ett huvudlösenord! Lösenord sparat! + PIN-kod angiven Lösenord inte inställt + PIN-kod inte angiven Lösenordet har inte ändrats + PIN-koden inte ändrad + PIN-kod borttagen Ange lösenord här + Ange PIN-kod här diff --git a/core/ui/src/main/res/values-sv-rSE/strings.xml b/core/ui/src/main/res/values-sv-rSE/strings.xml index f1d734b770..89edd20476 100644 --- a/core/ui/src/main/res/values-sv-rSE/strings.xml +++ b/core/ui/src/main/res/values-sv-rSE/strings.xml @@ -14,6 +14,7 @@ %1$.2f U/h Pump inte initierad, ingen profil vald. Lyckades inte uppdatera basalprofilen + Bolus %1$.2f U levererad Ingen giltig data om temp basaler fanns i pumpen Begränsar IOB till %1$.1f pga %2$s LOOP INAKTIVERAD PGA BEGRÄNSNINGAR @@ -44,12 +45,15 @@ Tysta i 5 minuter Tysta Lyckad + Avancerade inställningar Förlängd bolus misslyckad + APS-läge Förlängd bolus Pausad TDD totalt Kommer att leverera %1$.2f enheter Väntar på pump + AAPS startad %1$+.2f U %1$dg %1$.2f h @@ -58,6 +62,8 @@ Var god vänta… Stopp Kolhydrater + Ogiltig profil! + INGEN PROFIL VALD ]]> Datum Enheter @@ -100,6 +106,7 @@ Laddar… Anteckning Ta bort + Lägg till ny Lägg till nytt ovan Data kommer från en annan pump. Byt pumpdrivrutin för att återställa. BG @@ -135,6 +142,8 @@ Återställ Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil. Profil + Markera för borttagning + Är du säker på att du vill ta bort %1$d objekt Behandling Skapa kopia av denna profil? Kalkylatorinställningar @@ -144,6 +153,7 @@ IOB från basal OGILTIG Logga in + Prime/Fyll Insulin Avbryt temp mål Closed Loop @@ -152,13 +162,19 @@ Duration IC ISF + Det gick inte att avbryta temp-basal + Det gick inte att avbryta förlängd bolus + Ladda upp status till Nightscout eller Tidepool Inaktiverad/pausad loop Aktivt Insulin (IOB) Fel lösenord + Fel PIN-kod Lösenorden stämmer inte överens + PIN-koderna överensstämmer inte Profilens basaler är inte satta på hel timme: %1$s + Basalvärdet ersatt med det lägsta tillåtna: %1$s Basalvärdet ersatt med det högsta tillåtna: %1$s /U U/h @@ -166,6 +182,7 @@ Byt till profil %1$d%% i %2$d min + Avbryt temp-basal Låt temp basalen gå Basaldos Duration @@ -187,9 +204,12 @@ Anteckning: %1$s Fråga : %1$s Träning : %1$s + Pump/nålbyte + Sensorbyte Start CGM-sensor Stoppa CGM-sensor Diabeteshundlarm + Byte av insulinreservoar Profilbyte Mellanmålsbolus Måltidsbolus @@ -199,6 +219,8 @@ Temp basal slut KH-korrektion OpenAPS Offline + Byte av pumpbatteri + Tillfälligt mål Temp målvärde Avbryt temp mål Kalkylator @@ -225,7 +247,9 @@ Väntar på resultat SMB + %1$d g kolhydrater behövs inom %2$d minuter + Sammanlagd TDD Exponentiellt viktad TDD Basal Bolus @@ -234,6 +258,7 @@ Antal dagar Vikt Kan visa fel om man använder bolus för förfyllning! + Gammal data, vänligen tryck på \"UPPDATERA\" Total grundbasal TDB * 2 @@ -306,9 +331,11 @@ ÅTERSTÄLL STATISTIK RADERA LOGGAR RADERA FRAMTIDA BEHANDLINGAR + Radera framtida behandlingar EXPORTERA INSTÄLLNINGAR IMPORTERA INSTÄLLNINGAR ÅTERSTÄLL DATABASERNA + RENSA DATABASER EXPORTERA DATABASERNA IMPORTERA DATABASER EXPORTERA OTP @@ -349,6 +376,9 @@ KH %1$d g FÖRLÄNGD BOLUS %1$.2f U %2$d min HÄMTA HÄNDELSER + RENSA LARM + AVAKTIVERA + UPPDATERAD TID HÄMTA HISTORIK %1$d HÄMTA TDD SPARA PROFIL @@ -366,28 +396,81 @@ %1$.0f%% Basal Basal % + fil ditt namn + Autotune + Hjälp för potentiella justeringar av profil (ISF, KH-kvoter och basaldoser) + AT + Autotune-inställningar + Automatiskt profilbyte + Om aktiverad kommer Autotune automatiskt uppdatera profilen efter beräkning. + Kategorisera UAM som basal + Aktivera endast om du på ett tillförlitligt sätt har matat in alla kolhydrater. Med detta alternativ aktiverat kommer Autotune se plötsliga höjningar och rekommendera ändringar av basal-nivån. + Justera insulinkurvan + Aktivera endast om du använder Free-Peak Oref. Detta alternativ kommer att justera topp och längd för DIA + Antal dagar med data + Tillämpa genomsnitt för ISF och KH-kvot + Autotune kommer inte att justera variationer över dygnet för ISF eller KH-kvoter. Det här alternativet tillämpar bara genomsnittlig inställning över hela dygnet + Inkludera mer logginformation för felsökning + Slå på endast om utvecklare bett dig att skicka mer logginformation för att underlätta felsökning av Autotune-plugin + Antal dagar data att inkludera för Autotune (upp till 30) + Justerad + Profil : + Justering dagar : + Kördes senast: + Varning : + Välj profil att justera + Vald profil har %1$d IC-värden. Autotune kommer att använda %2$.2f g/U + Vald profil har %1$d ISF-värden. Autotune kommer att använda %2$.1f %3$s/U + Fel i angivet data, försök köra autotune igen eller minska antalet dagar + Fel i angivet data, öka antalet dagar + Autotune-beräkning startad, det kan ta en stund + Kontrollera resultatet noggrant innan du använder det! + Delresultat för dag %1$d / %2$d justerat Resultat: %1$s + Parameter + % Saknas: + Autotune-profil %1$s + Kör Autotune + Kontrollera profilen Jämför profiler + Kopiera till lokal profil + Uppdatera angiven profil + Återställ angiven profil + Skapa en ny lokal profil av denna Autotune-profil? + Uppdatera %1$s med Autotune-profil? + Återställ %1$s med angiven profil? + Felaktig profil + Autotune kördes utan byte av profil + Autotune körde och profilen byttes automatiskt + Fel under senaste körning av Autotune + En annan Autotune-körning upptäcktes, körning avbruten Systemaviseringar för larm & info Akut larm INFO + Bolusguide + Ditt blodsocker är högt. Istället för att äta är det rekommenderat att vänta tills det sjunker. Vill du göra en korrigeringsbolus nu och få en påminnelse när det är dags att äta? I det här fallet kommer inga kolhydrater att registreras nu, utan du måste ange måltiden på nytt i kalkylatorn. COB kontra IOB Varning! Långsam KH-absorption upptäckt %2$d%% av tiden. Dubbelkolla din beräkning. COB kan vara väldigt missvisande och du riskerar få för mycket insulin!]]> Direkt bolus [%] + Tröskelvärde för gammalt BG-värde [min] + Bolusbegränsning tillämpad: %1$.2f U till %2$.2f U + Bolus kommer bara att loggas (inte levereras av pumpen) Larma när det är dags att äta Ingen åtgärd vald. Inget ändras. Inget nytt BG-värde att basera beräkning på! Ingen aktiv profil vald! Okänt COB! Saknas BG eller är appen nyss omstartad? Max KH uppnått! + Kalkyl (IC: %1$.1f, ISF: %2$.1f) Kolhydrater: %1$.2fU COB: %1$.0fg %2$.2fU BG: %1$.2fU + IOB: %1$.2fU Superbolus: %1$.2fU 15\' trend: %1$.2fU Procent: %1$.2fU x %2$d%% ≈ %3$.2fU @@ -395,10 +478,17 @@ TempM: %1$s %1$s till %2$s Ingen pump tillgänglig! + Snabbknappar + Barn Tonåring Vuxen + Insulinresistent vuxen Gravid + Välj en patienttyp för att ställa in säkerhetsgränser + Max tillåten bolus [U] + Maximalt tillåtna kolhydrater [g] + Patienttyp Lås upp inställningar @@ -451,6 +541,7 @@ minska %1$s med %2$s öka %1$s med %2$s + Tillåten gräns nådd %1$dh %2$dm Tid @@ -470,6 +561,9 @@ Saknar behörighet att skicka SMS + Döda inte min app? + Uppladdning av kraschloggar inaktiverad! + \n\nDokumentation:\nhttps://androidaps.readthedocs.io\n\nfacebook:\nhttps://www.facebook.com/groups/AndroidAPSUsers %1$d dag %1$d dagar @@ -483,4 +577,7 @@ %1$d min + Vill du rensa databasen?\nDet kommer att ta bort spårade ändringar och historiska data äldre än 3 månader. + Vill du rensa databasen?\nDet kommer att ta bort spårade ändringar och historiska data äldre än 3 månader.\nAtt göra det kommer att påskynda full synkronisering dramatiskt. + Rensade poster diff --git a/core/utils/src/main/res/values-sv-rSE/strings.xml b/core/utils/src/main/res/values-sv-rSE/strings.xml index 3ea04e700d..b009e2f499 100644 --- a/core/utils/src/main/res/values-sv-rSE/strings.xml +++ b/core/utils/src/main/res/values-sv-rSE/strings.xml @@ -1,2 +1,8 @@ - + + %1$d valt + Ta bort objekt + Sortera objekt + Ta bort valda objekt + Sortera + diff --git a/database/impl/src/main/java/info/nightscout/database/impl/AppRepository.kt b/database/impl/src/main/java/info/nightscout/database/impl/AppRepository.kt index 46f872ad75..103296bbf8 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/AppRepository.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/AppRepository.kt @@ -10,6 +10,7 @@ import info.nightscout.database.entities.EffectiveProfileSwitch import info.nightscout.database.entities.ExtendedBolus import info.nightscout.database.entities.Food import info.nightscout.database.entities.GlucoseValue +import info.nightscout.database.entities.HeartRate import info.nightscout.database.entities.OfflineEvent import info.nightscout.database.entities.ProfileSwitch import info.nightscout.database.entities.TemporaryBasal @@ -65,7 +66,7 @@ import kotlin.math.roundToInt fun runTransactionForResult(transaction: Transaction): Single { val changes = mutableListOf() return Single.fromCallable { - database.runInTransaction(Callable { + database.runInTransaction(Callable { transaction.database = DelegatedAppDatabase(changes, database) transaction.run() }) @@ -85,7 +86,7 @@ import kotlin.math.roundToInt removed.add(Pair("ExtendedBolus", database.extendedBolusDao.deleteOlderThan(than))) removed.add(Pair("Bolus", database.bolusDao.deleteOlderThan(than))) removed.add(Pair("MultiWaveBolus", database.multiwaveBolusLinkDao.deleteOlderThan(than))) - //removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteOlderThan(than))) + // keep TDD removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteOlderThan(than))) removed.add(Pair("Carbs", database.carbsDao.deleteOlderThan(than))) removed.add(Pair("TemporaryTarget", database.temporaryTargetDao.deleteOlderThan(than))) removed.add(Pair("ApsResultLink", database.apsResultLinkDao.deleteOlderThan(than))) @@ -95,10 +96,10 @@ import kotlin.math.roundToInt removed.add(Pair("EffectiveProfileSwitch", database.effectiveProfileSwitchDao.deleteOlderThan(than))) removed.add(Pair("ProfileSwitch", database.profileSwitchDao.deleteOlderThan(than))) removed.add(Pair("ApsResult", database.apsResultDao.deleteOlderThan(than))) - //database.versionChangeDao.deleteOlderThan(than) + // keep version history database.versionChangeDao.deleteOlderThan(than) removed.add(Pair("UserEntry", database.userEntryDao.deleteOlderThan(than))) removed.add(Pair("PreferenceChange", database.preferenceChangeDao.deleteOlderThan(than))) - //database.foodDao.deleteOlderThan(than) + // keep foods database.foodDao.deleteOlderThan(than) removed.add(Pair("DeviceStatus", database.deviceStatusDao.deleteOlderThan(than))) removed.add(Pair("OfflineEvent", database.offlineEventDao.deleteOlderThan(than))) removed.add(Pair("HeartRate", database.heartRateDao.deleteOlderThan(than))) @@ -110,7 +111,7 @@ import kotlin.math.roundToInt removed.add(Pair("Bolus", database.bolusDao.deleteTrackedChanges())) removed.add(Pair("ExtendedBolus", database.extendedBolusDao.deleteTrackedChanges())) removed.add(Pair("MultiWaveBolus", database.multiwaveBolusLinkDao.deleteTrackedChanges())) - //removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteTrackedChanges())) + // keep TDD removed.add(Pair("TotalDailyDose", database.totalDailyDoseDao.deleteTrackedChanges())) removed.add(Pair("Carbs", database.carbsDao.deleteTrackedChanges())) removed.add(Pair("TemporaryTarget", database.temporaryTargetDao.deleteTrackedChanges())) removed.add(Pair("ApsResultLink", database.apsResultLinkDao.deleteTrackedChanges())) @@ -118,7 +119,7 @@ import kotlin.math.roundToInt removed.add(Pair("EffectiveProfileSwitch", database.effectiveProfileSwitchDao.deleteTrackedChanges())) removed.add(Pair("ProfileSwitch", database.profileSwitchDao.deleteTrackedChanges())) removed.add(Pair("ApsResult", database.apsResultDao.deleteTrackedChanges())) - //database.foodDao.deleteHistory() + // keep food database.foodDao.deleteHistory() removed.add(Pair("OfflineEvent", database.offlineEventDao.deleteTrackedChanges())) removed.add(Pair("HeartRate", database.heartRateDao.deleteTrackedChanges())) } @@ -148,6 +149,7 @@ import kotlin.math.roundToInt fun findBgReadingByNSId(nsId: String): GlucoseValue? = database.glucoseValueDao.findByNSId(nsId) + @Suppress("unused") fun getModifiedBgReadingsDataFromId(lastId: Long): Single> = database.glucoseValueDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -179,14 +181,6 @@ import kotlin.math.roundToInt } } - fun getBgReadingsCorrespondingLastHistoryRecord(lastId: Long): GlucoseValue? = - database.glucoseValueDao.getLastHistoryRecord(lastId) - - @Suppress("unused") // debug purpose only - fun getAllBgReadingsStartingFrom(lastId: Long): Single> = - database.glucoseValueDao.getAllStartingFrom(lastId) - .subscribeOn(Schedulers.io()) - // TEMP TARGETS fun findTemporaryTargetByNSId(nsId: String): TemporaryTarget? = database.temporaryTargetDao.findByNSId(nsId) @@ -210,10 +204,6 @@ import kotlin.math.roundToInt } } - fun compatGetTemporaryTargetData(): Single> = - database.temporaryTargetDao.getTemporaryTargetData() - .subscribeOn(Schedulers.io()) - fun getTemporaryTargetDataFromTime(timestamp: Long, ascending: Boolean): Single> = database.temporaryTargetDao.getTemporaryTargetDataFromTime(timestamp) .map { if (!ascending) it.reversed() else it } @@ -224,6 +214,7 @@ import kotlin.math.roundToInt .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) + @Suppress("unused") fun getModifiedTemporaryTargetsDataFromId(lastId: Long): Single> = database.temporaryTargetDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -240,10 +231,6 @@ import kotlin.math.roundToInt database.temporaryTargetDao.getLastId() // USER ENTRY - fun getAllUserEntries(): Single> = - database.userEntryDao.getAll() - .subscribeOn(Schedulers.io()) - fun getUserEntryDataFromTime(timestamp: Long): Single> = database.userEntryDao.getUserEntryDataFromTime(timestamp) .subscribeOn(Schedulers.io()) @@ -274,6 +261,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedProfileSwitchDataFromId(lastId: Long): Single> = database.profileSwitchDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -288,8 +276,7 @@ import kotlin.math.roundToInt if (tps != null && ps != null) return if (ps.timestamp > tps.timestamp) ps else tps if (ps == null) return tps - if (tps == null) return ps - return null + return ps // if (tps == null) } fun getPermanentProfileSwitch(timestamp: Long): ProfileSwitch? = @@ -340,6 +327,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedEffectiveProfileSwitchDataFromId(lastId: Long): Single> = database.effectiveProfileSwitchDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -400,6 +388,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedTherapyEventDataFromId(lastId: Long): Single> = database.therapyEventDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -430,14 +419,6 @@ import kotlin.math.roundToInt database.therapyEventDao.getLastTherapyRecord(type, System.currentTimeMillis()).toWrappedSingle() .subscribeOn(Schedulers.io()) - fun getTherapyEventByTimestamp(type: TherapyEvent.Type, timestamp: Long): TherapyEvent? = - database.therapyEventDao.findByTimestamp(type, timestamp) - - fun compatGetTherapyEventDataFromTime(timestamp: Long, ascending: Boolean): Single> = - database.therapyEventDao.compatGetTherapyEventDataFromTime(timestamp) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun compatGetTherapyEventDataFromToTime(from: Long, to: Long): Single> = database.therapyEventDao.compatGetTherapyEventDataFromToTime(from, to) .subscribeOn(Schedulers.io()) @@ -446,9 +427,6 @@ import kotlin.math.roundToInt database.therapyEventDao.getLastId() // FOOD - fun findFoodByNSId(nsId: String): Food? = - database.foodDao.findByNSId(nsId) - /* * returns a Pair of the next entity to sync and the ID of the "update". * The update id might either be the entry id itself if it is a new entry - or the id @@ -468,6 +446,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedFoodDataFromId(lastId: Long): Single> = database.foodDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -476,6 +455,7 @@ import kotlin.math.roundToInt database.foodDao.getFoodData() .subscribeOn(Schedulers.io()) + @Suppress("unused") fun deleteAllFoods() = database.foodDao.deleteAllEntries() @@ -505,6 +485,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedBolusesDataFromId(lastId: Long): Single> = database.bolusDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -540,11 +521,6 @@ import kotlin.math.roundToInt .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) - fun getBolusesIncludingInvalidFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single> = - database.bolusDao.getBolusesIncludingInvalidFromTimeToTime(from, to) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun deleteAllBoluses() = database.bolusDao.deleteAllEntries() @@ -570,9 +546,7 @@ import kotlin.math.roundToInt } private fun Single>.expand() = this.map { it.map(::expandCarbs).flatten() } - private fun Single>.filterOutExtended() = this.map { it.filter { c -> c.duration == 0L } } private fun Single>.fromTo(from: Long, to: Long) = this.map { it.filter { c -> c.timestamp in from..to } } - private infix fun Single>.until(to: Long) = this.map { it.filter { c -> c.timestamp <= to } } private fun Single>.from(start: Long) = this.map { it.filter { c -> c.timestamp >= start } } private fun Single>.sort() = this.map { it.sortedBy { c -> c.timestamp } } @@ -595,13 +569,11 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedCarbsDataFromId(lastId: Long): Single> = database.carbsDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) - fun getCarbsByTimestamp(timestamp: Long): Carbs? = - database.carbsDao.findByTimestamp(timestamp) - fun getLastCarbsRecord(): Carbs? = database.carbsDao.getLastCarbsRecord() @@ -630,11 +602,6 @@ import kotlin.math.roundToInt .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) - fun getCarbsDataFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single> = - database.carbsDao.getCarbsFromTimeToTime(from, to) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun getCarbsDataFromTimeToTimeExpanded(from: Long, to: Long, ascending: Boolean): Single> = database.carbsDao.getCarbsFromTimeToTimeExpandable(from, to) .expand() @@ -648,21 +615,6 @@ import kotlin.math.roundToInt .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) - fun getCarbsIncludingInvalidFromTimeExpanded(timestamp: Long, ascending: Boolean): Single> = - database.carbsDao.getCarbsIncludingInvalidFromTimeExpandable(timestamp) - .expand() - .from(timestamp) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - - fun getCarbsIncludingInvalidFromTimeToTimeExpanded(from: Long, to: Long, ascending: Boolean): Single> = - database.carbsDao.getCarbsIncludingInvalidFromTimeToTimeExpandable(from, to) - .expand() - .fromTo(from, to) - .sort() - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun deleteAllCarbs() = database.carbsDao.deleteAllEntries() @@ -692,6 +644,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedBolusCalculatorResultsDataFromId(lastId: Long): Single> = database.bolusCalculatorResultDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -757,14 +710,11 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedTemporaryBasalDataFromId(lastId: Long): Single> = database.temporaryBasalDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) - fun getTemporaryBasalsData(): Single> = - database.temporaryBasalDao.getTemporaryBasalData() - .subscribeOn(Schedulers.io()) - fun getTemporaryBasalActiveAt(timestamp: Long): Single> = database.temporaryBasalDao.getTemporaryBasalActiveAt(timestamp) .subscribeOn(Schedulers.io()) @@ -789,11 +739,6 @@ import kotlin.math.roundToInt .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) - fun getTemporaryBasalsDataIncludingInvalidFromTimeToTime(from: Long, to: Long, ascending: Boolean): Single> = - database.temporaryBasalDao.getTemporaryBasalDataIncludingInvalidFromTimeToTime(from, to) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun getOldestTemporaryBasalRecord(): TemporaryBasal? = database.temporaryBasalDao.getOldestRecord() @@ -824,6 +769,7 @@ import kotlin.math.roundToInt } } + @Suppress("unused") fun getModifiedExtendedBolusDataFromId(lastId: Long): Single> = database.extendedBolusDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -848,11 +794,6 @@ import kotlin.math.roundToInt .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) - fun getExtendedBolusDataIncludingInvalidFromTimeToTime(start: Long, end: Long, ascending: Boolean): Single> = - database.extendedBolusDao.getExtendedBolusDataIncludingInvalidFromTimeToTime(start, end) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun getOldestExtendedBolusRecord(): ExtendedBolus? = database.extendedBolusDao.getOldestRecord() @@ -897,25 +838,12 @@ import kotlin.math.roundToInt } } - fun compatGetOfflineEventData(): Single> = - database.offlineEventDao.getOfflineEventData() - .subscribeOn(Schedulers.io()) - - fun getOfflineEventDataFromTime(timestamp: Long, ascending: Boolean): Single> = - database.offlineEventDao.getOfflineEventDataFromTime(timestamp) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - - fun getOfflineEventDataIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single> = - database.offlineEventDao.getOfflineEventDataIncludingInvalidFromTime(timestamp) - .map { if (!ascending) it.reversed() else it } - .subscribeOn(Schedulers.io()) - fun getOfflineEventDataFromTimeToTime(start: Long, end: Long, ascending: Boolean): Single> = database.offlineEventDao.getOfflineEventDataFromTimeToTime(start, end) .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) + @Suppress("unused") fun getModifiedOfflineEventsDataFromId(lastId: Long): Single> = database.offlineEventDao.getModifiedFrom(lastId) .subscribeOn(Schedulers.io()) @@ -925,13 +853,16 @@ import kotlin.math.roundToInt .subscribeOn(Schedulers.io()) .toWrappedSingle() + @Suppress("unused") fun deleteAllOfflineEventEntries() = database.offlineEventDao.deleteAllEntries() fun getLastOfflineEventId(): Long? = database.offlineEventDao.getLastId() - fun getHeartRatesFromTime(timeMillis: Long) = database.heartRateDao.getFromTime(timeMillis) + fun getHeartRatesFromTime(timeMillis: Long): Single> = + database.heartRateDao.getFromTime(timeMillis) + .subscribeOn(Schedulers.io()) fun getHeartRatesFromTimeToTime(startMillis: Long, endMillis: Long) = database.heartRateDao.getFromTimeToTime(startMillis, endMillis) diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/BolusDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/BolusDao.kt index fd1c106776..5fbe85c564 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/BolusDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/BolusDao.kt @@ -59,9 +59,6 @@ internal interface BolusDao : TraceableDao { @Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC") fun getBolusesIncludingInvalidFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_BOLUSES WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") - fun getBolusesIncludingInvalidFromTimeToTime(from: Long, to: Long): Single> - // This query will be used with v3 to get all changed records @Query("SELECT * FROM $TABLE_BOLUSES WHERE id > :id AND pumpId IS NOT NULL AND type <> :exclude AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_BOLUSES WHERE id > :id) ORDER BY id ASC") fun getModifiedFrom(id: Long, exclude: Bolus.Type = Bolus.Type.PRIMING): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/CarbsDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/CarbsDao.kt index 9bba531e0a..5d8834094c 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/CarbsDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/CarbsDao.kt @@ -46,24 +46,15 @@ internal interface CarbsDao : TraceableDao { @Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp + duration >= :timestamp AND referenceId IS NULL ORDER BY id DESC") fun getCarbsFromTimeExpandable(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") - fun getCarbsFromTimeToTime(from: Long, to: Long): Single> - @Query("SELECT * FROM $TABLE_CARBS WHERE isValid = 1 AND timestamp + duration > :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") fun getCarbsFromTimeToTimeExpandable(from: Long, to: Long): Single> @Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY id DESC") fun getCarbsIncludingInvalidFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_CARBS WHERE timestamp + duration >= :timestamp AND referenceId IS NULL ORDER BY id DESC") - fun getCarbsIncludingInvalidFromTimeExpandable(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_CARBS WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") fun getCarbsIncludingInvalidFromTimeToTime(from: Long, to: Long): Single> - @Query("SELECT * FROM $TABLE_CARBS WHERE timestamp + duration >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY id DESC") - fun getCarbsIncludingInvalidFromTimeToTimeExpandable(from: Long, to: Long): Single> - // This query will be used with v3 to get all changed records @Query("SELECT * FROM $TABLE_CARBS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_CARBS WHERE id > :id) ORDER BY id ASC") fun getModifiedFrom(id: Long): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/ExtendedBolusDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/ExtendedBolusDao.kt index 92fe71aad4..8d85c3e6ae 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/ExtendedBolusDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/ExtendedBolusDao.kt @@ -53,9 +53,6 @@ internal interface ExtendedBolusDao : TraceableDao { @Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") fun getExtendedBolusDataIncludingInvalidFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY timestamp ASC") - fun getExtendedBolusDataIncludingInvalidFromTimeToTime(from: Long, to: Long): Single> - // This query will be used with v3 to get all changed records @Query("SELECT * FROM $TABLE_EXTENDED_BOLUSES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_EXTENDED_BOLUSES WHERE id > :id) ORDER BY id ASC") fun getModifiedFrom(id: Long): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/GlucoseValueDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/GlucoseValueDao.kt index cb9f01b7ca..9f6601da65 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/GlucoseValueDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/GlucoseValueDao.kt @@ -43,12 +43,6 @@ internal interface GlucoseValueDao : TraceableDao { @Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id > :lastId AND referenceId IS NULL ORDER BY timestamp ASC") fun getDataFromId(lastId: Long): Single> - @Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id >= :id") - fun getAllStartingFrom(id: Long): Single> - - @Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE referenceId = :id ORDER BY id DESC LIMIT 1") - fun getLastHistoryRecord(id: Long): GlucoseValue? - // This query will be used with v3 to get all changed records @Query("SELECT * FROM $TABLE_GLUCOSE_VALUES WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_GLUCOSE_VALUES WHERE id > :id) ORDER BY id ASC") fun getModifiedFrom(id: Long): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/HeartRateDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/HeartRateDao.kt index 82ce3f3c38..b234f8d460 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/HeartRateDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/HeartRateDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Query import info.nightscout.database.entities.HeartRate import info.nightscout.database.entities.TABLE_HEART_RATE +import io.reactivex.rxjava3.core.Single @Dao internal interface HeartRateDao : TraceableDao { @@ -21,7 +22,7 @@ internal interface HeartRateDao : TraceableDao { override fun deleteTrackedChanges(): Int @Query("SELECT * FROM $TABLE_HEART_RATE WHERE timestamp >= :timestamp ORDER BY timestamp") - fun getFromTime(timestamp: Long): List + fun getFromTime(timestamp: Long): Single> @Query("SELECT * FROM $TABLE_HEART_RATE WHERE timestamp BETWEEN :startMillis AND :endMillis ORDER BY timestamp") fun getFromTimeToTime(startMillis: Long, endMillis: Long): List diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/OfflineEventDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/OfflineEventDao.kt index 7f2209cc7a..7d0e74350f 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/OfflineEventDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/OfflineEventDao.kt @@ -31,18 +31,9 @@ internal interface OfflineEventDao : TraceableDao { @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp <= :timestamp AND (timestamp + duration) > :timestamp AND referenceId IS NULL AND isValid = 1 ORDER BY timestamp DESC LIMIT 1") fun getOfflineEventActiveAt(timestamp: Long): Maybe - @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") - fun getOfflineEventDataFromTime(timestamp: Long): Single> - - @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") - fun getOfflineEventDataIncludingInvalidFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE timestamp BETWEEN :start AND :end AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") fun getOfflineEventDataFromTimeToTime(start: Long, end: Long): Single> - @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") - fun getOfflineEventData(): Single> - // This query will be used with v3 to get all changed records @Query("SELECT * FROM $TABLE_OFFLINE_EVENTS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_OFFLINE_EVENTS WHERE id > :id) ORDER BY id ASC") fun getModifiedFrom(id: Long): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryBasalDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryBasalDao.kt index 373851489b..ea559c7a50 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryBasalDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryBasalDao.kt @@ -62,12 +62,6 @@ internal interface TemporaryBasalDao : TraceableDao { @Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") fun getTemporaryBasalDataIncludingInvalidFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE timestamp >= :from AND timestamp <= :to AND referenceId IS NULL ORDER BY timestamp ASC") - fun getTemporaryBasalDataIncludingInvalidFromTimeToTime(from: Long, to: Long): Single> - - @Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") - fun getTemporaryBasalData(): Single> - @Query("SELECT * FROM $TABLE_TEMPORARY_BASALS WHERE referenceId = :id ORDER BY id DESC LIMIT 1") fun getLastHistoryRecord(id: Long): TemporaryBasal? diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryTargetDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryTargetDao.kt index dfe77af51b..2b6bb67f30 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryTargetDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/TemporaryTargetDao.kt @@ -37,9 +37,6 @@ internal interface TemporaryTargetDao : TraceableDao { @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE timestamp >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC") fun getTemporaryTargetDataIncludingInvalidFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") - fun getTemporaryTargetData(): Single> - // This query will be used with v3 to get all changed records @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE id > :id AND referenceId IS NULL OR id IN (SELECT DISTINCT referenceId FROM $TABLE_TEMPORARY_TARGETS WHERE id > :id) ORDER BY id ASC") fun getModifiedFrom(id: Long): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/TherapyEventDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/TherapyEventDao.kt index c6abfbf11e..70113ad484 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/TherapyEventDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/TherapyEventDao.kt @@ -46,9 +46,6 @@ internal interface TherapyEventDao : TraceableDao { @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE type = :type AND isValid = 1 AND timestamp <= :now ORDER BY timestamp DESC LIMIT 1") fun getLastTherapyRecord(type: TherapyEvent.Type, now: Long): Maybe - @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :timestamp AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") - fun compatGetTherapyEventDataFromTime(timestamp: Long): Single> - @Query("SELECT * FROM $TABLE_THERAPY_EVENTS WHERE timestamp >= :from AND timestamp <= :to AND isValid = 1 AND referenceId IS NULL ORDER BY timestamp ASC") fun compatGetTherapyEventDataFromToTime(from: Long, to: Long): Single> diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/TraceableDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/TraceableDao.kt index f0e753c035..7dfefd28fd 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/TraceableDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/TraceableDao.kt @@ -3,8 +3,9 @@ package info.nightscout.database.impl.daos import androidx.room.Insert import androidx.room.Update import info.nightscout.database.entities.interfaces.TraceableDBEntry +import info.nightscout.database.impl.daos.workaround.TraceableDaoWorkaround -internal interface TraceableDao : info.nightscout.database.impl.daos.workaround.TraceableDaoWorkaround { +internal interface TraceableDao : TraceableDaoWorkaround { fun findById(id: Long): T? diff --git a/database/impl/src/main/java/info/nightscout/database/impl/daos/UserEntryDao.kt b/database/impl/src/main/java/info/nightscout/database/impl/daos/UserEntryDao.kt index 9af90ad9aa..751591f1b3 100644 --- a/database/impl/src/main/java/info/nightscout/database/impl/daos/UserEntryDao.kt +++ b/database/impl/src/main/java/info/nightscout/database/impl/daos/UserEntryDao.kt @@ -17,9 +17,6 @@ interface UserEntryDao { @Query("DELETE FROM $TABLE_USER_ENTRY WHERE timestamp < :than") fun deleteOlderThan(than: Long): Int - @Query("SELECT * FROM $TABLE_USER_ENTRY ORDER BY id DESC") - fun getAll(): Single> - @Query("SELECT * FROM $TABLE_USER_ENTRY WHERE timestamp >= :timestamp ORDER BY id DESC") fun getUserEntryDataFromTime(timestamp: Long): Single> diff --git a/implementation/src/main/java/info/nightscout/implementation/overview/OverviewDataImpl.kt b/implementation/src/main/java/info/nightscout/implementation/overview/OverviewDataImpl.kt index a1fd439f2f..db143c1a1b 100644 --- a/implementation/src/main/java/info/nightscout/implementation/overview/OverviewDataImpl.kt +++ b/implementation/src/main/java/info/nightscout/implementation/overview/OverviewDataImpl.kt @@ -138,11 +138,11 @@ class OverviewDataImpl @Inject constructor( */ override fun lastBg(autosensDataStore: AutosensDataStore): InMemoryGlucoseValue? = - autosensDataStore.bucketedData?.let { if (it.size > 0) it[0] else null } - // repository.getLastGlucoseValueWrapped().blockingGet().let { gvWrapped -> - // if (gvWrapped is ValueWrapper.Existing) gvWrapped.value - // else null - // } + autosensDataStore.bucketedData?.firstOrNull() + ?: repository.getLastGlucoseValueWrapped().blockingGet().let { gvWrapped -> + if (gvWrapped is ValueWrapper.Existing) InMemoryGlucoseValue(gvWrapped.value) + else null + } override fun isLow(autosensDataStore: AutosensDataStore): Boolean = lastBg(autosensDataStore)?.let { lastBg -> diff --git a/implementation/src/main/res/values-sv-rSE/strings.xml b/implementation/src/main/res/values-sv-rSE/strings.xml index 4b48a8c004..6d331c292f 100644 --- a/implementation/src/main/res/values-sv-rSE/strings.xml +++ b/implementation/src/main/res/values-sv-rSE/strings.xml @@ -4,9 +4,21 @@ Kommando körs just nu Basal understiger miniminivå. Profilen sattes inte. Behörighet + %1$s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt Appen behöver platsåtkomst för bluetooth- och WiFi-identifiering Applikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningar + Lågt Låg Hög + Högt + Under + Inom målområdet + Över + HbA1c: + SD: %1$s + Detaljerad 14 dagar + Dag TIR + Natt TIR + KH diff --git a/implementation/src/test/java/info/nightscout/implementation/overview/OverviewDataImplTest.kt b/implementation/src/test/java/info/nightscout/implementation/overview/OverviewDataImplTest.kt new file mode 100644 index 0000000000..73267a0397 --- /dev/null +++ b/implementation/src/test/java/info/nightscout/implementation/overview/OverviewDataImplTest.kt @@ -0,0 +1,90 @@ +package info.nightscout.implementation.overview + +import info.nightscout.androidaps.TestBase +import info.nightscout.database.ValueWrapper +import info.nightscout.database.entities.GlucoseValue +import info.nightscout.database.impl.AppRepository +import info.nightscout.interfaces.GlucoseUnit +import info.nightscout.interfaces.aps.AutosensDataStore +import info.nightscout.interfaces.iob.InMemoryGlucoseValue +import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.profile.DefaultValueHelper +import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.shared.interfaces.ResourceHelper +import info.nightscout.shared.sharedPreferences.SP +import info.nightscout.shared.utils.DateUtil +import info.nightscout.shared.utils.T +import io.reactivex.rxjava3.core.Single +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mock +import org.mockito.Mockito + +class OverviewDataImplTest : TestBase() { + + @Mock lateinit var rh: ResourceHelper + @Mock lateinit var dateUtil: DateUtil + @Mock lateinit var sp: SP + @Mock lateinit var activePlugin: ActivePlugin + @Mock lateinit var defaultValueHelper: DefaultValueHelper + @Mock lateinit var profileFunction: ProfileFunction + @Mock lateinit var repository: AppRepository + @Mock lateinit var autosensDataStore: AutosensDataStore + + private lateinit var sut: OverviewDataImpl + private val time = 1000000L + + private val glucoseValue = + GlucoseValue(raw = 200.0, noise = 0.0, value = 200.0, timestamp = time, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN, trendArrow = GlucoseValue.TrendArrow.FLAT) + + @BeforeEach + fun setup() { + sut = OverviewDataImpl(aapsLogger, rh, dateUtil, sp, activePlugin, defaultValueHelper, profileFunction, repository) + Mockito.`when`(defaultValueHelper.determineLowLine()).thenReturn(80.0) + Mockito.`when`(defaultValueHelper.determineHighLine()).thenReturn(180.0) + Mockito.`when`(profileFunction.getUnits()).thenReturn(GlucoseUnit.MGDL) + } + + @Test + fun lastBg() { + val bucketedData: MutableList = mutableListOf() + bucketedData.add(InMemoryGlucoseValue(time, 70.0, sourceSensor = GlucoseValue.SourceSensor.UNKNOWN)) + // no data + Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null) + Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Absent())) + Assertions.assertNull(sut.lastBg(autosensDataStore)) + Assertions.assertFalse(sut.isLow(autosensDataStore)) + Assertions.assertFalse(sut.isHigh(autosensDataStore)) + + // no bucketed but in db + Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null) + Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Existing(glucoseValue))) + Assertions.assertEquals(200.0, sut.lastBg(autosensDataStore)?.value) + Assertions.assertFalse(sut.isLow(autosensDataStore)) + Assertions.assertTrue(sut.isHigh(autosensDataStore)) + + // in bucketed + Mockito.`when`(autosensDataStore.bucketedData).thenReturn(bucketedData) + Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Existing(glucoseValue))) + Assertions.assertEquals(70.0, sut.lastBg(autosensDataStore)?.value) + Assertions.assertTrue(sut.isLow(autosensDataStore)) + Assertions.assertFalse(sut.isHigh(autosensDataStore)) + } + + @Test + fun isActualBg() { + // no bucketed but in db + Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null) + Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Existing(glucoseValue))) + Mockito.`when`(dateUtil.now()).thenReturn(time + T.mins(1).msecs()) + Assertions.assertTrue(sut.isActualBg(autosensDataStore)) + Mockito.`when`(dateUtil.now()).thenReturn(time + T.mins(9).msecs() + 1) + Assertions.assertFalse(sut.isActualBg(autosensDataStore)) + + // no data + Mockito.`when`(autosensDataStore.bucketedData).thenReturn(null) + Mockito.`when`(repository.getLastGlucoseValueWrapped()).thenReturn(Single.just(ValueWrapper.Absent())) + Assertions.assertFalse(sut.isActualBg(autosensDataStore)) + } +} \ No newline at end of file diff --git a/plugins/aps/src/main/java/info/nightscout/plugins/general/autotune/AutotunePlugin.kt b/plugins/aps/src/main/java/info/nightscout/plugins/general/autotune/AutotunePlugin.kt index 5e11f1dd7e..4d4449c814 100644 --- a/plugins/aps/src/main/java/info/nightscout/plugins/general/autotune/AutotunePlugin.kt +++ b/plugins/aps/src/main/java/info/nightscout/plugins/general/autotune/AutotunePlugin.kt @@ -370,7 +370,7 @@ class AutotunePlugin @Inject constructor( profilePlugin.currentProfile()?.basal = newProfile.basal() profilePlugin.currentProfile()?.ic = newProfile.ic(circadian) profilePlugin.currentProfile()?.isf = newProfile.isf(circadian) - profilePlugin.storeSettings() + profilePlugin.storeSettings(timestamp = dateUtil.now()) } fun saveLastRun() { diff --git a/plugins/aps/src/main/res/values-sv-rSE/strings.xml b/plugins/aps/src/main/res/values-sv-rSE/strings.xml index c04394acd5..62bb97b82d 100644 --- a/plugins/aps/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/aps/src/main/res/values-sv-rSE/strings.xml @@ -1,10 +1,14 @@ + Justera känslighet och BG + DynamicISF justeringsfaktor % + Justeringsfaktor för DynamicISF. Ställ in mer än 100% för mer aggressiva korrigeringsdoser, och mindre än 100% för mindre aggressiva korrigeringar. Högt målvärde höjer känsligheten Lågt målvärde sänker känsligheten OpenAPS SMB + Dynamisk ISF Minsta antal minuter mellan SMB Insulinresistens sänker mål-BG Om systemet upptäcker tillfällig insulinresistens, sänk mål-BG för att på så sätt tillåta mer insulin @@ -71,6 +75,8 @@ Max antal minuter basal som kan bli SMB vid UAM Minimigräns för KH-förslag Gränsvärde för om systemet ska föreslå en KH-korrektion. Förslag som är mindre än detta värde kommer inte att visas som notis. + BG-värde under vilket insulintillförsel stängs av. Standardvärdet använder standard-målmodell. Användaren kan justera mellan 60 mg/dl (3.3 mmol/l) och 100mg/dl (5.5mmol/l) + BG-nivå under vilken insulintillförseln stängs av Ökar maximalt basaldos eftersom inställningen är lägre än din maximala basal i profilen multiplikator för max basal multiplikator för daglig max basal @@ -82,13 +88,30 @@ maxvärde i Inställningar hård begränsning + Topp + Kör nu En bolus gavs för mindre än 3 min sedan. Hoppar över SMB + Pump ej initierad! Loop Aktivera eller inaktivera implementationen som kör loopen. + INGEN APS VALD ELLER HAR LEVERERAT RESULTAT Ignorera 5 min Ignorera 15 min Ignorera 30 min + KH-förslag + Ny rekommendation tillgänglig Basal justerad korrekt + Kördes senast APS + Begäran + Efter begränsningar + Begärd tid för temp-basal + Tid för temp-basal + Temp-basal satt i pump + Tid för SMB-begäran + SMB körtid + SMB påbörjad av pump + Minsta ändring som ska utföras [%] + Open Loop kommer bara att be om justering om ändringen är större än detta värde. Standardvärdet är 20% diff --git a/plugins/automation/src/main/java/info/nightscout/automation/triggers/TriggerHeartRate.kt b/plugins/automation/src/main/java/info/nightscout/automation/triggers/TriggerHeartRate.kt index 57309bb9f7..e1a6c4c919 100644 --- a/plugins/automation/src/main/java/info/nightscout/automation/triggers/TriggerHeartRate.kt +++ b/plugins/automation/src/main/java/info/nightscout/automation/triggers/TriggerHeartRate.kt @@ -31,7 +31,7 @@ class TriggerHeartRate(injector: HasAndroidInjector) : Trigger(injector) { return true } val start = dateUtil.now() - averageHeartRateDurationMillis - val hrs = repository.getHeartRatesFromTime(start) + val hrs = repository.getHeartRatesFromTime(start).blockingGet() val duration = hrs.takeUnless { it.isEmpty() }?.sumOf { hr -> hr.duration } ?: 0L if (duration == 0L) { aapsLogger.info(LTag.AUTOMATION, "HR not ready, no heart rate measured for ${friendlyDescription()}") 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 aa0e8d2e4b..0bf833e300 100644 --- a/plugins/automation/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/automation/src/main/res/values-sv-rSE/strings.xml @@ -92,6 +92,8 @@ Senaste bolus %1$s %2$s min sedan COB COB %1$s %2$.0f + Hjärtfrekvens + HF %1$s %2$.0f IOB [U]: Dist [m]: Återkommande tid @@ -109,6 +111,14 @@ Automationshändelse Ändra ordning Användaråtgärd + Ta bort automatisering + Sortera automatisering + Ta bort valda objekt + %1$d valda + Systemautomatisering + Kör automatiseringar + Lägg till regel + Sluta bearbeta M T @@ -118,5 +128,7 @@ L S + Dags att äta!\nKör bolusguiden igen för ny beräkning. Dags för bolus!\nKör Bolusguiden och gör beräkningar igen. + Fel vid inställning av framtida alarm diff --git a/plugins/automation/src/test/java/info/nightscout/automation/triggers/TriggerHeartRateTest.kt b/plugins/automation/src/test/java/info/nightscout/automation/triggers/TriggerHeartRateTest.kt index 84c4e2b9fb..8a950b4f39 100644 --- a/plugins/automation/src/test/java/info/nightscout/automation/triggers/TriggerHeartRateTest.kt +++ b/plugins/automation/src/test/java/info/nightscout/automation/triggers/TriggerHeartRateTest.kt @@ -3,11 +3,9 @@ package info.nightscout.automation.triggers import info.nightscout.automation.R import info.nightscout.automation.elements.Comparator import info.nightscout.database.entities.HeartRate +import io.reactivex.rxjava3.core.Single import org.json.JSONObject -import org.junit.Assert.assertEquals -import org.junit.Assert.assertFalse -import org.junit.Assert.assertNotSame -import org.junit.Assert.assertTrue +import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.mockito.Mockito.verify @@ -25,7 +23,7 @@ class TriggerHeartRateTest : TriggerTestBase() { @Test fun friendlyName() { - assertEquals(R.string.triggerHeartRate, TriggerHeartRate(injector).friendlyName()) + Assertions.assertEquals(R.string.triggerHeartRate, TriggerHeartRate(injector).friendlyName()) } @Test @@ -33,7 +31,7 @@ class TriggerHeartRateTest : TriggerTestBase() { val t = TriggerHeartRate(injector) `when`(rh.gs(Comparator.Compare.IS_EQUAL_OR_GREATER.stringRes)).thenReturn(">") `when`(rh.gs(R.string.triggerHeartRateDesc, ">", 80.0)).thenReturn("test") - assertEquals("test", t.friendlyDescription()) + Assertions.assertEquals("test", t.friendlyDescription()) } @Test @@ -43,16 +41,16 @@ class TriggerHeartRateTest : TriggerTestBase() { comparator.value = Comparator.Compare.IS_GREATER } val dup = t.duplicate() as TriggerHeartRate - assertNotSame(t, dup) - assertEquals(100.0, dup.heartRate.value, 0.01) - assertEquals(Comparator.Compare.IS_GREATER, dup.comparator.value) + Assertions.assertNotSame(t, dup) + Assertions.assertEquals(100.0, dup.heartRate.value, 0.01) + Assertions.assertEquals(Comparator.Compare.IS_GREATER, dup.comparator.value) } @Test fun shouldRunNotAvailable() { val t = TriggerHeartRate(injector).apply { comparator.value = Comparator.Compare.IS_NOT_AVAILABLE } - assertTrue(t.shouldRun()) + Assertions.assertTrue(t.shouldRun()) verifyNoMoreInteractions(repository) } @@ -62,8 +60,8 @@ class TriggerHeartRateTest : TriggerTestBase() { heartRate.value = 100.0 comparator.value = Comparator.Compare.IS_GREATER } - `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(emptyList()) - assertFalse(t.shouldRun()) + `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(Single.just(emptyList())) + Assertions.assertFalse(t.shouldRun()) verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis) verifyNoMoreInteractions(repository) } @@ -78,8 +76,8 @@ class TriggerHeartRateTest : TriggerTestBase() { HeartRate(duration = 300_000, timestamp = now - 300_000, beatsPerMinute = 80.0, device = "test"), HeartRate(duration = 300_000, timestamp = now, beatsPerMinute = 60.0, device = "test"), ) - `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(hrs) - assertFalse(t.shouldRun()) + `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(Single.just(hrs)) + Assertions.assertFalse(t.shouldRun()) verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis) verifyNoMoreInteractions(repository) } @@ -93,8 +91,8 @@ class TriggerHeartRateTest : TriggerTestBase() { val hrs = listOf( HeartRate(duration = 300_000, timestamp = now, beatsPerMinute = 120.0, device = "test"), ) - `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(hrs) - assertTrue(t.shouldRun()) + `when`(repository.getHeartRatesFromTime(now - t.averageHeartRateDurationMillis)).thenReturn(Single.just(hrs)) + Assertions.assertTrue(t.shouldRun()) verify(repository).getHeartRatesFromTime(now - t.averageHeartRateDurationMillis) verifyNoMoreInteractions(repository) } @@ -105,12 +103,9 @@ class TriggerHeartRateTest : TriggerTestBase() { heartRate.value = 100.0 comparator.value = Comparator.Compare.IS_GREATER } - assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value) + Assertions.assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value) - assertEquals( - """{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}""".trimMargin(), - t.toJSON() - ) + Assertions.assertEquals("""{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}""".trimMargin(), t.toJSON()) } @Test @@ -120,7 +115,7 @@ class TriggerHeartRateTest : TriggerTestBase() { """{"data":{"comparator":"IS_GREATER","heartRate":100},"type":"TriggerHeartRate"}""" ) ) as TriggerHeartRate - assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value) - assertEquals(100.0, t.heartRate.value, 0.01) + Assertions.assertEquals(Comparator.Compare.IS_GREATER, t.comparator.value) + Assertions.assertEquals(100.0, t.heartRate.value, 0.01) } } \ No newline at end of file diff --git a/plugins/configuration/src/main/res/values-sv-rSE/strings.xml b/plugins/configuration/src/main/res/values-sv-rSE/strings.xml index 7bd98497a0..bb17e8c574 100644 --- a/plugins/configuration/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/configuration/src/main/res/values-sv-rSE/strings.xml @@ -6,6 +6,7 @@ Föregående Installationsguide Avsluta + Välkommen Välkommen till installationsguiden! Den kommer att hjälpa dig genom installationsprocessen\n Licensavtal för slutanvändare FÅR INTE ANVÄNDAS FÖR ATT FATTA MEDICINSKA BESLUT. DET FINNS INGEN GARANTI FÖR PROGRAMMET I DEN UTSTRÄCKNING SOM TILLÅTS AV GÄLLANDE LAG. FÖRUTOM NÄR ANNAT ANGES SKRIFTLIGEN LEVERERAS APPLIKATIONEN SOM DEN ÄR HELT UTAN GARANTIER I NÅGON SOM HELST FORM, VARKEN UTTRYCKTA ELLER UNDERFÖRSTÅDDA, INKLUSIVE MEN INTE BEGRÄNSAT TILL SÄLJBARHET OCH LÄMPLIGHET FÖR ETT VISST ÄNDAMÅL. HELA RISKEN VAD GÄLLER KVALITET OCH PRESTANDA AV PROGRAMMET ÅLIGGER ANVÄNDAREN. OM PROGRAMMET VISAR SIG VARA DEFEKT ANTAR ANVÄNDAREN DEN FULLA FÖR KOSTNADEN FÖR ALL NÖDVÄNDIG SERVICE, REPARATION ELLER KORRIGERING. @@ -20,10 +21,12 @@ Appen behöver platsåtkomst för bluetooth- och WiFi-identifiering Applikationen behöver lagringsbehörighet för att kunna lagra loggfiler och exportinställningar Be om behörighet + %1$s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt Tidigare sparade inställningar hittade Huvudlösenordet används för att kryptera backuper och för att åsidosätta vissa säkerhetsfunktioner i applikationen. Kom ihåg det eller förvara det på ett säkert ställe. Nuvarande huvudlösenord Använd värden för den största måltiden som du vanligen äter\n + Synkronisera data till molnet. Du kan hoppa över detta steg nu, men du kommer inte att kunna klara inlärningsmålen förrän du ansluter Nightscout eller Tidepool. Status: Patientens namn Vänligen ange patientens namn eller smeknamn för att kunna skilja mellan flera uppsättningar av inställningar @@ -33,7 +36,9 @@ Profil Genomför profilbyte Hoppa över installationsguiden + Tryck på knappen nedan för att låta AAPS föreslå/göra basalförändringar Insticksprogrammet för känslighet används för att detektera insulinkänslighet och för att beräkning av aktiva kolhydrater, COB. För mer information, besök: + https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html Välj en av dessa algoritmer. De sorteras från den äldsta till nyaste. Nyare algoritm är oftast mer kraftfull och mer aggressiv. Om du är ny som loopanvändare vill du förmodligen börja med AMA och inte med senaste. Glöm inte att läsa dokumentationen om OpenAPS och konfigurera algoritmen innan användning. Konfigurera din Riley Link nedan. När du har valt en Riley Link kan du fortsätta installationen när status är \"Ansluten\". Det här kan ta en minut.\n Du kan fortsätta installationen först när pumpen har konfigurerats.\n @@ -48,24 +53,35 @@ Begäran APS-läge Föredraget APS-läge + Fel vid begäran om behörigheter Denna enhet verkar inte ha stöd för vitlistning från batterioptimering. Du eventuellt råka ut för problem pga detta. Konfigurationsverktyg Pump + Vilken pump vill du använda med AAPS? Profil + Vilken profil ska AAPS använda? APS Vilken algoritm ska användas för behandlingar? Generella inställningar Dessa är några allmänna insticksprogram som kan vara användbara. Synkronisering + Plugin för uppladdning och synkronisering av data. Vilka begränsningar ska tillämpas? Loop + Använd detta för att aktivera AAPS loop-möjligheter. Vilken typ av insulin använder du? BG-källa + Var ska AAPS få sitt data ifrån? + Utjämning + Välj utjämningsalgoritm Känslighetsavkänning Vilken algoritm vill du använda för känslighetsavkänning? Konf Används för att konfigurera de aktiva insticksprogrammen + Varning: Om du aktiverar och ansluter en pump kommer AAPS skriva över pumpens basalprofil med den aktiva profilen i AAPS. Se till att ha rätt inställningar i appen innan du ansluter. Om du är osäker, tryck på Avbryt och anslut pumpen på nytt vid ett senare tillfälle. + öppna inställningar + Följarversionen matchar inte AAPS-versionen. Vänligen uppdatera. Inställningar Du kommer att bli tillfrågad om huvudlösenordet som sedan kommer att användas för att kryptera exporterade inställningar. @@ -98,6 +114,7 @@ Underhåll UH Tillhandahåller funktioner för underhåll (t ex skicka eller ta bort loggar). + Rensning av databas Vill du verkligen återställa databaserna? Underhållsinställningar e-postmottagare @@ -106,7 +123,9 @@ Radera loggar Nightscoutversion: Engineering Mode aktiverat + Loggfiler Loggningsinställningar + Diverse Återställ databaserna Återställ standardinställningar @@ -134,5 +153,7 @@ Krypteringskonfigurationen saknas. Inställningsformatet är ogiltigt! Ej stödd eller ej angiven krypteringsalgoritm! + Välj anpassad urtavla + Vänligen starta om telefonen eller starta om AAPS från systeminställningar \nannars kommer Android APS inte att ha loggning aktiverat (viktigt för att spåra och kontrollera att algoritmerna fungerar korrekt)! diff --git a/plugins/constraints/src/main/res/values-sv-rSE/exam.xml b/plugins/constraints/src/main/res/values-sv-rSE/exam.xml index 93fa401f8f..a4ddf20898 100644 --- a/plugins/constraints/src/main/res/values-sv-rSE/exam.xml +++ b/plugins/constraints/src/main/res/values-sv-rSE/exam.xml @@ -4,15 +4,29 @@ Insulinduration (DIA) Du bör ange värdet för DIA i din profil. Det minsta tillåtna värdet är 5 timmar. + https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html#insulin + Om du tycker att värdet för DIA som du använde i din pump före AAPS fungerade väl, behöver du inte ändra det här när du börjar looping. Du bör själv fastställa det lämpliga värdet för DIA. Hypo tempmål + Vad är huvudskälet till att ange ett tillfälligt mål för lågt blodsocker? För att korrigera känningar som orsakas av felaktiga basalinställningar. + För att förhindra att AAPS överkorrigerar för ett snabbt stigande blodsocker orsakat av snabbverkande kolhydrater som intagits för att behandla lågt blodsocker. För att korrigera för en känning om ett resultat av motion. För att förhindra att blodsockret blir lågt även om basaldosen redan är 0%. + https://wiki.aaps.app/en/latest/Usage/temptarget.html Vilken profiltyp kan användas och konfigureras offline? Ämne: Offlineprofil NS-profil kan användas, men inte konfigureras. + https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html#profile + Skäl att använda \"Koppla bort pump\" i AAPS + Vad ska göras när pumpen avlägsnas från kroppen? Detta är onödigt eftersom insulin ändå inte kommer levereras om pumpen är fysiskt bortkopplad. + Det hjälper AAPS att förstå att inget insulin levereras när pumpen är fysiskt bortkopplad. + Det stoppar inte leverans av insulin om pumpen fortsätter att vara ansluten till din kropp. + Det kommer att ställa AAPS i öppen loop-läge. + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#other-settings + AAPS-inställningar + AAPS-inställningar Vilka är de rekommenderade metoderna för att säkerhetskopiera dina inställningar? Du behöver inte exportera dina inställningar om du antecknar dem. Exportera dina inställningar när du har slutfört ett mål. @@ -22,23 +36,29 @@ Din inställningsfil finns i mappen Internt lagringsutrymme/AAPS/preferences på telefonen. Kopiera din inställningsfilen till en säker plats utanför din telefon (t.ex. genom att använda molnlagring, ansluta med en kabel till datorn, e-post, etc.) Om telefonen är skadad eller borttappad finns det enkla sätt att återställa dina inställningar utan säkerhetskopia. + https://wiki.aaps.app/en/latest/Usage/ExportImportSettings.html + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#what-emergency-equipment-is-recommended-to-take-with-me Brusiga CGM-värden Vad bör göras om CGM-datat är brusigt? + Gör inget - AAPS tar hand om det. Inaktivera closed loop-läge för att undvika över- eller underdosering. Byt ut brusiga eller felaktiga sensorer. Kontrollera att din CGM-app ger utjämnade data. + https://wiki.aaps.app/en/latest/Usage/Smoothing-Blood-Glucose-Data-in-xDrip.html#smoothing-blood-glucose-data Träning och profiler Hur kan du använda profiler för att bäst hjälpa systemet att hantera aerobisk träning? Gör ett profilbyte till mindre än 100%. Gör ett profilbyte till mer än 100%. Lämna profilen på 100%. Pausa loopen. + https://wiki.aaps.app/en/latest/Usage/temptarget.html#activity-temp-target Träning och tillfälliga mål Hur kan man använda tillfälliga mål för att på bästa sätt hjälpa systemet att hantera aerobisk träning? Ställ in temp mål för Träning vid en lämplig tidpunkt innan motionen påbörjas. Ställ in temp mål för Träning efter avslutad träning. Lämna ditt målvärde oförändrat. Vänta tills blodglukosnivån sjunker under ditt Hypo temp mål och sen äter du 15 g av snabbverkande kolhydrater. + https://wiki.aaps.app/en/latest/Usage/temptarget.html#activity-temp-target Får jag insulin när loopen är avstängd eller pausad? Ja. Basalinsulin fortsätter att levereras. Nej, leverans av insulin är stoppad. @@ -48,7 +68,9 @@ När du upplever frekvent högt eller lågt blodsocker. Minst en gång i veckan. När du väl har ställt in och validerat dessa värden bör dessa värden inte ändras över tiden. + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#androidaps-settings Förutsättningar + Vad är nödvändigt för att installera och använda AAPS? Validerad profilinformation (Basal, IC, ISF, DIA). En dator med Android Studio installerad och konfigurerad. En telefon som stöds. @@ -59,35 +81,73 @@ Ett Github-konto. Erfarenhet av programmering eller redigering av kod. En MiniMed 670G pump. + https://wiki.aaps.app/en/latest/Module/module.html En smart klocka. En CGM som stöds. Förutsättningar + Vad är nödvändigt för att installera och använda AAPS? Validerad information för att konfigurera en profil (ISF, KH-kvot, basaldoser, DIA osv.). En kompatibel Android-enhet (t.ex. mobiltelefon, full Android-klocka eller surfplatta). + AAPS kräver en Internetanslutning för att kunna köras i closed loop-läge. En stödd CGM och lämplig app för att ta emot blodsockervärden på telefonen/enheten. + https://wiki.aaps.app/en/latest/Module/module.html + Uppdaterar AAPS Markera ett eller flera alternativ. Du måste ha Git installerat och konfigurerat på din dator. + När uppdaterade versioner av AAPS släpps, kan de tidigare versionerna få begränsad funktionalitet efter en viss tid. Du bör spara och notera platsen för ditt keystore och använda samma signeringsnyckel för uppdateringar som för den föregående installationen. Uppdatera aldrig om systemet fungerar bra. Om du har problem att bygga apk-filen, kan du installera en apk som har byggts av en vän. + https://wiki.aaps.app/en/latest/Installing-AndroidAPS/Update-to-new-version.html#update-to-a-new-version-or-branch Felsökning + Vart vänder du dig för att få hjälp med AAPS? + Du kan be om råd i Facebook-gruppen \"AAPS Users\". + Du bör läsa (och repetera) AAPS-dokumentationen. + Du kan be om råd och logga tekniska problem eller andra ärenden på AAPS Discord-server. Du bör fråga din diabetesklinik/endokrinolog. + https://wiki.aaps.app/en/latest/Installing-AndroidAPS/Update-to-new-version.html#troubleshooting https://www.facebook.com/groups/AndroidAPSUsers/ + https://discord.gg/4fQUWHZ4Mw + Insulininställningar Vilket insulin ska du använda med insticksprogrammet Ultra-Rapid Oref? Fiasp® NovoRapid®/Novolog® Humalog ® Actrapid ®/Humalin R ®/\"reguljärt\" human-insulin. + https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html#insulin Insticksprogram för känslighet Markera ett eller flera alternativ. + Insticksprogram för känslighet gör det möjligt för AAPS att justera för tillfälliga eller kortvariga förändringar i insulinkänsligheten (t. ex. hormonella förändringar eller problem med absorption vid infusionsstället). + Insticksprogram för känslighet ger användaren föreslagna ändringar av basaldoser, KH-kvoter och ISF som kan användas för att redigera profilen. + När du loggar ett kanylbyte återställs autosens-värdet tillbaka till 100%. + Vissa av insticksprogrammens inställningar har konfigurerbara tidsintervall som kan ställas in av användaren. + https://wiki.aaps.app/en/latest/Configuration/Sensitivity-detection-and-COB.html + https://wiki.aaps.app/en/latest/Usage/Open-APS-features.html#autosens Fel i KH-inmatning Vad ska du göra om du har gjort en felaktig inmatning? Ta bort den felaktiga posten i Behandlingar och ange rätt kolhydratmängd. Ge bolus med insulin med hjälp av förfyllningsmenyn för infusionssetet. + Gör inget - AAPS kommer att utföra lämpliga justeringar. Ge bolus med hjälp av knappen Insulin på hem/översiktssidan. Fel i bolusinmatning + Vad ska du göra om du fått mindre insulin än vad pumpens historik visar, t.ex. på grund av en insulinblockering, en felaktig kanyl eller om du glömt att sätta tillbaka din slangpump efter en dusch? Ta bort insulindata från Nightscout för att ta bort den från pumpens historik. + Jämför värden i AAPS och pumphistoriken (om pumpen stöder detta). Ge en bolus med en del av det insulin du saknar antingen med penna eller genom att använda förfyllningsfunktionen. + Gör ingenting och låt AAPS korrigera eventuella resulterande höga blodglukosnivåer. + Aktiva kolhydrater (COB) + Hur påverkas COB-beräkningen av ISF-värdet? + Att öka ISF gör den beräknade KH-absorptionstiden längre + Att öka ISF gör den beräknade KH-absorptionstiden kortare + Att öka ISF kommer inte påverka beräknad KH-absorption + Hur påverkas COB-beräkningen av KH-kvoten? + Att öka KH-kvoten gör den beräknade absorptionstiden längre + Att öka KH-kvoten gör den beräknade absorptionstiden kortare + Att öka KH-kvoten kommer inte påverka beräknad absorptionstid + Hur påverkas COB-beräkningen av en förändrad profilprocent? + Att sätta profilen till 150% kommer att göra den beräknade KH-absorptionstiden längre + Att sätta profilen till 150% kommer att göra den beräknade KH-absorptionstiden kortare + Att sätta profilen till 150% kommer inte att påverka den beräknade KH-absorptionstiden IOB-värdet påverkas av temp basaler. Hög temp basal kommer inte att ges när ditt BG-värde är under målet. Negativ IOB under en längre period även om du inte motionerat, tyder på att din profil ger för mycket insulin. @@ -95,15 +155,31 @@ Kolhydrater och bolus Endast gram får användas för att uppskatta och registrera kolhydrater som konsumeras. Kolhydrater som konsumeras kan registreras med hjälp av ett lämpligt utbytessystem (t.ex. DAFNE \"CHO\" eller europeiska \"Brödenheter\"). + AAPS använder en dynamisk modell för att uppskatta kolhydratsupptag och beräkna COB. Om blodglukosnivån ligger utanför normala värden (för lågt eller för högt) kan boluskalkylatorn användas för att ge förslag om KH- eller insulinkorrektioner. + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#insulin-to-carb-ratio-ic-g-u e-carbs Vad kan du använda e-carbs (förlängda kolhydrater) till? För att schemalägga framtida kolhydrater och/eller fördela över ett intervall (likt en förlängd bolus fördelar insulin över ett intervall). + För att logga \"fria\" motionskolhydrater som du vill dölja för AAPS. + e-carbs (inlagda för distribution i framtiden) kan hjälpa AAPS att hantera måltider som är fett- och/eller proteinrika. + För att logga kolhydrater som givits för att korrigera ett lågt BG-värde. + https://wiki.aaps.app/en/latest/Usage/Extended-Carbs.html Fjärrövervakning + Hur kan du övervaka AAPS (till exempel för ditt barn) på distans? + AAPSClient-appen, Nightscout-appen och Nightscouts webbsida låter dig följa AAPS på distans. Andra appar (t.ex. Dexcom Follow, xDrip+ i följarläge) gör att du kan följa vissa parametrar (t.ex. BG-värden) men använder andra algoritmer så IOB och COB kanske inte överenstämmer. + För att följa AAPS måste båda enheterna ha Internetåtkomst (via WiFi eller mobildata). + AAPSClient som används som följare kommer både övervaka och ge full kontroll över AAPS. + https://wiki.aaps.app/en/latest/Children/Children.html Insulinkänslighetsfaktor (ISF) Högre ISF-värden kommer att leda till mer insulin för att täcka en viss mängd kolhydrater. + Att sänka ISF leder till ökad insulinleverans för att korrigera blodsocker som är över målvärdet. + Att höja eller sänka ISF har påverkar inte insulinleveransen när blodglukosnivån är lägre än målet. + ISF ska anges i dina AAPS-inställningar. Om du ändrar ISF-värdet i din profil är det tillräckligt för att tillämpa ändringen. + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#insulin-sensitivity-factor-isf-mmol-l-u-or-mg-dl-u + https://wiki.aaps.app/en/latest/Usage/Profiles.html Du kan använda mer än ett värde för KH-kvot i din profil. Om du ändrar din ISF-profil i din profil bör du alltid ändra din KH-kvot också. Insulin till kolhydratförhållandet (I:C förhållande) @@ -111,24 +187,41 @@ Lägre kolhydratskvot leder till att mindre insulin levereras för en given mängd kolhydrater. Om du har 0 COB, kommer en förändring av IC-kvoten leda till en annan mängd insulin för att korrigera din BG-nivå. IC kommer att vara annorlunda om du räknar brödenheter (utbytesenhet) som 10g eller 12g. + KH-kvot. Betyder det hur många brödenheter (utbytesenheter) som omfattas av 1U insulin? + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#insulin-to-carb-ratio-ic-g-u Profilbyte + När du anger ett profilbyte till 90%, vilka svar är sanna? Basaldoserna kommer att bli 10% lägre. ISF kommer att bli 10% högre. KH-kvoten kommer att bli 10% lägre. ISF och KH-kvoterna kommer att vara oförändrade. + https://wiki.aaps.app/en/latest/Usage/Profiles.html#profile-switch Profilbyte + När du anger ett profilbyte till 120%, vilka svar är sanna? Blodglukosmålet kommer att bli 20% högre. Basaldoserna kommer att bli 20% högre. Blodglukosmålet ändras inte. ISF kommer att bli 20% högre. Profilbyte + Om du stiger upp 2 timmar tidigare än vanligt, hur ska du informera AAPS om ändringen? Gör ett profilbyte med en tidsförskjutning av 2 Gör ett profilbyte med en tidsförskjutning av -2 + Ange ett \"Äta snart\" tillfälligt mål. + Gör ett profilbyte till mer än 100%. + https://wiki.aaps.app/en/latest/Usage/Profiles.html#timeshift Ändringar av profiler Basaldoser, ISF, KH-kvoter och dylikt bör anges i profiler. + För att aktivera ändringar i din Nightscout-profil krävs att din AAPS-telefon har Internetanslutning. Att redigera profiler för att ändra värden är tillräckligt för att genomföra eventuella ändringar. + Flera profiler kan ställas in och väljas för att hantera förändrade omständigheter (t.ex. hormonella förändringar, skiftarbete, livsstilsskillnader för vardagar/helg). + https://wiki.aaps.app/en/latest/Module/module.html#good-individual-dosage-algorithm-for-your-diabetes-therapy Hjälp med basaldoser + Var kan du få hjälp att ställa in din basal och andra inställningar. Ditt diabetesteam Google Facebook + Annan medicin. Läs nedanstående deklaration och markera rutan för att acceptera. + AAPS sänker basaldosen eller pausar insulinleveransen för att höja blodglukosvärdet. Mediciner av typen SGLT2-hämmare (glifloziner) kan motverka eller förhindra den väntade glukoshöjningen vilket kan leda till akut insulinbrist och ketoacidos (DKA). +\nVanliga märken som finns på marknaden: Invokana®, Forxiga®, Jardiance®, Steglatro®, Suglat®, Apleway®, Deberza®, Synjardy®, Vokanamet®, Xigduo®.\n\n +Jag lovar härmed att inte ta sådana läkemedel medan jag använder AAPS eller kommer att pausa loopen innan jag tar dessa läkemedel. diff --git a/plugins/constraints/src/main/res/values-sv-rSE/objectives.xml b/plugins/constraints/src/main/res/values-sv-rSE/objectives.xml index 71e5017bbe..b104b2decc 100644 --- a/plugins/constraints/src/main/res/values-sv-rSE/objectives.xml +++ b/plugins/constraints/src/main/res/values-sv-rSE/objectives.xml @@ -7,20 +7,38 @@ Mål %1$d inte uppnått Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp + Du har utfört grundläggande installation av AAPS-ekosystemet. Nightscout är inte nödvändigt för AAPS att köra, men det är mycket användbart för rapportering och övervakning av andra patienter. Det är inte nödvändigt att vara ansluten till NS hela tiden om du använder NS enbart för dig själv. Du kan ställa in att uppladdning enbart ska ske t. ex. endast på wifi för att spara batteri. Starta med open loop Kör i Open Loop-läge i några dagar och sätt ett antal temp-basaler manuellt. Konfigurera och använd temporära och förinställda temporära mål (t.ex. Träning eller Hypo) + Öppen loop kan användas för rekommendationer om du inte har en kompatibel pump eller om du inte är redo att stänga loopen. Förstå din open loop och hur den föreslår temp basaler Utifrån vad du nu lärt dig, besluta vilken max basal du vill ha. Ställ in det både i inställningarna i appen och i din pump + Var noggrann med säkerhetsfunktioner och justera säkerhetsparametrar vid behov. Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger + Att sätta MaxIOB till noll förebygger att du får lågt blodsocker och kommer inte att lägga till mer insulin över basal hastighet (utom situationer där du har negativ IOB) Finjustering av closed loop, med gradvis ökande max IOB och minskande målvärde för BG Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG + Uppdatera MaxIOB när ett barn växer. Låt inte systemet ge dig mer insulin än du kan täcka med mat = ett mycket högt värde är en dålig idé. Justera basaler och kvoter om det behövs. Aktivera sedan autosens 1 veckas lyckad looping dagtid, där alla måltider lagts in + Om ditt autosens-resultat inte pendlar runt 100% är din profil förmodligen fel. Aktiverar ytterligare funktioner för användning dagtid, t ex SMB + Du måste läsa wikin och öka max IOB för att få SMB att fungera bra. En bra start är att sätta max IOB till din genomsnittliga måltidsbolus plus 3 gånger den högsta basalen du har under ett dygn + Att använda SMB är ditt mål. Oref1-algoritmen utformades även för att hjälpa dig med dina bolusar. Du bör inte ge full bolus till din mat utan bara en del av det och låt AAPS ge dig resten om det behövs. På så sätt har du mer utrymme för felberäknade kolhydrater. Visste du att du kan ställa in en procentandel av boluskalkylatorns resultat för att minska storleken på bolus? + Aktiverar extra funktioner som kan användas dagtid, såsom insticksprogrammet för dynamisk känslighet + Se till att SMB fungerar korrekt. Aktivera insticksprogrammet DynamicISF och identifiera lämplig kalibrering för just din kropp. Det är lämpligt att börja med ett värde lägre än 100% av säkerhetsskäl. + Insticksprogrammet för dynamisk känslighet bygger på teorin att det totala insulinintaget och nuvarande blodsockernivåer påverkar insulinkänsligheten. Insticksprogrammet DynamicISF kan löpande justera insulinkänslighetsfaktorn (ISF) som används av algoritmen. Aktivera automatisering + Läs dokumentationen kring hur automatisering fungerar. Konfigurera dina första enkla regler. I stället för att ange en åtgärd, låt AAPS enbart visa en avisering. När du är säker på att automatisering utlöses vid rätt tidpunkt kan du ersätta aviseringen med verklig åtgärd. (https://wiki.aaps.app/en/latest/Usage/Automation.html) + Automation kan vara en bra tjänare men en dålig herre. Överanvänd den inte. Försök inte att ersätta underliggande algoritm. Testa regeln först med enbart meddelande innan du sätter igång den på riktigt. Automatiseringarna påverkas av ordningsföljden. + BG tillgängligt i NS eller Tidepool + Pumpstatus tillgängligt i NS eller Tidepool Manuella justeringar Utfört: %1$s + Lär dig hur du styr AAPS + Utför olika åtgärder i AAPS + Du har lärt dig hur man hanterar grunderna i AAPS. Huvudkontrollerna finns på översiktsskärmen och nås via klick eller långklick, fler kontroller finns på åtgärdsskärmen. Du bör veta hur man kan placera ett insticksprograms vy i toppmenyn, eller låta den visas i övre vänstra listan över aktiverade insticksprogram. Ställ in profilen 90% för 10 minuter (Tryck och håll in profilens namn i Översikten) Simulera dusch. Koppla från pump i 1 timme (Tryck och håll in på Open Loop i Översikten) ... och återanslut på samma sätt @@ -30,12 +48,41 @@ Testa skala om BG-grafen genom att trycka och hålla in fingret på den Bevisa dina kunskaper Studera frågorna.  Ni får fyra möjliga svar på varje fråga. Det kan finnas mer än ett korrekt svar. Kontrollera alla de som är korrekta och välj Kontrollera. + Du behöver inte vara en utvecklare men du behöver NS för att skicka mål och kompatibel pump samt en dator för att bygga AAPS för första gången och för varje uppdatering. + AAPS kan köras offline. + Profilen bör granskas och uppdateras. Bättre profil = bättre resultat. + DIA i looping har olika betydelse: \"den tid det tar tills allt insulin har absorberas av kroppen\" än i klassisk pumpterapi: \"den tid det tar tills merparten av insulinet absorberas\". + Du har lärt dig betydelsen av ISF-värde och hur det påverkar mängden insulin som levereras för BG-korrigering. + Du har lärt dig betydelsen av KH-kvoten och hur det påverkar mängden insulin som levereras för att täcka upp för intagna kolhydrater. + Tillfälligt mål för lågt blodsocker används endast för att förhindra att AAPS överkorrigera vid lågt blodsocker, när det är vanligt att AAPS bygger upp ett negativt IOB. Ytterligare åtgärder bör utvärderas för att förhindra att denna situation uppstår igen. + Användning av procent påverkar inte målvärdet för blodsocker. Men basal, ISF och IC justeras för att ge mer insulin (över 100%%) eller mindre insulin (under 100%%). + Genom att använda tidsförskjutning när du byter profil kan du anpassa dygnsprofilen till ovanligheter som t. ex. att du vaknat sent. + Redigering av profilen räcker inte för att en ändring ska bli aktiv. Du måste fortfarande genomföra ett profilbyte för att aktivera ändringar. + Du bör minska mängden insulin i kroppen minst en timme före träning genom att välja en profilprocent under 100%. + Att sätta ett högre tillfälligt BG-målvärde minst 1 timme före träning hjälper också med att minska mängden insulin i kroppen. + När du inte kan lita på de värden AAPS får från CGM bör du inte använda loopen utan uppsikt. + AAPS måste veta att pumpen inte är ansluten för att kunna räkna IOB korrekt. + Att ange vilket insulin som är i pumpen är nödvändigt eftersom det påverkar IOB-beräkningen. + Känslighetsdetektion är en del av algoritmen som gör det möjligt att anpassa insulindoseringen till olika situationer. + Dina framsteg i målen lagras tillsammans med andra inställningar och bör säkerhetskopieras. + Spara alltid exporterade inställningar och den genererade APK-filen även utanför telefon. Telefonen kan förloras, skadas etc. Ett bra ställe kan vara en molnlagringstjänst som kan nås från telefonen. I detta fall kan du återställa AAPS på en annan enhet på några minuter. Bra praxis är att lagra huvudlösenordet på en säker plats också. Utan det är din backup värdelös. Detsamma gäller för signeringsnycklar (.jks-fil) och lösenord som används för att bygga AAPS. Resten är inte viktigt - det kan när som helst laddas ner från internet igen. + Om du gjorde en felaktig inmatning till AAPS eller om den inte matchar verkligheten, lös det så fort som möjligt. Det kan leda till överdosering. AAPS bör alltid hållas informerad på bästa möjliga sätt om verkligt intag av kolhydrater, insulinleverans etc. + Om du analyserar huruvida AAPS fungerar bra för dig kommer IOB-grafen att ge dig mycket användbar information. + COB-beräkningen beror på sambandet mellan ISF och IC. Att öka ISF eller att minska IC kommer att leda till längre absorptionstider. Men att växla profil med procentuella förändringar påverkar båda värdena samtidigt och absorptionstiden påverkas därmed inte. + Endast gram är tillåtna för inmatning av kolhydrater. + E-carbs är en ersättning för konceptet med förlängd bolus i pumpvärlden. + Fjärrövervakning och fjärrstyrning är möjligt men alla funktioner behöver inte vara tillgängliga på distans. Svarsfunktionen inaktiverad till: %1$s Fel svar Nästa icke slutförda Begärd kod: %1$s (markera ett eller flera alternativ) + https://wiki.aaps.app/en/latest/Getting-Started/FAQ.html#what-to-do-when-taking-a-shower-or-bath + https://wiki.aaps.app/en/latest/Getting-Started/Screenshots.html#the-homescreen + https://wiki.aaps.app/en/latest/Configuration/Config-Builder.html + https://wiki.aaps.app/en/latest/Getting-Started/Screenshots.html#the-homescreen Inte ansluten till internet Fel vid hämtning av tid Målets krav är inte uppfyllda + Vad jag har lärt mig: diff --git a/plugins/constraints/src/main/res/values-sv-rSE/strings.xml b/plugins/constraints/src/main/res/values-sv-rSE/strings.xml index 91f87d5314..1ce8e012ad 100644 --- a/plugins/constraints/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/constraints/src/main/res/values-sv-rSE/strings.xml @@ -2,11 +2,27 @@ + Sommar/vintertid inträffar inom 24 timmar + Sommar/vintertid ändrades för mindre än 3 timmar sedan. Closed Loop avstängt + Frigör minst %1$d MB lagring. Loopen inaktiverad! + gammal version + väldigt gammal version + Applikationen inte giltig längre + AAPS har inte kunnat söka efter nya versioner de senaste %1$d dagarna! AAPS kommer att aktivera LGS-läge efter %2$d dagar, och loopen kommer att inaktiveras efter %3$d dagar. Återställ Internet-anslutningen! + Du kör en ogiltig version. Loop avstängd! + Version %1$s tillgänglig + Version %1$s upphör att gälla %2$s + Omräknad data används + BG för nära:\n%1$s\n%2$s + omräknad + dubbla poster + Platt datakurva. Anses vara fel + Begränsar förlängd bolus till %1$.1f U p.g.a. %2$s Begränsar kolhydrater till %1$d g pga %2$s Pumpen kan inte hantera temp basaler Closed Loop inaktiverat i Inställningar @@ -18,14 +34,20 @@ hård begränsning Säkerhetsbegränsningar + Slutfört, bra jobbat! Inte slutfört ännu Förfluten tid Max IOB är korrekt angivet BG tillgängligt från vald källa + Synkroniseringstjänsten har skrivrättigheter Loop aktiverad APS vald Closed loop aktiverad Mål Inlärningsprogram Vill du starta om målet? Du kan förlora de steg du gjort hittills. + Nästa + Föregående + Nollställ slutfört läge + Nollställ startat läge diff --git a/plugins/insulin/build.gradle b/plugins/insulin/build.gradle index 79591ec2dc..0c6f411c5e 100644 --- a/plugins/insulin/build.gradle +++ b/plugins/insulin/build.gradle @@ -24,4 +24,6 @@ dependencies { implementation project(':core:utils') implementation project(':core:validators') implementation project(':database:entities') + + testImplementation project(':core:main') } \ No newline at end of file diff --git a/plugins/insulin/src/main/res/values-sv-rSE/strings.xml b/plugins/insulin/src/main/res/values-sv-rSE/strings.xml index c067f3fa91..7891a6a2ea 100644 --- a/plugins/insulin/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/insulin/src/main/res/values-sv-rSE/strings.xml @@ -11,5 +11,8 @@ Peaktid [min] Free-Peak Oref Rapid-Acting Oref + Ultra-Rapid Oref %1$f tim DIA är för kort. Använder %2$f istället! + Novorapid, Novolog, Humalog + Fiasp diff --git a/plugins/insulin/src/test/java/info/nightscout/androidaps/HardLimitsMock.kt b/plugins/insulin/src/test/java/info/nightscout/androidaps/HardLimitsMock.kt new file mode 100644 index 0000000000..288eaf084a --- /dev/null +++ b/plugins/insulin/src/test/java/info/nightscout/androidaps/HardLimitsMock.kt @@ -0,0 +1,83 @@ +package info.nightscout.androidaps + +import info.nightscout.interfaces.utils.HardLimits +import info.nightscout.shared.interfaces.ResourceHelper +import info.nightscout.shared.sharedPreferences.SP +import javax.inject.Inject +import kotlin.math.max +import kotlin.math.min + +class HardLimitsMock @Inject constructor( + private val sp: SP, + private val rh: ResourceHelper +) : HardLimits { + + companion object { + + private const val CHILD = 0 + private const val TEENAGE = 1 + private const val ADULT = 2 + private const val RESISTANT_ADULT = 3 + private const val PREGNANT = 4 + private val MAX_BOLUS = doubleArrayOf(5.0, 10.0, 17.0, 25.0, 60.0) + + // Very Hard Limits Ranges + // First value is the Lowest and second value is the Highest a Limit can define + val VERY_HARD_LIMIT_MIN_BG = doubleArrayOf(80.0, 180.0) + val VERY_HARD_LIMIT_MAX_BG = doubleArrayOf(90.0, 200.0) + val VERY_HARD_LIMIT_TARGET_BG = doubleArrayOf(80.0, 200.0) + + // Very Hard Limits Ranges for Temp Targets + val VERY_HARD_LIMIT_TEMP_MIN_BG = intArrayOf(72, 180) + val VERY_HARD_LIMIT_TEMP_MAX_BG = intArrayOf(72, 270) + val VERY_HARD_LIMIT_TEMP_TARGET_BG = intArrayOf(72, 200) + val MIN_DIA = doubleArrayOf(5.0, 5.0, 5.0, 5.0, 5.0) + val MAX_DIA = doubleArrayOf(9.0, 9.0, 9.0, 9.0, 10.0) + val MIN_IC = doubleArrayOf(2.0, 2.0, 2.0, 2.0, 0.3) + val MAX_IC = doubleArrayOf(100.0, 100.0, 100.0, 100.0, 100.0) + const val MIN_ISF = 2.0 // mgdl + const val MAX_ISF = 1000.0 // mgdl + val MAX_IOB_AMA = doubleArrayOf(3.0, 5.0, 7.0, 12.0, 25.0) + val MAX_IOB_SMB = doubleArrayOf(7.0, 13.0, 22.0, 30.0, 70.0) + val MAX_BASAL = doubleArrayOf(2.0, 5.0, 10.0, 12.0, 25.0) + + //LGS Hard limits + //No IOB at all + const val MAX_IOB_LGS = 0.0 + + } + + private fun loadAge(): Int = when (sp.getString(info.nightscout.core.utils.R.string.key_age, "")) { + rh.gs(info.nightscout.core.utils.R.string.key_child) -> CHILD + rh.gs(info.nightscout.core.utils.R.string.key_teenage) -> TEENAGE + rh.gs(info.nightscout.core.utils.R.string.key_adult) -> ADULT + rh.gs(info.nightscout.core.utils.R.string.key_resistantadult) -> RESISTANT_ADULT + rh.gs(info.nightscout.core.utils.R.string.key_pregnant) -> PREGNANT + else -> ADULT + } + + override fun maxBolus(): Double = MAX_BOLUS[loadAge()] + override fun maxIobAMA(): Double = MAX_IOB_AMA[loadAge()] + override fun maxIobSMB(): Double = MAX_IOB_SMB[loadAge()] + override fun maxBasal(): Double = MAX_BASAL[loadAge()] + override fun minDia(): Double = MIN_DIA[loadAge()] + override fun maxDia(): Double = MAX_DIA[loadAge()] + override fun minIC(): Double = MIN_IC[loadAge()] + override fun maxIC(): Double = MAX_IC[loadAge()] + + // safety checks + override fun checkHardLimits(value: Double, valueName: Int, lowLimit: Double, highLimit: Double): Boolean = + value == verifyHardLimits(value, valueName, lowLimit, highLimit) + + override fun isInRange(value: Double, lowLimit: Double, highLimit: Double): Boolean = + value in lowLimit..highLimit + + override fun verifyHardLimits(value: Double, valueName: Int, lowLimit: Double, highLimit: Double): Double { + var newValue = value + if (newValue < lowLimit || newValue > highLimit) { + newValue = max(newValue, lowLimit) + newValue = min(newValue, highLimit) + } + return newValue + } +} \ No newline at end of file diff --git a/plugins/insulin/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt b/plugins/insulin/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt new file mode 100644 index 0000000000..c3960ec89d --- /dev/null +++ b/plugins/insulin/src/test/java/info/nightscout/androidaps/TestBaseWithProfile.kt @@ -0,0 +1,61 @@ +package info.nightscout.androidaps + +import android.content.Context +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector +import info.nightscout.core.extensions.pureProfileFromJson +import info.nightscout.core.profile.ProfileSealed +import info.nightscout.interfaces.Config +import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.profile.DefaultValueHelper +import info.nightscout.interfaces.profile.Profile +import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.utils.HardLimits +import info.nightscout.rx.bus.RxBus +import info.nightscout.shared.interfaces.ResourceHelper +import info.nightscout.shared.sharedPreferences.SP +import info.nightscout.shared.utils.DateUtil +import org.json.JSONObject +import org.junit.jupiter.api.BeforeEach +import org.mockito.Mock +import org.mockito.Mockito.`when` + +@Suppress("SpellCheckingInspection") +open class TestBaseWithProfile : TestBase() { + + @Mock lateinit var activePluginProvider: ActivePlugin + @Mock lateinit var rh: ResourceHelper + @Mock lateinit var profileFunction: ProfileFunction + @Mock lateinit var defaultValueHelper: DefaultValueHelper + @Mock lateinit var dateUtil: DateUtil + @Mock lateinit var config: Config + @Mock lateinit var sp: SP + @Mock lateinit var context: Context + + lateinit var hardLimits: HardLimits + lateinit var testPumpPlugin: TestPumpPlugin + + val rxBus = RxBus(aapsSchedulers, aapsLogger) + + val profileInjector = HasAndroidInjector { AndroidInjector { } } + + private lateinit var invalidProfileJSON: String + private lateinit var validProfileJSON: String + lateinit var validProfile: Profile + lateinit var invalidProfile: Profile + @Suppress("PropertyName") val TESTPROFILENAME = "someProfile" + + @BeforeEach + fun prepareMock() { + invalidProfileJSON = "{\"dia\":\"1\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," + + "{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," + + "\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}" + validProfileJSON = "{\"dia\":\"5\",\"carbratio\":[{\"time\":\"00:00\",\"value\":\"30\"}],\"carbs_hr\":\"20\",\"delay\":\"20\",\"sens\":[{\"time\":\"00:00\",\"value\":\"3\"}," + + "{\"time\":\"2:00\",\"value\":\"3.4\"}],\"timezone\":\"UTC\",\"basal\":[{\"time\":\"00:00\",\"value\":\"1\"}],\"target_low\":[{\"time\":\"00:00\",\"value\":\"4.5\"}]," + + "\"target_high\":[{\"time\":\"00:00\",\"value\":\"7\"}],\"startDate\":\"1970-01-01T00:00:00.000Z\",\"units\":\"mmol\"}" + validProfile = ProfileSealed.Pure(pureProfileFromJson(JSONObject(validProfileJSON), dateUtil)!!) + testPumpPlugin = TestPumpPlugin(profileInjector) + `when`(activePluginProvider.activePump).thenReturn(testPumpPlugin) + hardLimits = HardLimitsMock(sp, rh) + } +} diff --git a/plugins/insulin/src/test/java/info/nightscout/androidaps/TestPumpPlugin.kt b/plugins/insulin/src/test/java/info/nightscout/androidaps/TestPumpPlugin.kt new file mode 100644 index 0000000000..5ba01a09b6 --- /dev/null +++ b/plugins/insulin/src/test/java/info/nightscout/androidaps/TestPumpPlugin.kt @@ -0,0 +1,72 @@ +package info.nightscout.androidaps + +import dagger.android.HasAndroidInjector +import info.nightscout.interfaces.profile.Profile +import info.nightscout.interfaces.pump.DetailedBolusInfo +import info.nightscout.interfaces.pump.Pump +import info.nightscout.interfaces.pump.PumpEnactResult +import info.nightscout.interfaces.pump.PumpSync +import info.nightscout.interfaces.pump.defs.ManufacturerType +import info.nightscout.interfaces.pump.defs.PumpDescription +import info.nightscout.interfaces.pump.defs.PumpType +import info.nightscout.interfaces.utils.TimeChangeType +import org.json.JSONObject + +@Suppress("MemberVisibilityCanBePrivate") +class TestPumpPlugin(val injector: HasAndroidInjector) : Pump { + + var connected = false + var isProfileSet = true + + override fun isConnected() = connected + override fun isConnecting() = false + override fun isHandshakeInProgress() = false + val lastData = 0L + + val baseBasal = 0.0 + override var pumpDescription = PumpDescription() + + override fun isInitialized(): Boolean = true + override fun isSuspended(): Boolean = false + override fun isBusy(): Boolean = false + override fun connect(reason: String) { + connected = true + } + + override fun disconnect(reason: String) { + connected = false + } + + override fun stopConnecting() { + connected = false + } + + override fun waitForDisconnectionInSeconds(): Int = 0 + override fun getPumpStatus(reason: String) {} + override fun setNewBasalProfile(profile: Profile): PumpEnactResult = PumpEnactResult(injector) + override fun isThisProfileSet(profile: Profile): Boolean = isProfileSet + override fun lastDataTime(): Long = lastData + override val baseBasalRate: Double = baseBasal + override val reservoirLevel: Double = 0.0 + override val batteryLevel: Int = 0 + override fun deliverTreatment(detailedBolusInfo: DetailedBolusInfo): PumpEnactResult = PumpEnactResult(injector).success(true) + override fun stopBolusDelivering() {} + override fun setTempBasalAbsolute(absoluteRate: Double, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult = + PumpEnactResult(injector).success(true) + + override fun setTempBasalPercent(percent: Int, durationInMinutes: Int, profile: Profile, enforceNew: Boolean, tbrType: PumpSync.TemporaryBasalType): PumpEnactResult = + PumpEnactResult(injector).success(true) + + override fun setExtendedBolus(insulin: Double, durationInMinutes: Int): PumpEnactResult = PumpEnactResult(injector).success(true) + override fun cancelTempBasal(enforceNew: Boolean): PumpEnactResult = PumpEnactResult(injector).success(true) + override fun cancelExtendedBolus(): PumpEnactResult = PumpEnactResult(injector).success(true) + override fun getJSONStatus(profile: Profile, profileName: String, version: String): JSONObject = JSONObject() + override fun manufacturer(): ManufacturerType = ManufacturerType.AAPS + override fun model(): PumpType = PumpType.GENERIC_AAPS + override fun serialNumber(): String = "1" + override fun shortStatus(veryShort: Boolean): String = "" + override val isFakingTempsByExtendedBoluses: Boolean = false + override fun loadTDDs(): PumpEnactResult = PumpEnactResult(injector).success(true) + override fun canHandleDST(): Boolean = true + override fun timezoneOrDSTChanged(timeChangeType: TimeChangeType) {} +} \ No newline at end of file diff --git a/plugins/insulin/src/test/java/info/nightscout/core/extensions/BolusExtensionKtTest.kt b/plugins/insulin/src/test/java/info/nightscout/core/extensions/BolusExtensionKtTest.kt new file mode 100644 index 0000000000..f5c14a0cbf --- /dev/null +++ b/plugins/insulin/src/test/java/info/nightscout/core/extensions/BolusExtensionKtTest.kt @@ -0,0 +1,50 @@ +package info.nightscout.core.extensions + +import info.nightscout.androidaps.TestBaseWithProfile +import info.nightscout.database.entities.Bolus +import info.nightscout.insulin.InsulinLyumjevPlugin +import info.nightscout.interfaces.insulin.Insulin +import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.ui.UiInteraction +import info.nightscout.shared.utils.T +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mock +import org.mockito.Mockito + +class BolusExtensionKtTest : TestBaseWithProfile() { + + @Mock lateinit var activePlugin: ActivePlugin + @Mock lateinit var profileFunctions: ProfileFunction + @Mock lateinit var uiInteraction: UiInteraction + + private lateinit var insulin: Insulin + + private val now = 1000000L + private val dia = 7.0 + + @BeforeEach + fun setup() { + insulin = InsulinLyumjevPlugin(profileInjector, rh, profileFunctions, rxBus, aapsLogger, config, hardLimits, uiInteraction) + Mockito.`when`(activePlugin.activeInsulin).thenReturn(insulin) + } + + @Test + fun iobCalc() { + val bolus = Bolus(timestamp = now - 1, amount = 1.0, type = Bolus.Type.NORMAL) + // there should be almost full IOB after now + Assertions.assertEquals(1.0, bolus.iobCalc(activePlugin, now, dia).iobContrib, 0.01) + // there should be less than 5% after DIA -1 + Assertions.assertTrue(0.05 > bolus.iobCalc(activePlugin, now + T.hours(dia.toLong() - 1).msecs(), dia).iobContrib) + // there should be zero after DIA + Assertions.assertEquals(0.0, bolus.iobCalc(activePlugin, now + T.hours(dia.toLong() + 1).msecs(), dia).iobContrib) + // no IOB for invalid record + bolus.isValid = false + Assertions.assertEquals(0.0, bolus.iobCalc(activePlugin, now + T.hours(1).msecs(), dia).iobContrib) + bolus.isValid = true + bolus.type = Bolus.Type.PRIMING + Assertions.assertEquals(0.0, bolus.iobCalc(activePlugin, now + T.hours(1).msecs(), dia).iobContrib) + } +} \ No newline at end of file diff --git a/plugins/insulin/src/test/java/info/nightscout/core/extensions/ExtendedBolusExtensionKtTest.kt b/plugins/insulin/src/test/java/info/nightscout/core/extensions/ExtendedBolusExtensionKtTest.kt new file mode 100644 index 0000000000..c4766dd893 --- /dev/null +++ b/plugins/insulin/src/test/java/info/nightscout/core/extensions/ExtendedBolusExtensionKtTest.kt @@ -0,0 +1,49 @@ +package info.nightscout.core.extensions + +import info.nightscout.androidaps.TestBaseWithProfile +import info.nightscout.database.entities.ExtendedBolus +import info.nightscout.insulin.InsulinLyumjevPlugin +import info.nightscout.interfaces.insulin.Insulin +import info.nightscout.interfaces.plugin.ActivePlugin +import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.ui.UiInteraction +import info.nightscout.shared.utils.T +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mock +import org.mockito.Mockito + +class ExtendedBolusExtensionKtTest : TestBaseWithProfile() { + + @Mock lateinit var activePlugin: ActivePlugin + @Mock lateinit var profileFunctions: ProfileFunction + @Mock lateinit var uiInteraction: UiInteraction + + private lateinit var insulin: Insulin + + private val now = 1000000L + private val dia = 7.0 + + @BeforeEach + fun setup() { + insulin = InsulinLyumjevPlugin(profileInjector, rh, profileFunctions, rxBus, aapsLogger, config, hardLimits, uiInteraction) + Mockito.`when`(activePlugin.activeInsulin).thenReturn(insulin) + } + + @Test + fun iobCalc() { + val bolus = ExtendedBolus(timestamp = now - 1, amount = 1.0, duration = T.hours(1).msecs()) + // there should zero IOB after now + Assertions.assertEquals(0.0, bolus.iobCalc(now, validProfile, insulin).iob, 0.01) + // there should be significant IOB at EB finish + Assertions.assertTrue(0.8 < bolus.iobCalc(now + T.hours(1).msecs(), validProfile, insulin).iob) + // there should be less that 5% after DIA -1 + Assertions.assertTrue(0.05 > bolus.iobCalc(now + T.hours(dia.toLong() - 1).msecs(), validProfile, insulin).iob) + // there should be zero after DIA + Assertions.assertEquals(0.0, bolus.iobCalc(now + T.hours(dia.toLong() + 1).msecs(), validProfile, insulin).iob) + // no IOB for invalid record + bolus.isValid = false + Assertions.assertEquals(0.0, bolus.iobCalc(now + T.hours(1).msecs(), validProfile, insulin).iob) + } +} \ No newline at end of file diff --git a/plugins/main/src/main/java/info/nightscout/plugins/general/overview/OverviewFragment.kt b/plugins/main/src/main/java/info/nightscout/plugins/general/overview/OverviewFragment.kt index fd1efea351..4ebf5c77ad 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/general/overview/OverviewFragment.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/general/overview/OverviewFragment.kt @@ -65,7 +65,7 @@ import info.nightscout.interfaces.profile.ProfileFunction import info.nightscout.interfaces.protection.ProtectionCheck import info.nightscout.interfaces.pump.defs.PumpType import info.nightscout.interfaces.source.DexcomBoyda -import info.nightscout.interfaces.source.XDrip +import info.nightscout.interfaces.source.XDripSource import info.nightscout.interfaces.ui.UiInteraction import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.interfaces.utils.TrendCalculator @@ -128,7 +128,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList @Inject lateinit var activePlugin: ActivePlugin @Inject lateinit var iobCobCalculator: IobCobCalculator @Inject lateinit var dexcomBoyda: DexcomBoyda - @Inject lateinit var xDrip: XDrip + @Inject lateinit var xDripSource: XDripSource @Inject lateinit var notificationStore: NotificationStore @Inject lateinit var quickWizard: QuickWizard @Inject lateinit var config: Config @@ -400,7 +400,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } R.id.cgm_button -> { - if (xDrip.isEnabled()) + if (xDripSource.isEnabled()) openCgmApp("com.eveningoutpost.dexdrip") else if (dexcomBoyda.isEnabled()) { dexcomBoyda.findDexcomPackageName()?.let { @@ -411,7 +411,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList } R.id.calibration_button -> { - if (xDrip.isEnabled()) { + if (xDripSource.isEnabled()) { uiInteraction.runCalibrationDialog(childFragmentManager) } else if (dexcomBoyda.isEnabled()) { try { @@ -577,7 +577,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList && sp.getBoolean(R.string.key_show_insulin_button, true)).toVisibility() // **** Calibration & CGM buttons **** - val xDripIsBgSource = xDrip.isEnabled() + val xDripIsBgSource = xDripSource.isEnabled() val dexcomIsSource = dexcomBoyda.isEnabled() binding.buttonsLayout.calibrationButton.visibility = (xDripIsBgSource && actualBG != null && sp.getBoolean(R.string.key_show_calibration_button, true)).toVisibility() if (dexcomIsSource) { diff --git a/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt b/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt index 9223cfac9c..633e8713b8 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfileFragment.kt @@ -335,7 +335,7 @@ class ProfileFragment : DaggerFragment() { ?: "" ) ) - profilePlugin.storeSettings(activity) + profilePlugin.storeSettings(activity, dateUtil.now()) build() } updateGUI() diff --git a/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfilePlugin.kt b/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfilePlugin.kt index 22129c0409..90967d245f 100644 --- a/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfilePlugin.kt +++ b/plugins/main/src/main/java/info/nightscout/plugins/profile/ProfilePlugin.kt @@ -168,7 +168,7 @@ class ProfilePlugin @Inject constructor( } @Synchronized - override fun storeSettings(activity: FragmentActivity?, emptyCreated: Boolean) { + override fun storeSettings(activity: FragmentActivity?, timestamp: Long) { for (i in 0 until numOfProfiles) { profiles[i].run { val localProfileNumbered = Constants.LOCAL_PROFILE + "_" + i + "_" @@ -184,7 +184,7 @@ class ProfilePlugin @Inject constructor( } sp.putInt(Constants.LOCAL_PROFILE + "_profiles", numOfProfiles) - sp.putLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, if (emptyCreated) 0 else dateUtil.now()) + sp.putLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, timestamp) createAndStoreConvertedProfile() isEdited = false aapsLogger.debug(LTag.PROFILE, "Storing settings: " + rawProfile?.data.toString()) @@ -249,13 +249,12 @@ class ProfilePlugin @Inject constructor( ) } } - if (newProfiles.size > 0) { + if (newProfiles.isNotEmpty()) { profiles = newProfiles currentProfileIndex = 0 isEdited = false - createAndStoreConvertedProfile() aapsLogger.debug(LTag.PROFILE, "Accepted ${profiles.size} profiles") - storeSettings() + storeSettings(timestamp = store.getStartDate()) rxBus.send(EventLocalProfileChanged()) } else aapsLogger.debug(LTag.PROFILE, "ProfileStore not accepted") @@ -354,7 +353,7 @@ class ProfilePlugin @Inject constructor( ) currentProfileIndex = profiles.size - 1 createAndStoreConvertedProfile() - storeSettings(emptyCreated = true) + storeSettings(timestamp = 0) } fun cloneProfile() { @@ -363,7 +362,7 @@ class ProfilePlugin @Inject constructor( profiles.add(p) currentProfileIndex = profiles.size - 1 createAndStoreConvertedProfile() - storeSettings() + storeSettings(timestamp = dateUtil.now()) isEdited = false } @@ -371,16 +370,16 @@ class ProfilePlugin @Inject constructor( profiles.add(p) currentProfileIndex = profiles.size - 1 createAndStoreConvertedProfile() - storeSettings() + storeSettings(timestamp = dateUtil.now()) isEdited = false } fun removeCurrentProfile() { profiles.removeAt(currentProfileIndex) - if (profiles.size == 0) addNewProfile() + if (profiles.isEmpty()) addNewProfile() currentProfileIndex = 0 createAndStoreConvertedProfile() - storeSettings() + storeSettings(timestamp = dateUtil.now()) isEdited = false } diff --git a/plugins/main/src/main/res/values-pt-rPT/strings.xml b/plugins/main/src/main/res/values-pt-rPT/strings.xml index f504e12684..368da1218e 100644 --- a/plugins/main/src/main/res/values-pt-rPT/strings.xml +++ b/plugins/main/src/main/res/values-pt-rPT/strings.xml @@ -3,6 +3,7 @@ Comunicador SMS SMS + Controle remotamente a AndroidAPS usando comandos SMS. da app Authenticator para: %1$s seguido pelo PIN PIN obrigatório adicional no token final Dígitos adicionais que devem ser memorizados e colados no final de cada Uma-Senha-Única que seja gerada @@ -18,9 +19,11 @@ Tem a certeza de que deseja copiar o segredo da OTP para a área de transferêencia?\n\nSó pode precisar se a app do seu autenticador tiver problemas para digitalizar QRCode, deseja digitá-lo manualmente ou deseja configurar o token OTP de hardware usando app dedicada. Segredo da OTP (em formato Base32) exportado e copiado na áreas de transferênca. Cole-o no autenticador ou no hardware OTP burner! 1. Instalar Autenticador + 2. Digitalize o código para configurar os códigos OTP AAPS 3. Testar Uma-Senha-Única (OTP) Repor Autenticadores Instalar uma app Autenticador que suporte Tokens RFC 6238 TOTP em cada telefone seguidor. Populares aplicativos gratuitos são:\n • Authy\n • o Google Authenticator\n • LastPass Autenticador\n • FreeOTP Autenticador + Ao repor o autenticador, torna inválidos todos os autenticadores já inseridos. Precisará de os configurar novamente! OK TAMANHO INVÁLIDO! PIN ERRADO @@ -90,6 +93,8 @@ Enviar SMS se evento de bomba inacessível for acionado Reportar bomba inacessível Para mudar o tipo de Loop para SGB (Baixa Suspensão por Glicose Baixa) responda com o código %1$s + De forma a mudar o Loop para Loop Fechado responda com o código %1$s + Modo de loop atual: %1$s Formato incorrecto GLIC: Ultima GLIC: @@ -102,6 +107,7 @@ Erro na leitura de estado Troca de perfil criada A duração do DBT deve ser de um múltiplo de %1$d minutos e maior que 0. + Código QR para configuração da senha única Loop Desactivado Alimentos @@ -116,10 +122,16 @@ Subcategoria Calculadora + Escolha escuro, claro ou deixe para usar o tema do sistema + Esquema de Cores da App + Tema Escuro + Tema Claro + Usar tema do dispositivo Perfil PL Defina um perfil que está disponível offline. + adicionar novo à lista Deseja mudar de perfil e descartar as alterações feitas no perfil actual? Guardar ou repor as alterações actuais primeiro Eliminar perfil actual? @@ -129,10 +141,14 @@ Erro nos valores da basal Erros no valor alvo Erro nos valores do FSI + Alguns dos nomes dos perfis contêm pontos.\nTal não é suportado pelo NS.\nOs perfis não serão enviados para o NS. Perfil inválido %1$s não aceite do NS Ver Erros + Selecione o perfil para editar Nome do Perfil: + adicionar novo perfil + clonar perfil atual eliminar perfil actual DIA ALV @@ -153,8 +169,12 @@ Bateria da Bomba Cânula O uso do Bólus Prolongado irá parar o modo Loop Fechado durante o tempo do bólus prolongado. Quer realmente isso? + idade do cateter + idade do adesivo da bomba Mostrar luzes de estado no ecrã principal + Limite do aviso da idade do cateter [h] + Limite crítico da idade do cateter [h] Limite aviso idade insulina [h] Limite crítico da idade da insulina [h] Limite aviso idade sensor [h] @@ -173,6 +193,7 @@ Menu do Gráfico qualidade da glicose no sangue Glicose no Sangue + desatualizado Aceitar nova basal temporária: CGM Visão Geral @@ -221,6 +242,7 @@ Abreviar títulos dos separadores Mostrar campo de notas na janela de tratamentos Assistente de bólus executa o cálculo, mas apenas esta parte da insulina calculada é administada. Útil com o algoritmo SMB. + Entregar bólus completo (100%) se a glicemia for mais velha que Activar Guia de Bólus Use lembrete para começar a comer mais tarde em vez di resultado do assistente durante a glicemia alta (\"pré-bolus\") Activar superbólus no assistente @@ -232,6 +254,7 @@ Previsões Tratamentos + Frequência cardíaca Desvio de inclinação Actividade Impacto Glicose @@ -249,7 +272,9 @@ ABS DESVINCLI TRATA + FC SENS + Escala do Gráfico Gráfico Tema Gráfico Original @@ -262,8 +287,22 @@ Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada. WEAR + Monitorizar e controlar a AndroidAPS utilizando o seu relógio WearOS. + (Nenhum relógio Conectado) + Estado da Bomba + Estado do loop + Calc. Assistente:\nInsulina: %1$.2fU\nHidratos: %2$dg + O assistente rápido selecionado não está mais disponível, atualize o ecrã + Assistente rápido: %1$s\nInsulina: %2$.2fU\nHidratos: %3$dg + Predefinição de alvo temporário desconhecido: %1$s + Cancelando Alvos Temporários em execução? + Diferentes unidades usadas no relógio e telefone! + Alvo-temporário-Zero - cancelar Alvos -Temporários em progresso? Min-GLIC fora do alvo! Máx-GLIC fora do alvo! + AlvoTemporário:\nMin: %1$s\nMax: %2$s\nDuração: %3$s + AlvoTemporário:\nAlvo: %1$s\nDuração: %2$s + AlvoTemporário:\nMotivo %1$s\nAlvo: %2$s\nDuração: %3$s sem efeito - por favor verifique no telemóvel Definições do Relógio Controles do Relógio @@ -275,9 +314,19 @@ Mostrar SMB no relogio como bolus normal. Mostrar previsões no mostrador. Previsões + Definições da watchface predefinida + Autorização da watchface predefinida Autorizar watchface por definição para alterar e bloquear algumas configurações de exibição do relógio para se adequarem ao design do watchface + Watchface Predefinida: %1$s + Carregar Watchface + Infos Watchface + Exportar modelo + Modelo de Watchface Predefinida exportado Reenviar Todos os Dados Abrir Definições no Relógio + Lista de preferências bloqueadas pela Watchface + Lista de preferências necessárias para a Watchface + Lista de campos incluídos na Watchface Mostra uma notificação em curso com um breve resumo do que o seu loop está a fazer DADOS ANTIGOS diff --git a/plugins/main/src/main/res/values-sv-rSE/strings.xml b/plugins/main/src/main/res/values-sv-rSE/strings.xml index c78555669d..8bf7381617 100644 --- a/plugins/main/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/main/src/main/res/values-sv-rSE/strings.xml @@ -3,6 +3,7 @@ SMS-tjänst SMS + Fjärrstyr AAPS med SMS-kommandon. från autentiseringsapp för: %1$s följt av PIN-kod PIN-kod som läggs till på slutet Ytterligare siffror som ska memoreras och läggas till i slutet av varje genererat engångslösenord @@ -18,9 +19,15 @@ Är du säker på att du vill kopiera OTP-hemligheten till Urklipp?\n\nDu behöver bara göra detta om din autentiseringsapp har problem QR-koder så du vill ange den manuellt eller om du vill konfigurera OTP-token med hjälp av en dedikerad app. OTP-hemligheten exporteras och kopieras till klippbordet i Base32-format. Klistra in den i autentiseringsfunktionen eller OTP-brännaren! 1. Installera autentiseringsapp + 2. Scanna koden för att ställa in OTP-koder för AAPS 3. Testa engångslösenord Återställ autentiserare På varje följartelefon behöver man installera en autentiseringsapp som stöder RFC 6238 TOTP tokens. Populära gratisappar är:\n • Authy\n • Google Authenticator\n • LastPass Authenticator\n • FreeOTP Authenticator + Genom att återställa autentiseringsfunktionen kommer alla redan driftsatta autentiserare bli ogiltiga. Du kommer behöva sätta upp dem igen! + OK + OGILTIG STORLEK! + FEL PIN + FEL OTP Fel kod. Kommandot avbrutet. Föregående pumpkommunikation har inte bekräftats/avslutats i tid Godkända telefonnummer @@ -85,6 +92,9 @@ Ogiltigt innehåll i meddelande Skicka SMS om pumpen inte kan nås Rapportera om pump inte kan nås + För att växla Loop-läge till LGS (Low Glucose Suspend) svara med kod %1$s + För att växla Loop-läge till Closed Loop svara med kod %1$s + Nuvarande loop-läge: %1$s Felaktigt format BG: Senaste BG: @@ -97,6 +107,7 @@ Statuskontroll misslyckad Skapade ett profilbyte Durationen måste vara större än 0 och en multipel av %1$d minuter. + QR-kod för att konfigurera engångslösenord Loop inaktiverad Matdatabas @@ -111,6 +122,11 @@ Underkategori Kalkylator + Välj mörkt, ljust eller att följa systemets tema + Appens färgschema + Mörkt tema + Ljust tema + Använd systemets tema Profil LP @@ -125,9 +141,11 @@ Fel i basaldoser Fel i målvärden Fel i korrektionskvoter + Vissa profilnamn innehåller punkter.\nDetta stöds inte av Nightscout.\nProfilen kommer inte överföras till NS. Ogiltig profil %1$s från NS accepteras inte Visa Fel + Välj profil att ändra Profilnamn: lägg till ny profil klona nuvarande profil @@ -156,6 +174,8 @@ Slanglös pump Visa \"statuslampor\" på hemskärmen + Tröskelvärde varning för kanylålder: [h] + Tröskelvärde akut varning för kanylålder: [h] Insulinålder - varning: [h] Insulinålder - akut varning: [h] Sensorålder - varning: [h] @@ -192,7 +212,7 @@ OpenAPS Uppladdare BG datastatus - Inställningar för snabbsteg + Inställningar för snabbknappar Håll skärmen igång Förhindrar att skärmen stängs av. Förbrukar mer batteri. Behandlingar @@ -223,6 +243,7 @@ Förkorta namnen på flikarna Anteckning i behandlingsdialoger Bolusguiden utför beräkningar, men endast denna del av beräknat insulin levereras. Användbar med SMB-algoritm. + Leverera full bolus (100%) om BG-värde är äldre än Aktivera bolusguiden Få en påminnelse om att börja äta senare (istället för kalkylatorns resultat) om du ligger högt i BG Aktivera superbolus i kalkylatorn @@ -234,6 +255,7 @@ BG-prognos Behandlingar + Hjärtfrekvens Avvikelsekurva Insulinaktivitet (5m) Blodglukospåverkan @@ -251,7 +273,9 @@ Abs Devslope Beh + HF SENS + Graf-skala Graf Ursprungligt tema @@ -259,12 +283,17 @@ Knappar visas alltid längst ned på skärmen Stor skärm Tema + användning: Skicka dagens loggfiler till utvecklarna tillsammans med denna datumstämpel. Oväntad situation. Wear + Följ och kontrollera AAPS med din Wear OS-klocka. + (Ingen klocka ansluten) + Pumpstatus + Loop-status Kalkylator:\nInsulin: %1$.2fU\nKolhydrater: %2$dg - Vald kalkylator inte längre tillgänglig. Vänligen uppdatera din bricka + Vald snabbknapp inte längre tillgänglig. Vänligen uppdatera vyn Snabbsteg: %1$s\nInsulin: %2$.2fU\nKolhydrater: %3$dg Tempmål okänd förinställning: %1$s Avbryt temp-mål? @@ -274,6 +303,7 @@ Ogiltigt maximum BG! Temp-mål:\nMin: %1$s\nMax: %2$s\nVaraktighet: %3$s Temp-mål:\nMål: %1$s\nDuration: %2$s + Tillfälligt mål:\nOrsak: %1$s\nMål: %2$s\nVaraktighet: %3$s misslyckat - kontrollera telefonen Inställningar för klocka (Wear) Kontrollera från klockan @@ -285,9 +315,46 @@ Visa SMB på klockan som en standardbolus. Visa BG-prognos på klockan. BG-prognos + Anpassade inställningar för urtavla + Anpassad auktorisering för urtavla + Auktorisera inlästa anpassade urtavlor för att ändra och låsa vissa visningsinställningar för att passa design av urtavlan + Anpassad urtavla: %1$s + Ladda urtavla + Info urtavla + Exportera mall + Anpassad mall exporterad Uppdatera klockans data Öppna inställningar på klockan + Inställningar som är låsta av urtavlan + Inställningar som krävs av urtavlan + Fält som ingår i urtavlan Visar en konstant avisering med en kort sammanfattning av vad din loop gör Aktuellt BG saknas! + försöker hämta data från pump. + TDD: Fortfarande gamla data! Kan inte hämta från pump. + g + h + Ingen aktiv profil! + Profil:\n\nTidsförskjutning: %1$d\nProcent: %2$d%%\" + %1$.2fU %1$.0f%% + Ingen profil inläst + Använd endast i APS-läge! + Senaste resultat ej tillgängligt! + CLOSED LOOP + OPEN LOOP + LOOP INAKTIVERAD + APS + Kördes senast + Senaste handling + Idag + viktad + Målen gäller endast i APS-läge! + Inget historiskt data! + U + Tillfälligt målvärde + tills + STANDARDINTERVALL + målvärde + Dos: %1$.2fU/h (%2$.2f%%) \nVaraktighet %3$d min diff --git a/plugins/smoothing/src/main/res/values-sv-rSE/strings.xml b/plugins/smoothing/src/main/res/values-sv-rSE/strings.xml index 3ea04e700d..7c39d9b0f4 100644 --- a/plugins/smoothing/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/smoothing/src/main/res/values-sv-rSE/strings.xml @@ -1,2 +1,10 @@ - + + UTJÄMNING + Exponentiell utjämning + "Andra ordningens exponentiella utjämningsalgoritm" + Genomsnittlig utjämning + "Genomsnittlig utjämningsalgoritm, det nyaste värdet påverkas inte" + Ingen utjämning + "Ingen utjämning utförs på inmatade glukosdata. Använd detta när du redan har filtrerat data, t.ex. från BYODA G6." + diff --git a/plugins/source/src/main/java/info/nightscout/source/AidexPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/AidexPlugin.kt index 5a78d807b8..38c78c287d 100644 --- a/plugins/source/src/main/java/info/nightscout/source/AidexPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/AidexPlugin.kt @@ -35,17 +35,13 @@ class AidexPlugin @Inject constructor( .mainType(PluginType.BGSOURCE) .fragmentClass(BGSourceFragment::class.java.name) .pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48)) + .preferencesId(R.xml.pref_bgsource) .pluginName(R.string.aidex) .shortName(R.string.aidex_short) .description(R.string.description_source_aidex), aapsLogger, rh, injector ), BgSource { - /** - * Aidex App doesn't have upload to NS - */ - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = true - // Allow only for pumpcontrol or dev & engineering_mode override fun specialEnableCondition(): Boolean { return config.APS.not() || config.isDev() && config.isEngineeringMode() diff --git a/plugins/source/src/main/java/info/nightscout/source/DexcomPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/DexcomPlugin.kt index 7aefb92707..19ecf845b0 100644 --- a/plugins/source/src/main/java/info/nightscout/source/DexcomPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/DexcomPlugin.kt @@ -45,7 +45,6 @@ class DexcomPlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, aapsLogger: AAPSLogger, - private val sp: SP, private val context: Context, config: Config ) : PluginBase( @@ -53,9 +52,9 @@ class DexcomPlugin @Inject constructor( .mainType(PluginType.BGSOURCE) .fragmentClass(BGSourceFragment::class.java.name) .pluginIcon(info.nightscout.core.main.R.drawable.ic_dexcom_g6) + .preferencesId(R.xml.pref_dexcom) .pluginName(R.string.dexcom_app_patched) .shortName(R.string.dexcom_short) - .preferencesId(R.xml.pref_dexcom) .description(R.string.description_source_dexcom), aapsLogger, rh, injector ), BgSource, DexcomBoyda { @@ -68,12 +67,6 @@ class DexcomPlugin @Inject constructor( override fun advancedFilteringSupported(): Boolean = true - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - (glucoseValue.sourceSensor == GlucoseValue.SourceSensor.DEXCOM_G6_NATIVE || - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.DEXCOM_G5_NATIVE || - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.DEXCOM_NATIVE_UNKNOWN) - && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - override fun onStart() { super.onStart() requestPermissionIfNeeded() diff --git a/plugins/source/src/main/java/info/nightscout/source/EversensePlugin.kt b/plugins/source/src/main/java/info/nightscout/source/EversensePlugin.kt index fef2626d90..c77c133892 100644 --- a/plugins/source/src/main/java/info/nightscout/source/EversensePlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/EversensePlugin.kt @@ -19,7 +19,6 @@ import info.nightscout.interfaces.source.BgSource import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper -import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.utils.DateUtil import kotlinx.coroutines.Dispatchers import java.util.Arrays @@ -30,25 +29,21 @@ import javax.inject.Singleton class EversensePlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, - aapsLogger: AAPSLogger, - private val sp: SP + aapsLogger: AAPSLogger ) : PluginBase( PluginDescription() - .mainType(PluginType.BGSOURCE) - .fragmentClass(BGSourceFragment::class.java.name) - .pluginIcon(info.nightscout.core.main.R.drawable.ic_eversense) - .pluginName(R.string.eversense) - .shortName(R.string.eversense_shortname) - .preferencesId(R.xml.pref_bgsource) - .description(R.string.description_source_eversense), + .mainType(PluginType.BGSOURCE) + .fragmentClass(BGSourceFragment::class.java.name) + .pluginIcon(info.nightscout.core.main.R.drawable.ic_eversense) + .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.eversense) + .shortName(R.string.eversense_shortname) + .description(R.string.description_source_eversense), aapsLogger, rh, injector ), BgSource { override var sensorBatteryLevel = -1 - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.EVERSENSE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - // cannot be inner class because of needed injection class EversenseWorker( context: Context, @@ -126,14 +121,16 @@ class EversensePlugin @Inject constructor( aapsLogger.debug(LTag.BGSOURCE, "calibrationTimestamps" + Arrays.toString(calibrationTimestamps)) aapsLogger.debug(LTag.BGSOURCE, "calibrationRecordNumbers" + Arrays.toString(calibrationRecordNumbers)) for (i in calibrationGlucoseLevels.indices) { - repository.runTransactionForResult(InsertIfNewByTimestampTherapyEventTransaction( - timestamp = calibrationTimestamps[i], - type = TherapyEvent.Type.FINGER_STICK_BG_VALUE, - glucose = calibrationGlucoseLevels[i].toDouble(), - glucoseType = TherapyEvent.MeterType.FINGER, - glucoseUnit = TherapyEvent.GlucoseUnit.MGDL, - enteredBy = "AndroidAPS-Eversense" - )) + repository.runTransactionForResult( + InsertIfNewByTimestampTherapyEventTransaction( + timestamp = calibrationTimestamps[i], + type = TherapyEvent.Type.FINGER_STICK_BG_VALUE, + glucose = calibrationGlucoseLevels[i].toDouble(), + glucoseType = TherapyEvent.MeterType.FINGER, + glucoseUnit = TherapyEvent.GlucoseUnit.MGDL, + enteredBy = "AndroidAPS-Eversense" + ) + ) .doOnError { aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it) ret = Result.failure(workDataOf("Error" to it.toString())) diff --git a/plugins/source/src/main/java/info/nightscout/source/GlimpPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/GlimpPlugin.kt index 5e1328a22f..1630431807 100644 --- a/plugins/source/src/main/java/info/nightscout/source/GlimpPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/GlimpPlugin.kt @@ -17,7 +17,6 @@ import info.nightscout.interfaces.source.BgSource import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper -import info.nightscout.shared.sharedPreferences.SP import kotlinx.coroutines.Dispatchers import javax.inject.Inject import javax.inject.Singleton @@ -27,15 +26,14 @@ import javax.inject.Singleton class GlimpPlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, - aapsLogger: AAPSLogger, - private val sp: SP + aapsLogger: AAPSLogger ) : PluginBase( PluginDescription() .mainType(PluginType.BGSOURCE) .fragmentClass(BGSourceFragment::class.java.name) .pluginIcon(info.nightscout.core.main.R.drawable.ic_glimp) - .pluginName(R.string.glimp) .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.glimp) .description(R.string.description_source_glimp), aapsLogger, rh, injector ), BgSource { @@ -78,8 +76,4 @@ class GlimpPlugin @Inject constructor( return ret } } - - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.LIBRE_1_GLIMP && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - } \ No newline at end of file diff --git a/plugins/source/src/main/java/info/nightscout/source/GlunovoPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/GlunovoPlugin.kt index 2c7bf928ba..3bf28db760 100644 --- a/plugins/source/src/main/java/info/nightscout/source/GlunovoPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/GlunovoPlugin.kt @@ -45,8 +45,8 @@ class GlunovoPlugin @Inject constructor( .mainType(PluginType.BGSOURCE) .fragmentClass(BGSourceFragment::class.java.name) .pluginIcon(info.nightscout.core.main.R.drawable.ic_glunovo) - .pluginName(R.string.glunovo) .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.glunovo) .shortName(R.string.glunovo) .description(R.string.description_source_glunovo), aapsLogger, resourceHelper, injector @@ -167,9 +167,6 @@ class GlunovoPlugin @Inject constructor( } } - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.GLUNOVO_NATIVE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - companion object { const val AUTHORITY = "alexpr.co.uk.infinivocgm.cgm_db.CgmExternalProvider/" diff --git a/plugins/source/src/main/java/info/nightscout/source/IntelligoPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/IntelligoPlugin.kt index 411a30f0ac..0b9c3335d6 100644 --- a/plugins/source/src/main/java/info/nightscout/source/IntelligoPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/IntelligoPlugin.kt @@ -48,8 +48,8 @@ class IntelligoPlugin @Inject constructor( .mainType(PluginType.BGSOURCE) .fragmentClass(BGSourceFragment::class.java.name) .pluginIcon(info.nightscout.core.ui.R.drawable.ic_intelligo) - .pluginName(R.string.intelligo) .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.intelligo) .shortName(R.string.intelligo) .description(R.string.description_source_intelligo), aapsLogger, resourceHelper, injector @@ -175,14 +175,9 @@ class IntelligoPlugin @Inject constructor( } } - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.INTELLIGO_NATIVE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - companion object { const val AUTHORITY = "alexpr.co.uk.infinivocgm.intelligo.cgm_db.CgmExternalProvider" - - //const val AUTHORITY = "alexpr.co.uk.infinivocgm.cgm_db.CgmExternalProvider/" const val TABLE_NAME = "CgmReading" const val INTERVAL = 180000L // 3 min } diff --git a/plugins/source/src/main/java/info/nightscout/source/MM640gPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/MM640gPlugin.kt index 41c60db626..f8e5521a0d 100644 --- a/plugins/source/src/main/java/info/nightscout/source/MM640gPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/MM640gPlugin.kt @@ -16,7 +16,6 @@ import info.nightscout.interfaces.source.BgSource import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper -import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.utils.DateUtil import kotlinx.coroutines.Dispatchers import org.json.JSONArray @@ -28,15 +27,15 @@ import javax.inject.Singleton class MM640gPlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, - aapsLogger: AAPSLogger, - private val sp: SP + aapsLogger: AAPSLogger ) : PluginBase( PluginDescription() - .mainType(PluginType.BGSOURCE) - .fragmentClass(BGSourceFragment::class.java.name) - .pluginIcon(info.nightscout.core.main.R.drawable.ic_generic_cgm) - .pluginName(R.string.mm640g) - .description(R.string.description_source_mm640g), + .mainType(PluginType.BGSOURCE) + .fragmentClass(BGSourceFragment::class.java.name) + .preferencesId(R.xml.pref_bgsource) + .pluginIcon(info.nightscout.core.main.R.drawable.ic_generic_cgm) + .pluginName(R.string.mm640g) + .description(R.string.description_source_mm640g), aapsLogger, rh, injector ), BgSource { @@ -75,6 +74,7 @@ class MM640gPlugin @Inject constructor( trendArrow = GlucoseValue.TrendArrow.fromString(jsonObject.getString("direction")), sourceSensor = GlucoseValue.SourceSensor.MM_600_SERIES ) + else -> aapsLogger.debug(LTag.BGSOURCE, "Unknown entries type: $type") } } @@ -98,8 +98,4 @@ class MM640gPlugin @Inject constructor( return ret } } - - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.MM_600_SERIES && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - } \ No newline at end of file diff --git a/plugins/source/src/main/java/info/nightscout/source/NSClientSourcePlugin.kt b/plugins/source/src/main/java/info/nightscout/source/NSClientSourcePlugin.kt index d4aee71030..d6252a6ca8 100644 --- a/plugins/source/src/main/java/info/nightscout/source/NSClientSourcePlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/NSClientSourcePlugin.kt @@ -7,7 +7,6 @@ import info.nightscout.interfaces.plugin.PluginBase import info.nightscout.interfaces.plugin.PluginDescription import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.source.BgSource -import info.nightscout.interfaces.source.DoingOwnUploadSource import info.nightscout.interfaces.source.NSClientSource import info.nightscout.rx.logging.AAPSLogger import info.nightscout.shared.interfaces.ResourceHelper @@ -31,15 +30,13 @@ class NSClientSourcePlugin @Inject constructor( .alwaysEnabled(config.NSCLIENT) .setDefault(config.NSCLIENT), aapsLogger, rh, injector -), BgSource, NSClientSource, DoingOwnUploadSource { +), BgSource, NSClientSource { private var lastBGTimeStamp: Long = 0 private var isAdvancedFilteringEnabled = false override fun advancedFilteringSupported(): Boolean = isAdvancedFilteringEnabled - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = false - override fun detectSource(glucoseValue: GlucoseValue) { if (glucoseValue.timestamp > lastBGTimeStamp) { isAdvancedFilteringEnabled = arrayOf( diff --git a/plugins/source/src/main/java/info/nightscout/source/PoctechPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/PoctechPlugin.kt index e4aa9ce32e..28fb917fb8 100644 --- a/plugins/source/src/main/java/info/nightscout/source/PoctechPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/PoctechPlugin.kt @@ -18,7 +18,6 @@ import info.nightscout.interfaces.utils.JsonHelper.safeGetString import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper -import info.nightscout.shared.sharedPreferences.SP import kotlinx.coroutines.Dispatchers import org.json.JSONArray import org.json.JSONException @@ -29,16 +28,15 @@ import javax.inject.Singleton class PoctechPlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, - aapsLogger: AAPSLogger, - private val sp: SP + aapsLogger: AAPSLogger ) : PluginBase( PluginDescription() - .mainType(PluginType.BGSOURCE) - .fragmentClass(BGSourceFragment::class.java.name) - .pluginIcon(info.nightscout.core.main.R.drawable.ic_poctech) - .pluginName(R.string.poctech) - .preferencesId(R.xml.pref_bgsource) - .description(R.string.description_source_poctech), + .mainType(PluginType.BGSOURCE) + .fragmentClass(BGSourceFragment::class.java.name) + .pluginIcon(info.nightscout.core.main.R.drawable.ic_poctech) + .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.poctech) + .description(R.string.description_source_poctech), aapsLogger, rh, injector ), BgSource { @@ -91,8 +89,4 @@ class PoctechPlugin @Inject constructor( return ret } } - - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.POCTECH_NATIVE && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - } \ No newline at end of file diff --git a/plugins/source/src/main/java/info/nightscout/source/RandomBgPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/RandomBgPlugin.kt index 0ba41981ec..0beff92a8e 100644 --- a/plugins/source/src/main/java/info/nightscout/source/RandomBgPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/RandomBgPlugin.kt @@ -18,7 +18,6 @@ import info.nightscout.interfaces.source.BgSource import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper -import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.utils.T import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign @@ -35,7 +34,6 @@ class RandomBgPlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, aapsLogger: AAPSLogger, - private val sp: SP, private val repository: AppRepository, private val virtualPump: VirtualPump, private val config: Config @@ -44,9 +42,9 @@ class RandomBgPlugin @Inject constructor( .mainType(PluginType.BGSOURCE) .fragmentClass(BGSourceFragment::class.java.name) .pluginIcon(R.drawable.ic_dice) + .preferencesId(R.xml.pref_bgsource) .pluginName(R.string.random_bg) .shortName(R.string.random_bg_short) - .preferencesId(R.xml.pref_bgsource) .description(R.string.description_source_random_bg), aapsLogger, rh, injector ), BgSource { @@ -73,9 +71,6 @@ class RandomBgPlugin @Inject constructor( override fun advancedFilteringSupported(): Boolean = true - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.RANDOM && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - override fun onStart() { super.onStart() val cal = GregorianCalendar() @@ -116,9 +111,7 @@ class RandomBgPlugin @Inject constructor( ) disposable += repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null)) .subscribe({ savedValues -> - savedValues.inserted.forEach { - aapsLogger.debug(LTag.DATABASE, "Inserted bg $it") - } + savedValues.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted bg $it") } }, { aapsLogger.error(LTag.DATABASE, "Error while saving values from Random plugin", it) } ) } diff --git a/plugins/source/src/main/java/info/nightscout/source/TomatoPlugin.kt b/plugins/source/src/main/java/info/nightscout/source/TomatoPlugin.kt index 1c4d0432ab..7075ed516c 100644 --- a/plugins/source/src/main/java/info/nightscout/source/TomatoPlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/TomatoPlugin.kt @@ -25,17 +25,16 @@ import javax.inject.Singleton class TomatoPlugin @Inject constructor( injector: HasAndroidInjector, rh: ResourceHelper, - aapsLogger: AAPSLogger, - private val sp: SP + aapsLogger: AAPSLogger ) : PluginBase( PluginDescription() - .mainType(PluginType.BGSOURCE) - .fragmentClass(BGSourceFragment::class.java.name) - .pluginIcon(info.nightscout.core.main.R.drawable.ic_sensor) - .pluginName(R.string.tomato) - .preferencesId(R.xml.pref_bgsource) - .shortName(R.string.tomato_short) - .description(R.string.description_source_tomato), + .mainType(PluginType.BGSOURCE) + .fragmentClass(BGSourceFragment::class.java.name) + .pluginIcon(info.nightscout.core.main.R.drawable.ic_sensor) + .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.tomato) + .shortName(R.string.tomato_short) + .description(R.string.description_source_tomato), aapsLogger, rh, injector ), BgSource { @@ -78,8 +77,4 @@ class TomatoPlugin @Inject constructor( return ret } } - - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = - glucoseValue.sourceSensor == GlucoseValue.SourceSensor.LIBRE_1_TOMATO && sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) - } \ No newline at end of file diff --git a/plugins/source/src/main/java/info/nightscout/source/XdripSourcePlugin.kt b/plugins/source/src/main/java/info/nightscout/source/XdripSourcePlugin.kt index 227fa23f42..39bcc209bf 100644 --- a/plugins/source/src/main/java/info/nightscout/source/XdripSourcePlugin.kt +++ b/plugins/source/src/main/java/info/nightscout/source/XdripSourcePlugin.kt @@ -15,8 +15,7 @@ import info.nightscout.interfaces.plugin.PluginDescription import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.receivers.Intents import info.nightscout.interfaces.source.BgSource -import info.nightscout.interfaces.source.DoingOwnUploadSource -import info.nightscout.interfaces.source.XDrip +import info.nightscout.interfaces.source.XDripSource import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.shared.interfaces.ResourceHelper @@ -31,19 +30,18 @@ class XdripSourcePlugin @Inject constructor( aapsLogger: AAPSLogger ) : PluginBase( PluginDescription() - .mainType(PluginType.BGSOURCE) - .fragmentClass(BGSourceFragment::class.java.name) - .pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48)) - .pluginName(R.string.source_xdrip) - .description(R.string.description_source_xdrip), + .mainType(PluginType.BGSOURCE) + .fragmentClass(BGSourceFragment::class.java.name) + .pluginIcon((info.nightscout.core.main.R.drawable.ic_blooddrop_48)) + .preferencesId(R.xml.pref_bgsource) + .pluginName(R.string.source_xdrip) + .description(R.string.description_source_xdrip), aapsLogger, rh, injector -), BgSource, DoingOwnUploadSource, XDrip { +), BgSource, XDripSource { private var advancedFiltering = false override var sensorBatteryLevel = -1 - override fun shouldUploadToNs(glucoseValue: GlucoseValue): Boolean = false - override fun advancedFilteringSupported(): Boolean = advancedFiltering private fun detectSource(glucoseValue: GlucoseValue) { @@ -82,8 +80,10 @@ class XdripSourcePlugin @Inject constructor( raw = bundle.getDouble(Intents.EXTRA_RAW, 0.0), noise = null, trendArrow = GlucoseValue.TrendArrow.fromString(bundle.getString(Intents.EXTRA_BG_SLOPE_NAME)), - sourceSensor = GlucoseValue.SourceSensor.fromString(bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION) - ?: "") + sourceSensor = GlucoseValue.SourceSensor.fromString( + bundle.getString(Intents.XDRIP_DATA_SOURCE_DESCRIPTION) + ?: "" + ) ) repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null)) .doOnError { diff --git a/plugins/source/src/main/java/info/nightscout/source/di/SourceModule.kt b/plugins/source/src/main/java/info/nightscout/source/di/SourceModule.kt index 7ef977156b..74cc1dc105 100644 --- a/plugins/source/src/main/java/info/nightscout/source/di/SourceModule.kt +++ b/plugins/source/src/main/java/info/nightscout/source/di/SourceModule.kt @@ -5,7 +5,7 @@ import dagger.Module import dagger.android.ContributesAndroidInjector import info.nightscout.interfaces.source.DexcomBoyda import info.nightscout.interfaces.source.NSClientSource -import info.nightscout.interfaces.source.XDrip +import info.nightscout.interfaces.source.XDripSource import info.nightscout.source.AidexPlugin import info.nightscout.source.BGSourceFragment import info.nightscout.source.DexcomPlugin @@ -45,6 +45,6 @@ abstract class SourceModule { @Binds fun bindNSClientSource(nsClientSourcePlugin: NSClientSourcePlugin): NSClientSource @Binds fun bindDexcomBoyda(dexcomPlugin: DexcomPlugin): DexcomBoyda - @Binds fun bindXDrip(xdripSourcePlugin: XdripSourcePlugin): XDrip + @Binds fun bindXDrip(xdripSourcePlugin: XdripSourcePlugin): XDripSource } } \ No newline at end of file diff --git a/plugins/source/src/main/res/values-sv-rSE/strings.xml b/plugins/source/src/main/res/values-sv-rSE/strings.xml index d1289cd501..98ee764325 100644 --- a/plugins/source/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/source/src/main/res/values-sv-rSE/strings.xml @@ -1,7 +1,10 @@ + NSClient BG + NS BG Ladda ner BG-data från Nightscout + xDrip+ BG Ta emot BG-data från xDrip+. Patchad Dexcom-app Dex @@ -9,14 +12,29 @@ Eversense App (modifierad) Ta emot BG-data från den modifierade Eversense-appen. + Glimp Ta emot BG-data från Glimp + MM640g Ta emot BG-data från 600SeriesAndroidUploader Poctech Ta emot BG-data från Poctechappen Glunovo Ta emot värden från Glunovo-appen + Intelligo + Ta emot värden från Intelligo-appen Tomato (MiaoMiao) Tomato Ta emot BG-data från tomato app (MiaoMiao-enhet) + GlucoRx Aidex + Aidex + Ta emot BG-värden från GlucoRx Aidex CGMS. + Slumpmässig BG + Generera slumpmässiga BG-data (endast demo-läge) + BG + Skicka BG-data till xDrip+ + Välj \"640G/Eversense\" som datakälla i xDrip+ Uppladdningsinställningar för BG + Logga sensorbyte till Nightscout + Logga automatiskt ett sensorbyte i NS när en sensor startas + riktning diff --git a/plugins/source/src/test/java/info/nightscout/source/GlimpPluginTest.kt b/plugins/source/src/test/java/info/nightscout/source/GlimpPluginTest.kt index be6fc799ba..493259c63d 100644 --- a/plugins/source/src/test/java/info/nightscout/source/GlimpPluginTest.kt +++ b/plugins/source/src/test/java/info/nightscout/source/GlimpPluginTest.kt @@ -18,7 +18,7 @@ class GlimpPluginTest : TestBase() { @BeforeEach fun setup() { - glimpPlugin = GlimpPlugin({ AndroidInjector { } }, rh, aapsLogger, sp) + glimpPlugin = GlimpPlugin({ AndroidInjector { } }, rh, aapsLogger) } @Test fun advancedFilteringSupported() { diff --git a/plugins/source/src/test/java/info/nightscout/source/MM640GPluginTest.kt b/plugins/source/src/test/java/info/nightscout/source/MM640GPluginTest.kt index 4d71051ef7..bd71ea29b3 100644 --- a/plugins/source/src/test/java/info/nightscout/source/MM640GPluginTest.kt +++ b/plugins/source/src/test/java/info/nightscout/source/MM640GPluginTest.kt @@ -3,7 +3,6 @@ package info.nightscout.source import dagger.android.AndroidInjector import info.nightscout.androidaps.TestBase import info.nightscout.shared.interfaces.ResourceHelper -import info.nightscout.shared.sharedPreferences.SP import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -14,11 +13,10 @@ class MM640GPluginTest : TestBase() { private lateinit var mM640gPlugin: MM640gPlugin @Mock lateinit var rh: ResourceHelper - @Mock lateinit var sp: SP @BeforeEach fun setup() { - mM640gPlugin = MM640gPlugin({ AndroidInjector { } }, rh, aapsLogger, sp) + mM640gPlugin = MM640gPlugin({ AndroidInjector { } }, rh, aapsLogger) } @Test fun advancedFilteringSupported() { diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsShared/NsIncomingDataProcessor.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsShared/NsIncomingDataProcessor.kt index bff985c3c4..074afa6147 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsShared/NsIncomingDataProcessor.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsShared/NsIncomingDataProcessor.kt @@ -16,7 +16,18 @@ import info.nightscout.interfaces.profile.ProfileSource import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.plugins.sync.R -import info.nightscout.plugins.sync.nsclientV3.extensions.* +import info.nightscout.plugins.sync.nsclientV3.extensions.toBolus +import info.nightscout.plugins.sync.nsclientV3.extensions.toBolusCalculatorResult +import info.nightscout.plugins.sync.nsclientV3.extensions.toCarbs +import info.nightscout.plugins.sync.nsclientV3.extensions.toEffectiveProfileSwitch +import info.nightscout.plugins.sync.nsclientV3.extensions.toExtendedBolus +import info.nightscout.plugins.sync.nsclientV3.extensions.toFood +import info.nightscout.plugins.sync.nsclientV3.extensions.toOfflineEvent +import info.nightscout.plugins.sync.nsclientV3.extensions.toProfileSwitch +import info.nightscout.plugins.sync.nsclientV3.extensions.toTemporaryBasal +import info.nightscout.plugins.sync.nsclientV3.extensions.toTemporaryTarget +import info.nightscout.plugins.sync.nsclientV3.extensions.toTherapyEvent +import info.nightscout.plugins.sync.nsclientV3.extensions.toTransactionGlucoseValue import info.nightscout.rx.bus.RxBus import info.nightscout.rx.events.EventDismissNotification import info.nightscout.rx.events.EventNSClientNewLog @@ -24,7 +35,17 @@ import info.nightscout.rx.logging.AAPSLogger import info.nightscout.rx.logging.LTag import info.nightscout.sdk.localmodel.entry.NSSgvV3 import info.nightscout.sdk.localmodel.food.NSFood -import info.nightscout.sdk.localmodel.treatment.* +import info.nightscout.sdk.localmodel.treatment.NSBolus +import info.nightscout.sdk.localmodel.treatment.NSBolusWizard +import info.nightscout.sdk.localmodel.treatment.NSCarbs +import info.nightscout.sdk.localmodel.treatment.NSEffectiveProfileSwitch +import info.nightscout.sdk.localmodel.treatment.NSExtendedBolus +import info.nightscout.sdk.localmodel.treatment.NSOfflineEvent +import info.nightscout.sdk.localmodel.treatment.NSProfileSwitch +import info.nightscout.sdk.localmodel.treatment.NSTemporaryBasal +import info.nightscout.sdk.localmodel.treatment.NSTemporaryTarget +import info.nightscout.sdk.localmodel.treatment.NSTherapyEvent +import info.nightscout.sdk.localmodel.treatment.NSTreatment import info.nightscout.shared.sharedPreferences.SP import info.nightscout.shared.utils.DateUtil import info.nightscout.shared.utils.T @@ -223,8 +244,9 @@ class NsIncomingDataProcessor @Inject constructor( val lastLocalChange = sp.getLong(info.nightscout.core.utils.R.string.key_local_profile_last_change, 0) aapsLogger.debug(LTag.PROFILE, "Received profileStore: createdAt: $createdAt Local last modification: $lastLocalChange") @Suppress("LiftReturnOrAssignment") - if (createdAt > lastLocalChange || createdAt % 1000 == 0L) {// whole second means edited in NS + if (createdAt > lastLocalChange || createdAt % 1000 == 0L) { // whole second means edited in NS profileSource.loadFromStore(store) + activePlugin.activeNsClient?.dataSyncSelector?.profileReceived(store.getStartDate()) aapsLogger.debug(LTag.PROFILE, "Received profileStore: $profileJson") } } diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/DataSyncSelectorV1.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/DataSyncSelectorV1.kt index 75cefbf012..f4a52bbe9c 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/DataSyncSelectorV1.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/DataSyncSelectorV1.kt @@ -4,6 +4,7 @@ import info.nightscout.core.utils.waitMillis import info.nightscout.database.impl.AppRepository import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.plugins.sync.R @@ -74,6 +75,9 @@ class DataSyncSelectorV1 @Inject constructor( private var running = false private val sync = Any() + + private val bgUploadEnabled get() = sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) && activePlugin.activeBgSource !is NSClientSource + override suspend fun doUpload() { synchronized(sync) { if (running) { @@ -154,7 +158,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastBolusIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting Bolus data sync from $lastSynced") sp.putLong(R.string.key_ns_bolus_last_synced_id, lastSynced) } } @@ -203,7 +206,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastCarbsIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting Carbs data sync from $lastSynced") sp.putLong(R.string.key_ns_carbs_last_synced_id, lastSynced) } } @@ -252,7 +254,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastBolusCalculatorResultsIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting BolusCalculatorResult data sync from $lastSynced") sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, lastSynced) } } @@ -301,7 +302,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastTempTargetsIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryTarget data sync from $lastSynced") sp.putLong(R.string.key_ns_temporary_target_last_synced_id, lastSynced) } } @@ -350,7 +350,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastFoodIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_food_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting Food data sync from $lastSynced") sp.putLong(R.string.key_ns_food_last_synced_id, lastSynced) } } @@ -399,7 +398,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastGlucoseValueIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting GlucoseValue data sync from $lastSynced") sp.putLong(R.string.key_ns_glucose_value_last_synced_id, lastSynced) } } @@ -419,7 +417,7 @@ class DataSyncSelectorV1 @Inject constructor( appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv -> aapsLogger.info(LTag.NSCLIENT, "Loading GlucoseValue data Start: $startId ${gv.first} forID: ${gv.second.id} ") val dataPair = DataSyncSelector.PairGlucoseValue(gv.first, gv.second.id) - if (activePlugin.activeBgSource.shouldUploadToNs(gv.first)) { + if (bgUploadEnabled) { when { // new record with existing NS id => must be coming from NS => ignore gv.first.id == gv.second.id && gv.first.interfaceIDs.nightscoutId != null -> @@ -450,7 +448,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastTherapyEventIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting TherapyEvents data sync from $lastSynced") sp.putLong(R.string.key_ns_therapy_event_last_synced_id, lastSynced) } } @@ -499,7 +496,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastDeviceStatusIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting DeviceStatus data sync from $lastSynced") sp.putLong(R.string.key_ns_device_status_last_synced_id, lastSynced) } } @@ -531,7 +527,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastTemporaryBasalIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryBasal data sync from $lastSynced") sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, lastSynced) } } @@ -583,7 +578,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastExtendedBolusIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting ExtendedBolus data sync from $lastSynced") sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, lastSynced) } } @@ -635,7 +629,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastProfileSwitchIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting ProfileSwitch data sync from $lastSynced") sp.putLong(R.string.key_ns_profile_switch_last_synced_id, lastSynced) } } @@ -684,7 +677,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting EffectiveProfileSwitch data sync from $lastSynced") sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced) } } @@ -733,7 +725,6 @@ class DataSyncSelectorV1 @Inject constructor( private fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting OfflineEvent data sync from $lastSynced") sp.putLong(R.string.key_ns_offline_event_last_synced_id, lastSynced) } } @@ -784,6 +775,10 @@ class DataSyncSelectorV1 @Inject constructor( sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, lastSynced) } + override fun profileReceived(timestamp: Long) { + sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, timestamp) + } + private suspend fun processChangedProfileStore() { if (isPaused) return val lastSync = sp.getLong(R.string.key_ns_profile_store_last_synced_timestamp, 0) diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/NSClientPlugin.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/NSClientPlugin.kt index 711106bedd..3d400bbee9 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/NSClientPlugin.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclient/NSClientPlugin.kt @@ -21,7 +21,6 @@ import info.nightscout.interfaces.plugin.PluginDescription import info.nightscout.interfaces.plugin.PluginType import info.nightscout.interfaces.profile.Profile import info.nightscout.interfaces.profile.ProfileFunction -import info.nightscout.interfaces.source.DoingOwnUploadSource import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.sync.NsClient import info.nightscout.interfaces.sync.Sync @@ -129,9 +128,6 @@ class NSClientPlugin @Inject constructor( preferenceFragment.findPreference(rh.gs(info.nightscout.core.utils.R.string.key_ns_create_announcements_from_carbs_req))?.isVisible = false } preferenceFragment.findPreference(rh.gs(R.string.key_ns_receive_tbr_eb))?.isVisible = config.isEngineeringMode() - if (activePlugin.activeBgSource is DoingOwnUploadSource) { - preferenceFragment.findPreference(rh.gs(info.nightscout.core.utils.R.string.key_do_ns_upload))?.isVisible = false - } } override val hasWritePermission: Boolean get() = nsClientService?.hasWriteAuth ?: false diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclientV3/DataSyncSelectorV3.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclientV3/DataSyncSelectorV3.kt index 3c5ea4b316..f1acdd1677 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclientV3/DataSyncSelectorV3.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/nsclientV3/DataSyncSelectorV3.kt @@ -6,6 +6,7 @@ import info.nightscout.interfaces.Config import info.nightscout.interfaces.nsclient.StoreDataForDb import info.nightscout.interfaces.plugin.ActivePlugin import info.nightscout.interfaces.profile.ProfileFunction +import info.nightscout.interfaces.source.NSClientSource import info.nightscout.interfaces.sync.DataSyncSelector import info.nightscout.interfaces.utils.JsonHelper import info.nightscout.plugins.sync.R @@ -70,6 +71,8 @@ class DataSyncSelectorV3 @Inject constructor( override fun queueSize(): Long = queueCounter.size() + private val bgUploadEnabled get() = sp.getBoolean(info.nightscout.core.utils.R.string.key_do_ns_upload, false) && activePlugin.activeBgSource !is NSClientSource + override suspend fun doUpload() { rxBus.send(EventNSClientUpdateGuiStatus()) if ((config.NSCLIENT || sp.getBoolean(R.string.key_ns_upload, true)) && !isPaused) { @@ -128,7 +131,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastBolusIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting Bolus data sync from $lastSynced") sp.putLong(R.string.key_ns_bolus_last_synced_id, lastSynced) } } @@ -147,7 +149,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.bolusesRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementBolus(startId).blockingGet()?.let { bolus -> - //aapsLogger.info(LTag.NSCLIENT, "Loading Bolus data Start: $startId ${bolus.first} forID: ${bolus.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore bolus.first.id == bolus.second.id && bolus.first.interfaceIDs.nightscoutId != null -> @@ -171,7 +172,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastCarbsIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_carbs_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting Carbs data sync from $lastSynced") sp.putLong(R.string.key_ns_carbs_last_synced_id, lastSynced) } } @@ -190,7 +190,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.carbsRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementCarbs(startId).blockingGet()?.let { carb -> - //aapsLogger.info(LTag.NSCLIENT, "Loading Carbs data Start: $startId ${carb.first} forID: ${carb.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore carb.first.id == carb.second.id && carb.first.interfaceIDs.nightscoutId != null -> @@ -214,7 +213,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastBolusCalculatorResultsIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_bolus_calculator_result_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting BolusCalculatorResult data sync from $lastSynced") sp.putLong(R.string.key_ns_bolus_calculator_result_last_synced_id, lastSynced) } } @@ -233,7 +231,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.bcrRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementBolusCalculatorResult(startId).blockingGet()?.let { bolusCalculatorResult -> - //aapsLogger.info(LTag.NSCLIENT, "Loading BolusCalculatorResult data Start: $startId ${bolusCalculatorResult.first} forID: ${bolusCalculatorResult.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore bolusCalculatorResult.first.id == bolusCalculatorResult.second.id && bolusCalculatorResult.first.interfaceIDs.nightscoutId != null -> @@ -265,7 +262,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastTempTargetsIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryTarget data sync from $lastSynced") sp.putLong(R.string.key_ns_temporary_target_last_synced_id, lastSynced) } } @@ -284,7 +280,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.ttsRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementTemporaryTarget(startId).blockingGet()?.let { tt -> - //aapsLogger.info(LTag.NSCLIENT, "Loading TemporaryTarget data Start: $startId ${tt.first} forID: ${tt.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore tt.first.id == tt.second.id && tt.first.interfaceIDs.nightscoutId != null -> @@ -308,7 +303,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastFoodIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_food_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting Food data sync from $lastSynced") sp.putLong(R.string.key_ns_food_last_synced_id, lastSynced) } } @@ -327,7 +321,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.foodsRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementFood(startId).blockingGet()?.let { food -> - //aapsLogger.info(LTag.NSCLIENT, "Loading Food data Start: $startId ${food.first} forID: ${food.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore food.first.id == food.second.id && food.first.interfaceIDs.nightscoutId != null -> @@ -351,7 +344,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastGlucoseValueIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_glucose_value_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting GlucoseValue data sync from $lastSynced") sp.putLong(R.string.key_ns_glucose_value_last_synced_id, lastSynced) } } @@ -370,8 +362,7 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.gvsRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementGlucoseValue(startId).blockingGet()?.let { gv -> - //aapsLogger.info(LTag.NSCLIENT, "Loading GlucoseValue data Start: $startId ${gv.first} forID: ${gv.second.id} ") - if (activePlugin.activeBgSource.shouldUploadToNs(gv.first)) { + if (bgUploadEnabled) { when { // new record with existing NS id => must be coming from NS => ignore gv.first.id == gv.second.id && gv.first.interfaceIDs.nightscoutId != null -> @@ -396,7 +387,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastTherapyEventIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_therapy_event_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting TherapyEvents data sync from $lastSynced") sp.putLong(R.string.key_ns_therapy_event_last_synced_id, lastSynced) } } @@ -415,7 +405,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.tesRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementTherapyEvent(startId).blockingGet()?.let { te -> - //aapsLogger.info(LTag.NSCLIENT, "Loading TherapyEvents data Start: $startId ${te.first} forID: ${te.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore te.first.id == te.second.id && te.first.interfaceIDs.nightscoutId != null -> @@ -439,7 +428,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastDeviceStatusIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_device_status_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting DeviceStatus data sync from $lastSynced") sp.putLong(R.string.key_ns_device_status_last_synced_id, lastSynced) } } @@ -458,7 +446,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.dssRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementDeviceStatus(startId).blockingGet()?.let { deviceStatus -> - //aapsLogger.info(LTag.NSCLIENT, "Loading DeviceStatus data Start: $startId $deviceStatus") cont = activePlugin.activeNsClient?.nsAdd("devicestatus", DataSyncSelector.PairDeviceStatus(deviceStatus, lastDbId), "$startId/$lastDbId") ?: false if (cont) confirmLastDeviceStatusIdIfGreater(deviceStatus.id) // with nsId = ignore @@ -470,7 +457,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastTemporaryBasalIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_temporary_basal_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting TemporaryBasal data sync from $lastSynced") sp.putLong(R.string.key_ns_temporary_basal_last_synced_id, lastSynced) } } @@ -490,7 +476,6 @@ class DataSyncSelectorV3 @Inject constructor( rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementTemporaryBasal(startId).blockingGet()?.let { tb -> val profile = profileFunction.getProfile(tb.first.timestamp) - //aapsLogger.info(LTag.NSCLIENT, "Loading TemporaryBasal data Start: $startId ${tb.first} forID: ${tb.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore tb.first.id == tb.second.id && tb.first.interfaceIDs.nightscoutId != null -> @@ -514,7 +499,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastExtendedBolusIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_extended_bolus_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting ExtendedBolus data sync from $lastSynced") sp.putLong(R.string.key_ns_extended_bolus_last_synced_id, lastSynced) } } @@ -533,7 +517,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.ebsRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementExtendedBolus(startId).blockingGet()?.let { eb -> - //aapsLogger.info(LTag.NSCLIENT, "Loading ExtendedBolus data Start: $startId ${eb.first} forID: ${eb.second.id} ") val profile = profileFunction.getProfile(eb.first.timestamp) if (profile != null) { when { @@ -560,7 +543,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastProfileSwitchIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_profile_switch_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting ProfileSwitch data sync from $lastSynced") sp.putLong(R.string.key_ns_profile_switch_last_synced_id, lastSynced) } } @@ -579,7 +561,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.pssRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementProfileSwitch(startId).blockingGet()?.let { ps -> - //aapsLogger.info(LTag.NSCLIENT, "Loading ProfileSwitch data Start: $startId ${ps.first} forID: ${ps.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore ps.first.id == ps.second.id && ps.first.interfaceIDs.nightscoutId != null -> @@ -603,7 +584,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastEffectiveProfileSwitchIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_effective_profile_switch_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting EffectiveProfileSwitch data sync from $lastSynced") sp.putLong(R.string.key_ns_effective_profile_switch_last_synced_id, lastSynced) } } @@ -622,7 +602,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.epssRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementEffectiveProfileSwitch(startId).blockingGet()?.let { ps -> - //aapsLogger.info(LTag.NSCLIENT, "Loading EffectiveProfileSwitch data Start: $startId ${ps.first} forID: ${ps.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore ps.first.id == ps.second.id && ps.first.interfaceIDs.nightscoutId != null -> @@ -646,7 +625,6 @@ class DataSyncSelectorV3 @Inject constructor( private fun confirmLastOfflineEventIdIfGreater(lastSynced: Long) { if (lastSynced > sp.getLong(R.string.key_ns_offline_event_last_synced_id, 0)) { - //aapsLogger.debug(LTag.NSCLIENT, "Setting OfflineEvent data sync from $lastSynced") sp.putLong(R.string.key_ns_offline_event_last_synced_id, lastSynced) } } @@ -665,7 +643,6 @@ class DataSyncSelectorV3 @Inject constructor( queueCounter.oesRemaining = lastDbId - startId rxBus.send(EventNSClientUpdateGuiQueue()) appRepository.getNextSyncElementOfflineEvent(startId).blockingGet()?.let { oe -> - //aapsLogger.info(LTag.NSCLIENT, "Loading OfflineEvent data Start: $startId ${oe.first} forID: ${oe.second.id} ") when { // new record with existing NS id => must be coming from NS => ignore oe.first.id == oe.second.id && oe.first.interfaceIDs.nightscoutId != null -> @@ -691,6 +668,10 @@ class DataSyncSelectorV3 @Inject constructor( sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, lastSynced) } + override fun profileReceived(timestamp: Long) { + sp.putLong(R.string.key_ns_profile_store_last_synced_timestamp, timestamp) + } + private suspend fun processChangedProfileStore() { if (isPaused) return val lastSync = sp.getLong(R.string.key_ns_profile_store_last_synced_timestamp, 0) diff --git a/plugins/sync/src/main/java/info/nightscout/plugins/sync/xdrip/DataSyncSelectorXdripImpl.kt b/plugins/sync/src/main/java/info/nightscout/plugins/sync/xdrip/DataSyncSelectorXdripImpl.kt index b4476d3722..6fd20db5be 100644 --- a/plugins/sync/src/main/java/info/nightscout/plugins/sync/xdrip/DataSyncSelectorXdripImpl.kt +++ b/plugins/sync/src/main/java/info/nightscout/plugins/sync/xdrip/DataSyncSelectorXdripImpl.kt @@ -531,6 +531,10 @@ class DataSyncSelectorXdripImpl @Inject constructor( sp.putLong(R.string.key_xdrip_profile_store_last_synced_timestamp, lastSynced) } + override fun profileReceived(timestamp: Long) { + sp.putLong(R.string.key_xdrip_profile_store_last_synced_timestamp, timestamp) + } + private fun processChangedProfileStore() { if (!isEnabled) return val lastSync = sp.getLong(R.string.key_xdrip_profile_store_last_synced_timestamp, 0) diff --git a/plugins/sync/src/main/res/values-sv-rSE/oh_strings.xml b/plugins/sync/src/main/res/values-sv-rSE/oh_strings.xml index 070db63454..ae52e7a6c4 100644 --- a/plugins/sync/src/main/res/values-sv-rSE/oh_strings.xml +++ b/plugins/sync/src/main/res/values-sv-rSE/oh_strings.xml @@ -1,5 +1,7 @@ + Open Humans + OH Med Open Humans kan du ladda upp din diabetesdata och donera den till vetenskapliga projekt. Logga ut Konfiguration @@ -10,17 +12,45 @@ Ladda bara upp vid laddning Laddar upp till Open Humans… Aviseringar från Open Humans + AAPS laddar upp till Open Humans. Det kan ta ett tag. Du har loggats ut från Open Humans Klicka här om du vill logga in igen. Nästa + Välkommen till Open Humans + För att ställa in datauppladdning, klicka på \"Nästa\". + Samtycke Användarvillkor + Läs noggrant följande information och godkänn användarvillkoren för att fortsätta. Detta är ett open source-verktyg som kommer att ladda upp dina data till Open Humans. Vi förbehåller oss inga rättigheter att dela dina uppgifter med tredje part utan ditt uttryckliga tillstånd. De data som projektet och appen tar emot identifieras via ett slumpmässigt användar-ID och kommer endast att överföras på ett säkert sätt till ett Open Humans-konto om du tillåter det. Du kan när som helst sluta ladda upp och radera dina uppladdningsdata via www.openhumans.org. + Data uppladdat + Glukosvärden Bolusar + Förlängda bolusar Kolhydrater + Careportal-händelser (utom anteckningar) + Profilbyten + Total daglig dos (TDD) + Tillfälliga basaldoser + Tillfälliga målvärden Inställningar + Programversion Modell + Skärmdimensioner + Felsökningsdata för algoritmen + Data INTE uppladdat + Lösenord Nightscout-URL + Nightscout API-hemlighet + Fritextfält Jag förstår och instämmer. + Logga in på Open Humans + Avslutande detaljer + Du är bara ett steg från att ladda upp dina data till Open Humans. Vill du fortsätta? Avbryt + Fortsätt + Slutför... + Detta kan ta några sekunder. + Vi är klara! + Från och med nu kommer telefonen att ladda upp data i bakgrunden då och då. Stäng diff --git a/plugins/sync/src/main/res/values-sv-rSE/strings.xml b/plugins/sync/src/main/res/values-sv-rSE/strings.xml index aa158fefd0..c5f5840e5d 100644 --- a/plugins/sync/src/main/res/values-sv-rSE/strings.xml +++ b/plugins/sync/src/main/res/values-sv-rSE/strings.xml @@ -1,7 +1,11 @@ + Använd mobilanslutning + Använd WiFi-anslutning WiFi nätverksnamn + Vid laddning + På batteri Anslutningsinställningar Tillåtna nätverksnamn (separerade med semikolon) Tillåt NS-data vid roaming @@ -10,12 +14,17 @@ Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar) Skapa Nightscout-aviseringar för KH-förslag Synkroniserar dina data med Nightscout + Synkroniserar dina data med Nightscout genom v3 API + Blockerad av laddningsinställningar + Blockerad av anslutningsinställningar Versionen av Nightscout stöds inte APS Upld batt Fel på NSClient. Överväg att starta om NSClient och Nightscout-webbplatsen. NS Client kan inte uppdatera Nightscout. Fel API secret? + NSClientV3 + NSV3 NSClient NSCl URL: @@ -26,6 +35,9 @@ Nightscout API secret Nightscout API secret Ange Nightscout API secret (min 12 tecken) + NS åtkomstnyckel + NS åtkomstnyckel + Åtkomstnyckel genererad på Nighscouts admin-sida (minst 17 tecken) Synkronisera nu Töm kö Visa kö @@ -45,6 +57,8 @@ Acceptera profilbyten som matats in via NS eller NSClient Ladda ner APS offline händelser Acceptera APS Offline-händelser som matas in via NS eller NSClient + Ladda ner temp basal och förlängd bolus + Acceptera temp basal och förlängd bolus inlagda av en annan instans Ladda ner loggade insulindoser Acceptera loggat insulin som matats in via NS eller NSClient (den levereras inte, endast beräknad mot IOB) Ladda ner loggade kolhydrater @@ -61,6 +75,8 @@ Akut varning efter [min] Rapportera appstart till Nightscout Kopiera NS-inställningar (om det finns)? + Anslut till websockets + Aktivering innebär: snabbare uppdateringar, mottagande av larm och meddelanden och högre batteriförbrukning liknande v1. OBS! Alla uppladdare till NS måste använda v3-protokollet. Ditt användarnamn på Tidepool. Normalt din e-postadress Användarnamn @@ -77,8 +93,27 @@ Ladda upp temp basaler Ladda upp profilbyten och temp mål Ladda upp BG-test + Ta bort allt + Nollställ start Ladda upp nu + Inte ansluten + Skrivskyddad + Arbetar + xDrip+ + XD + Skicka data till xDrip+ + Visa detaljerad IOB + Bryt ner IOB som bolus-IOB och basal-IOB på urtavlan + Visa BGI + Visa BGI i statusraden + xDrip+ Avancerad Statusrad + Loop inaktiverad + Skicka statusrad till xDrip+ + xDrip+ inte installerat + Kalibrering skickad till xDrip+ + Skicka glukos och behandlingsdata till xDrip+. Datakällan \"xDrip+ Sync Follower\" måste väljas och godkännande av data måste aktiveras i Inställningar - Inter-app-inställningar - Acceptera Glukos/Behandlingar + Aktivera sändningar till xDrip+. diff --git a/plugins/sync/src/test/java/info/nightscout/androidaps/BundleMock.java b/plugins/sync/src/test/java/info/nightscout/androidaps/BundleMock.java index 940f882bf1..b789e81eb4 100644 --- a/plugins/sync/src/test/java/info/nightscout/androidaps/BundleMock.java +++ b/plugins/sync/src/test/java/info/nightscout/androidaps/BundleMock.java @@ -24,7 +24,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; -@SuppressWarnings({"unused", "rawtypes", "SuspiciousMethodCalls", "unchecked"}) +@SuppressWarnings({"unused", "rawtypes", "SuspiciousMethodCalls", "unchecked", "deprecation"}) public final class BundleMock { public static Bundle mock() { diff --git a/pump/combov2/comboctl/src/jvmTest/kotlin/info/nightscout/comboctl/base/testUtils/TestBluetoothDevice.kt b/pump/combov2/comboctl/src/jvmTest/kotlin/info/nightscout/comboctl/base/testUtils/TestBluetoothDevice.kt index 2c4a4e8859..bbb02cded4 100644 --- a/pump/combov2/comboctl/src/jvmTest/kotlin/info/nightscout/comboctl/base/testUtils/TestBluetoothDevice.kt +++ b/pump/combov2/comboctl/src/jvmTest/kotlin/info/nightscout/comboctl/base/testUtils/TestBluetoothDevice.kt @@ -24,7 +24,8 @@ class TestBluetoothDevice(private val testComboIO: ComboIO) : BluetoothDevice(Di } override fun disconnect() { - frameParser.reset() + // Synchronized rest so we don't interfere with pushing/parsing data into the frameParser. + synchronized(frameParser) { frameParser.reset() } runBlocking { innerJob.cancelAndJoin() } @@ -38,8 +39,10 @@ class TestBluetoothDevice(private val testComboIO: ComboIO) : BluetoothDevice(Di } override fun blockingSend(dataToSend: List) { - frameParser.pushData(dataToSend) - frameParser.parseFrame()?.let { + synchronized(frameParser) { + frameParser.pushData(dataToSend) + frameParser.parseFrame() + }?.let { runBlocking { innerScope.async { testComboIO.send(it) diff --git a/pump/combov2/src/main/res/values-sv-rSE/strings.xml b/pump/combov2/src/main/res/values-sv-rSE/strings.xml index a75509dcd9..248b158b54 100644 --- a/pump/combov2/src/main/res/values-sv-rSE/strings.xml +++ b/pump/combov2/src/main/res/values-sv-rSE/strings.xml @@ -1,19 +1,131 @@ + Accu-Chek Combo + Inbyggd pumpintegration för Accu-Check Combo-pumpar + Kunde inte ansluta till pumpen + Inte parkopplad till en pump + Pumpen avslutade anslutningen + Combo varning + Combo fel + Ring hotline för uppdatering + Bluetooth-fel; parkoppla på nytt + Reservoar tom Batteri tomt Ocklusion + Slut på tid för reservpump Mekaniskt fel + Elektroniskt fel + Strömavbrott + Lånepump stannar + Reservoarfel + Infusionsset är inte förfyllt + Förlängd bolus stöds inte + Accu-Chek Combo v2 + Parkoppla med pump + Koppla från pump + Drivrutinsstatus + Nuvarande aktivitet Bluetooth-adress + Påbörja parkoppling + Parkoppling pågår + Steg för att parkoppla med din Combo:\n\n +1. Navigera till pumpens Bluetooth-inställningar\n +2. Kontrollera om en enhet redan visas som parkopplad; Om så är fallet, gå till \"Ta bort enhet\" skärmen på pumpen för att ta bort/koppla ifrån den enheten\n +3. Gå till pumpskärmen \"Lägg till enhet\" och starta parkoppling på pumpen\n +4. Klicka på knappen \"Påbörja parkoppling\" nedan för att initiera parkoppling i AAPS\n + Efter ett tag visas telefonens namn på pumpens skärm; tryck på CHECK för att bekräfta.\n\n +När parkopplingen är slutförd, bekräfta den färdiga parningen på pumpen och återgå till pumpens startskärm genom att trycka på CHECK-knappen två gånger.\n\n +Om ingen anslutning är etablerad efter mer än ~5 minuter:\n\n +1. Tryck tillbaka eller \"Avbryt parkoppling\"\n +2. Avbryt parkopplingen på Combo (tryck på både UP- och MENU-knapparna +samtidigt för att avbryta parkoppling)\n +3. Försök para ihop igen + Ange PIN-kod + Avbryt parkoppling + 10-siffrig PIN-kod + Parkoppingen lyckades + Parkopplingen avbruten av användaren + Sökningen tog för lång tid + Parkoppling misslyckades på grund av fel: %1$s + Parkoppling avbröts av okänd anledning + "Ogiltig längd på PIN-kod. Behöver %1$d siffror men fick %2$d" + Söker efter pump + Upprättar Bluetooth-anslutning (försök nr. %1$d) + Utför handskakning med pump + Pumpen efterfrågar 10-siffrig PIN-kod + Avslutar parkoppling + Ingen anslutning på %1$d minuter + Mindre än en minut sedan + Ställer in aktuell tid i pumpen + Ställer in aktuellt datum i pumpen Inte initierad + Kontrollerar pump + Klar Pausad + Pumpen är pausad + Kör kommando + Hämtar basalprofil Sätter basalprofil + Sätter temp basal %1$d%% i %2$d minuter + Avbryter pågående temp basal + Levererar %1$.1f U som bolus + Hämtar TDD-historik + Uppdaterar pumpens datumtid + Uppdaterar pumpens status + PIN-koden fungerade inte. Kontrollera om det fanns ett stavfel. Om detta fortsätter att ske, avbryt och försök igen. + Varaktighet för sökning (i sekunder) + Aktivera detaljerad loggning + Hämtar basalprofil; %1$d faktor(er) inlästa + Sätter basalprofil; %1$d faktor(er) skrivna + Levererar bolus (%1$.1f av %2$.1f U levererade) + Kan inte skicka behandling - pumpen är pausad + Otillräckligt med insulin i reservoaren Bolus avbruten Bolus avbruten. Det verkar som om ingen bolus levererades. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt. + Bolus ej levererad + Kan inte hämta pumpdata. Pumpen måste parkopplas på nytt + Ej redovisade bolusleveranser upptäckta. Avbryter bolus av säkerhetsskäl. + Felaktig aktiv basalprofil. Profil 1 måste vara aktiv, inte profil %1$d + Okänd Combo-varning + Combo-varning %1$d%% (%2$d min återstår) + %1$d%% (mindre än 1 minut kvar) + Laddning av dygnsdoser avbruten + Hämtning av dygnsdoser misslyckades Pumpbatteriet är svagt + Låg nivå i pumpreservoaren + Inställning av temp basal lyckades + Inställning av temp basal misslyckades + Ställ in emulerad 100% temp basal + Låter pågående emulerad 100% temp basal avsluta + Ignorerar överflödig begäran av 100% temp basal + Oväntad gräns påträffades vid justering av temp basal: målprocenten var %1$d%%, nådde en gräns vid %2$d%% + Kan inte ställa in absolut temp basal om basaldosen är noll + Parkoppla AndroidAPS och Android med en för närvarande icke-parad Accu-Chek Combo-pump + Koppla bort AndroidAPS och Android från den nuvarande parkopplade Accu-Chek Combo-pumpen + Okänd temp basal upptäcktes och stoppades; procentsats: %1$d%%; återstående varaktighet: %2$s + Anslutningsfel: %1$s Sen ansl: %1$d min sedan + Varning: %s + Senaste Bolus: %1$s U @ %2$s Temp: %s Res: %dU tom låg + full + Batt.: %s + Auto-detektera och ange byte av insulinreservoar automatiskt + Auto-detektera och ange byte av batteri automatiskt + Byte av insulinreservoar infogas automatiskt av combov2-drivrutinen + Batteribytet registrerades automatiskt av combov2-drivrutinen + Tidszon ändrad + Datum och/eller tid ändrad + Sommartid startad + Sommartid avslutad + Kan inte ansluta till pump eftersom pumpen rapporterade ett fel. Användaren måste hantera felet och sedan antingen vänta 5 minuter eller trycka på knappen Uppdatera i fliken drivrutiner. + Uppdaterar pumpens status efter att pumpen rapporterade ett fel + Gå tillbaka + Kan inte utföra parkoppling eftersom drivrutinen inte är initierad. Detta händer vanligtvis när de nödvändiga Bluetooth-behörigheterna inte har beviljats. Gå tillbaka, bevilja Bluetooth-behörigheter och försök sedan igen att parkoppla. + Kan inte starta drivrutinen - Bluetooth är inaktiverat + Drivrutin kan inte köras - den här enheten stöder inte Bluetooth diff --git a/pump/dana/src/main/res/layout/danar_history_activity.xml b/pump/dana/src/main/res/layout/danar_history_activity.xml index d86ba24236..a02f7c67d9 100644 --- a/pump/dana/src/main/res/layout/danar_history_activity.xml +++ b/pump/dana/src/main/res/layout/danar_history_activity.xml @@ -18,7 +18,8 @@ android:hint="@string/event_type" app:layout_constraintBottom_toTopOf="@+id/status" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent"> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> = messageBuffer.toTypedArray() - val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> (dateTime(s1) - dateTime(s2)).toInt() } + val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> dateTime(s1).compareTo(dateTime(s2)) } for (message in sorted) processMessage(message) danaPump.historyDoneReceived = true } else messageBuffer.add(bytes) diff --git a/pump/danar/src/main/res/values-sv-rSE/strings.xml b/pump/danar/src/main/res/values-sv-rSE/strings.xml index 3ea04e700d..8ec686d17b 100644 --- a/pump/danar/src/main/res/values-sv-rSE/strings.xml +++ b/pump/danar/src/main/res/values-sv-rSE/strings.xml @@ -1,2 +1,4 @@ - + + Åtgärden stöds inte i pumpen. Använd enbart AAPS gränssnitt! + diff --git a/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketAPSHistoryEvents.kt b/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketAPSHistoryEvents.kt index 9b948b0768..cbde42fe50 100644 --- a/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketAPSHistoryEvents.kt +++ b/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketAPSHistoryEvents.kt @@ -76,7 +76,7 @@ open class DanaRSPacketAPSHistoryEvents( aapsLogger.debug(LTag.PUMPCOMM, "Last record received") val array: Array = messageBuffer.toTypedArray() - val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> (dateTime(s1) - dateTime(s2)).toInt() } + val sorted = array.sortedArrayWith { s1: ByteArray, s2: ByteArray -> dateTime(s1).compareTo(dateTime(s2)) } for (index in sorted.indices) { val message = sorted[index] // workaround for RS history bug @@ -102,7 +102,7 @@ open class DanaRSPacketAPSHistoryEvents( } else messageBuffer.add(data) } - fun dateTime(data: ByteArray): Long = + private fun dateTime(data: ByteArray): Long = if (!danaPump.usingUTC) dateTimeSecFromBuff(data, 1) // 6 bytes else intFromBuffMsbLsb(data, 3, 4) * 1000L diff --git a/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketHistoryBolus.kt b/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketHistoryBolus.kt index c81f29e812..9752f9dd06 100644 --- a/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketHistoryBolus.kt +++ b/pump/danars/src/main/java/info/nightscout/pump/danars/comm/DanaRSPacketHistoryBolus.kt @@ -4,7 +4,7 @@ import dagger.android.HasAndroidInjector import info.nightscout.androidaps.danars.encryption.BleEncryption import info.nightscout.rx.logging.LTag -class DanaRSPacketHistoryBolus constructor( +class DanaRSPacketHistoryBolus( injector: HasAndroidInjector, from: Long = 0 ) : DanaRSPacketHistory(injector, from) { diff --git a/pump/diaconn/src/main/res/values-sv-rSE/strings.xml b/pump/diaconn/src/main/res/values-sv-rSE/strings.xml index dc3baee59a..6d4956e1a2 100644 --- a/pump/diaconn/src/main/res/values-sv-rSE/strings.xml +++ b/pump/diaconn/src/main/res/values-sv-rSE/strings.xml @@ -152,4 +152,6 @@ LGS status är redan AV. \"Temp basal start\" ignoreras när temp basal redan är aktiv \"Temp basal stopp\" ignoreras när ingen temp basal är aktiv + Skicka pumploggar till Diaconns moln. + Diaconn Molnsynkronisering diff --git a/pump/eopatch/src/main/res/values-sv-rSE/strings.xml b/pump/eopatch/src/main/res/values-sv-rSE/strings.xml index aa941dc89e..98a3aac06f 100644 --- a/pump/eopatch/src/main/res/values-sv-rSE/strings.xml +++ b/pump/eopatch/src/main/res/values-sv-rSE/strings.xml @@ -1,15 +1,107 @@ + EOPatch2 + EOP2 + Pumpintegration för EOPatch2 / GlucoMen Day Varningar + Varningar för låg reservoar + Påminnelse om att byta patch + Påminnelse om att byta patchvibrator + hh:mm + BLE Status + Serienummer + Lot-nummer + Start datum & tid + Utgångstid Status Profilens basaldos Temp basaldos Totalt levererat + Profilens basaldos är mindre än 0,05 U/h. EOPatch har en lägsta basaldos på 0.05U. Försök igen efter att profilen har ställts in till mer än så. + Ingen profil vald. Välj en profil och försök igen. dag + + + - + 30 min + 1 tim + 1 tim 30 min + 2 tim + \u0020 + För att byta pod måste den aktuella kasseras. All insulinleverans från den nuvarande podden kommer att stoppas. + Kassering av podden är slutförd. + Podden har inaktiverats.\nDu kan nu ta bort den och kassera den. + En bolus håller på att levereras. Är du säker på att du vill avbryta den för att kassera podden? + En temp basal håller på att levereras. Vill du avbryta den och kassera podden? + Både bolus och temp basal håller på att levereras. Är du säker på att du vill avbryta all insulintillförsel och kassera podden? + Är du säker på att du vill kassera podden? + Återstående insulin + Återstående tid Slutför + Kassera + Kommunikationsfel under kassering av pod + För normal avaktivering, tryck på \'Försök igen\'.\nFör ensidig avaktivering, tryck på \'Kassera\'. + För normal inaktivering, tryck på \'Försök igen\'. + För ensidig avaktivering, tryck på \'Kassera\'. + Att manuellt stänga av poddens larm + Om podden avaktiveras ensidigt under ett kommunikationsfel, finns en risk att larmet från podden fortsätter. + I detta fall kan du stänga av larmet så här: + 1. Ta bort podden från kroppen och ta bort tejpen. + 2. Använd ett gem och tryck in det hårt i hålet vid sidan av påfyllningsporten för insulin. + Insulinpåfyllning + 1/6 1. + Fyll en ny pod med rumstempererat insulin. Kontrollera sprutans vinkel. + 2. + Vänta på 1 pip. + Påbörja parkoppling + Parkoppling + 2/6 + Den nya podden håller på att parkopplas.\nHåll din smarta enhet så nära podden som möjligt + Förbered för att sätta fast podden + 3/6 + Ta bort tejpen och tryck sedan på \'Nästa\'. + [Caution1] Om en nål sticker ut, tryck på \'Kassera\'. + [Caution2] Om podden är blöt eller smutsig eller om tejpen är ihopklistrad, tryck på \'Kassera\'. + Sätta fast podden + 4/6 + Rengör huden, låt torka och fäst sedan podden. + Kontrollera att den sitter som den ska och tryck sedan på \"Starta säkerhetskontroll\". + Starta säkerhetskontroll + Säkerhetskontroll… + 5/6 + Det här steget tar ca 30 sekunder. + [Caution] Ta inte bort nålkontrollern innan säkerhetskontrollen är slutförd. + Skjuter in nålen + 6/6 + Vrid nålkontrollern mer än 100° för att skjuta in nålen och rotera sedan helt för att ta bort den + Lyssna efter 1 pip och tryck sedan på \"Nästa\". + Lyssna efter 1 pip och tryck sedan på \"Nästa\". + Podaktivering slutförd! + \'%1$s\' program har aktiverats. + Varnar dig när poddens livstid är på väg att ta slut.\nÄndra påminnelsetiden om det behövs. + Påminnelse om att byta pod + Påminnelse om podaktivering + Podaktiveringen har inte slutförts.\n Fortsätt. + Kontrollera kommunikation med pod + Kontrollerar kommunikation… + Flytta din smarta enhet närmare podden. + Vänligen flytta till en annan plats och försök igen. + Kommunikationsfel + Kommunikation lyckades + Ansluten till podden. + Avbryt parkoppling dagar +  U + Vid avstängningen kommer den nuvarande leveransen av Bolus & tillfällig basaldos att avbrytas. \n\nDos : %1$s U/hr\nÅterstående tid : %2$s\n& Kvarvarande insulin att leverera: %3$.2f U + Vid avstängning kommer den nuvarande leveransen av bolus att avbrytas. \n\nInsulin kvar att leverera : %1$.2f U + Vid avstängningen kommer den nuvarande leveransen av tillfällig basaldos att avbrytas. \n\nDos : %1$s U/hr\nÅterstående tid : %2$s + Insulinleveransen kommer att pausas. + Kassera/Byt pod + Aktivera pod + Kassera pod Återuppta + Kassera + Kommunikationskontroll Pausa Pausad Körs @@ -17,8 +109,25 @@ Bekräfta Larm Ansluter + Ändrar + Bearbetar Försök igen + [Caution] Ta INTE bort kanylkåpan och den självhäftande undersidan tills vidare instruktioner ges. + Är du säker på att du vill kassera den nuvarande podden? + På grund av obekräftad bolusinformation kan boluskalkylatorn inte användas förrän %s.\n\nÄr du säker på att du vill kassera den nuvarande Patchen? + Fel vid insättning av nål. + Kontrollera att riktningen på hålet som är kvar efter att ha vridit spaken är rak och tryck sedan på \'Försök igen\'. + Tryck på \'Kassera\' för att avaktivera pod. + Basalavstängning + Återuppta insulinleverans + Slutet av insulinavstängning.\nTryck på \"Bekräfta\" för att återuppta leveransen av insulin.\n\n[Caution]\nInsulinleverans kommer inte att återupptas förrän du trycker på \"Bekräfta\".\nOm du inte trycker på \'Bekräfta\', kan du utveckla högt blodsocker. Insulinleverans är pausad. + Insulinleveransen har återupptagits. Slutför + återstående tid: %1$s:%2$s Nästa + Försök igen efter kommunikationskontroll. + Avstängning misslyckades. + Återupptagande misslyckades. + EEE d MMM yyyy hh:mm diff --git a/pump/eopatch/src/main/res/values-sv-rSE/strings_alarm.xml b/pump/eopatch/src/main/res/values-sv-rSE/strings_alarm.xml index 61862d1424..32e33ecd44 100644 --- a/pump/eopatch/src/main/res/values-sv-rSE/strings_alarm.xml +++ b/pump/eopatch/src/main/res/values-sv-rSE/strings_alarm.xml @@ -1,2 +1,32 @@ - + + Tom reservoar\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu. + Podden har gått ut\nDen har inaktiverats och insulinleveransen har stoppats. Byt pod nu. + Ocklusion upptäckt\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu. + Fel i uppstartstest\nPodden har inaktiverats. Byt pod nu. + Olämplig temperatur\nInsulinleverans eller processen för att aktivera ny pod avbryts. Undvik extrem temperatur nu. + Fel vid insättning av kanyl\nKotrollera vredets position och tryck \'Försök igen\'. + Batterifel\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu. + Batterifel\nPodden har inaktiverats och insulinleveransen har stoppats. Byt pod nu. + Aktiveringsfel\n\'Aktivera pod\'-processen har löpt ut. Tryck på \'Bekräfta\' för att inaktivera nuvarande pod. Byt pod nu. + Pod-fel\nDen har inaktiverats och insulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Pod-fel\nPodden har inaktiverats och \ninsulinleveransen har stoppats. Byt pod nu. + Podden löper ut %s. Var redo att byta pod. + Dags att återuppta insulinleveransen\nTryck på \'Återuppta\'. + Låg reservoar\nByt pod snart. + Poddens livslängd har löpt ut\nByt pod nu. + Podden löper ut snart\nByt pod nu. + Ofullständig pod-aktivering\nSlutför \'Aktivera Pod\'-processen. + Pod-batteri lågt\nVar redo att byta pod. + diff --git a/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml b/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml index 7c83cc52c8..1d386306d2 100644 --- a/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml +++ b/pump/medtrum/src/main/res/values-cs-rCZ/strings.xml @@ -14,6 +14,7 @@ Stav BLE Naposledy připojeno + Aktivní bolus Stav pumpy Aktivní alarmy %.2f U diff --git a/pump/medtrum/src/main/res/values-es-rES/strings.xml b/pump/medtrum/src/main/res/values-es-rES/strings.xml index a3ef0a2419..ef9134dbe6 100644 --- a/pump/medtrum/src/main/res/values-es-rES/strings.xml +++ b/pump/medtrum/src/main/res/values-es-rES/strings.xml @@ -14,6 +14,7 @@ Estado BLE Última conexión + Bolo activo Estado de la bomba Alarmas activas %.2f U diff --git a/pump/medtrum/src/main/res/values-fr-rFR/strings.xml b/pump/medtrum/src/main/res/values-fr-rFR/strings.xml index e872f4fac3..02ed4893e5 100644 --- a/pump/medtrum/src/main/res/values-fr-rFR/strings.xml +++ b/pump/medtrum/src/main/res/values-fr-rFR/strings.xml @@ -14,6 +14,7 @@ État BT Dernière connexion + Bolus actif État de la pompe Alarmes actives %.2f U diff --git a/pump/medtrum/src/main/res/values-iw-rIL/strings.xml b/pump/medtrum/src/main/res/values-iw-rIL/strings.xml index 36c8a820fe..4d4e49e9df 100644 --- a/pump/medtrum/src/main/res/values-iw-rIL/strings.xml +++ b/pump/medtrum/src/main/res/values-iw-rIL/strings.xml @@ -2,6 +2,7 @@ + בולוס פעיל 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 455e60eb95..707562fb11 100644 --- a/pump/medtrum/src/main/res/values-lt-rLT/strings.xml +++ b/pump/medtrum/src/main/res/values-lt-rLT/strings.xml @@ -9,10 +9,12 @@ Pompa sustabdyta Pompa sustabdyta dėl viršyto valandos insulino limito Pompa sustabdyta dėl viršyto paros insulino limito + Rezervuaras neaktyvus Vartotojo nustatymai neįrašyti! BLE statusas Pask. prijungimas + Aktyvus bolusas Pompos būsena Aktyvūs aliarmai %.2f v @@ -22,17 +24,45 @@ %.2f v/val. Pompos tipas FW versija + Rezerv. nr. + Rezerv. nebeveiks Atnaujinti Atstatyti aliarmus + Keisti rezerv. + Inicijuota naudotojo + Neįjungta Senka pompos baterija Senka rezervuaras Pompa baigia darbą + Sustabdyta dėl žemos glikemijos + Sustabdyta dėl žemos glikemijos 2 + Autom. sustabdyta Sustabdyta Pristabdyta Užsikimšimas Baigė galioti + Rezervuaras tuščias + Rezerv. klaida + Rezerv. klaida 2 + Pildyti + Pildoma + Užpildyta + Prijungti rezervuarą + Aktyvuojama... + Aktyvuota + Deaktyvuoti rezervuarą + Deaktyvuojama... + Deaktyvuotas + Aktyvuojama + Netikėta būsena: %1$s + Nepasirinktas profilis. Pasirinkite profilį ir bandykite dar kartą. + Pompos pagrindo SN: %1$X + Svarbu: būtina užpildyti bent 70 v. + Kol kas neprijunkite pompos prie kūno. + Deaktyvuojama. Palaukite. + Ištraukite adatą. Nuimkite pompą nuo kūno. Serijos numeris Įveskite pompos pagrindo serijos numerį. diff --git a/pump/medtrum/src/main/res/values-nl-rNL/strings.xml b/pump/medtrum/src/main/res/values-nl-rNL/strings.xml index 91a4a0e03c..cfda17eed6 100644 --- a/pump/medtrum/src/main/res/values-nl-rNL/strings.xml +++ b/pump/medtrum/src/main/res/values-nl-rNL/strings.xml @@ -14,6 +14,7 @@ BLE Status Laatste verbinding + Actieve bolus Pomp status Actieve alarmen %.2f E diff --git a/pump/medtrum/src/main/res/values-no-rNO/strings.xml b/pump/medtrum/src/main/res/values-no-rNO/strings.xml index 292981931b..9bbc851cf0 100644 --- a/pump/medtrum/src/main/res/values-no-rNO/strings.xml +++ b/pump/medtrum/src/main/res/values-no-rNO/strings.xml @@ -14,6 +14,7 @@ Bluetooth Status Siste tilkobling + Aktiv bolus Pumpestatus Aktive alarmer %.2f E diff --git a/pump/medtrum/src/main/res/values-pl-rPL/strings.xml b/pump/medtrum/src/main/res/values-pl-rPL/strings.xml index fc152fa7f9..6a952d13ea 100644 --- a/pump/medtrum/src/main/res/values-pl-rPL/strings.xml +++ b/pump/medtrum/src/main/res/values-pl-rPL/strings.xml @@ -14,6 +14,7 @@ Status Bluetooth Low Energy Ostatnie połączenie + Aktywny bolus Status pompy Aktywne alarmy %.2f U diff --git a/pump/medtrum/src/main/res/values-pt-rPT/strings.xml b/pump/medtrum/src/main/res/values-pt-rPT/strings.xml index 36c8a820fe..b47973319b 100644 --- a/pump/medtrum/src/main/res/values-pt-rPT/strings.xml +++ b/pump/medtrum/src/main/res/values-pt-rPT/strings.xml @@ -2,6 +2,7 @@ + Bólus ativo diff --git a/pump/medtrum/src/main/res/values-sk-rSK/strings.xml b/pump/medtrum/src/main/res/values-sk-rSK/strings.xml index 458bbb3790..b2539f9ed9 100644 --- a/pump/medtrum/src/main/res/values-sk-rSK/strings.xml +++ b/pump/medtrum/src/main/res/values-sk-rSK/strings.xml @@ -14,6 +14,7 @@ Stav BLE Naposledy pripojené + Aktívny bolus Stav pumpy Aktívne alarmy %.2f JI diff --git a/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml b/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml index 3ea04e700d..c11a22a624 100644 --- a/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml +++ b/pump/medtrum/src/main/res/values-sv-rSE/arrays.xml @@ -1,2 +1,13 @@ - + + + Ljus, vibration och pip + Ljus och vibration + Ljus och pip + Ljus + Vibration och pip + Vibration + Pip + Ljudlös + + diff --git a/pump/medtrum/src/main/res/values-sv-rSE/strings.xml b/pump/medtrum/src/main/res/values-sv-rSE/strings.xml index 36c8a820fe..3c4218974d 100644 --- a/pump/medtrum/src/main/res/values-sv-rSE/strings.xml +++ b/pump/medtrum/src/main/res/values-sv-rSE/strings.xml @@ -1,9 +1,119 @@ + Medtrum + MT + Pumpintegration för Medtrum Nano + Inställningar för Medtrum-pump + Pumpfel: %1$s !! + Pumpen är pausad + Pumpen är pausad på grund av att din maximala dos per timme är överskriden + Pumpen är pausad på grund av att din maximala dos per dygn är överskriden + Podden är inte aktiverad + Kunde inte spara användarinställningarna till pumpen! + Bluetooth-status + Senast ansluten + Aktiv bolus + Pumpstatus + Aktiva larm + %.2f U + %.2f V + Basaltyp + Basaldos + %.2f U/h + Pumptyp + FW-version + Patch-nr + Podden löper ut + Uppdatera + Återställ larm + Byt pod + Begärt av användare + Ej aktiverad + Ingen + Låg batterinivå i pumpen + Låg nivå pumpreservoar + Pump löper ut snart + Pausad pga lågt BG + Pausad pga lågt BG 2 + Pausad automatiskt + pausad pga max timdos + pausad pga max dagsdos + Pausad + Pausad + Ocklusion + Utgången + Reservoar tom + Poddfel + Poddfel 2 + Basfel + Batteri urladdat + Ingen kalibrering + Det gick inte att uppdatera pumpens tidszon, bekräfta meddelande och uppdatera manuellt. + Försök igen + Nästa + Kassera + Aktivera Pod + Anslut och fyll + Förfyll + Förfyller + Förfyllning slutförd + Sätt fast pod + Aktiverar... + Aktivering slutförd + Inaktivera pod + Inaktiverar... + Podden inaktiverad + Aktivering pågår + Oväntat tillstånd: %1$s + Ingen profil vald. Välj en profil och försök igen. + Pumpbasens serienummer: %1$X + Ingen aktiv pod. Tryck på Nästa för att påbörja aktiveringsprocessen. + Pumpbas bör inte anslutas till podden förrän nästa steg! + Anslut pumpbasen till en ny pod, ta bort kvarvarande luft och fyll med insulin, tryck sedan på Nästa. + Obs: Minst 70 enheter krävs för aktivering. + Fäst inte podden på kroppen ännu. + Halvtryck på nålknappen. Tryck sedan på Nästa för att börja prima. + Vänta på att förfyllning ska slutföras. + Det gick inte att förfylla, tryck på Försök igen för att försöka igen. + Tryck på Nästa för att fortsätta. + Tryck på Nästa för att starta aktivering. + Ta bort säkerhetslåset. Fäst pumpen på kroppen. Tryck på nålknappen. + Aktiverar pump och ställer in basaldos. Vänligen vänta. + Det gick inte att aktivera, tryck på Försök igen för att försöka igen. + Ny pod aktiverad. %.2f enheter återstår. + Tryck på OK för att återgå till huvudskärmen. + Är du säker på att du vill inaktivera nuvarande pod? + Är du säker på att du vill avbryta aktiveringen? + Är du säker? Denna åtgärd kan inte ångras!! + Tryck på Nästa för att inaktivera eller Avbryt för att återgå till huvudskärmen. + Inaktiverar patch. Vänligen vänta. + Det gick inte att inaktivera, tryck på Kassera för att glömma patchen. + Dra tillbaka nålen. Ta bort podden från kroppen. + Ta bort pumpbasen och kassera den använda podden på lämpligt sätt. + Tryck på OK för att återgå till huvudskärmen. Tryck på Nästa för att starta aktiveringen av ny pod. + Hoppsan! Något gick fel, det verkar som att en aktivering redan pågår. + Tryck på Nästa för att återuppta aktiveringen eller Kassera för att återställa aktiveringsstatus. + Vänligen vänta, läser aktiveringsstatus från pump. + Serienummer + Ange serienumret för pumpbasen. + Ogiltigt serienummer! + Pump otestad: %1$d! Kontakta oss på Discord eller Github för support + Larminställningar + Ställ in dina föredragna larminställningar för pumpen. + Poddens utgångsdatum + När den är aktiverad, kommer podden att löpa ut efter 3 dagar, med en tidsfrist på 8 timmar efter det. + Maximalt insulin per timme + Ange maximalt tillåtna insulin-enheter per timme. Om den överskrids kommer pumpen att pausas. + Maximal daglig insulin-dos + Ange maximalt tillåtna insulin-enheter per dag. Om den överskrids kommer pumpen att pausas. + Hämtar pumpstatus + Hämtar bolus-status + Hämtar status för tillfällig basal + Ställer in användaralternativ diff --git a/pump/medtrum/src/main/res/values-tr-rTR/strings.xml b/pump/medtrum/src/main/res/values-tr-rTR/strings.xml index 07ed0eb9df..dfccf59592 100644 --- a/pump/medtrum/src/main/res/values-tr-rTR/strings.xml +++ b/pump/medtrum/src/main/res/values-tr-rTR/strings.xml @@ -14,6 +14,7 @@ BLE Durumu Son bağlantı + Aktif bolus Pompa durumu Aktif alarmlar %.2f Ü diff --git a/pump/omnipod-dash/src/main/res/values-sv-rSE/strings.xml b/pump/omnipod-dash/src/main/res/values-sv-rSE/strings.xml index b6efe4d208..56ec8c9719 100644 --- a/pump/omnipod-dash/src/main/res/values-sv-rSE/strings.xml +++ b/pump/omnipod-dash/src/main/res/values-sv-rSE/strings.xml @@ -6,6 +6,7 @@ Pod-historik Beskrivning + Mängd Källa Datum Typ: @@ -30,11 +31,26 @@ Kommandot har inte skickats Kommando ej mottaget av poden Okänt tillstånd för kommandot + %1$.2f U/h, %2$d minuter %1$.2fU Insulinleverans är pausad + Totalt levererat: %1$.2f U Tappade anslutningen till pod En annan bolus håller på att levereras Inte tillräckligt med insulin kvar i reservoaren Obekräftat kommando Begärt av användare + Profilen sparad + Avstängd leverans är ej bekräftad! Vänligen uppdatera Podstatus manuellt från Omnipod-fliken och återuppta leverans vid behov. + Insulinleverans är pausad + Podden tidszon skiljer sig från telefonens. Basaldos är felaktig. Gör ett profilbyte för att åtgärda + Det gick inte att spara den nya basalprofilen. Leverans pausad + Det gick inte att spara basalprofilen. Leveransen kan vara avstängd! Uppdatera Pod-status manuellt från Omnipod-fliken och återuppta leveransen vid behov. + Osäker status för bolusleverans. Uppdatera podstatus för att bekräfta eller avvisa. + Oväntad status från tillfällig basal! Om en tillfällig basal var aktiv tidigare, har den avbrutits. Var vänlig kontrollera levererat insulin och pumphistoriken + Kontrollerar leveransstatus + Temp basal-inställningen kan ha misslyckats. Om en temp basal kördes tidigare, kan den ha avbrutits. Uppdatera Pod-status manuellt från Omnipod-fliken. + Osäker om temp basal verkligen blev avbruten + Fick inte bekräftelse på återupptagen leverans. Vänligen uppdatera podstatus + Temp basal-inställningen kan ha misslyckats. Om en temp basal kördes tidigare, kan den ha avbrutits. Uppdatera Pod-status manuellt från Omnipod-fliken. diff --git a/pump/pump-common/src/main/res/values-sv-rSE/strings.xml b/pump/pump-common/src/main/res/values-sv-rSE/strings.xml index 9f7b43a748..3a54548336 100644 --- a/pump/pump-common/src/main/res/values-sv-rSE/strings.xml +++ b/pump/pump-common/src/main/res/values-sv-rSE/strings.xml @@ -5,9 +5,15 @@ Operationen stöds inte av pumpen ännu. OK Serienummer på pumpen + %1$.2fU / %2$.2fU levererat Inte initierad + Initierad + Krypterar kommunikation + Klar + Upptagen Pausad + Kör kommando Basaldoser Konfigurationer @@ -19,8 +25,20 @@ Förfyllningar Larm Glukos + Bas Annat + Alla händelser + Händelser (ingen statistik) + Idag + Senaste timmen + Senaste 3 timmarna + Senaste 6 timmarna + Senaste 12 timmarna + Senaste 2 dagarna + Senaste 4 dagarna + Senaste veckan + Senaste månaden Sök Stopp @@ -33,9 +51,15 @@ Bluetooth avstängt Ingen bluetoothadapter + Konfigurerad pump hittades inte Pumpen kan inte nås + Det gick inte att ansluta till BLE enheten + Kryptering misslyckades + Hittade icke-ansluten pump Basalprofiler är inte aktiverade på pumpen. Aktivera det i pumpens menyer. + Fel basalprofilstyp inställd på pumpen (måste vara %s). + Fel tempbasalstyp inställd på pumpen (måste vara %s). Fel max bolus i pumpen (måste vara %1$.2f). Fel max basal i pumpen (måste vara %1$.2f). @@ -48,4 +72,12 @@ %1$d tim %1$d tim + + %1$d tim sedan + %1$d timmar sedan + + + %1$d dag sedan + %1$d dagar sedan + diff --git a/pump/pump-core/src/main/res/values-sv-rSE/strings.xml b/pump/pump-core/src/main/res/values-sv-rSE/strings.xml index ffa30108b2..acb1355a65 100644 --- a/pump/pump-core/src/main/res/values-sv-rSE/strings.xml +++ b/pump/pump-core/src/main/res/values-sv-rSE/strings.xml @@ -1,6 +1,7 @@ + Aldrig ansluten Sover Väcker Aktiv diff --git a/pump/virtual/src/main/res/values-sv-rSE/strings.xml b/pump/virtual/src/main/res/values-sv-rSE/strings.xml index ccfd5d374a..930172d423 100644 --- a/pump/virtual/src/main/res/values-sv-rSE/strings.xml +++ b/pump/virtual/src/main/res/values-sv-rSE/strings.xml @@ -1,6 +1,11 @@ + Typ av virtuell pump + Pumpdefinition + Bolus: Steg =%1$s\nFörlängd bolus: [Steg=%2$s, Varaktighet =%3$smin -%4$sh] \nBasal: Steg=%5$s\nTempbasal: %6$s (av %7$s), Varaktighet=%8$smin -%9$sh\n%10$s + VPUMP Integration för pumpar som ännu inte stöds av AndroidAPS (Open loop) + VIRTUELL PUMP Inställningar för Virtuell pump diff --git a/ui/src/main/java/info/nightscout/ui/activities/fragments/TreatmentsTempTargetFragment.kt b/ui/src/main/java/info/nightscout/ui/activities/fragments/TreatmentsTempTargetFragment.kt index 65421a72a1..806de9ce8b 100644 --- a/ui/src/main/java/info/nightscout/ui/activities/fragments/TreatmentsTempTargetFragment.kt +++ b/ui/src/main/java/info/nightscout/ui/activities/fragments/TreatmentsTempTargetFragment.kt @@ -105,8 +105,7 @@ class TreatmentsTempTargetFragment : DaggerFragment(), MenuProvider { uel.log(Action.TREATMENTS_NS_REFRESH, Sources.Treatments) disposable += Completable.fromAction { - repository.deleteAllEffectiveProfileSwitches() - repository.deleteAllProfileSwitches() + repository.deleteAllTempTargetEntries() } .subscribeOn(aapsSchedulers.io) .observeOn(aapsSchedulers.main) diff --git a/ui/src/main/res/values-sv-rSE/strings.xml b/ui/src/main/res/values-sv-rSE/strings.xml index dddc696d8e..fe3f36b5c6 100644 --- a/ui/src/main/res/values-sv-rSE/strings.xml +++ b/ui/src/main/res/values-sv-rSE/strings.xml @@ -3,6 +3,7 @@ Bolusspärr aktiverad Kolhydratsspärr aktiverad TT + Dialogrutan stängd Starta \"Träning\" Starta \"Äta snart\" Starta \"Hypo\" @@ -11,9 +12,12 @@ Påminn om bolus senare ställ in påminnelse + Konfigurera opacitet + AAPS-widget Aktivitetsövervakare Vill du återställa aktivitetsstatistiken? + Vill du återställa TDD-statistiken? Statistik Beräkning pågår Ogiltig inmatning (ålder) @@ -23,6 +27,7 @@ Ålder Vikt Den vanligaste profilen: + Observera att endast data som visas på den här skärmen kommer att överföras anonymt. ID tilldelas till den här installationen av AAPS. Du kan ladda upp data igen om din huvudprofil ändras men låt den köra minst en vecka för att göra resultatet synligt i tid inom intervallet. Din hjälp är uppskattad. Glukostyp Annat Mätare @@ -69,8 +74,10 @@ Saknar %1$dg nuvarande BG KH-tid + ange larm för KH-timer Visa beräkning + Inga poster tillgängliga Kalkyl IOB: Insulin: @@ -84,10 +91,25 @@ Korrektion Måltid Förfyllning + Profiländringar + Tillfälliga målvärden + Kolhydrater och bolus + Visa ogiltiga / borttagna poster + Dölj ogiltiga / borttagna poster + Uppdatera från Nightscout Uppdatera från NS + Visa ogiltiga + Dölj ogiltiga + Ta bort \"AAPS startade\" + Dölj loop + Visa loop Angivet av användare Kopiera + Visa loop-poster + Dölj loop-poster + Profil 1 + Profil 2 Profiltyp % av basal Valt: @@ -106,4 +128,29 @@ Stopp nedtryckt + endast på klockan + endast på telefonen + Inställningar för snabbknappar + Knapptext: + Kolhydrater: + Giltig: + Lägg till + Ändra + Visa snabbknappar på: + BG-beräkning + Bolus IOB-beräkning + Basal IOB-beräkning + Trendberäkning + Superbolusberäkning + Procent + Alla + Telefon + Klocka + Endast positiva + Endast negativa + COB-beräkning + Beräkning av temporärt målvärde + Procentuell beräkning + Appens standardinställning + dra och släpp-handtag diff --git a/wear/src/main/res/values-sv-rSE/strings.xml b/wear/src/main/res/values-sv-rSE/strings.xml index 1565b6c7ce..bcebeaa52f 100644 --- a/wear/src/main/res/values-sv-rSE/strings.xml +++ b/wear/src/main/res/values-sv-rSE/strings.xml @@ -7,9 +7,11 @@ AAPS (BigChart) AAPS (NoChart) AAPS (Circle) + AAPS(v2) AAPS (Cockpit) AAPS (Steampunk) AAPS (DigitalStyle) + AAPS (anpassad) AAPS(Åtgärder) AAPS(Temp-mål) AAPS(Snabbsteg) @@ -21,16 +23,20 @@ AAPS-data är %1$s gammal. Kontrollera sensorn, xDrip+, NS, AAPS-inställning eller något annat! Vibrera vid bolus Enheter för åtgärder + U Visa datum Visa IOB + Visa detaljerad IOB Visa COB Visa skillnad + Visa detaljerad delta Visa genomsnittlig skillnad Visa telefonens batterinivå Visa riggens batterinivå Visa basaldos Visa APS-status Visa BG + Visa BGI Visa riktningspil Visa sedan Mörkt @@ -72,6 +78,7 @@ Beh Bolus Kolhydrater + eCarbs Inställningar Status Synkronisera om @@ -88,10 +95,12 @@ Kalkylator begärd Påfyllning begärd Kolhydrater begärda + Profilbyte begärt Mål Låg Hög KH + eCarbs Procent Start [min] Duration [tim] @@ -139,6 +148,7 @@ Visa bara tid och BG Vibrera varje timme Visa veckonummer + Visa sekunder Din stil: ingen stil minimal stil @@ -164,5 +174,32 @@ Ingen konfiguration tillgänglig Wear-kontroller inaktiverade Ingen data tillgänglig + öka + minska + H + L + medel --U + --g + -.--U/h + U: --% + S: -- + -- Min. sedan + --- mg/dl + Ingen loop-status + 000g + 00,0 + 0,00U + AAPS Snooze-varning + Skickar Snooze till AAPS + h + v + d + h + %1$s:%2$s + %1$s:%2$s:%3$s + gammal + gammal! + fel! + Hjärtfrekvens diff --git a/workflow/src/main/java/info/nightscout/workflow/LoadBgDataWorker.kt b/workflow/src/main/java/info/nightscout/workflow/LoadBgDataWorker.kt index 46caec932e..fdf7edc263 100644 --- a/workflow/src/main/java/info/nightscout/workflow/LoadBgDataWorker.kt +++ b/workflow/src/main/java/info/nightscout/workflow/LoadBgDataWorker.kt @@ -43,7 +43,6 @@ class LoadBgDataWorker( bgReadings = repository .compatGetBgReadingsDataFromTime(start, to + T.mins(2).msecs(), false) .blockingGet() - .filter { it.value >= 39 } aapsLogger.debug(LTag.AUTOSENS) { "BG data loaded. Size: ${bgReadings.size} Start date: ${dateUtil.dateAndTimeString(start)} End date: ${dateUtil.dateAndTimeString(to)}" } createBucketedData(aapsLogger, dateUtil) }