diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt index 4c129c301c..b6285863be 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CalibrationDialog.kt @@ -9,13 +9,11 @@ import dagger.android.HasAndroidInjector import info.nightscout.androidaps.Constants import info.nightscout.androidaps.R import info.nightscout.androidaps.data.Profile -import info.nightscout.androidaps.database.entities.UserEntry import info.nightscout.androidaps.database.entities.UserEntry.* import info.nightscout.androidaps.databinding.DialogCalibrationBinding import info.nightscout.androidaps.interfaces.ProfileFunction import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus -import info.nightscout.androidaps.utils.extensions.fromStringKey import info.nightscout.androidaps.utils.HtmlHelper import info.nightscout.androidaps.utils.XdripCalibrations import info.nightscout.androidaps.utils.alertDialogs.OKDialog @@ -80,7 +78,7 @@ class CalibrationDialog : DialogFragmentWithDate() { if (bg > 0) { activity?.let { activity -> OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.overview_calibration), HtmlHelper.fromHtml(Joiner.on("
").join(actions)), { - uel.log(Action.CALIBRATION, d1 = ValueWithUnit(bg, if (units == Constants.MMOL) Units.Mg_Dl else Units.Mmol_L)) + uel.log(Action.CALIBRATION, ValueWithUnit(bg, if (units == Constants.MMOL) Units.Mmol_L else Units.Mg_Dl)) xdripCalibrations.sendIntent(bg) }) } diff --git a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt index f8a334f7b0..82f39b363a 100644 --- a/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt +++ b/app/src/main/java/info/nightscout/androidaps/dialogs/CarbsDialog.kt @@ -11,7 +11,7 @@ import info.nightscout.androidaps.Constants import info.nightscout.androidaps.MainApp import info.nightscout.androidaps.R import info.nightscout.androidaps.data.Profile -import info.nightscout.androidaps.database.entities.UserEntry +import info.nightscout.androidaps.database.entities.UserEntry.* import info.nightscout.androidaps.databinding.DialogCarbsBinding import info.nightscout.androidaps.db.CareportalEvent import info.nightscout.androidaps.db.Source @@ -213,7 +213,7 @@ class CarbsDialog : DialogFragmentWithDate() { OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.carbs), HtmlHelper.fromHtml(Joiner.on("
").join(actions)), { when { activitySelected -> { - uel.log(UserEntry.Action.TT_ACTIVITY, d1 = activityTT, i1 = activityTTDuration) + uel.log(Action.TT_ACTIVITY, ValueWithUnit(activityTT, if (units == Constants.MMOL) Units.Mmol_L else Units.Mg_Dl) , ValueWithUnit(activityTTDuration, Units.M)) val tempTarget = TempTarget() .date(System.currentTimeMillis()) .duration(activityTTDuration) @@ -225,7 +225,7 @@ class CarbsDialog : DialogFragmentWithDate() { } eatingSoonSelected -> { - uel.log(UserEntry.Action.TT_EATING_SOON, d1 = eatingSoonTT, i1 = eatingSoonTTDuration) + uel.log(Action.TT_EATING_SOON, ValueWithUnit(eatingSoonTT, if (units == Constants.MMOL) Units.Mmol_L else Units.Mg_Dl) , ValueWithUnit(eatingSoonTTDuration, Units.M)) val tempTarget = TempTarget() .date(System.currentTimeMillis()) .duration(eatingSoonTTDuration) @@ -237,7 +237,7 @@ class CarbsDialog : DialogFragmentWithDate() { } hypoSelected -> { - uel.log(UserEntry.Action.TT_HYPO, d1 = hypoTT, i1 = hypoTTDuration) + uel.log(Action.TT_HYPO, ValueWithUnit(hypoTT, if (units == Constants.MMOL) Units.Mmol_L else Units.Mg_Dl) , ValueWithUnit(hypoTTDuration, Units.M)) val tempTarget = TempTarget() .date(System.currentTimeMillis()) .duration(hypoTTDuration) @@ -250,10 +250,10 @@ class CarbsDialog : DialogFragmentWithDate() { } if (carbsAfterConstraints > 0) { if (duration == 0) { - uel.log(UserEntry.Action.CARBS, d1 = carbsAfterConstraints.toDouble(), i1 = timeOffset) + uel.log(Action.CARBS, ValueWithUnit(carbsAfterConstraints.toDouble(), Units.G), ValueWithUnit(timeOffset, Units.M)) carbsGenerator.createCarb(carbsAfterConstraints, time, CareportalEvent.CARBCORRECTION, notes) } else { - uel.log(UserEntry.Action.CARBS, d1 = carbsAfterConstraints.toDouble(), i1 = timeOffset, i2 = duration) + uel.log(Action.CARBS, ValueWithUnit(carbsAfterConstraints.toDouble(), Units.G), ValueWithUnit(timeOffset,Units.M), ValueWithUnit(duration, Units.H)) carbsGenerator.generateCarbs(carbsAfterConstraints, time, duration, notes) nsUpload.uploadEvent(CareportalEvent.NOTE, DateUtil.now() - 2000, resourceHelper.gs(R.string.generated_ecarbs_note, carbsAfterConstraints, duration, timeOffset)) } diff --git a/core/src/main/java/info/nightscout/androidaps/logging/UserEntryLogger.kt b/core/src/main/java/info/nightscout/androidaps/logging/UserEntryLogger.kt index eb2dae411b..beefb07d00 100644 --- a/core/src/main/java/info/nightscout/androidaps/logging/UserEntryLogger.kt +++ b/core/src/main/java/info/nightscout/androidaps/logging/UserEntryLogger.kt @@ -1,7 +1,7 @@ package info.nightscout.androidaps.logging +import info.nightscout.androidaps.Constants import info.nightscout.androidaps.database.AppRepository -import info.nightscout.androidaps.database.entities.UserEntry import info.nightscout.androidaps.database.entities.UserEntry.* import info.nightscout.androidaps.database.transactions.UserEntryTransaction import info.nightscout.androidaps.utils.rx.AapsSchedulers @@ -20,20 +20,62 @@ class UserEntryLogger @Inject constructor( private val compositeDisposable = CompositeDisposable() - fun log(action: UserEntry.Action, s: String = "", d1: ValueWithUnit = ValueWithUnit(0.0,Units.None), d2: ValueWithUnit = ValueWithUnit(0.0,Units.None), i1: ValueWithUnit = ValueWithUnit(0,Units.None), i2: ValueWithUnit = ValueWithUnit(0,Units.None)) { + fun log(action: Action, s: String, vararg listvalues: ValueWithUnit) { + val values = mutableListOf() + for (v in listvalues){ + var vConverted = v + // Convertion to always store all values in the same units in database + when(v.unit) { + Units.Mmol_L -> { vConverted = ValueWithUnit(v.dValue * Constants.MMOLL_TO_MGDL, Units.Mg_Dl)} + } + values.add(vConverted) + } compositeDisposable += repository.runTransaction(UserEntryTransaction( action = action, s = s, - d1 = d1, - d2 = d2, - i1 = i1, - i2 = i2 + values = values )) .subscribeOn(aapsSchedulers.io) .observeOn(aapsSchedulers.io) .subscribeBy( - onError = { aapsLogger.debug("ERRORED USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") }, - onComplete = { aapsLogger.debug("USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") } + //onError = { aapsLogger.debug("ERRORED USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") }, + //onComplete = { aapsLogger.debug("USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") } + ) + } + + fun log(action: Action, vararg listvalues: ValueWithUnit) { + val values = mutableListOf() + for (v in listvalues){ + var vConverted = v + // Convertion to always store all values in the same units in database + when(v.unit) { + Units.Mmol_L -> { vConverted = ValueWithUnit(v.dValue * Constants.MMOLL_TO_MGDL, Units.Mg_Dl)} + } + values.add(vConverted) + } + compositeDisposable += repository.runTransaction(UserEntryTransaction( + action = action, + s = "", + values = values + )) + .subscribeOn(aapsSchedulers.io) + .observeOn(aapsSchedulers.io) + .subscribeBy( + //onError = { aapsLogger.debug("ERRORED USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") }, + //onComplete = { aapsLogger.debug("USER ENTRY: $action $s ${if (d1.dValue != 0.0) d1 else ""} ${if (d2.dValue != 0.0) d2 else ""} ${if (i1.iValue != 0) i1 else ""} ${if (i2.iValue != 0) i2 else ""}") } + ) + } + + fun log(action: Action) { + compositeDisposable += repository.runTransaction(UserEntryTransaction( + action = action, + s = "" + )) + .subscribeOn(aapsSchedulers.io) + .observeOn(aapsSchedulers.io) + .subscribeBy( + onError = { aapsLogger.debug("ERRORED USER ENTRY: $action") }, + onComplete = { aapsLogger.debug("USER ENTRY: $action") } ) } } \ No newline at end of file diff --git a/database/src/main/java/info/nightscout/androidaps/database/Converters.kt b/database/src/main/java/info/nightscout/androidaps/database/Converters.kt index 5cfb99a71c..eb23f19449 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/Converters.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/Converters.kt @@ -20,8 +20,10 @@ class Converters { fun fromValueWithUnit(valueWithUnit: UserEntry.ValueWithUnit?): String? { if (valueWithUnit == null) return null val jsonObject = JSONObject() + jsonObject.put("sValue", valueWithUnit.sValue) jsonObject.put("dValue", valueWithUnit.dValue) jsonObject.put("iValue", valueWithUnit.iValue) + jsonObject.put("lValue", valueWithUnit.lValue) jsonObject.put("unit", valueWithUnit.unit.name) return jsonObject.toString() } @@ -30,7 +32,34 @@ class Converters { fun toValueWithUnit(jsonString: String?): UserEntry.ValueWithUnit? { if (jsonString == null) return null val jsonObject = JSONObject(jsonString) - return UserEntry.ValueWithUnit(jsonObject.getDouble("dValue"), jsonObject.getInt("iValue"),UserEntry.Units.fromString(jsonObject.getString("unit")) ) + return UserEntry.ValueWithUnit(jsonObject.getString("sValue"), jsonObject.getDouble("dValue"), jsonObject.getInt("iValue"), jsonObject.getLong("lValue"), UserEntry.Units.fromString(jsonObject.getString("unit")) ) + } + + @TypeConverter + fun fromMutableListOfValueWithUnit(values: MutableList?): String? { + if (values == null) return null + val jsonArray = JSONArray() + values.forEach { + val jsonObject = JSONObject() + jsonObject.put("dValue", it.dValue) + jsonObject.put("iValue", it.iValue) + jsonObject.put("lValue", it.lValue) + jsonObject.put("unit", it.unit.name) + jsonArray.put(jsonObject) + } + return jsonArray.toString() + } + + @TypeConverter + fun toMutableListOfValueWithUnit(jsonString: String?): List? { + if (jsonString == null) return null + val jsonArray = JSONArray(jsonString) + val list = mutableListOf() + for (i in 0 until jsonArray.length()) { + val jsonObject = jsonArray.getJSONObject(i) + list.add(Block(jsonObject.getLong("duration"), jsonObject.getDouble("amount"))) + } + return list } @TypeConverter diff --git a/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt b/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt index 84c2649b05..dd9dd003f0 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/entities/UserEntry.kt @@ -17,10 +17,7 @@ data class UserEntry( override var utcOffset: Long = TimeZone.getDefault().getOffset(timestamp).toLong(), var action: Action, var s: String, - var d1: ValueWithUnit, - var d2: ValueWithUnit, - var i1: ValueWithUnit, - var i2: ValueWithUnit + var values: MutableList ) : DBEntry, DBEntryWithTime { enum class Action () { @SerializedName("BOLUS") BOLUS, @@ -123,16 +120,16 @@ data class UserEntry( fun fromString(source: String?) = UserEntry.Action.values().firstOrNull { it.name == source } ?: UserEntry.Action.UNKNOWN } } - data class ValueWithUnit (val dValue: Double, val iValue: Int, val unit: Units) { - constructor(value:Int, unit:Units) : this(0.0, value, unit) - constructor(value:Double, unit:Units) : this(value,0, unit) - - + data class ValueWithUnit (val dValue: Double, val iValue: Int, val lValue: Long, val unit: Units) { + constructor(dvalue:Double, unit:Units) : this(dvalue,0, 0, unit) + constructor(ivalue:Int, unit:Units) : this(0.0, ivalue, 0, unit) + constructor(lvalue:Long, unit:Units) : this(0.0,0, lvalue, unit) } enum class Units { @SerializedName("None") None, @SerializedName("Mg_Dl") Mg_Dl, @SerializedName("Mmol_L") Mmol_L, + @SerializedName("Timestamp") Timestamp, @SerializedName("U") U, @SerializedName("U_H") U_H, @SerializedName("G") G, diff --git a/database/src/main/java/info/nightscout/androidaps/database/transactions/UserEntryTransaction.kt b/database/src/main/java/info/nightscout/androidaps/database/transactions/UserEntryTransaction.kt index 0b633d013b..3537f2bd83 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/transactions/UserEntryTransaction.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/transactions/UserEntryTransaction.kt @@ -5,23 +5,16 @@ import info.nightscout.androidaps.database.entities.UserEntry.* class UserEntryTransaction( val action: Action, - val s: String = "", - val d1: ValueWithUnit = ValueWithUnit(0.0, Units.None), - val d2: ValueWithUnit = ValueWithUnit(0.0, Units.None), - val i1: ValueWithUnit = ValueWithUnit(0, Units.None), - val i2: ValueWithUnit = ValueWithUnit(0, Units.None) + val s: String, + val values: MutableList = mutableListOf() ) : Transaction() { override fun run() { - database.userEntryDao.insert(UserEntry( timestamp = System.currentTimeMillis(), action = action, s = s, - d1 = d1, - d2 = d2, - i1 = i1, - i2 = i2 + values = values )) } } \ No newline at end of file