remove nsUpload call for TemporaryTargets

This commit is contained in:
Milos Kozak 2021-03-26 16:23:47 +01:00
parent ff001b0add
commit 4edf51d6ea
38 changed files with 262 additions and 225 deletions

View file

@ -16,6 +16,7 @@ import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
import info.nightscout.androidaps.plugins.configBuilder.PluginStore import info.nightscout.androidaps.plugins.configBuilder.PluginStore
import info.nightscout.androidaps.plugins.general.maintenance.ImportExportPrefs import info.nightscout.androidaps.plugins.general.maintenance.ImportExportPrefs
import info.nightscout.androidaps.plugins.general.nsclient.DataSyncSelectorImplementation
import info.nightscout.androidaps.plugins.general.nsclient.UploadQueue import info.nightscout.androidaps.plugins.general.nsclient.UploadQueue
import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
@ -85,6 +86,8 @@ open class AppModule {
@Binds fun bindIobCobCalculatorInterface(iobCobCalculatorPlugin: IobCobCalculatorPlugin): IobCobCalculatorInterface @Binds fun bindIobCobCalculatorInterface(iobCobCalculatorPlugin: IobCobCalculatorPlugin): IobCobCalculatorInterface
@Binds fun bindSmsCommunicatorInterface(smsCommunicatorPlugin: SmsCommunicatorPlugin): SmsCommunicatorInterface @Binds fun bindSmsCommunicatorInterface(smsCommunicatorPlugin: SmsCommunicatorPlugin): SmsCommunicatorInterface
@Binds fun bindUploadQueueAdminInterfaceToUploadQueue(uploadQueueAdminInterface: UploadQueueAdminInterface) : UploadQueueInterface @Binds fun bindUploadQueueAdminInterfaceToUploadQueue(uploadQueueAdminInterface: UploadQueueAdminInterface) : UploadQueueInterface
@Binds fun bindDataSyncSelector(dataSyncSelectorImplementation: DataSyncSelectorImplementation): DataSyncSelector
} }
} }

View file

@ -14,7 +14,7 @@ abstract class DataClassesModule {
@ContributesAndroidInjector abstract fun glucoseStatusInjector(): GlucoseStatus @ContributesAndroidInjector abstract fun glucoseStatusInjector(): GlucoseStatus
@ContributesAndroidInjector abstract fun DatabaseHelperInjector(): DatabaseHelper @ContributesAndroidInjector abstract fun databaseHelperInjector(): DatabaseHelper
@ContributesAndroidInjector abstract fun treatmentServiceInjector(): TreatmentService @ContributesAndroidInjector abstract fun treatmentServiceInjector(): TreatmentService
@ContributesAndroidInjector abstract fun bolusWizardInjector(): BolusWizard @ContributesAndroidInjector abstract fun bolusWizardInjector(): BolusWizard

View file

@ -25,7 +25,6 @@ import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.queue.Callback
@ -51,7 +50,6 @@ class CarbsDialog : DialogFragmentWithDate() {
@Inject lateinit var treatmentsPlugin: TreatmentsPlugin @Inject lateinit var treatmentsPlugin: TreatmentsPlugin
@Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin @Inject lateinit var iobCobCalculatorPlugin: IobCobCalculatorPlugin
@Inject lateinit var nsUpload: NSUpload
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var carbTimer: CarbTimer @Inject lateinit var carbTimer: CarbTimer
@Inject lateinit var commandQueue: CommandQueue @Inject lateinit var commandQueue: CommandQueue
@ -234,16 +232,10 @@ class CarbsDialog : DialogFragmentWithDate() {
lowTarget = Profile.toMgdl(activityTT, profileFunction.getUnits()), lowTarget = Profile.toMgdl(activityTT, profileFunction.getUnits()),
highTarget = Profile.toMgdl(activityTT, profileFunction.getUnits()) highTarget = Profile.toMgdl(activityTT, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
aapsLogger.debug(LTag.DATABASE, "Inserted tt $it") result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
nsUpload.uploadTempTarget(it)
}
result.updated.forEach {
aapsLogger.debug(LTag.DATABASE, "Updated tt $it")
nsUpload.updateTempTarget(it)
}
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
} }
@ -256,16 +248,10 @@ class CarbsDialog : DialogFragmentWithDate() {
lowTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()), lowTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()),
highTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()) highTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
aapsLogger.debug(LTag.DATABASE, "Inserted tt $it") result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
nsUpload.uploadTempTarget(it)
}
result.updated.forEach {
aapsLogger.debug(LTag.DATABASE, "Updated tt $it")
nsUpload.updateTempTarget(it)
}
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
} }
@ -278,14 +264,8 @@ class CarbsDialog : DialogFragmentWithDate() {
lowTarget = Profile.toMgdl(hypoTT, profileFunction.getUnits()), lowTarget = Profile.toMgdl(hypoTT, profileFunction.getUnits()),
highTarget = Profile.toMgdl(hypoTT, profileFunction.getUnits()) highTarget = Profile.toMgdl(hypoTT, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
aapsLogger.debug(LTag.DATABASE, "Inserted tt $it") result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
nsUpload.uploadTempTarget(it)
}
result.updated.forEach {
aapsLogger.debug(LTag.DATABASE, "Updated tt $it")
nsUpload.updateTempTarget(it)
}
}, { }, {
aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })

View file

@ -227,7 +227,7 @@ class CareDialog : DialogFragmentWithDate() {
disposable += repository.runTransactionForResult(InsertTherapyEventIfNewTransaction(therapyEvent)).subscribe({ result -> disposable += repository.runTransactionForResult(InsertTherapyEventIfNewTransaction(therapyEvent)).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadEvent(it) } result.inserted.forEach { nsUpload.uploadEvent(it) }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
}) })
valuesWithUnit.add(0, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged)) valuesWithUnit.add(0, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged))
valuesWithUnit.add(1, ValueWithUnit(therapyEvent.type.text, Units.TherapyEvent)) valuesWithUnit.add(1, ValueWithUnit(therapyEvent.type.text, Units.TherapyEvent))

View file

@ -150,7 +150,7 @@ class FillDialog : DialogFragmentWithDate() {
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadEvent(it) } result.inserted.forEach { nsUpload.uploadEvent(it) }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
}) })
} }
if (insulinChange) { if (insulinChange) {
@ -164,7 +164,7 @@ class FillDialog : DialogFragmentWithDate() {
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadEvent(it) } result.inserted.forEach { nsUpload.uploadEvent(it) }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
}) })
} }
}, null) }, null)

View file

