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