AndroidAPS/app/src/main/java/info/nightscout/androidaps/Services/DataService.java

341 lines
17 KiB
Java
Raw Normal View History

2016-06-07 21:48:17 +02:00
package info.nightscout.androidaps.Services;
import android.app.IntentService;
import android.content.Intent;
import android.content.pm.PackageManager;
2016-06-07 21:48:17 +02:00
import android.os.Bundle;
2016-07-14 23:29:21 +02:00
import android.provider.Telephony;
2016-06-07 21:48:17 +02:00
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2016-07-19 11:31:58 +02:00
import info.nightscout.androidaps.Config;
2016-06-07 21:48:17 +02:00
import info.nightscout.androidaps.MainApp;
2016-06-26 14:56:43 +02:00
import info.nightscout.androidaps.R;
2017-05-25 20:18:29 +02:00
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.events.EventNsFood;
2018-04-05 09:39:18 +02:00
import info.nightscout.androidaps.events.EventNsTreatment;
2016-08-05 23:54:03 +02:00
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
2017-04-21 12:15:08 +02:00
import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin;
2018-01-23 20:58:48 +01:00
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
2017-06-06 08:21:11 +02:00
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSMbg;
2017-06-26 12:44:03 +02:00
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus;
2016-08-10 23:27:26 +02:00
import info.nightscout.androidaps.plugins.Overview.OverviewPlugin;
2017-01-16 23:37:58 +01:00
import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
2018-01-23 20:58:48 +01:00
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.ProfileNS.NSProfilePlugin;
import info.nightscout.androidaps.plugins.PumpDanaR.activities.DanaRNSHistorySync;
2018-07-27 13:41:25 +02:00
import info.nightscout.androidaps.plugins.SmsCommunicator.SmsCommunicatorPlugin;
2018-03-31 00:36:03 +02:00
import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin;
import info.nightscout.androidaps.plugins.Source.SourceGlimpPlugin;
import info.nightscout.androidaps.plugins.Source.SourceMM640gPlugin;
import info.nightscout.androidaps.plugins.Source.SourceNSClientPlugin;
2018-06-11 17:26:31 +02:00
import info.nightscout.androidaps.plugins.Source.SourcePoctechPlugin;
2018-03-31 00:36:03 +02:00
import info.nightscout.androidaps.plugins.Source.SourceXdripPlugin;
import info.nightscout.androidaps.receivers.DataReceiver;
2017-08-14 12:11:53 +02:00
import info.nightscout.utils.BundleLogger;
2018-04-05 09:39:18 +02:00
import info.nightscout.utils.JsonHelper;
import info.nightscout.utils.SP;
2016-06-07 21:48:17 +02:00
public class DataService extends IntentService {
private static Logger log = LoggerFactory.getLogger(DataService.class);
public DataService() {
super("DataService");
registerBus();
2016-06-07 21:48:17 +02:00
}
@Override
protected void onHandleIntent(final Intent intent) {
2016-06-07 21:48:17 +02:00
if (Config.logFunctionCalls)
2017-08-14 12:11:53 +02:00
log.debug("onHandleIntent " + BundleLogger.log(intent.getExtras()));
boolean acceptNSData = !SP.getBoolean(R.string.key_ns_upload_only, false);
Bundle bundles = intent.getExtras();
if (bundles != null && bundles.containsKey("islocal")) {
acceptNSData = acceptNSData || bundles.getBoolean("islocal");
}
2018-07-27 13:41:25 +02:00
final String action = intent.getAction();
if (Intents.ACTION_NEW_BG_ESTIMATE.equals(action)) {
SourceXdripPlugin.getPlugin().handleNewData(intent);
} else if (Intents.NS_EMULATOR.equals(action)) {
SourceMM640gPlugin.getPlugin().handleNewData(intent);
} else if (Intents.GLIMP_BG.equals(action)) {
SourceGlimpPlugin.getPlugin().handleNewData(intent);
} else if (Intents.DEXCOMG5_BG.equals(action)) {
SourceDexcomG5Plugin.getPlugin().handleNewData(intent);
} else if (Intents.POCTECH_BG.equals(action)) {
SourcePoctechPlugin.getPlugin().handleNewData(intent);
} else if (Intents.ACTION_NEW_SGV.equals(action)) {
SourceNSClientPlugin.getPlugin().handleNewData(intent);
} else if (Intents.ACTION_NEW_PROFILE.equals(action)) {
// always handle Profile if NSProfile is enabled without looking at nsUploadOnly
NSProfilePlugin.getPlugin().handleNewData(intent);
} else if (acceptNSData &&
(Intents.ACTION_NEW_TREATMENT.equals(action) ||
Intents.ACTION_CHANGED_TREATMENT.equals(action) ||
Intents.ACTION_REMOVED_TREATMENT.equals(action) ||
Intents.ACTION_NEW_STATUS.equals(action) ||
Intents.ACTION_NEW_DEVICESTATUS.equals(action) ||
Intents.ACTION_NEW_FOOD.equals(action) ||
Intents.ACTION_CHANGED_FOOD.equals(action) ||
Intents.ACTION_REMOVED_FOOD.equals(action) ||
Intents.ACTION_NEW_CAL.equals(action) ||
Intents.ACTION_NEW_MBG.equals(action))
) {
handleNewDataFromNSClient(intent);
} else if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(action)) {
SmsCommunicatorPlugin.getPlugin().handleNewData(intent);
2016-06-07 21:48:17 +02:00
}
2018-07-27 13:41:25 +02:00
if (Config.logFunctionCalls)
2016-08-07 23:21:08 +02:00
log.debug("onHandleIntent exit " + intent);
DataReceiver.completeWakefulIntent(intent);
2016-06-07 21:48:17 +02:00
}
@Override
public void onDestroy() {
super.onDestroy();
MainApp.bus().unregister(this);
2016-06-07 21:48:17 +02:00
}
private void registerBus() {
try {
MainApp.bus().unregister(this);
} catch (RuntimeException x) {
// Ignore
}
MainApp.bus().register(this);
}
private void handleNewDataFromNSClient(Intent intent) {
Bundle bundles = intent.getExtras();
if (bundles == null) return;
if (Config.logIncommingData)
log.debug("Got intent: " + intent.getAction());
2016-06-26 14:56:43 +02:00
if (intent.getAction().equals(Intents.ACTION_NEW_STATUS)) {
if (bundles.containsKey("nsclientversioncode")) {
ConfigBuilderPlugin.nightscoutVersionCode = bundles.getInt("nightscoutversioncode"); // for ver 1.2.3 contains 10203
ConfigBuilderPlugin.nightscoutVersionName = bundles.getString("nightscoutversionname");
ConfigBuilderPlugin.nsClientVersionCode = bundles.getInt("nsclientversioncode"); // for ver 1.17 contains 117
ConfigBuilderPlugin.nsClientVersionName = bundles.getString("nsclientversionname");
2016-08-11 00:15:50 +02:00
log.debug("Got versions: NSClient: " + ConfigBuilderPlugin.nsClientVersionName + " Nightscout: " + ConfigBuilderPlugin.nightscoutVersionName);
try {
if (ConfigBuilderPlugin.nsClientVersionCode < MainApp.instance().getPackageManager().getPackageInfo(MainApp.instance().getPackageName(), 0).versionCode) {
2018-05-02 13:57:28 +02:00
Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT);
MainApp.bus().post(new EventNewNotification(notification));
} else {
MainApp.bus().post(new EventDismissNotification(Notification.OLD_NSCLIENT));
}
} catch (PackageManager.NameNotFoundException e) {
log.error("Unhandled exception", e);
}
if (ConfigBuilderPlugin.nightscoutVersionCode < Config.SUPPORTEDNSVERSION) {
2018-05-02 13:57:28 +02:00
Notification notification = new Notification(Notification.OLD_NS, MainApp.gs(R.string.unsupportednsversion), Notification.NORMAL);
2017-01-16 23:37:58 +01:00
MainApp.bus().post(new EventNewNotification(notification));
} else {
MainApp.bus().post(new EventDismissNotification(Notification.OLD_NS));
2017-01-16 23:37:58 +01:00
}
2016-06-26 14:56:43 +02:00
} else {
2018-05-02 13:57:28 +02:00
Notification notification = new Notification(Notification.OLD_NSCLIENT, MainApp.gs(R.string.unsupportedclientver), Notification.URGENT);
2017-01-16 23:37:58 +01:00
MainApp.bus().post(new EventNewNotification(notification));
2016-06-26 14:56:43 +02:00
}
if (bundles.containsKey("status")) {
try {
JSONObject statusJson = new JSONObject(bundles.getString("status"));
2017-06-26 12:44:03 +02:00
NSSettingsStatus.getInstance().setData(statusJson);
2017-06-12 11:15:03 +02:00
if (Config.logIncommingData)
log.debug("Received status: " + statusJson.toString());
2017-06-26 12:44:03 +02:00
Double targetHigh = NSSettingsStatus.getInstance().getThreshold("bgTargetTop");
Double targetlow = NSSettingsStatus.getInstance().getThreshold("bgTargetBottom");
2017-06-21 07:28:04 +02:00
if (targetHigh != null)
OverviewPlugin.bgTargetHigh = targetHigh;
if (targetlow != null)
OverviewPlugin.bgTargetLow = targetlow;
} catch (JSONException e) {
log.error("Unhandled exception", e);
}
}
2016-06-26 14:56:43 +02:00
}
2016-06-27 18:48:48 +02:00
if (intent.getAction().equals(Intents.ACTION_NEW_DEVICESTATUS)) {
2016-10-16 21:11:16 +02:00
try {
if (bundles.containsKey("devicestatus")) {
JSONObject devicestatusJson = new JSONObject(bundles.getString("devicestatus"));
2017-06-26 12:44:03 +02:00
NSDeviceStatus.getInstance().setData(devicestatusJson);
2016-10-16 21:11:16 +02:00
if (devicestatusJson.has("pump")) {
// Objectives 0
ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
ObjectivesPlugin.saveProgress();
}
}
if (bundles.containsKey("devicestatuses")) {
String devicestatusesstring = bundles.getString("devicestatuses");
2016-10-16 21:11:16 +02:00
JSONArray jsonArray = new JSONArray(devicestatusesstring);
2017-06-26 12:44:03 +02:00
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject devicestatusJson = jsonArray.getJSONObject(i);
NSDeviceStatus.getInstance().setData(devicestatusJson);
if (devicestatusJson.has("pump")) {
// Objectives 0
2016-08-10 23:43:08 +02:00
ObjectivesPlugin.pumpStatusIsAvailableInNS = true;
ObjectivesPlugin.saveProgress();
}
}
2016-06-27 18:48:48 +02:00
}
2016-10-16 21:11:16 +02:00
} catch (Exception e) {
log.error("Unhandled exception", e);
2016-06-27 18:48:48 +02:00
}
}
2016-06-07 21:48:17 +02:00
2017-09-24 22:47:18 +02:00
if (intent.getAction().equals(Intents.ACTION_NEW_TREATMENT) || intent.getAction().equals(Intents.ACTION_CHANGED_TREATMENT)) {
2016-06-07 21:48:17 +02:00
try {
if (bundles.containsKey("treatment")) {
JSONObject json = new JSONObject(bundles.getString("treatment"));
2018-04-05 09:39:18 +02:00
handleTreatmentFromNS(json, intent);
2016-06-07 21:48:17 +02:00
}
if (bundles.containsKey("treatments")) {
String trstring = bundles.getString("treatments");
JSONArray jsonArray = new JSONArray(trstring);
for (int i = 0; i < jsonArray.length(); i++) {
2018-04-05 09:39:18 +02:00
JSONObject json = jsonArray.getJSONObject(i);
handleTreatmentFromNS(json, intent);
2016-06-07 21:48:17 +02:00
}
}
2018-04-05 09:39:18 +02:00
} catch (JSONException e) {
log.error("Unhandled exception", e);
2016-06-07 21:48:17 +02:00
}
}
if (intent.getAction().equals(Intents.ACTION_REMOVED_TREATMENT)) {
try {
if (bundles.containsKey("treatment")) {
String trstring = bundles.getString("treatment");
2018-04-05 09:39:18 +02:00
JSONObject json = new JSONObject(trstring);
handleTreatmentFromNS(json);
2016-06-07 21:48:17 +02:00
}
if (bundles.containsKey("treatments")) {
String trstring = bundles.getString("treatments");
2016-06-07 21:48:17 +02:00
JSONArray jsonArray = new JSONArray(trstring);
for (int i = 0; i < jsonArray.length(); i++) {
2018-04-05 09:39:18 +02:00
JSONObject json = jsonArray.getJSONObject(i);
handleTreatmentFromNS(json);
2016-06-07 21:48:17 +02:00
}
}
2018-04-05 09:39:18 +02:00
} catch (JSONException e) {
log.error("Unhandled exception", e);
2016-06-07 21:48:17 +02:00
}
}
if (intent.getAction().equals(Intents.ACTION_NEW_MBG)) {
2017-06-06 08:21:11 +02:00
try {
if (bundles.containsKey("mbg")) {
String mbgstring = bundles.getString("mbg");
2017-06-06 08:21:11 +02:00
JSONObject mbgJson = new JSONObject(mbgstring);
2018-05-29 20:57:55 +02:00
storeMbg(mbgJson);
2017-06-06 08:21:11 +02:00
}
if (bundles.containsKey("mbgs")) {
String sgvstring = bundles.getString("mbgs");
2017-06-06 08:21:11 +02:00
JSONArray jsonArray = new JSONArray(sgvstring);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject mbgJson = jsonArray.getJSONObject(i);
2018-05-29 20:57:55 +02:00
storeMbg(mbgJson);
2017-06-06 08:21:11 +02:00
}
}
} catch (Exception e) {
log.error("Unhandled exception", e);
2017-06-06 08:21:11 +02:00
}
}
2017-10-17 20:55:23 +02:00
2018-01-07 20:24:42 +01:00
if (intent.getAction().equals(Intents.ACTION_NEW_FOOD)
|| intent.getAction().equals(Intents.ACTION_CHANGED_FOOD)) {
2018-03-31 00:36:03 +02:00
int mode = Intents.ACTION_NEW_FOOD.equals(intent.getAction()) ? EventNsFood.ADD : EventNsFood.UPDATE;
EventNsFood evt = new EventNsFood(mode, bundles);
2018-01-07 20:24:42 +01:00
MainApp.bus().post(evt);
2017-10-17 20:55:23 +02:00
}
if (intent.getAction().equals(Intents.ACTION_REMOVED_FOOD)) {
EventNsFood evt = new EventNsFood(EventNsFood.REMOVE, bundles);
2018-01-07 20:24:42 +01:00
MainApp.bus().post(evt);
2017-10-17 20:55:23 +02:00
}
}
2018-04-05 09:39:18 +02:00
private void handleTreatmentFromNS(JSONObject json) {
// new DB model
EventNsTreatment evtTreatment = new EventNsTreatment(EventNsTreatment.REMOVE, json);
MainApp.bus().post(evtTreatment);
// old DB model
String _id = JsonHelper.safeGetString(json, "_id");
MainApp.getDbHelper().deleteTempTargetById(_id);
MainApp.getDbHelper().deleteTempBasalById(_id);
MainApp.getDbHelper().deleteExtendedBolusById(_id);
MainApp.getDbHelper().deleteCareportalEventById(_id);
2017-06-02 10:25:49 +02:00
MainApp.getDbHelper().deleteProfileSwitchById(_id);
}
private void handleTreatmentFromNS(JSONObject json, Intent intent) throws JSONException {
2018-04-05 09:39:18 +02:00
// new DB model
int mode = Intents.ACTION_NEW_TREATMENT.equals(intent.getAction()) ? EventNsTreatment.ADD : EventNsTreatment.UPDATE;
double insulin = JsonHelper.safeGetDouble(json, "insulin");
double carbs = JsonHelper.safeGetDouble(json, "carbs");
String eventType = JsonHelper.safeGetString(json, "eventType");
if (insulin > 0 || carbs > 0) {
EventNsTreatment evtTreatment = new EventNsTreatment(mode, json);
MainApp.bus().post(evtTreatment);
} else if (json.has(DanaRNSHistorySync.DANARSIGNATURE)) {
// old DB model
MainApp.getDbHelper().updateDanaRHistoryRecordId(json);
} else if (eventType.equals(CareportalEvent.TEMPORARYTARGET)) {
MainApp.getDbHelper().createTemptargetFromJsonIfNotExists(json);
} else if (eventType.equals(CareportalEvent.TEMPBASAL)) {
MainApp.getDbHelper().createTempBasalFromJsonIfNotExists(json);
} else if (eventType.equals(CareportalEvent.COMBOBOLUS)) {
MainApp.getDbHelper().createExtendedBolusFromJsonIfNotExists(json);
} else if (eventType.equals(CareportalEvent.PROFILESWITCH)) {
MainApp.getDbHelper().createProfileSwitchFromJsonIfNotExists(json);
} else if (eventType.equals(CareportalEvent.SITECHANGE) ||
eventType.equals(CareportalEvent.INSULINCHANGE) ||
eventType.equals(CareportalEvent.SENSORCHANGE) ||
eventType.equals(CareportalEvent.BGCHECK) ||
eventType.equals(CareportalEvent.NOTE) ||
eventType.equals(CareportalEvent.NONE) ||
eventType.equals(CareportalEvent.ANNOUNCEMENT) ||
eventType.equals(CareportalEvent.QUESTION) ||
eventType.equals(CareportalEvent.EXERCISE) ||
eventType.equals(CareportalEvent.OPENAPSOFFLINE) ||
eventType.equals(CareportalEvent.PUMPBATTERYCHANGE)) {
MainApp.getDbHelper().createCareportalEventFromJsonIfNotExists(json);
2016-07-27 17:49:56 +02:00
}
2018-04-05 09:39:18 +02:00
if (eventType.equals(CareportalEvent.ANNOUNCEMENT)) {
2018-07-27 13:41:25 +02:00
long date = JsonHelper.safeGetLong(json, "mills");
2017-06-15 23:12:12 +02:00
long now = System.currentTimeMillis();
2018-04-05 09:39:18 +02:00
String enteredBy = JsonHelper.safeGetString(json, "enteredBy", "");
String notes = JsonHelper.safeGetString(json, "notes", "");
if (date > now - 15 * 60 * 1000L && !notes.isEmpty()
&& !enteredBy.equals(SP.getString("careportal_enteredby", "AndroidAPS"))) {
Notification announcement = new Notification(Notification.NSANNOUNCEMENT, notes, Notification.ANNOUNCEMENT, 60);
2017-06-06 08:21:11 +02:00
MainApp.bus().post(new EventNewNotification(announcement));
}
}
2017-05-25 20:18:29 +02:00
}
2018-05-29 20:57:55 +02:00
private void storeMbg(JSONObject mbgJson) {
NSMbg nsMbg = new NSMbg(mbgJson);
CareportalEvent careportalEvent = new CareportalEvent(nsMbg);
MainApp.getDbHelper().createOrUpdate(careportalEvent);
if (Config.logIncommingData)
log.debug("Adding/Updating new MBG: " + careportalEvent.log());
}
2016-06-07 21:48:17 +02:00
}