@ -197,16 +197,10 @@ class InsulinDialog : DialogFragmentWithDate() {
lowTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()), lowTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()),
highTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()) highTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
aapsLogger.debug(LTag.DATABASE, "Inserted tt $it") result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
nsUpload.uploadTempTarget(it)
}
result.updated.forEach {
aapsLogger.debug(LTag.DATABASE, "Updated tt $it")
nsUpload.updateTempTarget(it)
}
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
} }
if (insulinAfterConstraints > 0) { if (insulinAfterConstraints > 0) {
@ -229,7 +223,7 @@ class InsulinDialog : DialogFragmentWithDate() {
nsUpload.uploadBolusRecord(it, detailedBolusInfo.createTherapyEvent(), null) nsUpload.uploadBolusRecord(it, detailedBolusInfo.createTherapyEvent(), null)
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving bolus", it) aapsLogger.error(LTag.DATABASE, "Error while saving bolus", it)
}) })
} else { } else {
commandQueue.bolus(detailedBolusInfo, object : Callback() { commandQueue.bolus(detailedBolusInfo, object : Callback() {

View file

@ -21,7 +21,6 @@ import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.utils.DefaultValueHelper import info.nightscout.androidaps.utils.DefaultValueHelper
import info.nightscout.androidaps.utils.HtmlHelper import info.nightscout.androidaps.utils.HtmlHelper
import info.nightscout.androidaps.utils.alertDialogs.OKDialog import info.nightscout.androidaps.utils.alertDialogs.OKDialog
@ -41,7 +40,6 @@ class TempTargetDialog : DialogFragmentWithDate() {
@Inject lateinit var defaultValueHelper: DefaultValueHelper @Inject lateinit var defaultValueHelper: DefaultValueHelper
@Inject lateinit var uel: UserEntryLogger @Inject lateinit var uel: UserEntryLogger
@Inject lateinit var repository: AppRepository @Inject lateinit var repository: AppRepository
@Inject lateinit var nsUpload: NSUpload
private lateinit var reasonList: List<String> private lateinit var reasonList: List<String>
@ -180,7 +178,7 @@ class TempTargetDialog : DialogFragmentWithDate() {
activity?.let { activity -> activity?.let { activity ->
OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.careportal_temporarytarget), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), { OKDialog.showConfirmation(activity, resourceHelper.gs(R.string.careportal_temporarytarget), HtmlHelper.fromHtml(Joiner.on("<br/>").join(actions)), {
val units = profileFunction.getUnits() val units = profileFunction.getUnits()
when(reason) { when (reason) {
resourceHelper.gs(R.string.eatingsoon) -> uel.log(Action.TT, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged), ValueWithUnit(TemporaryTarget.Reason.EATING_SOON.text, Units.TherapyEvent), ValueWithUnit(target, units), ValueWithUnit(duration, Units.M)) resourceHelper.gs(R.string.eatingsoon) -> uel.log(Action.TT, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged), ValueWithUnit(TemporaryTarget.Reason.EATING_SOON.text, Units.TherapyEvent), ValueWithUnit(target, units), ValueWithUnit(duration, Units.M))
resourceHelper.gs(R.string.activity) -> uel.log(Action.TT, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged), ValueWithUnit(TemporaryTarget.Reason.ACTIVITY.text, Units.TherapyEvent), ValueWithUnit(target, units), ValueWithUnit(duration, Units.M)) resourceHelper.gs(R.string.activity) -> uel.log(Action.TT, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged), ValueWithUnit(TemporaryTarget.Reason.ACTIVITY.text, Units.TherapyEvent), ValueWithUnit(target, units), ValueWithUnit(duration, Units.M))
resourceHelper.gs(R.string.hypo) -> uel.log(Action.TT, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged), ValueWithUnit(TemporaryTarget.Reason.HYPOGLYCEMIA.text, Units.TherapyEvent), ValueWithUnit(target, units), ValueWithUnit(duration, Units.M)) resourceHelper.gs(R.string.hypo) -> uel.log(Action.TT, ValueWithUnit(eventTime, Units.Timestamp, eventTimeChanged), ValueWithUnit(TemporaryTarget.Reason.HYPOGLYCEMIA.text, Units.TherapyEvent), ValueWithUnit(target, units), ValueWithUnit(duration, Units.M))
@ -190,9 +188,9 @@ class TempTargetDialog : DialogFragmentWithDate() {
if (target == 0.0 || duration == 0) { if (target == 0.0 || duration == 0) {
disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(eventTime)) disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(eventTime))
.subscribe({ result -> .subscribe({ result ->
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
} else { } else {
disposable += repository.runTransactionForResult(InsertTemporaryTargetAndCancelCurrentTransaction( disposable += repository.runTransactionForResult(InsertTemporaryTargetAndCancelCurrentTransaction(
@ -207,10 +205,10 @@ class TempTargetDialog : DialogFragmentWithDate() {
lowTarget = Profile.toMgdl(target, profileFunction.getUnits()), lowTarget = Profile.toMgdl(target, profileFunction.getUnits()),
highTarget = Profile.toMgdl(target, profileFunction.getUnits()) highTarget = Profile.toMgdl(target, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadTempTarget(it) } result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
} }

View file

@ -158,7 +158,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
nsUpload.uploadBolusRecord(it, detailedBolusInfo.createTherapyEvent(), null) nsUpload.uploadBolusRecord(it, detailedBolusInfo.createTherapyEvent(), null)
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving bolus", it) aapsLogger.error(LTag.DATABASE, "Error while saving bolus", it)
}) })
disposable += repository.runTransactionForResult(detailedBolusInfo.insertCarbsTransaction()) disposable += repository.runTransactionForResult(detailedBolusInfo.insertCarbsTransaction())
.subscribe({ result -> .subscribe({ result ->
@ -167,7 +167,7 @@ class TreatmentDialog : DialogFragmentWithDate() {
nsUpload.uploadCarbsRecord(it, detailedBolusInfo.createTherapyEvent()) nsUpload.uploadCarbsRecord(it, detailedBolusInfo.createTherapyEvent())
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving carbs", it) aapsLogger.error(LTag.DATABASE, "Error while saving carbs", it)
}) })
} else { } else {
commandQueue.bolus(detailedBolusInfo, object : Callback() { commandQueue.bolus(detailedBolusInfo, object : Callback() {

View file

@ -661,7 +661,7 @@ open class LoopPlugin @Inject constructor(
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadEvent(it) } result.inserted.forEach { nsUpload.uploadEvent(it) }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
}) })
} }

View file

@ -258,7 +258,7 @@ class FoodFragment : DaggerFragment() {
// no create at the moment // no create at the moment
// else uploadQueue.removeID("dbAdd", food.timestamp.toString()) // else uploadQueue.removeID("dbAdd", food.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while invalidating food", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating food", it)
}) })
}, null) }, null)
} }

View file

@ -57,7 +57,7 @@ class FoodPlugin @Inject constructor(
override fun doWork(): Result { override fun doWork(): Result {
val foods = dataWorker.pickupJSONArray(inputData.getLong(DataWorker.STORE_KEY, -1)) val foods = dataWorker.pickupJSONArray(inputData.getLong(DataWorker.STORE_KEY, -1))
?: return Result.failure() ?: return Result.failure()
aapsLogger.debug(LTag.DATAFOOD, "Received Food Data: $foods") aapsLogger.debug(LTag.DATABASE, "Received Food Data: $foods")
var ret = Result.success() var ret = Result.success()
@ -77,12 +77,12 @@ class FoodPlugin @Inject constructor(
repository.runTransactionForResult(SyncFoodTransaction(delFood)) repository.runTransactionForResult(SyncFoodTransaction(delFood))
.doOnError { .doOnError {
aapsLogger.error(LTag.DATAFOOD, "Error while removing food", it) aapsLogger.error(LTag.DATABASE, "Error while removing food", it)
ret = Result.failure() ret = Result.failure()
} }
.blockingGet() .blockingGet()
.also { .also {
it.invalidated.forEach { f -> aapsLogger.debug(LTag.DATAFOOD, "Invalidated food ${f.interfaceIDs.nightscoutId}") } it.invalidated.forEach { f -> aapsLogger.debug(LTag.DATABASE, "Invalidated food ${f.interfaceIDs.nightscoutId}") }
} }
} }
@ -91,17 +91,17 @@ class FoodPlugin @Inject constructor(
if (food != null) { if (food != null) {
repository.runTransactionForResult(SyncFoodTransaction(food)) repository.runTransactionForResult(SyncFoodTransaction(food))
.doOnError { .doOnError {
aapsLogger.error(LTag.DATAFOOD, "Error while adding/updating food", it) aapsLogger.error(LTag.DATABASE, "Error while adding/updating food", it)
ret = Result.failure() ret = Result.failure()
} }
.blockingGet() .blockingGet()
.also { result -> .also { result ->
result.inserted.forEach { aapsLogger.debug(LTag.DATAFOOD, "Inserted food $it") } result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted food $it") }
result.updated.forEach { aapsLogger.debug(LTag.DATAFOOD, "Updated food $it") } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated food $it") }
result.invalidated.forEach { aapsLogger.debug(LTag.DATAFOOD, "Invalidated food $it") } result.invalidated.forEach { aapsLogger.debug(LTag.DATABASE, "Invalidated food $it") }
} }
} else { } else {
aapsLogger.error(LTag.DATAFOOD, "Error parsing food", jsonFood.toString()) aapsLogger.error(LTag.DATABASE, "Error parsing food", jsonFood.toString())
ret = Result.failure() ret = Result.failure()
} }
} }

View file

@ -0,0 +1,73 @@
package info.nightscout.androidaps.plugins.general.nsclient
import androidx.work.ListenableWorker
import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.database.transactions.UpdateTemporaryTargetTransaction
import info.nightscout.androidaps.db.DbRequest
import info.nightscout.androidaps.interfaces.DataSyncSelector
import info.nightscout.androidaps.interfaces.ProfileFunction
import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.extensions.toJson
import info.nightscout.androidaps.utils.sharedPreferences.SP
import javax.inject.Inject
class DataSyncSelectorImplementation @Inject constructor(
private val sp: SP,
private val aapsLogger: AAPSLogger,
private val dateUtil: DateUtil,
private val profileFunction: ProfileFunction,
private val appRepository: AppRepository
) : DataSyncSelector {
/*
val updateTempTargetNsId = Runnable {
interfaceIDs.nightscoutId = nsId
repository.runTransactionForResult(UpdateTemporaryTargetTransaction(this))
.doOnError {
aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
ret = ListenableWorker.Result.failure()
}
.blockingGet()
}
*/
override fun resetToNextFullSync() {
sp.remove(R.string.key_ns_temporary_target_last_sync)
}
override fun confirmTempTargetsTimestamp(lastSynced: Long) {
sp.putLong(R.string.key_ns_temporary_target_last_sync, lastSynced)
}
override fun changedTempTargets(): List<TemporaryTarget> {
val startTime = sp.getLong(R.string.key_ns_temporary_target_last_sync, 0)
return appRepository.getAllChangedTemporaryTargetsFromTime(startTime).blockingGet().also {
aapsLogger.debug(LTag.NSCLIENT, "Loading TT data for sync from ${dateUtil.dateAndTimeAndSecondsString(startTime)}. Records ${it.size}")
}
}
override fun changedTempTargetsCompat(): List<DbRequest> {
val changedTT = changedTempTargets()
val prepared = mutableListOf<DbRequest>()
changedTT.forEach { tt ->
when {
// removed and not uploaded yet = ignore
!tt.isValid && tt.interfaceIDs.nightscoutId == null -> Unit
// removed and already uploaded = send for removal
!tt.isValid && tt.interfaceIDs.nightscoutId != null ->
prepared.add(DbRequest("dbRemove", "treatments", tt.interfaceIDs.nightscoutId, dateUtil._now()))
// existing without nsId = create new
tt.isValid && tt.interfaceIDs.nightscoutId == null ->
prepared.add(DbRequest("dbAdd", "treatments", tt.toJson(profileFunction.getUnits()), tt.timestamp))
// existing with nsId = update
tt.isValid && tt.interfaceIDs.nightscoutId != null ->
prepared.add(DbRequest("dbUpdate", "treatments", tt.interfaceIDs.nightscoutId, tt.toJson(profileFunction.getUnits()), tt.timestamp))
}
}
return prepared
}
}

View file

@ -64,7 +64,7 @@ class NSClientAddUpdateWorker(
val carbs = JsonHelper.safeGetDouble(json, "carbs") val carbs = JsonHelper.safeGetDouble(json, "carbs")
val eventType = JsonHelper.safeGetString(json, "eventType") val eventType = JsonHelper.safeGetString(json, "eventType")
if (eventType == null) { if (eventType == null) {
aapsLogger.debug(LTag.DATASERVICE, "Wrong treatment. Ignoring : $json") aapsLogger.debug(LTag.NSCLIENT, "Wrong treatment. Ignoring : $json")
continue continue
} }

View file

@ -38,6 +38,7 @@ public class NSAddAck extends Event implements Ack {
if (response.has("NSCLIENT_ID")) { if (response.has("NSCLIENT_ID")) {
nsClientID = response.getString("NSCLIENT_ID"); nsClientID = response.getString("NSCLIENT_ID");
} }
aapsLogger.debug(LTag.NSCLIENT, "DBACCESS YYYYY " + this.toString() + " " + response.toString());
} }
rxBus.send(this); rxBus.send(this);
return; return;

View file

@ -36,6 +36,7 @@ import info.nightscout.androidaps.db.DbRequest;
import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventAppExit;
import info.nightscout.androidaps.events.EventConfigBuilderChange; import info.nightscout.androidaps.events.EventConfigBuilderChange;
import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPreferenceChange;
import info.nightscout.androidaps.interfaces.DataSyncSelector;
import info.nightscout.androidaps.interfaces.DatabaseHelperInterface; import info.nightscout.androidaps.interfaces.DatabaseHelperInterface;
import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.UploadQueueInterface; import info.nightscout.androidaps.interfaces.UploadQueueInterface;
@ -78,6 +79,7 @@ import io.reactivex.disposables.CompositeDisposable;
import io.socket.client.IO; import io.socket.client.IO;
import io.socket.client.Socket; import io.socket.client.Socket;
import io.socket.emitter.Emitter; import io.socket.emitter.Emitter;
import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType;
public class NSClientService extends DaggerService { public class NSClientService extends DaggerService {
@Inject HasAndroidInjector injector; @Inject HasAndroidInjector injector;
@ -96,6 +98,7 @@ public class NSClientService extends DaggerService {
@Inject DateUtil dateUtil; @Inject DateUtil dateUtil;
@Inject UploadQueueInterface uploadQueue; @Inject UploadQueueInterface uploadQueue;
@Inject DataWorker dataWorker; @Inject DataWorker dataWorker;
@Inject DataSyncSelector dataSyncSelector;
private final CompositeDisposable disposable = new CompositeDisposable(); private final CompositeDisposable disposable = new CompositeDisposable();
@ -738,6 +741,19 @@ public class NSClientService extends DaggerService {
} }
} }
public void dbAdd(DbRequest dbr, NSAddAck ack, JvmType.Object originalData) {
try {
if (!isConnected || !hasWriteAuth) return;
JSONObject message = new JSONObject();
message.put("collection", dbr.collection);
message.put("data", new JSONObject(dbr.data));
mSocket.emit("dbAdd", message, ack);
rxBus.send(new EventNSClientNewLog("DBADD " + dbr.collection, "Sent " + dbr.nsClientID));
} catch (JSONException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public void sendAlarmAck(AlarmAck alarmAck) { public void sendAlarmAck(AlarmAck alarmAck) {
if (!isConnected || !hasWriteAuth) return; if (!isConnected || !hasWriteAuth) return;
mSocket.emit("ack", alarmAck.level, alarmAck.group, alarmAck.silenceTime); mSocket.emit("ack", alarmAck.level, alarmAck.group, alarmAck.silenceTime);
@ -761,6 +777,12 @@ public class NSClientService extends DaggerService {
rxBus.send(new EventNSClientNewLog("QUEUE", "Resend started: " + reason)); rxBus.send(new EventNSClientNewLog("QUEUE", "Resend started: " + reason));
List<DbRequest> ttData = dataSyncSelector.changedTempTargetsCompat();
for (DbRequest dbr : ttData) {
uploadQueue.add(dbr);
dataSyncSelector.confirmTempTargetsTimestamp(Long.parseLong(dbr.nsClientID));
}
CloseableIterator<DbRequest> iterator; CloseableIterator<DbRequest> iterator;
int maxcount = 30; int maxcount = 30;
try { try {
@ -768,6 +790,21 @@ public class NSClientService extends DaggerService {
try { try {
while (iterator.hasNext() && maxcount > 0) { while (iterator.hasNext() && maxcount > 0) {
DbRequest dbr = iterator.next(); DbRequest dbr = iterator.next();
processDbRequest(dbr);
maxcount--;
}
} finally {
iterator.close();
}
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
rxBus.send(new EventNSClientNewLog("QUEUE", "Resend ended: " + reason));
});
}
private void processDbRequest(DbRequest dbr) {
if (dbr.action.equals("dbAdd")) { if (dbr.action.equals("dbAdd")) {
NSAddAck addAck = new NSAddAck(aapsLogger, rxBus); NSAddAck addAck = new NSAddAck(aapsLogger, rxBus);
dbAdd(dbr, addAck); dbAdd(dbr, addAck);
@ -781,17 +818,6 @@ public class NSClientService extends DaggerService {
NSUpdateAck updateUnsetAck = new NSUpdateAck(dbr.action, dbr._id, aapsLogger, rxBus); NSUpdateAck updateUnsetAck = new NSUpdateAck(dbr.action, dbr._id, aapsLogger, rxBus);
dbUpdateUnset(dbr, updateUnsetAck); dbUpdateUnset(dbr, updateUnsetAck);
} }
maxcount--;
}
} finally {
iterator.close();
}
} catch (SQLException e) {
aapsLogger.error("Unhandled exception", e);
}
rxBus.send(new EventNSClientNewLog("QUEUE", "Resend ended: " + reason));
});
} }
public void restart() { public void restart() {
@ -838,32 +864,6 @@ public class NSClientService extends DaggerService {
} }
} }
public void handleNewTreatment(JSONArray treatments, boolean isDelta) {
List<JSONArray> splitted = splitArray(treatments);
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
bundle.putString("treatments", part.toString());
bundle.putBoolean("delta", isDelta);
Intent intent = new Intent(Intents.ACTION_NEW_TREATMENT);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false)) {
splitted = splitArray(treatments);
for (JSONArray part : splitted) {
Bundle bundle = new Bundle();
bundle.putString("treatments", part.toString());
bundle.putBoolean("delta", isDelta);
Intent intent = new Intent(Intents.ACTION_NEW_TREATMENT);
intent.putExtras(bundle);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
this.getApplicationContext().sendBroadcast(intent);
}
}
}
public List<JSONArray> splitArray(JSONArray array) { public List<JSONArray> splitArray(JSONArray array) {
List<JSONArray> ret = new ArrayList<>(); List<JSONArray> ret = new ArrayList<>();
try { try {

View file

@ -78,7 +78,6 @@ class SmsCommunicatorPlugin @Inject constructor(
private val config: Config, private val config: Config,
private val dateUtil: DateUtil, private val dateUtil: DateUtil,
private val uel: UserEntryLogger, private val uel: UserEntryLogger,
private val nsUpload: NSUpload,
private val glucoseStatusProvider: GlucoseStatusProvider, private val glucoseStatusProvider: GlucoseStatusProvider,
private val repository: AppRepository private val repository: AppRepository
) : PluginBase(PluginDescription() ) : PluginBase(PluginDescription()
@ -826,10 +825,10 @@ class SmsCommunicatorPlugin @Inject constructor(
lowTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()), lowTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()),
highTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits()) highTarget = Profile.toMgdl(eatingSoonTT, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadTempTarget(it) } result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
val tt = if (currentProfile.units == Constants.MMOL) { val tt = if (currentProfile.units == Constants.MMOL) {
DecimalFormatter.to1Decimal(eatingSoonTT) DecimalFormatter.to1Decimal(eatingSoonTT)
@ -960,10 +959,10 @@ class SmsCommunicatorPlugin @Inject constructor(
lowTarget = Profile.toMgdl(tt, profileFunction.getUnits()), lowTarget = Profile.toMgdl(tt, profileFunction.getUnits()),
highTarget = Profile.toMgdl(tt, profileFunction.getUnits()) highTarget = Profile.toMgdl(tt, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadTempTarget(it) } result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
val ttString = if (units == Constants.MMOL) DecimalFormatter.to1Decimal(tt) else DecimalFormatter.to0Decimal(tt) val ttString = if (units == Constants.MMOL) DecimalFormatter.to1Decimal(tt) else DecimalFormatter.to0Decimal(tt)
val replyText = String.format(resourceHelper.gs(R.string.smscommunicator_tt_set), ttString, ttDuration) val replyText = String.format(resourceHelper.gs(R.string.smscommunicator_tt_set), ttString, ttDuration)
@ -980,9 +979,9 @@ class SmsCommunicatorPlugin @Inject constructor(
override fun run() { override fun run() {
disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(dateUtil._now())) disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(dateUtil._now()))
.subscribe({ result -> .subscribe({ result ->
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
val replyText = String.format(resourceHelper.gs(R.string.smscommunicator_tt_canceled)) val replyText = String.format(resourceHelper.gs(R.string.smscommunicator_tt_canceled))
sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, replyText)) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, replyText))

View file

@ -22,6 +22,7 @@ import info.nightscout.androidaps.database.transactions.InsertTemporaryTargetAnd
import info.nightscout.androidaps.db.TDD import info.nightscout.androidaps.db.TDD
import info.nightscout.androidaps.interfaces.* import info.nightscout.androidaps.interfaces.*
import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
@ -573,17 +574,17 @@ class ActionStringHandler @Inject constructor(
lowTarget = Profile.toMgdl(low, profileFunction.getUnits()), lowTarget = Profile.toMgdl(low, profileFunction.getUnits()),
highTarget = Profile.toMgdl(high, profileFunction.getUnits()) highTarget = Profile.toMgdl(high, profileFunction.getUnits())
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadTempTarget(it) } result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error("Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
else else
disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(System.currentTimeMillis())) disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(System.currentTimeMillis()))
.subscribe({ result -> .subscribe({ result ->
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error("Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
} }

View file

@ -141,14 +141,14 @@ class EversensePlugin @Inject constructor(
enteredBy = "AndroidAPS-Eversense" enteredBy = "AndroidAPS-Eversense"
)) ))
.doOnError { .doOnError {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
ret = Result.failure() ret = Result.failure()
} }
.blockingGet() .blockingGet()
.also { result -> .also { result ->
result.inserted.forEach { result.inserted.forEach {
nsUpload.uploadEvent(it) nsUpload.uploadEvent(it)
aapsLogger.debug(LTag.BGSOURCE, "Inserted bg $it") aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
} }
} }
} }

View file

@ -112,11 +112,11 @@ class RandomBgPlugin @Inject constructor(
xDripBroadcast(it) xDripBroadcast(it)
if (sp.getBoolean(R.string.key_dexcomg5_nsupload, false)) if (sp.getBoolean(R.string.key_dexcomg5_nsupload, false))
nsUpload.uploadBg(it, GlucoseValue.SourceSensor.RANDOM.text) nsUpload.uploadBg(it, GlucoseValue.SourceSensor.RANDOM.text)
aapsLogger.debug(LTag.BGSOURCE, "Inserted bg $it") aapsLogger.debug(LTag.DATABASE, "Inserted bg $it")
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving values from Random plugin", it) aapsLogger.error(LTag.DATABASE, "Error while saving values from Random plugin", it)
}) })
aapsLogger.debug(LTag.BGSOURCE, "Generated BG: $bgMgdl ${Date()}") aapsLogger.debug(LTag.DATABASE, "Generated BG: $bgMgdl ${Date()}")
} }
} }

