From 6aa9a0fe12b88c7ef94bb52eeb16d093b2dd8193 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Fri, 26 Mar 2021 21:16:27 +0100 Subject: [PATCH] bypass Queue for TemporaryTargets --- .../DataSyncSelectorImplementation.kt | 29 +++-- .../general/nsclient/NSClientPlugin.java | 50 +------ .../general/nsclient/acks/NSAddAck.java | 63 --------- .../plugins/general/nsclient/acks/NSAddAck.kt | 54 ++++++++ .../general/nsclient/acks/NSUpdateAck.java | 46 ------- .../general/nsclient/acks/NSUpdateAck.kt | 37 ++++++ .../nsclient/services/NSClientService.java | 122 +++++++++++------- .../androidaps/interfaces/DataSyncSelector.kt | 3 +- .../androidaps/database/AppRepository.kt | 4 +- .../database/daos/TemporaryTargetDao.kt | 4 +- .../UpdateNsIdTemporaryTargetTransaction.kt | 12 ++ 11 files changed, 209 insertions(+), 215 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.kt delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.kt create mode 100644 database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdTemporaryTargetTransaction.kt diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt index 139dc30f10..971799653c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/DataSyncSelectorImplementation.kt @@ -20,6 +20,7 @@ class DataSyncSelectorImplementation @Inject constructor( private val aapsLogger: AAPSLogger, private val dateUtil: DateUtil, private val profileFunction: ProfileFunction, + private val nsClientPlugin: NSClientPlugin, private val appRepository: AppRepository ) : DataSyncSelector { @@ -40,34 +41,42 @@ class DataSyncSelectorImplementation @Inject constructor( } override fun confirmTempTargetsTimestamp(lastSynced: Long) { + aapsLogger.debug(LTag.NSCLIENT, "Setting TT data sync from $lastSynced") sp.putLong(R.string.key_ns_temporary_target_last_sync, lastSynced) } + override fun confirmTempTargetsTimestampIfGreater(lastSynced: Long) { + aapsLogger.debug(LTag.NSCLIENT, "Setting TT data sync from $lastSynced") + if (lastSynced > sp.getLong(R.string.key_ns_temporary_target_last_sync, 0)) { + aapsLogger.debug(LTag.NSCLIENT, ">>> Setting TT data sync from $lastSynced") + sp.putLong(R.string.key_ns_temporary_target_last_sync, lastSynced) + } + } + override fun changedTempTargets(): List { 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}") + return appRepository.getAllChangedTemporaryTargetsFromTime(startTime, 1).blockingGet().also { + aapsLogger.debug(LTag.NSCLIENT, "Loading TT data for sync from $startTime ${dateUtil.dateAndTimeAndSecondsString(startTime)}. Records ${it.size}") } } - override fun changedTempTargetsCompat(): List { + override fun processChangedTempTargetsCompat(): Boolean { val changedTT = changedTempTargets() - val prepared = mutableListOf() changedTT.forEach { tt -> when { // removed and not uploaded yet = ignore - !tt.isValid && tt.interfaceIDs.nightscoutId == null -> Unit + !tt.isValid && tt.interfaceIDs.nightscoutId == null -> Any() // removed and already uploaded = send for removal !tt.isValid && tt.interfaceIDs.nightscoutId != null -> - prepared.add(DbRequest("dbRemove", "treatments", tt.interfaceIDs.nightscoutId, dateUtil._now())) + nsClientPlugin.nsClientService?.dbRemove("treatments", tt.interfaceIDs.nightscoutId, tt) // existing without nsId = create new tt.isValid && tt.interfaceIDs.nightscoutId == null -> - prepared.add(DbRequest("dbAdd", "treatments", tt.toJson(profileFunction.getUnits()), tt.timestamp)) + nsClientPlugin.nsClientService?.dbAdd("treatments", tt.toJson(profileFunction.getUnits()), tt) // existing with nsId = update - tt.isValid && tt.interfaceIDs.nightscoutId != null -> - prepared.add(DbRequest("dbUpdate", "treatments", tt.interfaceIDs.nightscoutId, tt.toJson(profileFunction.getUnits()), tt.timestamp)) + tt.isValid && tt.interfaceIDs.nightscoutId != null -> + nsClientPlugin.nsClientService?.dbUpdate("treatments", tt.interfaceIDs.nightscoutId, tt.toJson(profileFunction.getUnits()), tt) } } - return prepared + return changedTT.isNotEmpty() } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java index 48257ee342..457ea115ab 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientPlugin.java @@ -4,20 +4,16 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.text.Spanned; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.SwitchPreference; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - import java.util.ArrayList; import java.util.List; @@ -28,27 +24,15 @@ import dagger.android.HasAndroidInjector; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.database.AppRepository; -import info.nightscout.androidaps.database.entities.TemporaryTarget; -import info.nightscout.androidaps.database.entities.TherapyEvent; -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.transactions.SyncTemporaryTargetTransaction; -import info.nightscout.androidaps.database.transactions.SyncTherapyEventTransaction; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventChargingState; import info.nightscout.androidaps.events.EventNetworkChange; -import info.nightscout.androidaps.events.EventNsTreatment; import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.interfaces.ActivePluginProvider; -import info.nightscout.androidaps.interfaces.DatabaseHelperInterface; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.logging.AAPSLogger; import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.logging.UserEntryLogger; import info.nightscout.androidaps.plugins.bus.RxBusWrapper; import info.nightscout.androidaps.plugins.general.nsclient.data.AlarmAck; import info.nightscout.androidaps.plugins.general.nsclient.data.NSAlarm; @@ -57,12 +41,8 @@ import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientR import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientStatus; import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientUpdateGUI; import info.nightscout.androidaps.plugins.general.nsclient.services.NSClientService; -import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification; -import info.nightscout.androidaps.plugins.general.overview.notifications.Notification; -import info.nightscout.androidaps.services.Intents; import info.nightscout.androidaps.utils.FabricPrivacy; import info.nightscout.androidaps.utils.HtmlHelper; -import info.nightscout.androidaps.utils.JsonHelper; import info.nightscout.androidaps.utils.ToastUtils; import info.nightscout.androidaps.utils.buildHelper.BuildHelper; import info.nightscout.androidaps.utils.resources.ResourceHelper; @@ -70,11 +50,6 @@ import info.nightscout.androidaps.utils.rx.AapsSchedulers; import info.nightscout.androidaps.utils.sharedPreferences.SP; import io.reactivex.disposables.CompositeDisposable; -import static info.nightscout.androidaps.utils.extensions.TemporaryTargetExtensionKt.temporaryTargetFromJson; -import static info.nightscout.androidaps.utils.extensions.TemporaryTargetExtensionKt.temporaryTargetFromNsIdForInvalidating; -import static info.nightscout.androidaps.utils.extensions.TherapyEventExtensionKt.therapyEventFromJson; -import static info.nightscout.androidaps.utils.extensions.TherapyEventExtensionKt.therapyEventFromNsIdForInvalidating; - @Singleton public class NSClientPlugin extends PluginBase { private final CompositeDisposable disposable = new CompositeDisposable(); @@ -86,13 +61,9 @@ public class NSClientPlugin extends PluginBase { private final AapsSchedulers aapsSchedulers; private final FabricPrivacy fabricPrivacy; private final SP sp; + private final NsClientReceiverDelegate nsClientReceiverDelegate; private final Config config; private final BuildHelper buildHelper; - private final ActivePluginProvider activePlugin; - private final NSUpload nsUpload; - private final AppRepository repository; - private final DatabaseHelperInterface databaseHelper; - private final UserEntryLogger uel; public Handler handler; @@ -104,9 +75,8 @@ public class NSClientPlugin extends PluginBase { public String status = ""; - public NSClientService nsClientService = null; + public @Nullable NSClientService nsClientService = null; - private final NsClientReceiverDelegate nsClientReceiverDelegate; @Inject public NSClientPlugin( @@ -120,12 +90,7 @@ public class NSClientPlugin extends PluginBase { SP sp, NsClientReceiverDelegate nsClientReceiverDelegate, Config config, - BuildHelper buildHelper, - ActivePluginProvider activePlugin, - NSUpload nsUpload, - DatabaseHelperInterface databaseHelper, - AppRepository repository, - UserEntryLogger uel + BuildHelper buildHelper ) { super(new PluginDescription() .mainType(PluginType.GENERAL) @@ -148,11 +113,6 @@ public class NSClientPlugin extends PluginBase { this.nsClientReceiverDelegate = nsClientReceiverDelegate; this.config = config; this.buildHelper = buildHelper; - this.activePlugin = activePlugin; - this.nsUpload = nsUpload; - this.databaseHelper = databaseHelper; - this.repository = repository; - this.uel = uel; if (config.getNSCLIENT()) { getPluginDescription().alwaysEnabled(true).visibleByDefault(true); @@ -354,7 +314,7 @@ public class NSClientPlugin extends PluginBase { } public void updateLatestDateReceivedIfNewer(long latestReceived) { - if (latestReceived > nsClientService.latestDateInReceivedData) + if (nsClientService != null && latestReceived > nsClientService.latestDateInReceivedData) nsClientService.latestDateInReceivedData = latestReceived; } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.java deleted file mode 100644 index 2faa7ce261..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.java +++ /dev/null @@ -1,63 +0,0 @@ -package info.nightscout.androidaps.plugins.general.nsclient.acks; - -import org.json.JSONArray; -import org.json.JSONObject; - -import info.nightscout.androidaps.events.Event; -import info.nightscout.androidaps.logging.AAPSLogger; -import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart; -import io.socket.client.Ack; - -/** - * Created by mike on 29.12.2015. - */ -public class NSAddAck extends Event implements Ack { - private final AAPSLogger aapsLogger; - private final RxBusWrapper rxBus; - - public String _id = null; - public String nsClientID = null; - public JSONObject json = null; - - public NSAddAck(AAPSLogger aapsLogger, RxBusWrapper rxBus) { - this.aapsLogger = aapsLogger; - this.rxBus = rxBus; - } - - public void call(Object... args) { - // Regular response - try { - JSONArray responsearray = (JSONArray) (args[0]); - JSONObject response; - if (responsearray.length() > 0) { - response = responsearray.getJSONObject(0); - _id = response.getString("_id"); - json = response; - if (response.has("NSCLIENT_ID")) { - nsClientID = response.getString("NSCLIENT_ID"); - } - aapsLogger.debug(LTag.NSCLIENT, "DBACCESS YYYYY " + this.toString() + " " + response.toString()); - } - rxBus.send(this); - return; - } catch (Exception e) { - aapsLogger.error("Unhandled exception", e); - } - // Check for not authorized - try { - JSONObject response = (JSONObject) (args[0]); - if (response.has("result")) { - _id = null; - if (response.getString("result").contains("Not")) { - rxBus.send(new EventNSClientRestart()); - return; - } - aapsLogger.debug(LTag.NSCLIENT, "DBACCESS " + response.getString("result")); - } - } catch (Exception e) { - aapsLogger.error("Unhandled exception", e); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.kt new file mode 100644 index 0000000000..930defad05 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSAddAck.kt @@ -0,0 +1,54 @@ +package info.nightscout.androidaps.plugins.general.nsclient.acks + +import info.nightscout.androidaps.events.Event +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart +import io.socket.client.Ack +import org.json.JSONArray +import org.json.JSONObject + +class NSAddAck( + private val aapsLogger: AAPSLogger, + private val rxBus: RxBusWrapper, + val originalObject: Any? = null +) : Event(), Ack { + + var id: String? = null + @JvmField var nsClientID: String? = null + @JvmField var json: JSONObject? = null + override fun call(vararg args: Any) { + // Regular response + try { + val responseArray = args[0] as JSONArray + val response: JSONObject + if (responseArray.length() > 0) { + response = responseArray.getJSONObject(0) + id = response.getString("_id") + json = response + if (response.has("NSCLIENT_ID")) { + nsClientID = response.getString("NSCLIENT_ID") + } + } + rxBus.send(this) + return + } catch (e: Exception) { + aapsLogger.error("Unhandled exception", e) + } + // Check for not authorized + try { + val response = args[0] as JSONObject + if (response.has("result")) { + id = null + if (response.getString("result").contains("Not")) { + rxBus.send(EventNSClientRestart()) + return + } + aapsLogger.debug(LTag.NSCLIENT, "DBACCESS " + response.getString("result")) + } + } catch (e: Exception) { + aapsLogger.error("Unhandled exception", e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.java deleted file mode 100644 index 95a00279cf..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.java +++ /dev/null @@ -1,46 +0,0 @@ -package info.nightscout.androidaps.plugins.general.nsclient.acks; - -import org.json.JSONException; -import org.json.JSONObject; - -import info.nightscout.androidaps.events.Event; -import info.nightscout.androidaps.logging.AAPSLogger; -import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.bus.RxBusWrapper; -import io.socket.client.Ack; - -/** - * Created by mike on 21.02.2016. - */ -public class NSUpdateAck extends Event implements Ack { - private final AAPSLogger aapsLogger; - private final RxBusWrapper rxBus; - - public boolean result = false; - public String _id; - public String action; - - public void call(Object... args) { - JSONObject response = (JSONObject) args[0]; - if (response.has("result")) - try { - if (response.getString("result").equals("success")) - result = true; - else if (response.getString("result").equals("Missing _id")) { - result = true; - aapsLogger.debug(LTag.NSCLIENT, "Internal error: Missing _id returned on dbUpdate ack"); - } - rxBus.send(this); - } catch (JSONException e) { - aapsLogger.error("Unhandled exception", e); - } - } - - public NSUpdateAck(String action, String _id, AAPSLogger aapsLogger, RxBusWrapper rxBus) { - super(); - this.action = action; - this._id = _id; - this.aapsLogger = aapsLogger; - this.rxBus = rxBus; - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.kt new file mode 100644 index 0000000000..5d91178f82 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/acks/NSUpdateAck.kt @@ -0,0 +1,37 @@ +package info.nightscout.androidaps.plugins.general.nsclient.acks + +import info.nightscout.androidaps.events.Event +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import io.socket.client.Ack +import org.json.JSONException +import org.json.JSONObject + +/** + * Created by mike on 21.02.2016. + */ +class NSUpdateAck( + val action : String, + var _id: String, + private val aapsLogger: AAPSLogger, + private val rxBus: RxBusWrapper, + val originalObject: Any? = null +) : Event(), Ack { + + var result = false + override fun call(vararg args: Any) { + val response = args[0] as JSONObject + if (response.has("result")) try { + if (response.getString("result") == "success") { + result = true + } else if (response.getString("result") == "Missing _id") { + result = true + aapsLogger.debug(LTag.NSCLIENT, "Internal error: Missing _id returned on dbUpdate ack") + } + rxBus.send(this) + } catch (e: JSONException) { + aapsLogger.error("Unhandled exception", e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/services/NSClientService.java index a680e58360..de9d721c61 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/services/NSClientService.java @@ -10,7 +10,6 @@ import android.os.IBinder; import android.os.PowerManager; import android.os.SystemClock; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.work.OneTimeWorkRequest; import com.google.common.base.Charsets; @@ -32,6 +31,9 @@ import dagger.android.DaggerService; import dagger.android.HasAndroidInjector; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.R; +import info.nightscout.androidaps.database.AppRepository; +import info.nightscout.androidaps.database.entities.TemporaryTarget; +import info.nightscout.androidaps.database.transactions.UpdateNsIdTemporaryTargetTransaction; import info.nightscout.androidaps.db.DbRequest; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventConfigBuilderChange; @@ -79,7 +81,6 @@ import io.reactivex.disposables.CompositeDisposable; import io.socket.client.IO; import io.socket.client.Socket; import io.socket.emitter.Emitter; -import kotlin.reflect.jvm.internal.impl.load.kotlin.JvmType; public class NSClientService extends DaggerService { @Inject HasAndroidInjector injector; @@ -99,6 +100,7 @@ public class NSClientService extends DaggerService { @Inject UploadQueueInterface uploadQueue; @Inject DataWorker dataWorker; @Inject DataSyncSelector dataSyncSelector; + @Inject AppRepository repository; private final CompositeDisposable disposable = new CompositeDisposable(); @@ -216,6 +218,22 @@ public class NSClientService extends DaggerService { } public void processAddAck(NSAddAck ack) { + // new room way + if (ack.getOriginalObject() instanceof TemporaryTarget) { + ((TemporaryTarget) ack.getOriginalObject()).getInterfaceIDs().setNightscoutId(ack.getId()); + + disposable.add(repository.runTransactionForResult(new UpdateNsIdTemporaryTargetTransaction((TemporaryTarget) ack.getOriginalObject())) + .observeOn(aapsSchedulers.getIo()) + .subscribe( + result -> aapsLogger.debug(LTag.DATABASE, "Updated ns id of temporary target $originalObject"), + error -> aapsLogger.error(LTag.DATABASE, "Updated ns id of temporary target failed") + )); + dataSyncSelector.confirmTempTargetsTimestampIfGreater(((TemporaryTarget) ack.getOriginalObject()).getDateCreated()); + rxBus.send(new EventNSClientNewLog("DBADD", "Acked " + ack.nsClientID)); + resend("AddAck"); + return; + } + // old way if (ack.nsClientID != null) { uploadQueue.removeByNsClientIdIfExists(ack.json); rxBus.send(new EventNSClientNewLog("DBADD", "Acked " + ack.nsClientID)); @@ -225,9 +243,17 @@ public class NSClientService extends DaggerService { } public void processUpdateAck(NSUpdateAck ack) { - if (ack.result) { - uploadQueue.removeByMongoId(ack.action, ack._id); - rxBus.send(new EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked " + ack._id)); + // new room way + if (ack.getOriginalObject() instanceof TemporaryTarget) { + dataSyncSelector.confirmTempTargetsTimestampIfGreater(((TemporaryTarget) ack.getOriginalObject()).getDateCreated()); + rxBus.send(new EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked " + ack.get_id())); + resend("UpdateAck"); + return; + } + // old way + if (ack.getResult()) { + uploadQueue.removeByMongoId(ack.getAction(), ack.get_id()); + rxBus.send(new EventNSClientNewLog("DBUPDATE/DBREMOVE", "Acked " + ack.get_id())); } else { rxBus.send(new EventNSClientNewLog("ERROR", "DBUPDATE/DBREMOVE Unknown response")); } @@ -261,6 +287,7 @@ public class NSClientService extends DaggerService { public NSClientService getServiceInstance() { return NSClientService.this; } + } @Override @@ -701,15 +728,15 @@ public class NSClientService extends DaggerService { } } - public void dbUpdateUnset(DbRequest dbr, NSUpdateAck ack) { + public void dbUpdate(String collection, String _id, JSONObject data, Object originalObject) { try { if (!isConnected || !hasWriteAuth) return; JSONObject message = new JSONObject(); - message.put("collection", dbr.collection); - message.put("_id", dbr._id); - message.put("data", new JSONObject(dbr.data)); - mSocket.emit("dbUpdateUnset", message, ack); - rxBus.send(new EventNSClientNewLog("DBUPDATEUNSET " + dbr.collection, "Sent " + dbr._id)); + message.put("collection", collection); + message.put("_id", _id); + message.put("data", data); + mSocket.emit("dbUpdate", message, new NSUpdateAck("dbUpdate", _id, aapsLogger, rxBus, originalObject)); + rxBus.send(new EventNSClientNewLog("DBUPDATE " + collection, "Sent " + originalObject.toString())); } catch (JSONException e) { aapsLogger.error("Unhandled exception", e); } @@ -728,6 +755,19 @@ public class NSClientService extends DaggerService { } } + public void dbRemove(String collection, String _id, Object originalObject) { + try { + if (!isConnected || !hasWriteAuth) return; + JSONObject message = new JSONObject(); + message.put("collection", collection); + message.put("_id", _id); + mSocket.emit("dbRemove", message, new NSUpdateAck("dbRemove", _id, aapsLogger, rxBus, originalObject)); + rxBus.send(new EventNSClientNewLog("DBREMOVE " + collection, "Sent " + _id)); + } catch (JSONException e) { + aapsLogger.error("Unhandled exception", e); + } + } + public void dbAdd(DbRequest dbr, NSAddAck ack) { try { if (!isConnected || !hasWriteAuth) return; @@ -741,14 +781,14 @@ public class NSClientService extends DaggerService { } } - public void dbAdd(DbRequest dbr, NSAddAck ack, JvmType.Object originalData) { + public void dbAdd(String collection, JSONObject data, Object originalObject) { 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)); + message.put("collection", collection); + message.put("data", data); + mSocket.emit("dbAdd", message, new NSAddAck(aapsLogger, rxBus, originalObject)); + rxBus.send(new EventNSClientNewLog("DBADD " + collection, "Sent " + originalObject.toString())); } catch (JSONException e) { aapsLogger.error("Unhandled exception", e); } @@ -761,27 +801,24 @@ public class NSClientService extends DaggerService { } public void resend(final String reason) { - if (uploadQueue.size() == 0) - return; - if (!isConnected || !hasWriteAuth) return; handler.post(() -> { if (mSocket == null || !mSocket.connected()) return; - if (lastResendTime > System.currentTimeMillis() - 10 * 1000L) { - aapsLogger.debug(LTag.NSCLIENT, "Skipping resend by lastResendTime: " + ((System.currentTimeMillis() - lastResendTime) / 1000L) + " sec"); - return; - } +// for room db I send record by record . this would make the process slow +// if (lastResendTime > System.currentTimeMillis() - 10 * 1000L) { +// aapsLogger.debug(LTag.NSCLIENT, "Skipping resend by lastResendTime: " + ((System.currentTimeMillis() - lastResendTime) / 1000L) + " sec"); +// return; +// } lastResendTime = System.currentTimeMillis(); rxBus.send(new EventNSClientNewLog("QUEUE", "Resend started: " + reason)); - List ttData = dataSyncSelector.changedTempTargetsCompat(); - for (DbRequest dbr : ttData) { - uploadQueue.add(dbr); - dataSyncSelector.confirmTempTargetsTimestamp(Long.parseLong(dbr.nsClientID)); - } + if (dataSyncSelector.processChangedTempTargetsCompat()) return; + + if (uploadQueue.size() == 0) + return; CloseableIterator iterator; int maxcount = 30; @@ -790,7 +827,16 @@ public class NSClientService extends DaggerService { try { while (iterator.hasNext() && maxcount > 0) { DbRequest dbr = iterator.next(); - processDbRequest(dbr); + if (dbr.action.equals("dbAdd")) { + NSAddAck addAck = new NSAddAck(aapsLogger, rxBus, null); + dbAdd(dbr, addAck); + } else if (dbr.action.equals("dbRemove")) { + NSUpdateAck removeAck = new NSUpdateAck("dbRemove", dbr._id, aapsLogger, rxBus, null); + dbRemove(dbr, removeAck); + } else if (dbr.action.equals("dbUpdate")) { + NSUpdateAck updateAck = new NSUpdateAck("dbUpdate", dbr._id, aapsLogger, rxBus, null); + dbUpdate(dbr, updateAck); + } maxcount--; } } finally { @@ -804,22 +850,6 @@ public class NSClientService extends DaggerService { }); } - private void processDbRequest(DbRequest dbr) { - if (dbr.action.equals("dbAdd")) { - NSAddAck addAck = new NSAddAck(aapsLogger, rxBus); - dbAdd(dbr, addAck); - } else if (dbr.action.equals("dbRemove")) { - NSUpdateAck removeAck = new NSUpdateAck(dbr.action, dbr._id, aapsLogger, rxBus); - dbRemove(dbr, removeAck); - } else if (dbr.action.equals("dbUpdate")) { - NSUpdateAck updateAck = new NSUpdateAck(dbr.action, dbr._id, aapsLogger, rxBus); - dbUpdate(dbr, updateAck); - } else if (dbr.action.equals("dbUpdateUnset")) { - NSUpdateAck updateUnsetAck = new NSUpdateAck(dbr.action, dbr._id, aapsLogger, rxBus); - dbUpdateUnset(dbr, updateUnsetAck); - } - } - public void restart() { destroy(); initialize(); @@ -864,7 +894,7 @@ public class NSClientService extends DaggerService { } } - public List splitArray(JSONArray array) { + public List splitArray(JSONArray array) { List ret = new ArrayList<>(); try { int size = array.length(); diff --git a/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt b/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt index 9aa8918c7d..434d6d67b7 100644 --- a/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt +++ b/core/src/main/java/info/nightscout/androidaps/interfaces/DataSyncSelector.kt @@ -8,8 +8,9 @@ interface DataSyncSelector { fun resetToNextFullSync() fun confirmTempTargetsTimestamp(lastSynced: Long) + fun confirmTempTargetsTimestampIfGreater(lastSynced: Long) fun changedTempTargets() : List // Until NS v3 - fun changedTempTargetsCompat() : List + fun processChangedTempTargetsCompat(): Boolean } \ No newline at end of file diff --git a/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt b/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt index b6b54bd8b8..c835f0fe30 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/AppRepository.kt @@ -93,8 +93,8 @@ open class AppRepository @Inject internal constructor( .map { if (!ascending) it.reversed() else it } .subscribeOn(Schedulers.io()) - fun getAllChangedTemporaryTargetsFromTime(timestamp: Long): Single> = - database.temporaryTargetDao.getAllChangedFromTime(timestamp) + fun getAllChangedTemporaryTargetsFromTime(timestamp: Long, amount: Int): Single> = + database.temporaryTargetDao.getAllChangedFromTime(timestamp, amount) .subscribeOn(Schedulers.io()) fun getTemporaryTargetDataIncludingInvalidFromTime(timestamp: Long, ascending: Boolean): Single> = diff --git a/database/src/main/java/info/nightscout/androidaps/database/daos/TemporaryTargetDao.kt b/database/src/main/java/info/nightscout/androidaps/database/daos/TemporaryTargetDao.kt index f07bbda4d7..4630c4f72c 100644 --- a/database/src/main/java/info/nightscout/androidaps/database/daos/TemporaryTargetDao.kt +++ b/database/src/main/java/info/nightscout/androidaps/database/daos/TemporaryTargetDao.kt @@ -17,8 +17,8 @@ internal interface TemporaryTargetDao : TraceableDao { @Query("DELETE FROM $TABLE_TEMPORARY_TARGETS") 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> + @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE dateCreated > :timestamp AND referenceId IS NULL ORDER BY timestamp ASC LIMIT :amount") + fun getAllChangedFromTime(timestamp: Long, amount: Int): Single> @Query("SELECT * FROM $TABLE_TEMPORARY_TARGETS WHERE nightscoutId = :nsId AND referenceId IS NULL") fun findByNSId(nsId: String): TemporaryTarget? diff --git a/database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdTemporaryTargetTransaction.kt b/database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdTemporaryTargetTransaction.kt new file mode 100644 index 0000000000..419fba854d --- /dev/null +++ b/database/src/main/java/info/nightscout/androidaps/database/transactions/UpdateNsIdTemporaryTargetTransaction.kt @@ -0,0 +1,12 @@ +package info.nightscout.androidaps.database.transactions + +import info.nightscout.androidaps.database.entities.TemporaryTarget + +class UpdateNsIdTemporaryTargetTransaction(val temporaryTarget: TemporaryTarget) : Transaction() { + + override fun run() { + val current = database.temporaryTargetDao.findById(temporaryTarget.id) + if (current != null && current.interfaceIDs.nightscoutId != temporaryTarget.interfaceIDs.nightscoutId) + database.temporaryTargetDao.updateExistingEntry(temporaryTarget) + } +} \ No newline at end of file