From 9d977817acc4be8d78d6404b4eb71ffc5b4ab046 Mon Sep 17 00:00:00 2001 From: wangyafei Date: Wed, 19 Jun 2024 13:42:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat=EF=BC=9A=20=E4=BB=8E=E6=AC=A7=E6=80=81?= =?UTF-8?q?App=E6=8E=A5=E6=94=B6=E8=A1=80=E7=B3=96=E5=80=BC=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 + .../kotlin/app/aaps/di/PluginsListModule.kt | 7 ++ .../kotlin/app/aaps/receivers/DataReceiver.kt | 7 ++ .../aaps/core/interfaces/receivers/Intents.kt | 3 + .../aaps/database/entities/GlucoseValue.kt | 1 + .../aaps/plugins/source/PathedOTAppPlugin.kt | 95 +++++++++++++++++++ .../aaps/plugins/source/di/SourceModule.kt | 2 + .../src/main/res/values-zh-rCN/strings.xml | 3 + .../source/src/main/res/values/strings.xml | 3 + 9 files changed, 123 insertions(+) create mode 100755 plugins/source/src/main/kotlin/app/aaps/plugins/source/PathedOTAppPlugin.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a7b77fb53b5..b20658fa065 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -97,6 +97,8 @@ + + diff --git a/app/src/main/kotlin/app/aaps/di/PluginsListModule.kt b/app/src/main/kotlin/app/aaps/di/PluginsListModule.kt index d81230094eb..54b17aceae4 100644 --- a/app/src/main/kotlin/app/aaps/di/PluginsListModule.kt +++ b/app/src/main/kotlin/app/aaps/di/PluginsListModule.kt @@ -43,6 +43,7 @@ import app.aaps.plugins.source.GlunovoPlugin import app.aaps.plugins.source.IntelligoPlugin import app.aaps.plugins.source.MM640gPlugin import app.aaps.plugins.source.NSClientSourcePlugin +import app.aaps.plugins.source.PathedOTAppPlugin import app.aaps.plugins.source.PathedSIAppPlugin import app.aaps.plugins.source.PathedSinoAppPlugin import app.aaps.plugins.source.PoctechPlugin @@ -432,6 +433,12 @@ abstract class PluginsListModule { @IntKey(470) abstract fun bindGlunovoPlugin(plugin: GlunovoPlugin): PluginBase + @Binds + @AllConfigs + @IntoMap + @IntKey(666) + abstract fun bindPatchedOTAppPlugin(plugin: PathedOTAppPlugin): PluginBase + @Binds @AllConfigs @IntoMap diff --git a/app/src/main/kotlin/app/aaps/receivers/DataReceiver.kt b/app/src/main/kotlin/app/aaps/receivers/DataReceiver.kt index f2b50acbcb2..ee5fc7c14a8 100644 --- a/app/src/main/kotlin/app/aaps/receivers/DataReceiver.kt +++ b/app/src/main/kotlin/app/aaps/receivers/DataReceiver.kt @@ -18,6 +18,7 @@ import app.aaps.plugins.source.DexcomPlugin import app.aaps.plugins.source.EversensePlugin import app.aaps.plugins.source.GlimpPlugin import app.aaps.plugins.source.MM640gPlugin +import app.aaps.plugins.source.PathedOTAppPlugin import app.aaps.plugins.source.PathedSIAppPlugin import app.aaps.plugins.source.PathedSinoAppPlugin import app.aaps.plugins.source.PoctechPlugin @@ -69,6 +70,12 @@ open class DataReceiver : DaggerBroadcastReceiver() { it.copyString("collection", bundle) it.copyString("data", bundle) }.build()).build() + Intents.OTAPP_BG -> + OneTimeWorkRequest.Builder(PathedOTAppPlugin.PathedOTAppWorker::class.java) + .setInputData(Data.Builder().also { + it.copyString("collection", bundle) + it.copyString("data", bundle) + }.build()).build() Intents.SIAPP_BG -> OneTimeWorkRequest.Builder(PathedSIAppPlugin.PathedSIAppWorker::class.java) .setInputData(Data.Builder().also { diff --git a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/receivers/Intents.kt b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/receivers/Intents.kt index ca3ac37c985..97fe32a5fb7 100644 --- a/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/receivers/Intents.kt +++ b/core/interfaces/src/main/kotlin/app/aaps/core/interfaces/receivers/Intents.kt @@ -48,6 +48,9 @@ interface Intents { var AIDEX_TRANSMITTER_SN = "com.microtechmd.cgms.aidex.TransmitterSerialNumber" var AIDEX_SENSOR_ID = "com.microtechmd.cgms.aidex.SensorId" + // Patched Ottai App -> AAPS + const val OTAPP_BG = "cn.diyaps.sharing.OT_APP" + // Patched SI App -> AAPS const val SIAPP_BG = "cn.diyaps.sharing.SI_APP" diff --git a/database/entities/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt b/database/entities/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt index c37cd18862c..9348196921b 100644 --- a/database/entities/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt +++ b/database/entities/src/main/kotlin/app/aaps/database/entities/GlucoseValue.kt @@ -116,6 +116,7 @@ data class GlucoseValue( MM_600_SERIES("MM600Series"), EVERSENSE("Eversense"), AIDEX("GlucoRx Aidex"), + OTApp("Ottai App"), SIApp("SI App"), SinoApp("SI App"), RANDOM("Random"), diff --git a/plugins/source/src/main/kotlin/app/aaps/plugins/source/PathedOTAppPlugin.kt b/plugins/source/src/main/kotlin/app/aaps/plugins/source/PathedOTAppPlugin.kt new file mode 100755 index 00000000000..93f53919be8 --- /dev/null +++ b/plugins/source/src/main/kotlin/app/aaps/plugins/source/PathedOTAppPlugin.kt @@ -0,0 +1,95 @@ +package app.aaps.plugins.source + +import android.content.Context +import androidx.work.WorkerParameters +import androidx.work.workDataOf +import app.aaps.core.interfaces.logging.AAPSLogger +import app.aaps.core.interfaces.logging.LTag +import app.aaps.core.interfaces.plugin.PluginBase +import app.aaps.core.interfaces.plugin.PluginDescription +import app.aaps.core.interfaces.plugin.PluginType +import app.aaps.core.interfaces.resources.ResourceHelper +import app.aaps.core.interfaces.source.BgSource +import app.aaps.core.interfaces.utils.DateUtil +import app.aaps.core.main.utils.worker.LoggingWorker +import app.aaps.database.entities.GlucoseValue +import app.aaps.database.impl.AppRepository +import app.aaps.database.impl.transactions.CgmSourceTransaction +import app.aaps.database.transactions.TransactionGlucoseValue +import dagger.android.HasAndroidInjector +import kotlinx.coroutines.Dispatchers +import org.json.JSONArray +import org.json.JSONException +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class PathedOTAppPlugin @Inject constructor(injector: HasAndroidInjector, rh: ResourceHelper, aapsLogger: AAPSLogger, ) + : PluginBase(PluginDescription() + .mainType(PluginType.BGSOURCE) + .fragmentClass(BGSourceFragment::class.java.name) + .preferencesId(R.xml.pref_bgsource) + .pluginIcon(app.aaps.core.main.R.drawable.ic_generic_cgm) + .pluginName(R.string.patched_ottai_app) + .description(R.string.description_source_patched_ottai_app), + aapsLogger, rh, injector), BgSource { + + // cannot be inner class because of needed injection + class PathedOTAppWorker(context: Context, params: WorkerParameters) : LoggingWorker(context, params, Dispatchers.IO) { + + @Inject lateinit var mOTAppPlugin: PathedOTAppPlugin + @Inject lateinit var injector: HasAndroidInjector + @Inject lateinit var dateUtil: DateUtil + @Inject lateinit var repository: AppRepository + + init { + (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) + } + + override suspend fun doWorkAndLog(): Result { + var ret = Result.success() + if (!mOTAppPlugin.isEnabled()) return Result.success() + val collection = inputData.getString("collection") ?: return Result.failure(workDataOf("Error" to "missing collection")) + if (collection == "entries") { + val data = inputData.getString("data") + aapsLogger.debug(LTag.BGSOURCE, "Received SI App Data: $data") + if (!data.isNullOrEmpty()) { + try { + val glucoseValues = mutableListOf() + val jsonArray = JSONArray(data) + for (i in 0 until jsonArray.length()) { + val jsonObject = jsonArray.getJSONObject(i) + when (val type = jsonObject.getString("type")) { + "sgv" ->{ + glucoseValues += TransactionGlucoseValue( + timestamp = jsonObject.getLong("date"), + value = jsonObject.getDouble("sgv"), + raw = jsonObject.getDouble("sgv"), + noise = null, + trendArrow = GlucoseValue.TrendArrow.fromString(jsonObject.getString("direction")), + sourceSensor = GlucoseValue.SourceSensor.OTApp) + } + else -> aapsLogger.debug(LTag.BGSOURCE, "Unknown entries type: $type") + } + } + repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null)) + .doOnError { + aapsLogger.error(LTag.DATABASE, "Error while saving values from Ottai App", it) + ret = Result.failure(workDataOf("Error" to it.toString())) + } + .blockingGet() + .also { savedValues -> + savedValues.all().forEach { + aapsLogger.debug(LTag.DATABASE, "Inserted bg $it") + } + } + } catch (e: JSONException) { + aapsLogger.error("Exception: ", e) + ret = Result.failure(workDataOf("Error" to e.toString())) + } + } + } + return ret + } + } +} \ No newline at end of file diff --git a/plugins/source/src/main/kotlin/app/aaps/plugins/source/di/SourceModule.kt b/plugins/source/src/main/kotlin/app/aaps/plugins/source/di/SourceModule.kt index de7a9433b1c..35b13cf797b 100644 --- a/plugins/source/src/main/kotlin/app/aaps/plugins/source/di/SourceModule.kt +++ b/plugins/source/src/main/kotlin/app/aaps/plugins/source/di/SourceModule.kt @@ -10,6 +10,7 @@ import app.aaps.plugins.source.EversensePlugin import app.aaps.plugins.source.GlimpPlugin import app.aaps.plugins.source.MM640gPlugin import app.aaps.plugins.source.NSClientSourcePlugin +import app.aaps.plugins.source.PathedOTAppPlugin import app.aaps.plugins.source.PathedSIAppPlugin import app.aaps.plugins.source.PathedSinoAppPlugin import app.aaps.plugins.source.PoctechPlugin @@ -34,6 +35,7 @@ abstract class SourceModule { @ContributesAndroidInjector abstract fun contributesXdripWorker(): XdripSourcePlugin.XdripSourceWorker @ContributesAndroidInjector abstract fun contributesDexcomWorker(): DexcomPlugin.DexcomWorker @ContributesAndroidInjector abstract fun contributesMM640gWorker(): MM640gPlugin.MM640gWorker + @ContributesAndroidInjector abstract fun contributesOTAppWorker(): PathedOTAppPlugin.PathedOTAppWorker @ContributesAndroidInjector abstract fun contributesSIAppWorker(): PathedSIAppPlugin.PathedSIAppWorker @ContributesAndroidInjector abstract fun contributesSinoAppWorker(): PathedSinoAppPlugin.PathedSinoAppWorker @ContributesAndroidInjector abstract fun contributesGlimpWorker(): GlimpPlugin.GlimpWorker diff --git a/plugins/source/src/main/res/values-zh-rCN/strings.xml b/plugins/source/src/main/res/values-zh-rCN/strings.xml index 209f02a1111..72a0e9ffa80 100644 --- a/plugins/source/src/main/res/values-zh-rCN/strings.xml +++ b/plugins/source/src/main/res/values-zh-rCN/strings.xml @@ -20,6 +20,9 @@ Aidex动泰 从GlucoRx Aidex动泰持续葡萄糖监测系统接收血糖值。 血糖上传设置 + + 欧态补丁版 + 从欧态App接收血糖值。 X基补丁版 从X基补丁版App接收血糖值。 diff --git a/plugins/source/src/main/res/values/strings.xml b/plugins/source/src/main/res/values/strings.xml index 45c6708bbb6..b11310dad59 100644 --- a/plugins/source/src/main/res/values/strings.xml +++ b/plugins/source/src/main/res/values/strings.xml @@ -43,6 +43,9 @@ Create event \"Sensor Change\" in NS automatically on sensor start direction + + Patched Ottai App + Receive BG values from Ottai App. Patched SI App Patched Sino App From a5ce12685c0e98141ba55d7a44efec28150f2d1d Mon Sep 17 00:00:00 2001 From: wangyafei Date: Wed, 19 Jun 2024 17:48:58 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat=EF=BC=9A=20=E6=B7=BB=E5=8A=A0=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E4=B8=8Eicon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/src/main/res/mipmap-xhdpi/ottai_icon.png | Bin 0 -> 17221 bytes .../aaps/plugins/source/PathedOTAppPlugin.kt | 2 +- .../src/main/res/values-zh-rCN/strings.xml | 4 ++-- plugins/source/src/main/res/values/strings.xml | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 core/ui/src/main/res/mipmap-xhdpi/ottai_icon.png diff --git a/core/ui/src/main/res/mipmap-xhdpi/ottai_icon.png b/core/ui/src/main/res/mipmap-xhdpi/ottai_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..08ba082fe5db538c60006a6707b6c4eb17f6fd43 GIT binary patch literal 17221 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从GlucoRx Aidex动泰持续葡萄糖监测系统接收血糖值。 血糖上传设置 - 欧态补丁版 - 从欧态App接收血糖值。 + 欧态-小欧生态 + 从欧态易测APP接收血糖值。 X基补丁版 从X基补丁版App接收血糖值。 diff --git a/plugins/source/src/main/res/values/strings.xml b/plugins/source/src/main/res/values/strings.xml index b11310dad59..db885a76767 100644 --- a/plugins/source/src/main/res/values/strings.xml +++ b/plugins/source/src/main/res/values/strings.xml @@ -43,9 +43,9 @@ Create event \"Sensor Change\" in NS automatically on sensor start direction - - Patched Ottai App - Receive BG values from Ottai App. + + 欧态-小欧生态 + 从欧态易测APP接收血糖值。 Patched SI App Patched Sino App