View file

@ -87,7 +87,7 @@ class XdripPlugin @Inject constructor(
) )
repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null)) repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null))
.doOnError { .doOnError {
aapsLogger.error(LTag.BGSOURCE, "Error while saving values from Eversense App", it) aapsLogger.error(LTag.DATABASE, "Error while saving values from Eversense App", it)
ret = Result.failure() ret = Result.failure()
} }
.blockingGet() .blockingGet()

View file

@ -125,7 +125,7 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id)
else uploadQueue.removeByMongoId("dbAdd", bolus.timestamp.toString()) else uploadQueue.removeByMongoId("dbAdd", bolus.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.DATATREATMENTS, "Error while invalidating bolus", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating bolus", it)
}) })
} }
} }
@ -140,7 +140,7 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id)
else uploadQueue.removeByMongoId("dbAdd", carb.timestamp.toString()) else uploadQueue.removeByMongoId("dbAdd", carb.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.DATATREATMENTS, "Error while invalidating carbs", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it)
}) })
} }
} }
@ -155,7 +155,7 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id)
else uploadQueue.removeByMongoId("dbAdd", bolusCalc.timestamp.toString()) else uploadQueue.removeByMongoId("dbAdd", bolusCalc.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.DATATREATMENTS, "Error while invalidating carbs", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it)
}) })
} }
} }
@ -355,7 +355,7 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id)
else uploadQueue.removeByMongoId("dbAdd", bolus.timestamp.toString()) else uploadQueue.removeByMongoId("dbAdd", bolus.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.DATATREATMENTS, "Error while invalidating bolus", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating bolus", it)
}) })
}) })
} }
@ -379,7 +379,7 @@ class TreatmentsBolusCarbsFragment : DaggerFragment() {
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id)
else uploadQueue.removeByMongoId("dbAdd", carb.timestamp.toString()) else uploadQueue.removeByMongoId("dbAdd", carb.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.DATATREATMENTS, "Error while invalidating carbs", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating carbs", it)
}) })
}) })
} }

