Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
41796f0
Add Eversense E3/365 CGM plugin
CAPTCG May 29, 2026
128193e
Add EversenseStatusActivity, fix plugin registration, add credentials…
CAPTCG May 29, 2026
6142219
Register Eversense in core enums, DB models, and plugin list
CAPTCG May 31, 2026
137747e
June26 fixes: E365 credentials/auth/BLE, E3 calibration, status screen
CAPTCG May 31, 2026
6604ad5
fix: address code quality issues — memory leaks, threading, API 33+ c…
CAPTCG Jun 1, 2026
2a145f6
chore: remove patch file from repo
CAPTCG Jun 1, 2026
8ddbd4a
refactor: align with AAPS v4 design — constructor injection, remove s…
CAPTCG Jun 1, 2026
9cc25bc
chore: remove patch files from repo
CAPTCG Jun 1, 2026
8f8a903
fix: resolve SonarQube code smells
CAPTCG Jun 1, 2026
8ce19f5
style: align with AAPS patterns — string resources and coroutines
CAPTCG Jun 1, 2026
152d4c8
chore: remove stray patch file
CAPTCG Jun 1, 2026
650e1a8
merge: incorporate latest dev changes
CAPTCG Jun 1, 2026
ed2fde0
refactor: rename package com.nightscout.eversense to app.aaps.plugins…
Jun 2, 2026
a5eb8e5
refactor: replace custom EversenseLogger with AAPSLogger bridge
Jun 2, 2026
0140172
fix: suppress SonarCloud security hotspot for public OAuth2 credentials
Jun 2, 2026
d6cb344
fix: disable cleartext traffic in Eversense manifest
CAPTCG Jun 2, 2026
cc14381
fix: add core:interfaces dependency for AAPSLogger bridge
CAPTCG Jun 3, 2026
dc0d72c
fix: stabilize placement signal — filter noise when transmitter is no…
Jun 3, 2026
68c7769
fix: placement uses enterPositioningMode for E3/E365, remove clearSto…
CAPTCG Jun 15, 2026
6fa0333
fix: placement uses enterPositioningMode with onResume/onPause lifecycle
CAPTCG Jun 15, 2026
172ce6c
merge: upstream dev with NotificationId conflict resolved (Eversense …
CAPTCG Jun 15, 2026
44bf8a5
fix: SonarQube quick fixes — remove unused methods, clean imports, if…
CAPTCG Jun 16, 2026
aecd0fc
merge: upstream dev — resolve BooleanKey/IntKey conflicts, remove dep…
CAPTCG Jun 16, 2026
f992458
fix: remove deprecated Wizard BooleanKey entries removed by upstream
CAPTCG Jun 16, 2026
e3e7c45
feat: add enterPositioningMode/exitPositioningMode to EversenseCGMPlugin
CAPTCG Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion app/src/main/kotlin/app/aaps/di/PluginsListModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import app.aaps.plugins.smoothing.NoSmoothingPlugin
import app.aaps.plugins.smoothing.UnscentedKalmanFilterPlugin
import app.aaps.plugins.source.AidexPlugin
import app.aaps.plugins.source.DexcomPlugin
import app.aaps.plugins.source.EversensePlugin
import app.aaps.plugins.source.GlimpPlugin
import app.aaps.plugins.source.GlunovoPlugin
import app.aaps.plugins.source.IntelligoPlugin
Expand Down Expand Up @@ -270,6 +271,11 @@ abstract class PluginsListModule {
@IntoMap
@IntKey(440)
abstract fun bindDexcomPlugin(plugin: DexcomPlugin): PluginBase
@Binds
@AllConfigs
@IntoMap
@IntKey(446)
abstract fun bindEversensePlugin(plugin: EversensePlugin): PluginBase

@Binds
@AllConfigs
Expand Down Expand Up @@ -384,4 +390,4 @@ abstract class PluginsListModule {

@Qualifier
annotation class Unfinished
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ enum class SourceSensor(val text: String) {
SIBIONIC("SI App"),
SINO("Sino App"),
EVERSENSE("Eversense"),
EVERSENSE_E3("Eversense E3"),
EVERSENSE_365("Eversense 365"),
AIDEX("GlucoRx Aidex"),
SYAI_TAG("Syai Tag"),
INSTARA("Instara"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ private val ADVANCED_FILTERING_SENSORS = setOf(
SourceSensor.LIBRE_3,
SourceSensor.SYAI_TAG,
SourceSensor.RANDOM,
SourceSensor.EVERSENSE_365,
SourceSensor.EVERSENSE_E3,
)
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@ class SourceSensorExtensionsTest {
}

@Test
fun `eversense does not support advanced filtering`() {
fun `eversense 365 and e3 support advanced filtering`() {
assertThat(SourceSensor.EVERSENSE_365.advancedFilteringSupported()).isTrue()
assertThat(SourceSensor.EVERSENSE_E3.advancedFilteringSupported()).isTrue()
}

@Test
fun `eversense legacy does not support advanced filtering`() {
assertThat(SourceSensor.EVERSENSE.advancedFilteringSupported()).isFalse()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.aaps.core.interfaces.notifications
package app.aaps.core.interfaces.notifications

import app.aaps.core.interfaces.notifications.NotificationCategory.AUTOMATION
import app.aaps.core.interfaces.notifications.NotificationCategory.CGM
Expand Down Expand Up @@ -101,6 +101,12 @@ enum class NotificationId(
AIDEX_SENSOR_STABILIZING(97, NORMAL, CGM),
AIDEX_REPLACE_SENSOR(98, NORMAL, CGM),
AIDEX_SIGNAL_LOST(99, NORMAL, CGM),
// CGM — Eversense
EVERSENSE_ALARM(100, URGENT, CGM, allowMultiple = true),
EVERSENSE_FIRMWARE(101, INFO, CGM),
EVERSENSE_RELEASE(102, INFO, CGM),
EVERSENSE_PLACEMENT(103, URGENT, CGM),
EVERSENSE_CREDENTIALS(104, URGENT, CGM),

// Loop / APS
EASY_MODE_ENABLED(2, URGENT, LOOP),
Expand Down Expand Up @@ -160,3 +166,4 @@ enum class NotificationId(
fun fromLegacyId(id: Int): NotificationId? = legacyIdMap[id]
}
}

4 changes: 4 additions & 0 deletions core/keys/src/main/kotlin/app/aaps/core/keys/BooleanKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,14 @@ enum class BooleanKey(
WearNotifyOnSmb(key = "wear_notifySMB", defaultValue = true, titleResId = R.string.pref_title_wear_notify_on_smb, summaryResId = R.string.pref_summary_wear_notify_on_smb),
WearBroadcastData(key = "wear_broadcast_data", defaultValue = false, titleResId = R.string.pref_title_wear_broadcast_data, summaryResId = R.string.pref_summary_wear_broadcast_data, showInApsMode = false, showInPumpControlMode = false),

EversenseCloudUploadEnabled("eversense_cloud_upload_enabled", true, R.string.eversense_cloud_upload_enabled),
EversenseCloudUploadToast("eversense_notif_cloud_upload_toast", true, R.string.eversense_cloud_upload_toast),
@Deprecated("remove after migration")
WizardCalculationVisible("wizard_calculation_visible", defaultValue = false, titleResId = R.string.pref_title_wizard_calculation_visible),
WizardCorrectionPercent("wizard_correction_percent", defaultValue = false, titleResId = R.string.pref_title_wizard_correction_percent),
SiteRotationManagePump("site_rotation_manage_pump", defaultValue = false, titleResId = R.string.pref_title_site_rotation_manage_pump),
SiteRotationManageCgm("site_rotation_manage_cgm", defaultValue = false, titleResId = R.string.pref_title_site_rotation_manage_cgm),

}


4 changes: 2 additions & 2 deletions core/keys/src/main/kotlin/app/aaps/core/keys/IntKey.kt
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ enum class IntKey(
),
OverviewSageWarning(key = "statuslights_sage_warning", defaultValue = 216, min = 24, max = 720, titleResId = R.string.pref_title_sage_warning, defaultedBySM = true, unitType = UnitType.HOURS),
OverviewSageCritical(key = "statuslights_sage_critical", defaultValue = 240, min = 24, max = 720, titleResId = R.string.pref_title_sage_critical, defaultedBySM = true, unitType = UnitType.HOURS),
OverviewSbatWarning(key = "statuslights_sbat_warning", defaultValue = 25, min = 0, max = 100, titleResId = R.string.pref_title_sbat_warning, defaultedBySM = true, unitType = UnitType.PERCENT),
OverviewSbatCritical(key = "statuslights_sbat_critical", defaultValue = 5, min = 0, max = 100, titleResId = R.string.pref_title_sbat_critical, defaultedBySM = true, unitType = UnitType.PERCENT),
OverviewSbatWarning(key = "statuslights_sbat_warning", defaultValue = 40, min = 0, max = 100, titleResId = R.string.pref_title_sbat_warning, defaultedBySM = true, unitType = UnitType.PERCENT),
OverviewSbatCritical(key = "statuslights_sbat_critical", defaultValue = 20, min = 0, max = 100, titleResId = R.string.pref_title_sbat_critical, defaultedBySM = true, unitType = UnitType.PERCENT),
OverviewBageWarning(key = "statuslights_bage_warning", defaultValue = 216, min = 24, max = 1000, titleResId = R.string.pref_title_bage_warning, defaultedBySM = true, unitType = UnitType.HOURS),
OverviewBageCritical(key = "statuslights_bage_critical", defaultValue = 240, min = 24, max = 1000, titleResId = R.string.pref_title_bage_critical, defaultedBySM = true, unitType = UnitType.HOURS),
OverviewResWarning(key = "statuslights_res_warning", defaultValue = 80, min = 0, max = 300, titleResId = R.string.pref_title_res_warning, defaultedBySM = true, unitType = UnitType.INSULIN_INT),
Expand Down
4 changes: 4 additions & 0 deletions core/keys/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -464,4 +464,8 @@
<!-- Appearance preferences-->
<string name="prefs_range_title">Range for visualization</string>

<string name="eversense_use_smoothing">Use ESEL smoothing</string>
<string name="eversense_cloud_upload_enabled">Enable Eversense cloud upload</string>
<string name="eversense_cloud_upload_toast">Show cloud upload result</string>
</resources>

Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ data class GlucoseValue(
MM_600_SERIES,
MM_SIMPLERA,
EVERSENSE,
EVERSENSE_E3,
EVERSENSE_365,
AIDEX,
RANDOM,
UNKNOWN,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ fun GlucoseValue.SourceSensor.fromDb(): SourceSensor =
GlucoseValue.SourceSensor.MM_600_SERIES -> SourceSensor.MM_600_SERIES
GlucoseValue.SourceSensor.MM_SIMPLERA -> SourceSensor.MM_SIMPLERA
GlucoseValue.SourceSensor.EVERSENSE -> SourceSensor.EVERSENSE
GlucoseValue.SourceSensor.EVERSENSE_E3 -> SourceSensor.EVERSENSE_E3
GlucoseValue.SourceSensor.EVERSENSE_365 -> SourceSensor.EVERSENSE_365
GlucoseValue.SourceSensor.AIDEX -> SourceSensor.AIDEX
GlucoseValue.SourceSensor.RANDOM -> SourceSensor.RANDOM
GlucoseValue.SourceSensor.UNKNOWN -> SourceSensor.UNKNOWN
Expand Down Expand Up @@ -77,6 +79,8 @@ fun SourceSensor.toDb(): GlucoseValue.SourceSensor =
SourceSensor.MM_600_SERIES -> GlucoseValue.SourceSensor.MM_600_SERIES
SourceSensor.MM_SIMPLERA -> GlucoseValue.SourceSensor.MM_SIMPLERA
SourceSensor.EVERSENSE -> GlucoseValue.SourceSensor.EVERSENSE
SourceSensor.EVERSENSE_E3 -> GlucoseValue.SourceSensor.EVERSENSE_E3
SourceSensor.EVERSENSE_365 -> GlucoseValue.SourceSensor.EVERSENSE_365
SourceSensor.AIDEX -> GlucoseValue.SourceSensor.AIDEX
SourceSensor.RANDOM -> GlucoseValue.SourceSensor.RANDOM
SourceSensor.UNKNOWN -> GlucoseValue.SourceSensor.UNKNOWN
Expand Down
1 change: 1 addition & 0 deletions plugins/eversense/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
28 changes: 28 additions & 0 deletions plugins/eversense/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.ksp)

id("kotlinx-serialization")
id("android-module-dependencies")
id("test-module-dependencies")
}

android {
namespace = "com.nightscout.eversense"
}

dependencies {
api(libs.androidx.core)
api(platform(libs.kotlinx.serialization.bom))
api(libs.kotlinx.serialization.json)

api(libs.org.slf4j.api)
api(libs.com.github.tony19.logback.android)

implementation("org.bouncycastle:bcpkix-jdk18on:1.81")
implementation("org.bouncycastle:bcprov-jdk18on:1.81")

testImplementation("com.squareup.okhttp3:mockwebserver:4.12.0")
}


Empty file.
21 changes: 21 additions & 0 deletions plugins/eversense/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
12 changes: 12 additions & 0 deletions plugins/eversense/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

<application>

Check warning

Code scanning / SonarCloud

Android application backup should be disabled or restricted Medium

Make sure backup of application data is safe here. See more on SonarQube Cloud
</application>

</manifest>
Loading