diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.kt b/app/src/main/java/info/nightscout/androidaps/MainApp.kt index 420f27427d..40f03c6a69 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.kt +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.kt @@ -105,11 +105,8 @@ class MainApp : DaggerApplication() { filter.addAction(Intents.ACTION_NEW_TREATMENT) filter.addAction(Intents.ACTION_CHANGED_TREATMENT) filter.addAction(Intents.ACTION_REMOVED_TREATMENT) - filter.addAction(Intents.ACTION_NEW_SGV) - filter.addAction(Intents.ACTION_NEW_PROFILE) filter.addAction(Intents.ACTION_NEW_MBG) filter.addAction(Intents.ACTION_NEW_CAL) - filter.addAction(Intents.ACTION_FOOD) LocalBroadcastManager.getInstance(this).registerReceiver(DataReceiver(), filter) filter = IntentFilter() filter.addAction(Intent.ACTION_TIME_CHANGED) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/dataBroadcaster/DataBroadcastPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/dataBroadcaster/DataBroadcastPlugin.kt index 1f23c29588..4ff7ce4d14 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/dataBroadcaster/DataBroadcastPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/dataBroadcaster/DataBroadcastPlugin.kt @@ -163,7 +163,7 @@ class DataBroadcastPlugin @Inject constructor( bundle.putString("enacted", loopPlugin.lastRun?.request?.json().toString()) } } else { //NSClient or remote - val data = NSDeviceStatus.deviceStatusOpenAPSData + val data = nsDeviceStatus.deviceStatusOpenAPSData if (data.clockSuggested != 0L && data.suggested != null) { bundle.putLong("suggestedTimeStamp", data.clockSuggested) bundle.putString("suggested", data.suggested.toString()) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/food/FoodPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/food/FoodPlugin.kt index f6f5accf18..f0f78a8577 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/food/FoodPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/food/FoodPlugin.kt @@ -13,8 +13,7 @@ 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.receivers.BundleStore -import info.nightscout.androidaps.receivers.DataReceiver +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.utils.JsonHelper import info.nightscout.androidaps.utils.extensions.foodFromJson import info.nightscout.androidaps.utils.resources.ResourceHelper @@ -49,21 +48,19 @@ class FoodPlugin @Inject constructor( @Inject lateinit var aapsLogger: AAPSLogger @Inject lateinit var repository: AppRepository @Inject lateinit var sp: SP - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker init { (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) } override fun doWork(): Result { - aapsLogger.debug(LTag.DATAFOOD, "Received Food Data: $inputData}") - val bundle = bundleStore.pickup(inputData.getLong(DataReceiver.STORE_KEY, -1)) + val foods = dataWorker.pickupJSONArray(inputData.getLong(DataWorker.STORE_KEY, -1)) ?: return Result.failure() + aapsLogger.debug(LTag.DATAFOOD, "Received Food Data: $foods") var ret = Result.success() - val foodsString = bundle.getString("foods") ?: return Result.failure() - val foods = JSONArray(foodsString) for (index in 0 until foods.length()) { val jsonFood: JSONObject = foods.getJSONObject(index) 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 66aa97f51a..e5221da1f2 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 @@ -433,7 +433,7 @@ public class NSClientPlugin extends PluginBase { // room Therapy Event TherapyEvent therapyEvent = therapyEventFromNsIdForInvalidating(_id); disposable.add(repository.runTransactionForResult(new SyncTherapyEventTransaction(therapyEvent)).subscribe( - result -> result.getInvalidated().forEach(record -> uel.log(Action.CAREPORTAL_DELETED_FROM_NS, record.getNote() , new ValueWithUnit(record.getTimestamp(), Units.Timestamp, true), new ValueWithUnit(record.getType().getText(), Units.TherapyEvent))), + result -> result.getInvalidated().forEach(record -> uel.log(Action.CAREPORTAL_DELETED_FROM_NS, record.getNote() != null ? record.getNote() : "" , new ValueWithUnit(record.getTimestamp(), Units.Timestamp, true), new ValueWithUnit(record.getType().getText(), Units.TherapyEvent))), error -> aapsLogger.error(LTag.DATABASE, "Error while removing therapy event", error))); // new DB model EventNsTreatment evtTreatment = new EventNsTreatment(EventNsTreatment.Companion.getREMOVE(), json); @@ -493,8 +493,8 @@ public class NSClientPlugin extends PluginBase { disposable.add(repository.runTransactionForResult(new SyncTherapyEventTransaction(therapyEvent)) .subscribe( result -> { - result.getInserted().forEach(record -> uel.log(Action.CAREPORTAL_FROM_NS, record.getNote() , new ValueWithUnit(record.getTimestamp(), Units.Timestamp, true), new ValueWithUnit(record.getType().getText(), Units.TherapyEvent))); - result.getInvalidated().forEach(record -> uel.log(Action.CAREPORTAL_DELETED_FROM_NS, record.getNote() , new ValueWithUnit(record.getTimestamp(), Units.Timestamp, true), new ValueWithUnit(record.getType().getText(), Units.TherapyEvent))); + result.getInserted().forEach(record -> uel.log(Action.CAREPORTAL_FROM_NS, record.getNote() != null ? record.getNote() : "", new ValueWithUnit(record.getTimestamp(), Units.Timestamp, true), new ValueWithUnit(record.getType().getText(), Units.TherapyEvent))); + result.getInvalidated().forEach(record -> uel.log(Action.CAREPORTAL_DELETED_FROM_NS, record.getNote() != null ? record.getNote() : "" , new ValueWithUnit(record.getTimestamp(), Units.Timestamp, true), new ValueWithUnit(record.getType().getText(), Units.TherapyEvent))); }, error -> aapsLogger.error(LTag.DATABASE, "Error while saving therapy event", error))); } else { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientWorker.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientWorker.java index a5d4fcd597..2eae20075b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientWorker.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NSClientWorker.java @@ -7,13 +7,10 @@ import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; -import androidx.annotation.NonNull; - import javax.inject.Inject; import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.receivers.BundleStore; -import info.nightscout.androidaps.receivers.DataReceiver; +import info.nightscout.androidaps.receivers.DataWorker; // cannot be inner class because of needed injection public class NSClientWorker extends Worker { @@ -26,14 +23,14 @@ public class NSClientWorker extends Worker { } @Inject NSClientPlugin nsClientPlugin; - @Inject BundleStore bundleStore; + @Inject DataWorker dataWorker; @NonNull @Override public Result doWork() { - Bundle bundle = bundleStore.pickup(getInputData().getLong(DataReceiver.STORE_KEY, -1)); + Bundle bundle = dataWorker.pickupBundle(getInputData().getLong(DataWorker.STORE_KEY, -1)); if (bundle == null) return Result.failure(); - String action = getInputData().getString(DataReceiver.ACTION_KEY); + String action = getInputData().getString(DataWorker.ACTION_KEY); nsClientPlugin.handleNewDataFromNSClient(action, bundle); return Result.success(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSDeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSDeviceStatus.java deleted file mode 100644 index 6d50c67e3a..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSDeviceStatus.java +++ /dev/null @@ -1,481 +0,0 @@ -package info.nightscout.androidaps.plugins.general.nsclient.data; - -import android.text.Spanned; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import dagger.android.HasAndroidInjector; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.interfaces.ConfigInterface; -import info.nightscout.androidaps.logging.AAPSLogger; -import info.nightscout.androidaps.logging.LTag; -import info.nightscout.androidaps.plugins.aps.loop.APSResult; -import info.nightscout.androidaps.plugins.configBuilder.RunningConfiguration; -import info.nightscout.androidaps.utils.DateUtil; -import info.nightscout.androidaps.utils.HtmlHelper; -import info.nightscout.androidaps.utils.Round; -import info.nightscout.androidaps.utils.resources.ResourceHelper; -import info.nightscout.androidaps.utils.sharedPreferences.SP; - -/** - * Created by mike on 25.06.2017. - */ - -/* -{ - "_id": "594fdcec327b83c81b6b8c0f", - "device": "openaps://Sony D5803", - "pump": { - "battery": { - "percent": 100 - }, - "status": { - "status": "normal", - "timestamp": "2017-06-25T15:50:14Z" - }, - "extended": { - "Version": "1.5-ac98852-2017.06.25", - "PumpIOB": 1.13, - "LastBolus": "25. 6. 2017 17:25:00", - "LastBolusAmount": 0.3, - "BaseBasalRate": 0.4, - "ActiveProfile": "2016 +30%" - }, - "reservoir": 109, - "clock": "2017-06-25T15:55:10Z" - }, - "openaps": { - "suggested": { - "temp": "absolute", - "bg": 115.9, - "tick": "+5", - "eventualBG": 105, - "snoozeBG": 105, - "predBGs": { - "IOB": [116, 114, 112, 110, 109, 107, 106, 105, 105, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 107] - }, - "COB": 0, - "IOB": -0.035, - "reason": "COB: 0, Dev: -18, BGI: 0.43, ISF: 216, Target: 99; Eventual BG 105 > 99 but Min. Delta -2.60 < Exp. Delta 0.1; setting current basal of 0.4 as temp. Suggested rate is same as profile rate, no temp basal is active, doing nothing", - "timestamp": "2017-06-25T15:55:10Z" - }, - "iob": { - "iob": -0.035, - "basaliob": -0.035, - "activity": -0.0004, - "time": "2017-06-25T15:55:10Z" - } - }, - "uploaderBattery": 93, - "created_at": "2017-06-25T15:55:10Z", - "NSCLIENT_ID": 1498406118857 -} - */ -@Singleton -public class NSDeviceStatus { - private final AAPSLogger aapsLogger; - private final SP sp; - private final ResourceHelper resourceHelper; - private final NSSettingsStatus nsSettingsStatus; - private final ConfigInterface config; - private final RunningConfiguration runningConfiguration; - - private JSONObject data = null; - - @Inject - public NSDeviceStatus( - AAPSLogger aapsLogger, - SP sp, - ResourceHelper resourceHelper, - NSSettingsStatus nsSettingsStatus, - ConfigInterface config, - RunningConfiguration runningConfiguration - ) { - this.aapsLogger = aapsLogger; - this.sp = sp; - this.resourceHelper = resourceHelper; - this.nsSettingsStatus = nsSettingsStatus; - this.config = config; - this.runningConfiguration = runningConfiguration; - } - - public void handleNewData(JSONArray devicestatuses) { - - aapsLogger.debug(LTag.NSCLIENT, "Got NS devicestatus: $devicestatuses}"); - - for (int i = 0; i < devicestatuses.length(); i++) { - try { - JSONObject devicestatusJson = devicestatuses.getJSONObject(i); - if (devicestatusJson != null) { - setData(devicestatusJson); - if (devicestatusJson.has("pump")) { - // Objectives 0 - sp.putBoolean(R.string.key_ObjectivespumpStatusIsAvailableInNS, true); - } - if (devicestatusJson.has("configuration") && config.getNSCLIENT()) { - // copy configuration of Insulin and Sensitivity from main AAPS - runningConfiguration.apply(devicestatusJson.getJSONObject("configuration")); - } - } - } catch (JSONException jsonException) { - jsonException.printStackTrace(); - } - } - } - - public NSDeviceStatus setData(JSONObject obj) { - this.data = obj; - updatePumpData(); - updateOpenApsData(obj); - updateUploaderData(obj); - return this; - } - - public String getDevice() { - try { - if (data.has("device")) { - String device = data.getString("device"); - if (device.startsWith("openaps://")) { - device = device.substring(10); - return device; - } - } - } catch (JSONException e) { - aapsLogger.error("Unhandled exception", e); - } - return ""; - } - - public static class Levels { - static int URGENT = 2; - static int WARN = 1; - static int INFO = 0; - int LOW = -1; - int LOWEST = -2; - static int NONE = -3; - } - - // ***** PUMP DATA ****** - - private DeviceStatusPumpData deviceStatusPumpData = null; - - public Spanned getExtendedPumpStatus() { - if (deviceStatusPumpData != null && deviceStatusPumpData.extended != null) - return deviceStatusPumpData.extended; - return HtmlHelper.INSTANCE.fromHtml(""); - } - - public Spanned getPumpStatus() { - //String[] ALL_STATUS_FIELDS = {"reservoir", "battery", "clock", "status", "device"}; - - StringBuilder string = new StringBuilder(); - string.append(""); - string.append(resourceHelper.gs(R.string.pump)); - string.append(": "); - - if (deviceStatusPumpData == null) - return HtmlHelper.INSTANCE.fromHtml(""); - - // test warning level - int level = Levels.INFO; - long now = System.currentTimeMillis(); - if (deviceStatusPumpData.clock + nsSettingsStatus.extendedPumpSettings("urgentClock") * 60 * 1000L < now) - level = Levels.URGENT; - else if (deviceStatusPumpData.reservoir < nsSettingsStatus.extendedPumpSettings("urgentRes")) - level = Levels.URGENT; - else if (deviceStatusPumpData.isPercent && deviceStatusPumpData.percent < nsSettingsStatus.extendedPumpSettings("urgentBattP")) - level = Levels.URGENT; - else if (!deviceStatusPumpData.isPercent && deviceStatusPumpData.voltage < nsSettingsStatus.extendedPumpSettings("urgentBattV")) - level = Levels.URGENT; - else if (deviceStatusPumpData.clock + nsSettingsStatus.extendedPumpSettings("warnClock") * 60 * 1000L < now) - level = Levels.WARN; - else if (deviceStatusPumpData.reservoir < nsSettingsStatus.extendedPumpSettings("warnRes")) - level = Levels.WARN; - else if (deviceStatusPumpData.isPercent && deviceStatusPumpData.percent < nsSettingsStatus.extendedPumpSettings("warnBattP")) - level = Levels.WARN; - else if (!deviceStatusPumpData.isPercent && deviceStatusPumpData.voltage < nsSettingsStatus.extendedPumpSettings("warnBattV")) - level = Levels.WARN; - - string.append(""); - if (level == Levels.WARN) string.append("yellow\">"); - if (level == Levels.URGENT) string.append("red\">"); - - String fields = nsSettingsStatus.pumpExtendedSettingsFields(); - - if (fields.contains("reservoir")) { - string.append((int) deviceStatusPumpData.reservoir).append("U "); - } - - if (fields.contains("battery") && deviceStatusPumpData.isPercent) { - string.append(deviceStatusPumpData.percent).append("% "); - } - if (fields.contains("battery") && !deviceStatusPumpData.isPercent) { - string.append(Round.roundTo(deviceStatusPumpData.voltage, 0.001d)).append(" "); - } - - if (fields.contains("clock")) { - string.append(DateUtil.minAgo(resourceHelper, deviceStatusPumpData.clock)).append(" "); - } - - if (fields.contains("status")) { - string.append(deviceStatusPumpData.status).append(" "); - } - - if (fields.contains("device")) { - string.append(getDevice()).append(" "); - } - - - string.append(""); // color - - return HtmlHelper.INSTANCE.fromHtml(string.toString()); - } - - static class DeviceStatusPumpData { - long clock = 0L; - boolean isPercent = false; - int percent = 0; - double voltage = 0; - - String status = "N/A"; - double reservoir = 0d; - - Spanned extended = null; - } - - private void updatePumpData() { - try { - JSONObject pump = data != null && data.has("pump") ? data.getJSONObject("pump") : new JSONObject(); - - long clock = 0L; - if (pump.has("clock")) - clock = DateUtil.fromISODateString(pump.getString("clock")).getTime(); - // check if this is new data - if (clock == 0 || deviceStatusPumpData != null && clock < deviceStatusPumpData.clock) - return; - // create new status and process data - deviceStatusPumpData = new DeviceStatusPumpData(); - deviceStatusPumpData.clock = clock; - if (pump.has("status") && pump.getJSONObject("status").has("status")) - deviceStatusPumpData.status = pump.getJSONObject("status").getString("status"); - if (pump.has("reservoir")) - deviceStatusPumpData.reservoir = pump.getDouble("reservoir"); - if (pump.has("battery") && pump.getJSONObject("battery").has("percent")) { - deviceStatusPumpData.isPercent = true; - deviceStatusPumpData.percent = pump.getJSONObject("battery").getInt("percent"); - } else if (pump.has("battery") && pump.getJSONObject("battery").has("voltage")) { - deviceStatusPumpData.isPercent = false; - deviceStatusPumpData.voltage = pump.getJSONObject("battery").getDouble("voltage"); - } - if (pump.has("extended")) { - JSONObject extendedJson = pump.getJSONObject("extended"); - StringBuilder exteneded = new StringBuilder(); - Iterator keys = extendedJson.keys(); - while (keys.hasNext()) { - String key = (String) keys.next(); - String value = extendedJson.getString(key); - exteneded.append("").append(key).append(": ").append(value).append("
"); - } - deviceStatusPumpData.extended = HtmlHelper.INSTANCE.fromHtml(exteneded.toString()); - } - } catch (Exception e) { - aapsLogger.error("Unhandled exception", e); - } - } - - - // ********* OpenAPS data *********** - - public static DeviceStatusOpenAPSData deviceStatusOpenAPSData = new DeviceStatusOpenAPSData(); - - public static class DeviceStatusOpenAPSData { - public long clockSuggested = 0L; - public long clockEnacted = 0L; - - public JSONObject suggested = null; - public JSONObject enacted = null; - } - - private void updateOpenApsData(JSONObject object) { - try { - JSONObject openaps = object.has("openaps") ? object.getJSONObject("openaps") : new JSONObject(); - JSONObject suggested = openaps.has("suggested") ? openaps.getJSONObject("suggested") : new JSONObject(); - JSONObject enacted = openaps.has("enacted") ? openaps.getJSONObject("enacted") : new JSONObject(); - - long clock = 0L; - if (suggested.has("timestamp")) - clock = DateUtil.fromISODateString(suggested.getString("timestamp")).getTime(); - // check if this is new data - if (clock != 0 && clock > deviceStatusOpenAPSData.clockSuggested) { - deviceStatusOpenAPSData.suggested = suggested; - deviceStatusOpenAPSData.clockSuggested = clock; - } - - clock = 0L; - if (enacted.has("timestamp")) - clock = DateUtil.fromISODateString(enacted.getString("timestamp")).getTime(); - // check if this is new data - if (clock != 0 && clock > deviceStatusOpenAPSData.clockEnacted) { - deviceStatusOpenAPSData.enacted = enacted; - deviceStatusOpenAPSData.clockEnacted = clock; - } - } catch (Exception e) { - aapsLogger.error("Unhandled exception", e); - } - } - - public Spanned getOpenApsStatus() { - StringBuilder string = new StringBuilder(); - string.append(""); - string.append(resourceHelper.gs(R.string.openaps_short)); - string.append(": "); - - // test warning level - int level = Levels.INFO; - long now = System.currentTimeMillis(); - if (deviceStatusOpenAPSData.clockSuggested != 0 && deviceStatusOpenAPSData.clockSuggested + sp.getInt(R.string.key_nsalarm_urgent_staledatavalue, 31) * 60 * 1000L < now) - level = Levels.URGENT; - else if (deviceStatusOpenAPSData.clockSuggested != 0 && deviceStatusOpenAPSData.clockSuggested + sp.getInt(R.string.key_nsalarm_staledatavalue, 16) * 60 * 1000L < now) - level = Levels.WARN; - - string.append(""); - if (level == Levels.WARN) string.append("yellow\">"); - if (level == Levels.URGENT) string.append("red\">"); - - if (deviceStatusOpenAPSData.clockSuggested != 0) { - string.append(DateUtil.minAgo(resourceHelper, deviceStatusOpenAPSData.clockSuggested)).append(" "); - } - string.append(""); // color - - return HtmlHelper.INSTANCE.fromHtml(string.toString()); - } - - public static long getOpenApsTimestamp() { - - if (deviceStatusOpenAPSData.clockSuggested != 0) { - return deviceStatusOpenAPSData.clockSuggested; - } else { - return -1; - } - } - - public Spanned getExtendedOpenApsStatus() { - StringBuilder string = new StringBuilder(); - - try { - if (deviceStatusOpenAPSData.enacted != null && deviceStatusOpenAPSData.clockEnacted != deviceStatusOpenAPSData.clockSuggested) - string.append("").append(DateUtil.minAgo(resourceHelper, deviceStatusOpenAPSData.clockEnacted)).append(" ").append(deviceStatusOpenAPSData.enacted.getString("reason")).append("
"); - if (deviceStatusOpenAPSData.suggested != null) - string.append("").append(DateUtil.minAgo(resourceHelper, deviceStatusOpenAPSData.clockSuggested)).append(" ").append(deviceStatusOpenAPSData.suggested.getString("reason")).append("
"); - return HtmlHelper.INSTANCE.fromHtml(string.toString()); - } catch (JSONException e) { - aapsLogger.error("Unhandled exception", e); - } - return HtmlHelper.INSTANCE.fromHtml(""); - } - - // ********* Uploader data *********** - - private static final HashMap uploaders = new HashMap<>(); - - static class Uploader { - long clock = 0L; - int battery = 0; - } - - private void updateUploaderData(JSONObject object) { - try { - - long clock = 0L; - if (object.has("mills")) - clock = object.getLong("mills"); - else if (object.has("created_at")) - clock = DateUtil.fromISODateString(object.getString("created_at")).getTime(); - String device = getDevice(); - Integer battery = null; - if (object.has("uploaderBattery")) - battery = object.getInt("uploaderBattery"); - else if (object.has("uploader")) { - if (object.getJSONObject("uploader").has("battery")) - battery = object.getJSONObject("uploader").getInt("battery"); - } - Uploader uploader = uploaders.get(device); - // check if this is new data - if (clock != 0 && battery != null && (uploader == null || clock > uploader.clock)) { - if (uploader == null) - uploader = new Uploader(); - uploader.battery = battery; - uploader.clock = clock; - uploaders.put(device, uploader); - } - } catch (Exception e) { - aapsLogger.error("Unhandled exception", e); - } - } - - public String getUploaderStatus() { - Iterator iter = uploaders.entrySet().iterator(); - int minBattery = 100; - while (iter.hasNext()) { - Map.Entry pair = (Map.Entry) iter.next(); - Uploader uploader = (Uploader) pair.getValue(); - if (minBattery > uploader.battery) - minBattery = uploader.battery; - } - - return minBattery + "%"; - } - - public Spanned getUploaderStatusSpanned() { - StringBuilder string = new StringBuilder(); - string.append(""); - string.append(resourceHelper.gs(R.string.uploader_short)); - string.append(": "); - - Iterator iter = uploaders.entrySet().iterator(); - int minBattery = 100; - while (iter.hasNext()) { - Map.Entry pair = (Map.Entry) iter.next(); - Uploader uploader = (Uploader) pair.getValue(); - if (minBattery > uploader.battery) - minBattery = uploader.battery; - } - - string.append(minBattery); - string.append("%"); - return HtmlHelper.INSTANCE.fromHtml(string.toString()); - } - - public Spanned getExtendedUploaderStatus() { - StringBuilder string = new StringBuilder(); - - Iterator iter = uploaders.entrySet().iterator(); - while (iter.hasNext()) { - Map.Entry pair = (Map.Entry) iter.next(); - Uploader uploader = (Uploader) pair.getValue(); - String device = (String) pair.getKey(); - string.append("").append(device).append(": ").append(uploader.battery).append("%
"); - } - - return HtmlHelper.INSTANCE.fromHtml(string.toString()); - } - - public static APSResult getAPSResult(HasAndroidInjector injector) { - APSResult result = new APSResult(injector); - result.setJson(deviceStatusOpenAPSData.suggested); - result.setDate(deviceStatusOpenAPSData.clockSuggested); - return result; - } - -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSDeviceStatus.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSDeviceStatus.kt new file mode 100644 index 0000000000..5657f1d48e --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/data/NSDeviceStatus.kt @@ -0,0 +1,396 @@ +package info.nightscout.androidaps.plugins.general.nsclient.data + +import android.text.Spanned +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.interfaces.ConfigInterface +import info.nightscout.androidaps.logging.AAPSLogger +import info.nightscout.androidaps.logging.LTag +import info.nightscout.androidaps.plugins.aps.loop.APSResult +import info.nightscout.androidaps.plugins.configBuilder.RunningConfiguration +import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.utils.HtmlHelper.fromHtml +import info.nightscout.androidaps.utils.Round +import info.nightscout.androidaps.utils.T +import info.nightscout.androidaps.utils.resources.ResourceHelper +import info.nightscout.androidaps.utils.sharedPreferences.SP +import org.json.JSONArray +import org.json.JSONException +import org.json.JSONObject +import java.util.* +import javax.inject.Inject +import javax.inject.Singleton + +/* +{ + "_id": "594fdcec327b83c81b6b8c0f", + "device": "openaps://Sony D5803", + "pump": { + "battery": { + "percent": 100 + }, + "status": { + "status": "normal", + "timestamp": "2017-06-25T15:50:14Z" + }, + "extended": { + "Version": "1.5-ac98852-2017.06.25", + "PumpIOB": 1.13, + "LastBolus": "25. 6. 2017 17:25:00", + "LastBolusAmount": 0.3, + "BaseBasalRate": 0.4, + "ActiveProfile": "2016 +30%" + }, + "reservoir": 109, + "clock": "2017-06-25T15:55:10Z" + }, + "openaps": { + "suggested": { + "temp": "absolute", + "bg": 115.9, + "tick": "+5", + "eventualBG": 105, + "snoozeBG": 105, + "predBGs": { + "IOB": [116, 114, 112, 110, 109, 107, 106, 105, 105, 104, 104, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 107] + }, + "COB": 0, + "IOB": -0.035, + "reason": "COB: 0, Dev: -18, BGI: 0.43, ISF: 216, Target: 99; Eventual BG 105 > 99 but Min. Delta -2.60 < Exp. Delta 0.1; setting current basal of 0.4 as temp. Suggested rate is same as profile rate, no temp basal is active, doing nothing", + "timestamp": "2017-06-25T15:55:10Z" + }, + "iob": { + "iob": -0.035, + "basaliob": -0.035, + "activity": -0.0004, + "time": "2017-06-25T15:55:10Z" + } + }, + "uploaderBattery": 93, + "created_at": "2017-06-25T15:55:10Z", + "NSCLIENT_ID": 1498406118857 +} + */ +@Suppress("SpellCheckingInspection") +@Singleton +class NSDeviceStatus @Inject constructor( + private val aapsLogger: AAPSLogger, + private val sp: SP, + private val resourceHelper: ResourceHelper, + private val nsSettingsStatus: NSSettingsStatus, + private val config: ConfigInterface, + private val dateUtil: DateUtil, + private val runningConfiguration: RunningConfiguration +) { + + private var data: JSONObject? = null + fun handleNewData(deviceStatuses: JSONArray) { + aapsLogger.debug(LTag.NSCLIENT, "Got NS deviceStatus: \$deviceStatuses}") + try { + for (i in 0 until deviceStatuses.length()) { + val devicestatusJson = deviceStatuses.getJSONObject(i) + if (devicestatusJson != null) { + setData(devicestatusJson) + if (devicestatusJson.has("pump")) { + // Objectives 0 + sp.putBoolean(R.string.key_ObjectivespumpStatusIsAvailableInNS, true) + } + if (devicestatusJson.has("configuration") && config.NSCLIENT) { + // copy configuration of Insulin and Sensitivity from main AAPS + runningConfiguration.apply(devicestatusJson.getJSONObject("configuration")) + } + } + } + } catch (jsonException: JSONException) { + jsonException.printStackTrace() + } + } + + private fun setData(obj: JSONObject): NSDeviceStatus { + data = obj + updatePumpData() + updateOpenApsData(obj) + updateUploaderData(obj) + return this + } + + val device: String + get() { + try { + if (data!!.has("device")) { + var device = data!!.getString("device") + if (device.startsWith("openaps://")) { + device = device.substring(10) + return device + } + } + } catch (e: JSONException) { + aapsLogger.error("Unhandled exception", e) + } + return "" + } + + enum class Levels(val level: Int) { + + URGENT(2), + WARN(1), + INFO(0); + + fun toColor(): String = + when (level) { + INFO.level -> "white" + WARN.level -> "yellow" + URGENT.level -> "red" + else -> "white" + } + } + + // ***** PUMP DATA ****** + private var deviceStatusPumpData: DeviceStatusPumpData? = null + + val extendedPumpStatus: Spanned + get() = deviceStatusPumpData?.extended ?: fromHtml("") + + val pumpStatus: Spanned + // test warning level // color + get() { + val pumpData = deviceStatusPumpData ?: return fromHtml("") + + //String[] ALL_STATUS_FIELDS = {"reservoir", "battery", "clock", "status", "device"}; + val string = StringBuilder() + .append("") + .append(resourceHelper.gs(R.string.pump)) + .append(": ") + + // test warning level + val level = when { + pumpData.clock + nsSettingsStatus.extendedPumpSettings("urgentClock") * 60 * 1000L < dateUtil._now() -> Levels.URGENT + pumpData.reservoir < nsSettingsStatus.extendedPumpSettings("urgentRes") -> Levels.URGENT + pumpData.isPercent && pumpData.percent < nsSettingsStatus.extendedPumpSettings("urgentBattP") -> Levels.URGENT + !pumpData.isPercent && pumpData.voltage < nsSettingsStatus.extendedPumpSettings("urgentBattV") -> Levels.URGENT + pumpData.clock + nsSettingsStatus.extendedPumpSettings("warnClock") * 60 * 1000L < dateUtil._now() -> Levels.WARN + pumpData.reservoir < nsSettingsStatus.extendedPumpSettings("warnRes") -> Levels.WARN + pumpData.isPercent && pumpData.percent < nsSettingsStatus.extendedPumpSettings("warnBattP") -> Levels.WARN + !pumpData.isPercent && pumpData.voltage < nsSettingsStatus.extendedPumpSettings("warnBattV") -> Levels.WARN + else -> Levels.INFO + } + string.append("") + val fields = nsSettingsStatus.pumpExtendedSettingsFields() + if (fields.contains("reservoir")) string.append(pumpData.reservoir.toInt()).append("U ") + if (fields.contains("battery") && pumpData.isPercent) string.append(pumpData.percent).append("% ") + if (fields.contains("battery") && !pumpData.isPercent) string.append(Round.roundTo(pumpData.voltage, 0.001)).append(" ") + if (fields.contains("clock")) string.append(DateUtil.minAgo(resourceHelper, pumpData.clock)).append(" ") + if (fields.contains("status")) string.append(pumpData.status).append(" ") + if (fields.contains("device")) string.append(device).append(" ") + string.append("") // color + return fromHtml(string.toString()) + } + + internal class DeviceStatusPumpData { + + var clock = 0L + var isPercent = false + var percent = 0 + var voltage = 0.0 + var status = "N/A" + var reservoir = 0.0 + var extended: Spanned? = null + } + + private fun updatePumpData() { + try { + val data = this.data ?: return + val pump = if (data.has("pump")) data.getJSONObject("pump") else JSONObject() + val clock = if (pump.has("clock")) DateUtil.fromISODateString(pump.getString("clock")).time else 0L + // check if this is new data + if (clock == 0L || deviceStatusPumpData != null && clock < deviceStatusPumpData!!.clock) return + + // create new status and process data + val deviceStatusPumpData = DeviceStatusPumpData() + deviceStatusPumpData.clock = clock + if (pump.has("status") && pump.getJSONObject("status").has("status")) deviceStatusPumpData.status = pump.getJSONObject("status").getString("status") + if (pump.has("reservoir")) deviceStatusPumpData.reservoir = pump.getDouble("reservoir") + if (pump.has("battery") && pump.getJSONObject("battery").has("percent")) { + deviceStatusPumpData.isPercent = true + deviceStatusPumpData.percent = pump.getJSONObject("battery").getInt("percent") + } else if (pump.has("battery") && pump.getJSONObject("battery").has("voltage")) { + deviceStatusPumpData.isPercent = false + deviceStatusPumpData.voltage = pump.getJSONObject("battery").getDouble("voltage") + } + if (pump.has("extended")) { + val extendedJson = pump.getJSONObject("extended") + val extended = StringBuilder() + val keys: Iterator<*> = extendedJson.keys() + while (keys.hasNext()) { + val key = keys.next() as String + val value = extendedJson.getString(key) + extended.append("").append(key).append(": ").append(value).append("
") + } + deviceStatusPumpData.extended = fromHtml(extended.toString()) + } + this.deviceStatusPumpData = deviceStatusPumpData + } catch (e: Exception) { + aapsLogger.error("Unhandled exception", e) + } + } + + class DeviceStatusOpenAPSData { + + var clockSuggested = 0L + var clockEnacted = 0L + var suggested: JSONObject? = null + var enacted: JSONObject? = null + } + + private fun updateOpenApsData(jsonObject: JSONObject) { + try { + val openAps = if (jsonObject.has("openaps")) jsonObject.getJSONObject("openaps") else JSONObject() + val suggested = if (openAps.has("suggested")) openAps.getJSONObject("suggested") else JSONObject() + val enacted = if (openAps.has("enacted")) openAps.getJSONObject("enacted") else JSONObject() + var clock = if (suggested.has("timestamp")) DateUtil.fromISODateString(suggested.getString("timestamp")).time else 0L + // check if this is new data + if (clock != 0L && clock > deviceStatusOpenAPSData.clockSuggested) { + deviceStatusOpenAPSData.suggested = suggested + deviceStatusOpenAPSData.clockSuggested = clock + } + clock = if (enacted.has("timestamp")) DateUtil.fromISODateString(enacted.getString("timestamp")).time else 0L + // check if this is new data + if (clock != 0L && clock > deviceStatusOpenAPSData.clockEnacted) { + deviceStatusOpenAPSData.enacted = enacted + deviceStatusOpenAPSData.clockEnacted = clock + } + } catch (e: Exception) { + aapsLogger.error("Unhandled exception", e) + } + } + + val openApsStatus: Spanned + get() { + val string = StringBuilder() + .append("") + .append(resourceHelper.gs(R.string.openaps_short)) + .append(": ") + + // test warning level + val level = when { + deviceStatusOpenAPSData.clockSuggested + T.mins(sp.getLong(R.string.key_nsalarm_urgent_staledatavalue, 31)).msecs() < dateUtil._now() -> Levels.URGENT + deviceStatusOpenAPSData.clockSuggested + T.mins(sp.getLong(R.string.key_nsalarm_staledatavalue, 16)).msecs() < dateUtil._now() -> Levels.WARN + else -> Levels.INFO + } + string.append("") + if (deviceStatusOpenAPSData.clockSuggested != 0L) string.append(DateUtil.minAgo(resourceHelper, deviceStatusOpenAPSData.clockSuggested)).append(" ") + string.append("") // color + return fromHtml(string.toString()) + } + + val extendedOpenApsStatus: Spanned + get() { + val string = StringBuilder() + try { + if (deviceStatusOpenAPSData.enacted != null && deviceStatusOpenAPSData.clockEnacted != deviceStatusOpenAPSData.clockSuggested) string.append("").append(DateUtil.minAgo(resourceHelper, deviceStatusOpenAPSData.clockEnacted)).append(" ").append(deviceStatusOpenAPSData.enacted!!.getString("reason")).append("
") + if (deviceStatusOpenAPSData.suggested != null) string.append("").append(DateUtil.minAgo(resourceHelper, deviceStatusOpenAPSData.clockSuggested)).append(" ").append(deviceStatusOpenAPSData.suggested!!.getString("reason")).append("
") + return fromHtml(string.toString()) + } catch (e: JSONException) { + aapsLogger.error("Unhandled exception", e) + } + return fromHtml("") + } + + internal class Uploader { + + var clock = 0L + var battery = 0 + } + + private fun updateUploaderData(jsonObject: JSONObject) { + try { + val clock = + when { + jsonObject.has("mills") -> jsonObject.getLong("mills") + jsonObject.has("created_at") -> DateUtil.fromISODateString(jsonObject.getString("created_at")).time + else -> 0L + } + val device = device + val battery: Int = + when { + jsonObject.has("uploaderBattery") -> jsonObject.getInt("uploaderBattery") + jsonObject.has("uploader") && jsonObject.getJSONObject("uploader").has("battery") -> jsonObject.getJSONObject("uploader").getInt("battery") + else -> 0 + } + + var uploader = uploaderMap[device] + // check if this is new data + if (clock != 0L && battery != 0 && (uploader == null || clock > uploader.clock)) { + if (uploader == null) uploader = Uploader() + uploader.battery = battery + uploader.clock = clock + uploaderMap[device] = uploader + } + } catch (e: Exception) { + aapsLogger.error("Unhandled exception", e) + } + } + + val uploaderStatus: String + get() { + val iterator: Iterator<*> = uploaderMap.entries.iterator() + var minBattery = 100 + while (iterator.hasNext()) { + val pair = iterator.next() as Map.Entry<*, *> + val uploader = pair.value as Uploader + if (minBattery > uploader.battery) minBattery = uploader.battery + } + return "$minBattery%" + } + + val uploaderStatusSpanned: Spanned + get() { + val string = StringBuilder() + string.append("") + string.append(resourceHelper.gs(R.string.uploader_short)) + string.append(": ") + val iterator: Iterator<*> = uploaderMap.entries.iterator() + var minBattery = 100 + while (iterator.hasNext()) { + val pair = iterator.next() as Map.Entry<*, *> + val uploader = pair.value as Uploader + if (minBattery > uploader.battery) minBattery = uploader.battery + } + string.append(minBattery) + string.append("%") + return fromHtml(string.toString()) + } + + val extendedUploaderStatus: Spanned + get() { + val string = StringBuilder() + val iterator: Iterator<*> = uploaderMap.entries.iterator() + while (iterator.hasNext()) { + val pair = iterator.next() as Map.Entry<*, *> + val uploader = pair.value as Uploader + val device = pair.key as String + string.append("").append(device).append(": ").append(uploader.battery).append("%
") + } + return fromHtml(string.toString()) + } + + // ********* OpenAPS data *********** + var deviceStatusOpenAPSData = DeviceStatusOpenAPSData() + val openApsTimestamp: Long + get() = + if (deviceStatusOpenAPSData.clockSuggested != 0L) { + deviceStatusOpenAPSData.clockSuggested + } else { + -1 + } + + // ********* Uploader data *********** + private val uploaderMap = HashMap() + + fun getAPSResult(injector: HasAndroidInjector): APSResult { + val result = APSResult(injector) + result.json = deviceStatusOpenAPSData.suggested + result.date = deviceStatusOpenAPSData.clockSuggested + return result + } +} \ 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 b4be8d61c7..3d4c3390cd 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 @@ -11,6 +11,7 @@ import android.os.PowerManager; import android.os.SystemClock; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.work.OneTimeWorkRequest; import com.google.common.base.Charsets; import com.google.common.hash.Hashing; @@ -41,6 +42,7 @@ import info.nightscout.androidaps.interfaces.ProfileStore; 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.food.FoodPlugin; import info.nightscout.androidaps.plugins.general.nsclient.NSClientPlugin; import info.nightscout.androidaps.plugins.general.nsclient.UploadQueue; import info.nightscout.androidaps.plugins.general.nsclient.acks.NSAddAck; @@ -60,6 +62,9 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNo import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.general.overview.notifications.Notification; import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationWithAction; +import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin; +import info.nightscout.androidaps.plugins.source.NSClientSourcePlugin; +import info.nightscout.androidaps.receivers.DataWorker; import info.nightscout.androidaps.services.Intents; import info.nightscout.androidaps.utils.DateUtil; import info.nightscout.androidaps.utils.FabricPrivacy; @@ -90,6 +95,7 @@ public class NSClientService extends DaggerService { @Inject Config config; @Inject DateUtil dateUtil; @Inject UploadQueue uploadQueue; + @Inject DataWorker dataWorker; private final CompositeDisposable disposable = new CompositeDisposable(); @@ -534,16 +540,6 @@ public class NSClientService extends DaggerService { boolean isFull = !isDelta; rxBus.send(new EventNSClientNewLog("DATA", "Data packet #" + dataCounter++ + (isDelta ? " delta" : " full"))); - if (data.has("profiles")) { - JSONArray profiles = data.getJSONArray("profiles"); - if (profiles.length() > 0) { - JSONObject profile = (JSONObject) profiles.get(profiles.length() - 1); - profileStore = new ProfileStore(injector, profile); - broadcastProfile = true; - rxBus.send(new EventNSClientNewLog("PROFILE", "profile received")); - } - } - if (data.has("status")) { JSONObject status = data.getJSONObject("status"); nsSettingsStatus.setData(status); @@ -558,30 +554,48 @@ public class NSClientService extends DaggerService { } nsSettingsStatus.handleNewData(nightscoutVersionName, nightscoutVersionCode, status); - /* Other received data to 2016/02/10 - { - status: 'ok' - , name: env.name - , version: env.version - , versionNum: versionNum (for ver 1.2.3 contains 10203) - , serverTime: new Date().toISOString() - , apiEnabled: apiEnabled - , careportalEnabled: apiEnabled && env.settings.enable.indexOf('careportal') > -1 - , boluscalcEnabled: apiEnabled && env.settings.enable.indexOf('boluscalc') > -1 - , head: env.head - , settings: env.settings - , extendedSettings: ctx.plugins && ctx.plugins.extendedClientSettings ? ctx.plugins.extendedClientSettings(env.extendedSettings) : {} - , activeProfile ..... calculated from treatments or missing - } - */ + /* Other received data to 2016/02/10 + { + status: 'ok' + , name: env.name + , version: env.version + , versionNum: versionNum (for ver 1.2.3 contains 10203) + , serverTime: new Date().toISOString() + , apiEnabled: apiEnabled + , careportalEnabled: apiEnabled && env.settings.enable.indexOf('careportal') > -1 + , boluscalcEnabled: apiEnabled && env.settings.enable.indexOf('boluscalc') > -1 + , head: env.head + , settings: env.settings + , extendedSettings: ctx.plugins && ctx.plugins.extendedClientSettings ? ctx.plugins.extendedClientSettings(env.extendedSettings) : {} + , activeProfile ..... calculated from treatments or missing + } + */ } else if (!isDelta) { rxBus.send(new EventNSClientNewLog("ERROR", "Unsupported Nightscout version !!!!")); } // If new profile received or change detected broadcast it - if (broadcastProfile && profileStore != null) { - handleNewProfile(profileStore, isDelta); - rxBus.send(new EventNSClientNewLog("PROFILE", "broadcasting")); + if (data.has("profiles")) { + JSONArray profiles = data.getJSONArray("profiles"); + if (profiles.length() > 0) { + // take the newest + JSONObject profileStoreJson = (JSONObject) profiles.get(profiles.length() - 1); + rxBus.send(new EventNSClientNewLog("PROFILE", "profile received")); + dataWorker.enqueue( + new OneTimeWorkRequest.Builder(NSProfilePlugin.NSProfileWorker.class) + .setInputData(dataWorker.storeInputData(profileStoreJson, null)) + .build()); + + if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false)) { + Bundle bundle = new Bundle(); + bundle.putString("profile", profileStoreJson.toString()); + bundle.putBoolean("delta", isDelta); + Intent intent = new Intent(Intents.ACTION_NEW_PROFILE); + intent.putExtras(bundle); + intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); + sendBroadcast(intent); + } + } } if (data.has("treatments")) { @@ -635,8 +649,12 @@ public class NSClientService extends DaggerService { } if (data.has("food")) { JSONArray foods = data.getJSONArray("food"); - if (foods.length() > 0) rxBus.send(new EventNSClientNewLog("DATA", "received " + foods.length() + " foods")); - handleFood(foods, isDelta); + if (foods.length() > 0) + rxBus.send(new EventNSClientNewLog("DATA", "received " + foods.length() + " foods")); + dataWorker.enqueue( + new OneTimeWorkRequest.Builder(FoodPlugin.FoodWorker.class) + .setInputData(dataWorker.storeInputData(foods, null)) + .build()); } if (data.has("mbgs")) { JSONArray mbgs = data.getJSONArray("mbgs"); @@ -664,24 +682,23 @@ public class NSClientService extends DaggerService { JSONArray sgvs = data.getJSONArray("sgvs"); if (sgvs.length() > 0) rxBus.send(new EventNSClientNewLog("DATA", "received " + sgvs.length() + " sgvs")); - for (int index = 0; index < sgvs.length(); index++) { - JSONObject jsonSgv = sgvs.getJSONObject(index); - // rxBus.send(new EventNSClientNewLog("DATA", "svg " + sgvs.getJSONObject(index).toString()); - NSSgv sgv = new NSSgv(jsonSgv); - // Handle new sgv here - // remove from upload queue if Ack is failing - uploadQueue.removeID(jsonSgv); - //Find latest date in sgv - if (sgv.getMills() != null && sgv.getMills() < System.currentTimeMillis()) - if (sgv.getMills() > latestDateInReceivedData) - latestDateInReceivedData = sgv.getMills(); + + dataWorker.enqueue(new OneTimeWorkRequest.Builder(NSClientSourcePlugin.NSClientSourceWorker.class) + .setInputData(dataWorker.storeInputData(sgvs, null)) + .build()); + + List splitted = splitArray(sgvs); + if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false)) { + for (JSONArray part : splitted) { + Bundle bundle = new Bundle(); + bundle.putString("sgvs", part.toString()); + bundle.putBoolean("delta", isDelta); + Intent intent = new Intent(Intents.ACTION_NEW_SGV); + intent.putExtras(bundle); + intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); + sendBroadcast(intent); + } } - // Was that sgv more less 5 mins ago ? - if ((System.currentTimeMillis() - latestDateInReceivedData) / (60 * 1000L) < 5L) { - rxBus.send(new EventDismissNotification(Notification.NS_ALARM)); - rxBus.send(new EventDismissNotification(Notification.NS_URGENT_ALARM)); - } - handleNewSgv(sgvs, isDelta); } rxBus.send(new EventNSClientNewLog("LAST", dateUtil.dateAndTimeString(latestDateInReceivedData))); } catch (JSONException e) { @@ -849,16 +866,6 @@ public class NSClientService extends DaggerService { } } - public void handleFood(JSONArray foods, boolean isDelta) { - Bundle bundle = new Bundle(); - bundle.putString("foods", foods.toString()); - bundle.putBoolean("delta", isDelta); - Intent intent = new Intent(Intents.ACTION_FOOD); - intent.putExtras(bundle); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } - public void handleNewCal(JSONArray cals, boolean isDelta) { Bundle bundle = new Bundle(); bundle.putString("cals", cals.toString()); @@ -879,51 +886,6 @@ public class NSClientService extends DaggerService { LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } - public void handleNewProfile(ProfileStore profile, boolean isDelta) { - Bundle bundle = new Bundle(); - bundle.putString("profile", profile.getData().toString()); - bundle.putBoolean("delta", isDelta); - Intent intent = new Intent(Intents.ACTION_NEW_PROFILE); - intent.putExtras(bundle); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - - if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false)) { - bundle = new Bundle(); - bundle.putString("profile", profile.getData().toString()); - bundle.putBoolean("delta", isDelta); - intent = new Intent(Intents.ACTION_NEW_PROFILE); - intent.putExtras(bundle); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - this.sendBroadcast(intent); - } - } - - public void handleNewSgv(JSONArray sgvs, boolean isDelta) { - List splitted = splitArray(sgvs); - for (JSONArray part : splitted) { - Bundle bundle = new Bundle(); - bundle.putString("sgvs", part.toString()); - bundle.putBoolean("delta", isDelta); - Intent intent = new Intent(Intents.ACTION_NEW_SGV); - intent.putExtras(bundle); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } - - if (sp.getBoolean(R.string.key_nsclient_localbroadcasts, false)) { - for (JSONArray part : splitted) { - Bundle bundle = new Bundle(); - bundle.putString("sgvs", part.toString()); - bundle.putBoolean("delta", isDelta); - Intent intent = new Intent(Intents.ACTION_NEW_SGV); - intent.putExtras(bundle); - intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); - this.sendBroadcast(intent); - } - } - } - public void handleNewTreatment(JSONArray treatments, boolean isDelta) { List splitted = splitArray(treatments); for (JSONArray part : splitted) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt index b6bdbe4f04..1f8228d5d8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.kt @@ -839,7 +839,7 @@ class OverviewFragment : DaggerFragment(), View.OnClickListener, OnLongClickList val toTime: Long val fromTime: Long val endTime: Long - val apsResult = if (config.APS) lastRun?.constraintsProcessed else NSDeviceStatus.getAPSResult(injector) + val apsResult = if (config.APS) lastRun?.constraintsProcessed else nsDeviceStatus.getAPSResult(injector) if (predictionsAvailable && apsResult != null && menuChartSettings[0][OverviewMenus.CharType.PRE.ordinal]) { var predictionHours = (ceil(apsResult.latestPredictionsTime - System.currentTimeMillis().toDouble()) / (60 * 60 * 1000)).toInt() predictionHours = min(2, predictionHours) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt index be4eeb41a2..e8e490bcf5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/smsCommunicator/SmsCommunicatorPlugin.kt @@ -36,11 +36,10 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotifi import info.nightscout.androidaps.plugins.general.overview.notifications.Notification import info.nightscout.androidaps.plugins.general.smsCommunicator.events.EventSmsCommunicatorUpdateGui import info.nightscout.androidaps.plugins.general.smsCommunicator.otp.OneTimePassword -import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatusProvider import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin import info.nightscout.androidaps.queue.Callback -import info.nightscout.androidaps.receivers.BundleStore +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.receivers.DataReceiver import info.nightscout.androidaps.utils.* import info.nightscout.androidaps.utils.extensions.valueToUnitsString @@ -176,7 +175,7 @@ class SmsCommunicatorPlugin @Inject constructor( ) : Worker(context, params) { @Inject lateinit var smsCommunicatorPlugin: SmsCommunicatorPlugin - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker init { (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) @@ -184,7 +183,7 @@ class SmsCommunicatorPlugin @Inject constructor( @Suppress("SpellCheckingInspection") override fun doWork(): Result { - val bundle = bundleStore.pickup(inputData.getLong(DataReceiver.STORE_KEY, -1)) + val bundle = dataWorker.pickupBundle(inputData.getLong(DataWorker.STORE_KEY, -1)) ?: return Result.failure() val format = bundle.getString("format") ?: return Result.failure() val pdus = bundle["pdus"] as Array<*> @@ -731,7 +730,7 @@ class SmsCommunicatorPlugin @Inject constructor( var replyText = resourceHelper.gs(R.string.smscommunicator_extendedcancelfailed) replyText += "\n" + activePlugin.activePump.shortStatus(true) sendSMS(Sms(receivedSms.phoneNumber, replyText)) - uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true),ValueWithUnit(R.string.smscommunicator_extendedcanceled, Units.R_String)) + uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_extendedcanceled, Units.R_String)) } } }) @@ -758,14 +757,16 @@ class SmsCommunicatorPlugin @Inject constructor( replyText += "\n" + activePlugin.activePump.shortStatus(true) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, replyText)) if (config.APS) - uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_extendedset, 2), ValueWithUnit(aDouble ?:0.0, Units.U), ValueWithUnit(duration, Units.M), ValueWithUnit(R.string.loopsuspended, Units.R_String)) - else - uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_extendedset, 2), ValueWithUnit(aDouble ?:0.0, Units.U), ValueWithUnit(duration, Units.M)) + uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_extendedset, 2), ValueWithUnit(aDouble + ?: 0.0, Units.U), ValueWithUnit(duration, Units.M), ValueWithUnit(R.string.loopsuspended, Units.R_String)) + else + uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_extendedset, 2), ValueWithUnit(aDouble + ?: 0.0, Units.U), ValueWithUnit(duration, Units.M)) } else { var replyText = resourceHelper.gs(R.string.smscommunicator_extendedfailed) replyText += "\n" + activePlugin.activePump.shortStatus(true) sendSMS(Sms(receivedSms.phoneNumber, replyText)) - uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true),ValueWithUnit(R.string.smscommunicator_extendedfailed, Units.R_String)) + uel.log(Action.SMS_EXTENDED_BOLUS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_extendedfailed, Units.R_String)) } } }) @@ -883,12 +884,14 @@ class SmsCommunicatorPlugin @Inject constructor( var replyText = String.format(resourceHelper.gs(R.string.smscommunicator_carbsset), anInteger) replyText += "\n" + activePlugin.activePump.shortStatus(true) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, replyText)) - uel.log(Action.SMS_CARBS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_carbsset, 1), ValueWithUnit(anInteger ?:0,Units.G)) + uel.log(Action.SMS_CARBS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_carbsset, 1), ValueWithUnit(anInteger + ?: 0, Units.G)) } else { var replyText = resourceHelper.gs(R.string.smscommunicator_carbsfailed, anInteger) replyText += "\n" + activePlugin.activePump.shortStatus(true) sendSMS(Sms(receivedSms.phoneNumber, replyText)) - uel.log(Action.SMS_CARBS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_carbsfailed, 1), ValueWithUnit(anInteger ?:0,Units.G)) + uel.log(Action.SMS_CARBS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_carbsfailed, 1), ValueWithUnit(anInteger + ?: 0, Units.G)) } } }) @@ -897,7 +900,8 @@ class SmsCommunicatorPlugin @Inject constructor( var replyText = String.format(resourceHelper.gs(R.string.smscommunicator_carbsset), anInteger) replyText += "\n" + activePlugin.activePump.shortStatus(true) sendSMSToAllNumbers(Sms(receivedSms.phoneNumber, replyText)) - uel.log(Action.SMS_CARBS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_carbsset, 1), ValueWithUnit(anInteger ?:0,Units.G)) + uel.log(Action.SMS_CARBS, activePlugin.activePump.shortStatus(true), ValueWithUnit(R.string.smscommunicator_carbsset, 1), ValueWithUnit(anInteger + ?: 0, Units.G)) } } }) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/WatchUpdaterService.java index 8fa51862c9..db97d25b17 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/wearintegration/WatchUpdaterService.java @@ -715,7 +715,7 @@ public class WatchUpdaterService extends WearableListenerService implements Goog openApsStatus = loopPlugin.getLastRun() != null && loopPlugin.getLastRun().getLastTBREnact() != 0 ? loopPlugin.getLastRun().getLastTBREnact() : -1; } else { //NSClient or remote - openApsStatus = NSDeviceStatus.getOpenApsTimestamp(); + openApsStatus = nsDeviceStatus.getOpenApsTimestamp(); } PutDataMapRequest dataMapRequest = PutDataMapRequest.create(NEW_STATUS_PATH); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/profile/ns/NSProfilePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/profile/ns/NSProfilePlugin.kt index 5109f6811c..e2c3c56608 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/profile/ns/NSProfilePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/profile/ns/NSProfilePlugin.kt @@ -17,8 +17,7 @@ import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.general.nsclient.events.EventNSClientRestart import info.nightscout.androidaps.plugins.profile.ns.events.EventNSProfileUpdateGUI -import info.nightscout.androidaps.receivers.BundleStore -import info.nightscout.androidaps.receivers.DataReceiver +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP import org.json.JSONObject @@ -89,26 +88,23 @@ class NSProfilePlugin @Inject constructor( @Inject lateinit var nsProfilePlugin: NSProfilePlugin @Inject lateinit var aapsLogger: AAPSLogger @Inject lateinit var rxBus: RxBusWrapper - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker init { (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) } override fun doWork(): Result { - val bundle = bundleStore.pickup(inputData.getLong(DataReceiver.STORE_KEY, -1)) + val profileString = dataWorker.pickupJSONObject(inputData.getLong(DataWorker.STORE_KEY, -1)) ?: return Result.failure() - bundle.getString("profile")?.let { profileString -> - nsProfilePlugin.profile = ProfileStore(injector, JSONObject(profileString)) - nsProfilePlugin.storeNSProfile() - if (nsProfilePlugin.isEnabled()) { - rxBus.send(EventProfileStoreChanged()) - rxBus.send(EventNSProfileUpdateGUI()) - } - aapsLogger.debug(LTag.PROFILE, "Received profileStore: ${nsProfilePlugin.profile}") - return Result.success() + nsProfilePlugin.profile = ProfileStore(injector, profileString) + nsProfilePlugin.storeNSProfile() + if (nsProfilePlugin.isEnabled()) { + rxBus.send(EventProfileStoreChanged()) + rxBus.send(EventNSProfileUpdateGUI()) } - return Result.failure() + aapsLogger.debug(LTag.PROFILE, "Received profileStore: ${nsProfilePlugin.profile}") + return Result.success() } } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt index 6d46974392..8a45930cda 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/DexcomPlugin.kt @@ -21,8 +21,7 @@ import info.nightscout.androidaps.interfaces.PluginType import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.general.nsclient.NSUpload -import info.nightscout.androidaps.receivers.BundleStore -import info.nightscout.androidaps.receivers.DataReceiver +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.XDripBroadcast @@ -84,7 +83,7 @@ class DexcomPlugin @Inject constructor( @Inject lateinit var dexcomPlugin: DexcomPlugin @Inject lateinit var nsUpload: NSUpload @Inject lateinit var sp: SP - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker @Inject lateinit var broadcastToXDrip: XDripBroadcast @Inject lateinit var repository: AppRepository @@ -96,7 +95,7 @@ class DexcomPlugin @Inject constructor( var ret = Result.success() if (!dexcomPlugin.isEnabled(PluginType.BGSOURCE)) return Result.failure() - val bundle = bundleStore.pickup(inputData.getLong(DataReceiver.STORE_KEY, -1)) + val bundle = dataWorker.pickupBundle(inputData.getLong(DataWorker.STORE_KEY, -1)) ?: return Result.failure() try { val sourceSensor = when (bundle.getString("sensorType") ?: "") { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt index b876361cad..f585fbfff5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/EversensePlugin.kt @@ -17,8 +17,7 @@ import info.nightscout.androidaps.interfaces.PluginType import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.general.nsclient.NSUpload -import info.nightscout.androidaps.receivers.BundleStore -import info.nightscout.androidaps.receivers.DataReceiver +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.XDripBroadcast import info.nightscout.androidaps.utils.resources.ResourceHelper @@ -57,7 +56,7 @@ class EversensePlugin @Inject constructor( @Inject lateinit var sp: SP @Inject lateinit var nsUpload: NSUpload @Inject lateinit var dateUtil: DateUtil - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker @Inject lateinit var repository: AppRepository @Inject lateinit var broadcastToXDrip: XDripBroadcast @@ -69,7 +68,7 @@ class EversensePlugin @Inject constructor( var ret = Result.success() if (!eversensePlugin.isEnabled(PluginType.BGSOURCE)) return Result.failure() - val bundle = bundleStore.pickup(inputData.getLong(DataReceiver.STORE_KEY, -1)) + val bundle = dataWorker.pickupBundle(inputData.getLong(DataWorker.STORE_KEY, -1)) ?: return Result.failure() if (bundle.containsKey("currentCalibrationPhase")) aapsLogger.debug(LTag.BGSOURCE, "currentCalibrationPhase: " + bundle.getString("currentCalibrationPhase")) if (bundle.containsKey("placementModeInProgress")) aapsLogger.debug(LTag.BGSOURCE, "placementModeInProgress: " + bundle.getBoolean("placementModeInProgress")) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/MM640gPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/MM640gPlugin.kt index 99b757545a..1bb431e59b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/MM640gPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/MM640gPlugin.kt @@ -15,7 +15,7 @@ import info.nightscout.androidaps.interfaces.PluginType import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.LTag import info.nightscout.androidaps.plugins.general.nsclient.NSUpload -import info.nightscout.androidaps.receivers.BundleStore +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.utils.DateUtil import info.nightscout.androidaps.utils.XDripBroadcast import info.nightscout.androidaps.utils.resources.ResourceHelper @@ -51,7 +51,7 @@ class MM640gPlugin @Inject constructor( @Inject lateinit var sp: SP @Inject lateinit var nsUpload: NSUpload @Inject lateinit var dateUtil: DateUtil - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker @Inject lateinit var repository: AppRepository @Inject lateinit var broadcastToXDrip: XDripBroadcast diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/NSClientSourcePlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/NSClientSourcePlugin.kt index 89de2b425f..ca6b3513d4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/NSClientSourcePlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/NSClientSourcePlugin.kt @@ -15,10 +15,14 @@ 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.plugins.bus.RxBusWrapper import info.nightscout.androidaps.plugins.general.nsclient.NSUpload import info.nightscout.androidaps.plugins.general.nsclient.data.NSSgv -import info.nightscout.androidaps.receivers.BundleStore +import info.nightscout.androidaps.plugins.general.overview.events.EventDismissNotification +import info.nightscout.androidaps.plugins.general.overview.notifications.Notification +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.utils.DateUtil +import info.nightscout.androidaps.utils.T import info.nightscout.androidaps.utils.XDripBroadcast import info.nightscout.androidaps.utils.resources.ResourceHelper import info.nightscout.androidaps.utils.sharedPreferences.SP @@ -80,9 +84,10 @@ class NSClientSourcePlugin @Inject constructor( @Inject lateinit var injector: HasAndroidInjector @Inject lateinit var aapsLogger: AAPSLogger @Inject lateinit var sp: SP + @Inject lateinit var rxBus: RxBusWrapper @Inject lateinit var nsUpload: NSUpload @Inject lateinit var dateUtil: DateUtil - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker @Inject lateinit var repository: AppRepository @Inject lateinit var broadcastToXDrip: XDripBroadcast @Inject lateinit var dexcomPlugin: DexcomPlugin @@ -109,18 +114,27 @@ class NSClientSourcePlugin @Inject constructor( var ret = Result.success() if (!nsClientSourcePlugin.isEnabled() && !sp.getBoolean(R.string.key_ns_autobackfill, true) && !dexcomPlugin.isEnabled()) return Result.failure() + + val sgvs = dataWorker.pickupJSONArray(inputData.getLong(DataWorker.STORE_KEY, -1)) + ?: return Result.failure() + try { + var latestDateInReceivedData: Long = 0 + + aapsLogger.debug(LTag.BGSOURCE, "Received NS Data: $sgvs") val glucoseValues = mutableListOf() - inputData.getString("sgv")?.let { sgvString -> - aapsLogger.debug(LTag.BGSOURCE, "Received NS Data: $sgvString") - glucoseValues += toGv(JSONObject(sgvString)) + for (i in 0 until sgvs.length()) { + val sgv = toGv(sgvs.getJSONObject(i)) + if (sgv.timestamp < dateUtil._now() && sgv.timestamp > latestDateInReceivedData) latestDateInReceivedData = sgv.timestamp + glucoseValues += sgv + } - inputData.getString("sgvs")?.let { sgvString -> - aapsLogger.debug(LTag.BGSOURCE, "Received NS Data: $sgvString") - val jsonArray = JSONArray(sgvString) - for (i in 0 until jsonArray.length()) - glucoseValues += toGv(jsonArray.getJSONObject(i)) + // Was that sgv more less 5 mins ago ? + if (T.msecs(dateUtil._now() - latestDateInReceivedData).mins() < 5L) { + rxBus.send(EventDismissNotification(Notification.NS_ALARM)) + rxBus.send(EventDismissNotification(Notification.NS_URGENT_ALARM)) } + repository.runTransactionForResult(CgmSourceTransaction(glucoseValues, emptyList(), null, !nsClientSourcePlugin.isEnabled())) .doOnError { aapsLogger.error("Error while saving values from NSClient App", it) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt index 94abeea54e..3862e9f6d5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/XdripPlugin.kt @@ -14,8 +14,7 @@ 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.receivers.BundleStore -import info.nightscout.androidaps.receivers.DataReceiver +import info.nightscout.androidaps.receivers.DataWorker import info.nightscout.androidaps.services.Intents import info.nightscout.androidaps.utils.resources.ResourceHelper import javax.inject.Inject @@ -62,7 +61,7 @@ class XdripPlugin @Inject constructor( @Inject lateinit var aapsLogger: AAPSLogger @Inject lateinit var xdripPlugin: XdripPlugin @Inject lateinit var repository: AppRepository - @Inject lateinit var bundleStore: BundleStore + @Inject lateinit var dataWorker: DataWorker init { (context.applicationContext as HasAndroidInjector).androidInjector().inject(this) @@ -72,7 +71,7 @@ class XdripPlugin @Inject constructor( var ret = Result.success() if (!xdripPlugin.isEnabled(PluginType.BGSOURCE)) return Result.failure() - val bundle = bundleStore.pickup(inputData.getLong(DataReceiver.STORE_KEY, -1)) + val bundle = dataWorker.pickupBundle(inputData.getLong(DataWorker.STORE_KEY, -1)) ?: return Result.failure() aapsLogger.debug(LTag.BGSOURCE, "Received xDrip data: $bundle") diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/BundleStore.kt b/app/src/main/java/info/nightscout/androidaps/receivers/BundleStore.kt deleted file mode 100644 index 36e7e7bf7e..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/receivers/BundleStore.kt +++ /dev/null @@ -1,24 +0,0 @@ -package info.nightscout.androidaps.receivers - -import android.os.Bundle -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class BundleStore @Inject constructor() { - private val store = HashMap() - private var counter = 0L - - @Synchronized - fun store(bundle: Bundle) : Long { - store.put(counter, bundle) - return counter++ - } - - @Synchronized - fun pickup(key: Long) : Bundle? { - val bundle = store[key] - store.remove(key) - return bundle - } -} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.kt b/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.kt index 862d470dfd..81b929b4f9 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.kt +++ b/app/src/main/java/info/nightscout/androidaps/receivers/DataReceiver.kt @@ -2,20 +2,15 @@ package info.nightscout.androidaps.receivers import android.content.Context import android.content.Intent -import android.os.Bundle import android.provider.Telephony import androidx.work.Data -import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequest -import androidx.work.WorkManager import dagger.android.DaggerBroadcastReceiver import info.nightscout.androidaps.logging.AAPSLogger import info.nightscout.androidaps.logging.BundleLogger import info.nightscout.androidaps.logging.LTag -import info.nightscout.androidaps.plugins.general.food.FoodPlugin import info.nightscout.androidaps.plugins.general.nsclient.NSClientWorker import info.nightscout.androidaps.plugins.general.smsCommunicator.SmsCommunicatorPlugin -import info.nightscout.androidaps.plugins.profile.ns.NSProfilePlugin import info.nightscout.androidaps.plugins.source.* import info.nightscout.androidaps.services.Intents import info.nightscout.androidaps.utils.extensions.copyDouble @@ -27,9 +22,7 @@ import javax.inject.Inject open class DataReceiver : DaggerBroadcastReceiver() { @Inject lateinit var aapsLogger: AAPSLogger - @Inject lateinit var bundleStore: BundleStore - - private val jobGroupName = "data" + @Inject lateinit var dataWorker: DataWorker override fun onReceive(context: Context, intent: Intent) { super.onReceive(context, intent) @@ -40,7 +33,7 @@ open class DataReceiver : DaggerBroadcastReceiver() { when (intent.action) { Intents.ACTION_NEW_BG_ESTIMATE -> OneTimeWorkRequest.Builder(XdripPlugin.XdripWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() + .setInputData(dataWorker.storeInputData(bundle, intent)).build() Intents.POCTECH_BG -> OneTimeWorkRequest.Builder(PoctechPlugin.PoctechWorker::class.java) .setInputData(Data.Builder().also { @@ -54,20 +47,12 @@ open class DataReceiver : DaggerBroadcastReceiver() { it.copyLong("myTimestamp", bundle) }.build()).build() Intents.TOMATO_BG -> + @Suppress("SpellCheckingInspection") OneTimeWorkRequest.Builder(TomatoPlugin.TomatoWorker::class.java) .setInputData(Data.Builder().also { it.copyDouble("com.fanqies.tomatofn.Extras.BgEstimate", bundle) it.copyLong("com.fanqies.tomatofn.Extras.Time", bundle) }.build()).build() - Intents.ACTION_NEW_PROFILE -> - OneTimeWorkRequest.Builder(NSProfilePlugin.NSProfileWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() - Intents.ACTION_NEW_SGV -> - OneTimeWorkRequest.Builder(NSClientSourcePlugin.NSClientSourceWorker::class.java) - .setInputData(Data.Builder().also { - it.copyString("sgv", bundle, null) - it.copyString("sgvs", bundle, null) - }.build()).build() Intents.NS_EMULATOR -> OneTimeWorkRequest.Builder(MM640gPlugin.MM640gWorker::class.java) .setInputData(Data.Builder().also { @@ -80,36 +65,22 @@ open class DataReceiver : DaggerBroadcastReceiver() { }.build()).build() Telephony.Sms.Intents.SMS_RECEIVED_ACTION -> OneTimeWorkRequest.Builder(SmsCommunicatorPlugin.SmsCommunicatorWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() + .setInputData(dataWorker.storeInputData(bundle, intent)).build() Intents.EVERSENSE_BG -> OneTimeWorkRequest.Builder(EversensePlugin.EversenseWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() + .setInputData(dataWorker.storeInputData(bundle, intent)).build() Intents.DEXCOM_BG -> OneTimeWorkRequest.Builder(DexcomPlugin.DexcomWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() - Intents.ACTION_FOOD -> - OneTimeWorkRequest.Builder(FoodPlugin.FoodWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() + .setInputData(dataWorker.storeInputData(bundle, intent)).build() Intents.ACTION_NEW_TREATMENT, Intents.ACTION_CHANGED_TREATMENT, Intents.ACTION_REMOVED_TREATMENT, Intents.ACTION_NEW_CAL, Intents.ACTION_NEW_MBG -> OneTimeWorkRequest.Builder(NSClientWorker::class.java) - .setInputData(bundleInputData(bundle, intent)).build() + .setInputData(dataWorker.storeInputData(bundle, intent)).build() else -> null - }?.let { request -> - WorkManager.getInstance(context) - .enqueueUniqueWork(jobGroupName, ExistingWorkPolicy.APPEND_OR_REPLACE, request) - } + }?.let { request -> dataWorker.enqueue(request) } } - private fun bundleInputData(bundle: Bundle, intent: Intent) = - Data.Builder().putLong(STORE_KEY, bundleStore.store(bundle)).putString(ACTION_KEY, intent.action).build() - - companion object { - - const val STORE_KEY = "storeKey" - const val ACTION_KEY = "action" - } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/DataWorker.kt b/app/src/main/java/info/nightscout/androidaps/receivers/DataWorker.kt new file mode 100644 index 0000000000..d46491b15e --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/receivers/DataWorker.kt @@ -0,0 +1,70 @@ +package info.nightscout.androidaps.receivers + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.work.Data +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager +import org.json.JSONArray +import org.json.JSONObject +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class DataWorker @Inject constructor( + private val context: Context +) { + + private val store = HashMap() + private var counter = 0L + private val jobGroupName = "data" + + @Synchronized private fun store(value: Any): Long { + store[counter] = value + return counter++ + } + + @Synchronized fun pickupBundle(key: Long): Bundle? { + val value = store[key] + store.remove(key) + return value as Bundle? + } + + @Synchronized fun pickupString(key: Long): String? { + val value = store[key] + store.remove(key) + return value as String? + } + + @Synchronized fun pickupJSONArray(key: Long): JSONArray? { + val value = store[key] + store.remove(key) + return value as JSONArray? + } + + @Synchronized fun pickupJSONObject(key: Long): JSONObject? { + val value = store[key] + store.remove(key) + return value as JSONObject? + } + + fun storeInputData(value: Any, intent: Intent? = null) = + Data.Builder() + .putLong(STORE_KEY, store(value)) + .putString(ACTION_KEY, intent?.action).build() + + fun enqueue(request: OneTimeWorkRequest) { + WorkManager.getInstance(context) + .enqueueUniqueWork(jobGroupName, ExistingWorkPolicy.APPEND_OR_REPLACE, request) + + } + + companion object { + + const val STORE_KEY = "storeKey" + const val ACTION_KEY = "action" + } + +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/services/Intents.kt b/app/src/main/java/info/nightscout/androidaps/services/Intents.kt index 7255548a03..c52c68e4c6 100644 --- a/app/src/main/java/info/nightscout/androidaps/services/Intents.kt +++ b/app/src/main/java/info/nightscout/androidaps/services/Intents.kt @@ -5,7 +5,7 @@ interface Intents { companion object { - // NSClient -> App + // AAPS -> Xdrip const val ACTION_NEW_TREATMENT = "info.nightscout.client.NEW_TREATMENT" const val ACTION_CHANGED_TREATMENT = "info.nightscout.client.CHANGED_TREATMENT" const val ACTION_REMOVED_TREATMENT = "info.nightscout.client.REMOVED_TREATMENT" @@ -13,9 +13,8 @@ interface Intents { const val ACTION_NEW_SGV = "info.nightscout.client.NEW_SGV" const val ACTION_NEW_MBG = "info.nightscout.client.NEW_MBG" const val ACTION_NEW_CAL = "info.nightscout.client.NEW_CAL" - const val ACTION_FOOD = "info.nightscout.client.FOOD" - // xDrip -> App + // xDrip -> AAPS const val ACTION_NEW_BG_ESTIMATE = "com.eveningoutpost.dexdrip.BgEstimate" const val EXTRA_BG_ESTIMATE = "com.eveningoutpost.dexdrip.Extras.BgEstimate" const val EXTRA_BG_SLOPE = "com.eveningoutpost.dexdrip.Extras.BgSlope" diff --git a/core/src/main/java/info/nightscout/androidaps/logging/LTag.kt b/core/src/main/java/info/nightscout/androidaps/logging/LTag.kt index b62d9e45a5..3e67466663 100644 --- a/core/src/main/java/info/nightscout/androidaps/logging/LTag.kt +++ b/core/src/main/java/info/nightscout/androidaps/logging/LTag.kt @@ -13,7 +13,7 @@ enum class LTag(val tag: String, val defaultValue : Boolean = true, val requires DATASERVICE("DATASERVICE"), DATATREATMENTS("DATATREATMENTS"), EVENTS("EVENTS", defaultValue = false, requiresRestart = true), - GLUCOSE("GLUCOSE"), + GLUCOSE("GLUCOSE", defaultValue = false), LOCATION("LOCATION"), NOTIFICATION("NOTIFICATION"), NSCLIENT("NSCLIENT"),