View file

@ -105,7 +105,7 @@ class TreatmentsCareportalFragment : DaggerFragment() {
uploadQueue.removeByMongoId("dbAdd", event.timestamp.toString()) uploadQueue.removeByMongoId("dbAdd", event.timestamp.toString())
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while invalidating therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating therapy event", it)
}) })
}, null) }, null)
} }
@ -204,7 +204,7 @@ class TreatmentsCareportalFragment : DaggerFragment() {
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id)
else uploadQueue.removeByMongoId("dbAdd", therapyEvent.timestamp.toString()) else uploadQueue.removeByMongoId("dbAdd", therapyEvent.timestamp.toString())
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while invalidating therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while invalidating therapy event", it)
}) })
}, null) }, null)
} }

View file

@ -14,7 +14,9 @@ import info.nightscout.androidaps.R
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.ValueWrapper import info.nightscout.androidaps.database.ValueWrapper
import info.nightscout.androidaps.database.entities.TemporaryTarget import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.database.entities.UserEntry.* import info.nightscout.androidaps.database.entities.UserEntry.Action
import info.nightscout.androidaps.database.entities.UserEntry.Units
import info.nightscout.androidaps.database.entities.UserEntry.ValueWithUnit
import info.nightscout.androidaps.database.interfaces.end import info.nightscout.androidaps.database.interfaces.end
import info.nightscout.androidaps.database.transactions.InvalidateTemporaryTargetTransaction import info.nightscout.androidaps.database.transactions.InvalidateTemporaryTargetTransaction
import info.nightscout.androidaps.databinding.TreatmentsTemptargetFragmentBinding import info.nightscout.androidaps.databinding.TreatmentsTemptargetFragmentBinding
@ -26,7 +28,6 @@ import info.nightscout.androidaps.logging.AAPSLogger
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.logging.UserEntryLogger import info.nightscout.androidaps.logging.UserEntryLogger
import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.bus.RxBusWrapper
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart
import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui import info.nightscout.androidaps.plugins.treatments.events.EventTreatmentUpdateGui
import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsTempTargetFragment.RecyclerViewAdapter.TempTargetsViewHolder import info.nightscout.androidaps.plugins.treatments.fragments.TreatmentsTempTargetFragment.RecyclerViewAdapter.TempTargetsViewHolder
@ -57,7 +58,6 @@ class TreatmentsTempTargetFragment : DaggerFragment() {
@Inject lateinit var aapsLogger: AAPSLogger @Inject lateinit var aapsLogger: AAPSLogger
@Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var profileFunction: ProfileFunction
@Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var nsUpload: NSUpload
@Inject lateinit var uploadQueue: UploadQueueInterface @Inject lateinit var uploadQueue: UploadQueueInterface
@Inject lateinit var fabricPrivacy: FabricPrivacy @Inject lateinit var fabricPrivacy: FabricPrivacy
@Inject lateinit var translator: Translator @Inject lateinit var translator: Translator
@ -198,13 +198,9 @@ class TreatmentsTempTargetFragment : DaggerFragment() {
{ _: DialogInterface?, _: Int -> { _: DialogInterface?, _: Int ->
uel.log(Action.TT_REMOVED, ValueWithUnit(tempTarget.timestamp, Units.Timestamp), ValueWithUnit(tempTarget.reason.text, Units.TherapyEvent), ValueWithUnit(tempTarget.lowTarget, Units.Mg_Dl), ValueWithUnit(tempTarget.highTarget, Units.Mg_Dl, tempTarget.lowTarget != tempTarget.highTarget), ValueWithUnit(tempTarget.duration.toInt(), Units.M)) uel.log(Action.TT_REMOVED, ValueWithUnit(tempTarget.timestamp, Units.Timestamp), ValueWithUnit(tempTarget.reason.text, Units.TherapyEvent), ValueWithUnit(tempTarget.lowTarget, Units.Mg_Dl), ValueWithUnit(tempTarget.highTarget, Units.Mg_Dl, tempTarget.lowTarget != tempTarget.highTarget), ValueWithUnit(tempTarget.duration.toInt(), Units.M))
disposable += repository.runTransactionForResult(InvalidateTemporaryTargetTransaction(tempTarget.id)) disposable += repository.runTransactionForResult(InvalidateTemporaryTargetTransaction(tempTarget.id))
.subscribe({ .subscribe(
val id = tempTarget.interfaceIDs.nightscoutId { aapsLogger.debug(LTag.DATABASE, "Removed temp target $tempTarget") },
if (NSUpload.isIdValid(id)) nsUpload.removeCareportalEntryFromNS(id) { aapsLogger.error(LTag.DATABASE, "Error while invalidating temporary target", it) })
else uploadQueue.removeByMongoId("dbAdd", tempTarget.timestamp.toString())
}, {
aapsLogger.error(LTag.BGSOURCE, "Error while invalidating temporary target", it)
})
}, null) }, null)
} }
} }

View file

@ -212,7 +212,7 @@ open class CommandQueue @Inject constructor(
nsUpload.uploadCarbsRecord(it, detailedBolusInfo.createTherapyEvent()) nsUpload.uploadCarbsRecord(it, detailedBolusInfo.createTherapyEvent())
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving carbs", it) aapsLogger.error(LTag.DATABASE, "Error while saving carbs", it)
}) })
// Do not process carbs anymore // Do not process carbs anymore
detailedBolusInfo.carbs = 0.0 detailedBolusInfo.carbs = 0.0

View file

@ -26,7 +26,7 @@ open class DataReceiver : DaggerBroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent) super.onReceive(context, intent)
val bundle = intent.extras ?: return val bundle = intent.extras ?: return
aapsLogger.debug(LTag.DATASERVICE, "onReceive ${intent.action} ${BundleLogger.log(bundle)}") aapsLogger.debug(LTag.DATABASE, "onReceive ${intent.action} ${BundleLogger.log(bundle)}")
when (intent.action) { when (intent.action) {

View file

@ -431,7 +431,7 @@ class BolusWizard @Inject constructor(
nsUpload.uploadBolusCalc(this) nsUpload.uploadBolusCalc(this)
} }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving meal link", it) aapsLogger.error(LTag.DATABASE, "Error while saving meal link", it)
}) })
} }

View file

@ -33,6 +33,7 @@
<string name="key_protection_settings" translatable="false">protection</string> <string name="key_protection_settings" translatable="false">protection</string>
<string name="key_absorption_category_settings" translatable="false">absorption_category_settings</string> <string name="key_absorption_category_settings" translatable="false">absorption_category_settings</string>
<string name="key_insulin_oref_peak_settings" translatable="false">insulin_oref_peak_settings</string> <string name="key_insulin_oref_peak_settings" translatable="false">insulin_oref_peak_settings</string>
<string name="key_ns_temporary_target_last_sync" translatable="false">ns_temporary_target_last_sync</string>
<string name="treatmentssafety_title">Treatments safety</string> <string name="treatmentssafety_title">Treatments safety</string>
<string name="treatmentssafety_maxbolus_title">Max allowed bolus [U]</string> <string name="treatmentssafety_maxbolus_title">Max allowed bolus [U]</string>
@ -1128,5 +1129,4 @@
<string name="profile_carbs_ratio_value">Profile carbs ratio value</string> <string name="profile_carbs_ratio_value">Profile carbs ratio value</string>
</resources> </resources>

View file

@ -19,7 +19,6 @@ import info.nightscout.androidaps.plugins.general.automation.elements.InputTempT
import info.nightscout.androidaps.plugins.general.automation.elements.LabelWithElement import info.nightscout.androidaps.plugins.general.automation.elements.LabelWithElement
import info.nightscout.androidaps.plugins.general.automation.elements.LayoutBuilder import info.nightscout.androidaps.plugins.general.automation.elements.LayoutBuilder
import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTempTarget import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTempTarget
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.JsonHelper import info.nightscout.androidaps.utils.JsonHelper
@ -37,7 +36,6 @@ class ActionStartTempTarget(injector: HasAndroidInjector) : Action(injector) {
@Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var activePlugin: ActivePluginProvider @Inject lateinit var activePlugin: ActivePluginProvider
@Inject lateinit var repository: AppRepository @Inject lateinit var repository: AppRepository
@Inject lateinit var nsUpload: NSUpload
@Inject lateinit var profileFunction: ProfileFunction @Inject lateinit var profileFunction: ProfileFunction
private val disposable = CompositeDisposable() private val disposable = CompositeDisposable()
@ -56,11 +54,11 @@ class ActionStartTempTarget(injector: HasAndroidInjector) : Action(injector) {
override fun doAction(callback: Callback) { override fun doAction(callback: Callback) {
disposable += repository.runTransactionForResult(InsertTemporaryTargetAndCancelCurrentTransaction(tt())) disposable += repository.runTransactionForResult(InsertTemporaryTargetAndCancelCurrentTransaction(tt()))
.subscribe({ result -> .subscribe({ result ->
result.inserted.forEach { nsUpload.uploadTempTarget(it) } result.inserted.forEach { aapsLogger.debug(LTag.DATABASE, "Inserted temp target $it") }
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
callback.result(PumpEnactResult(injector).success(true).comment(R.string.ok))?.run() callback.result(PumpEnactResult(injector).success(true).comment(R.string.ok))?.run()
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
callback.result(PumpEnactResult(injector).success(false).comment(R.string.error))?.run() callback.result(PumpEnactResult(injector).success(false).comment(R.string.error))?.run()
}) })
} }

View file

@ -5,9 +5,7 @@ import info.nightscout.androidaps.automation.R
import info.nightscout.androidaps.data.PumpEnactResult import info.nightscout.androidaps.data.PumpEnactResult
import info.nightscout.androidaps.database.AppRepository import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.transactions.CancelCurrentTemporaryTargetIfAnyTransaction import info.nightscout.androidaps.database.transactions.CancelCurrentTemporaryTargetIfAnyTransaction
import info.nightscout.androidaps.interfaces.ActivePluginProvider
import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload
import info.nightscout.androidaps.queue.Callback import info.nightscout.androidaps.queue.Callback
import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
@ -18,9 +16,7 @@ import javax.inject.Inject
class ActionStopTempTarget(injector: HasAndroidInjector) : Action(injector) { class ActionStopTempTarget(injector: HasAndroidInjector) : Action(injector) {
@Inject lateinit var resourceHelper: ResourceHelper @Inject lateinit var resourceHelper: ResourceHelper
@Inject lateinit var activePlugin: ActivePluginProvider
@Inject lateinit var repository: AppRepository @Inject lateinit var repository: AppRepository
@Inject lateinit var nsUpload: NSUpload
@Inject lateinit var dateUtil: DateUtil @Inject lateinit var dateUtil: DateUtil
private val disposable = CompositeDisposable() private val disposable = CompositeDisposable()
@ -30,11 +26,11 @@ class ActionStopTempTarget(injector: HasAndroidInjector) : Action(injector) {
override fun icon(): Int = R.drawable.ic_stop_24dp override fun icon(): Int = R.drawable.ic_stop_24dp
override fun doAction(callback: Callback) { override fun doAction(callback: Callback) {
disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(DateUtil.now())) disposable += repository.runTransactionForResult(CancelCurrentTemporaryTargetIfAnyTransaction(dateUtil._now()))
.subscribe({ result -> .subscribe({ result ->
result.updated.forEach { nsUpload.updateTempTarget(it) } result.updated.forEach { aapsLogger.debug(LTag.DATABASE, "Updated temp target $it") }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving temporary target", it) aapsLogger.error(LTag.DATABASE, "Error while saving temporary target", it)
}) })
callback.result(PumpEnactResult(injector).success(true).comment(R.string.ok))?.run() callback.result(PumpEnactResult(injector).success(true).comment(R.string.ok))?.run()
} }

View file

@ -0,0 +1,15 @@
package info.nightscout.androidaps.interfaces
import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.db.DbRequest
interface DataSyncSelector {
fun resetToNextFullSync()
fun confirmTempTargetsTimestamp(lastSynced: Long)
fun changedTempTargets() : List<TemporaryTarget>
// Until NS v3
fun changedTempTargetsCompat() : List<DbRequest>
}

View file

@ -9,8 +9,6 @@ enum class LTag(val tag: String, val defaultValue : Boolean = true, val requires
CONFIGBUILDER("CONFIGBUILDER"), CONFIGBUILDER("CONFIGBUILDER"),
CONSTRAINTS("CONSTRAINTS"), CONSTRAINTS("CONSTRAINTS"),
DATABASE("DATABASE"), DATABASE("DATABASE"),
DATAFOOD("DATAFOOD", defaultValue = false),
DATASERVICE("DATASERVICE"),
DATATREATMENTS("DATATREATMENTS"), DATATREATMENTS("DATATREATMENTS"),
EVENTS("EVENTS", defaultValue = false, requiresRestart = true), EVENTS("EVENTS", defaultValue = false, requiresRestart = true),
GLUCOSE("GLUCOSE", defaultValue = false), GLUCOSE("GLUCOSE", defaultValue = false),

View file

@ -359,46 +359,6 @@ public class NSUpload {
} }
} }
public void uploadTempTarget(TemporaryTarget tempTarget) {
try {
JSONObject data = new JSONObject();
data.put("eventType", TherapyEvent.Type.TEMPORARY_TARGET.getText());
data.put("duration", T.msecs(tempTarget.getDuration()).mins());
data.put(ISVALID, tempTarget.isValid());
if (tempTarget.getLowTarget() > 0) {
data.put("reason", tempTarget.getReason().getText());
data.put("targetBottom", Profile.fromMgdlToUnits(tempTarget.getLowTarget(), profileFunction.getUnits()));
data.put("targetTop", Profile.fromMgdlToUnits(tempTarget.getHighTarget(), profileFunction.getUnits()));
data.put("units", profileFunction.getUnits());
}
data.put("created_at", DateUtil.toISOString(tempTarget.getTimestamp()));
data.put("enteredBy", "AndroidAPS");
uploadCareportalEntryToNS(data, tempTarget.getTimestamp());
} catch (JSONException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public void updateTempTarget(TemporaryTarget tempTarget) {
try {
JSONObject data = new JSONObject();
data.put("eventType", TherapyEvent.Type.TEMPORARY_TARGET.getText());
data.put("duration", T.msecs(tempTarget.getDuration()).mins());
data.put(ISVALID, tempTarget.isValid());
if (tempTarget.getLowTarget() > 0) {
data.put("reason", tempTarget.getReason().getText());
data.put("targetBottom", Profile.fromMgdlToUnits(tempTarget.getLowTarget(), profileFunction.getUnits()));
data.put("targetTop", Profile.fromMgdlToUnits(tempTarget.getHighTarget(), profileFunction.getUnits()));
data.put("units", profileFunction.getUnits());
}
data.put("created_at", DateUtil.toISOString(tempTarget.getTimestamp()));
data.put("enteredBy", "AndroidAPS");
uploadQueue.add(new DbRequest("dbUpdate", "treatments", tempTarget.getInterfaceIDs().getNightscoutId(), data, tempTarget.getTimestamp()));
} catch (JSONException e) {
aapsLogger.error("Unhandled exception", e);
}
}
public void updateProfileSwitch(ProfileSwitch profileSwitch) { public void updateProfileSwitch(ProfileSwitch profileSwitch) {
try { try {
JSONObject data = getJson(profileSwitch); JSONObject data = getJson(profileSwitch);

View file

@ -1,12 +1,20 @@
package info.nightscout.androidaps.utils.extensions package info.nightscout.androidaps.utils.extensions
import androidx.work.ListenableWorker
import com.google.gson.Gson
import info.nightscout.androidaps.Constants import info.nightscout.androidaps.Constants
import info.nightscout.androidaps.core.R import info.nightscout.androidaps.core.R
import info.nightscout.androidaps.data.Profile import info.nightscout.androidaps.data.Profile
import info.nightscout.androidaps.database.AppRepository
import info.nightscout.androidaps.database.entities.TemporaryTarget import info.nightscout.androidaps.database.entities.TemporaryTarget
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload import info.nightscout.androidaps.database.entities.TherapyEvent
import info.nightscout.androidaps.database.transactions.SyncTemporaryTargetTransaction
import info.nightscout.androidaps.database.transactions.UpdateTemporaryTargetTransaction
import info.nightscout.androidaps.logging.LTag
import info.nightscout.androidaps.utils.DateUtil
import info.nightscout.androidaps.utils.DecimalFormatter import info.nightscout.androidaps.utils.DecimalFormatter
import info.nightscout.androidaps.utils.JsonHelper import info.nightscout.androidaps.utils.JsonHelper
import info.nightscout.androidaps.utils.T
import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.resources.ResourceHelper
import org.json.JSONObject import org.json.JSONObject
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -37,7 +45,7 @@ fun temporaryTargetFromNsIdForInvalidating(nsId: String): TemporaryTarget =
.put("duration", -1) .put("duration", -1)
.put("reason", "fake") .put("reason", "fake")
.put("_id", nsId) .put("_id", nsId)
.put(NSUpload.ISVALID, false) .put("isValid", false)
)!! )!!
fun temporaryTargetFromJson(jsonObject: JSONObject): TemporaryTarget? { fun temporaryTargetFromJson(jsonObject: JSONObject): TemporaryTarget? {
@ -53,7 +61,7 @@ fun temporaryTargetFromJson(jsonObject: JSONObject): TemporaryTarget? {
// this string can be localized from NS, it will not work in this case CUSTOM will be used // this string can be localized from NS, it will not work in this case CUSTOM will be used
val reason = TemporaryTarget.Reason.fromString(reasonString) val reason = TemporaryTarget.Reason.fromString(reasonString)
val id = JsonHelper.safeGetStringAllowNull(jsonObject, "_id", null) ?: return null val id = JsonHelper.safeGetStringAllowNull(jsonObject, "_id", null) ?: return null
val isValid = JsonHelper.safeGetBoolean(jsonObject, NSUpload.ISVALID, true) val isValid = JsonHelper.safeGetBoolean(jsonObject, "isValid", true)
if (duration > 0L) { if (duration > 0L) {
// not ending event // not ending event
@ -82,3 +90,17 @@ fun temporaryTargetFromJson(jsonObject: JSONObject): TemporaryTarget? {
tt.interfaceIDs.nightscoutId = id tt.interfaceIDs.nightscoutId = id
return tt return tt
} }
fun TemporaryTarget.toJson(units: String): JSONObject =
JSONObject()
.put("eventType", TherapyEvent.Type.TEMPORARY_TARGET.text)
.put("duration", T.msecs(duration).mins())
.put("isValid", isValid)
.put("created_at", DateUtil.toISOString(timestamp))
.put("enteredBy", "AndroidAPS").also {
if (lowTarget > 0) it
.put("reason", reason.text)
.put("targetBottom", Profile.fromMgdlToUnits(lowTarget, units))
.put("targetTop", Profile.fromMgdlToUnits(highTarget, units))
.put("units", units)
}

View file

@ -191,7 +191,7 @@ open class DanaRS_Packet_APS_History_Events(
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadEvent(it) } result.inserted.forEach { nsUpload.uploadEvent(it) }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
}) })
status = "REFILL " + dateUtil.timeString(datetime) status = "REFILL " + dateUtil.timeString(datetime)
} }
@ -229,7 +229,7 @@ open class DanaRS_Packet_APS_History_Events(
)).subscribe({ result -> )).subscribe({ result ->
result.inserted.forEach { nsUpload.uploadEvent(it) } result.inserted.forEach { nsUpload.uploadEvent(it) }
}, { }, {
aapsLogger.error(LTag.BGSOURCE, "Error while saving therapy event", it) aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", it)
}) })
status = "PRIMECANNULA " + dateUtil.timeString(datetime) status = "PRIMECANNULA " + dateUtil.timeString(datetime)
} }

View file

@ -93,6 +93,10 @@ open class AppRepository @Inject internal constructor(
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
fun getAllChangedTemporaryTargetsFromTime(timestamp: Long): Single<List<TemporaryTarget>> =
database.temporaryTargetDao.getAllChangedFromTime(timestamp)
.subscribeOn(Schedulers.io())
fun getTemporaryTargetDataIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<TemporaryTarget>> = fun getTemporaryTargetDataIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single<List<TemporaryTarget>> =
database.temporaryTargetDao.getTemporaryTargetDataIncludingInvalidFromTime(timestamp) database.temporaryTargetDao.getTemporaryTargetDataIncludingInvalidFromTime(timestamp)
.map { if (!ascending) it.reversed() else it } .map { if (!ascending) it.reversed() else it }

View file

@ -21,9 +21,9 @@ open class DatabaseModule {
internal fun provideAppDatabase(context: Context, @DbFileName fileName: String) = internal fun provideAppDatabase(context: Context, @DbFileName fileName: String) =
Room Room
.databaseBuilder(context, AppDatabase::class.java, fileName) .databaseBuilder(context, AppDatabase::class.java, fileName)
.addMigrations(migration5to6) // .addMigrations(migration5to6)
.addMigrations(migration6to7) // .addMigrations(migration6to7)
.addMigrations(migration7to8) // .addMigrations(migration7to8)
.fallbackToDestructiveMigration() .fallbackToDestructiveMigration()
.build() .build()

View file

@ -17,6 +17,9 @@ internal interface TemporaryTargetDao : TraceableDao<TemporaryTarget> {
@Query("DELETE FROM $TABLE_TEMPORARY_TARGETS") @Query("DELETE FROM $TABLE_TEMPORARY_TARGETS")
override fun deleteAllEntries() override fun deleteAllEntries()
@Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE dateCreated >= :timestamp AND referenceId IS NULL ORDER BY timestamp ASC")
fun getAllChangedFromTime(timestamp: Long): Single<List<TemporaryTarget>>
@Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE nightscoutId = :nsId AND referenceId IS NULL") @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE nightscoutId = :nsId AND referenceId IS NULL")
fun findByNSId(nsId: String): TemporaryTarget? fun findByNSId(nsId: String): TemporaryTarget?

View file

@ -2,11 +2,7 @@ package info.nightscout.androidaps.database.transactions
import info.nightscout.androidaps.database.entities.TemporaryTarget import info.nightscout.androidaps.database.entities.TemporaryTarget
/** class UpdateTemporaryTargetTransaction(val temporaryTarget: TemporaryTarget) : Transaction<Unit>() {
* Updates the TemporaryTarget
*/
class UpdateTemporaryTargetTransaction(private val temporaryTarget: TemporaryTarget) : Transaction<Unit>() {
override fun run() { override fun run() {
database.temporaryTargetDao.updateExistingEntry(temporaryTarget) database.temporaryTargetDao.updateExistingEntry(temporaryTarget)
} }