This repository has been archived by the owner on May 14, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 310
/
Copy pathXDripPlusUploadService.java
229 lines (179 loc) · 8.4 KB
/
XDripPlusUploadService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package info.nightscout.android.xdrip_plus;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import androidx.annotation.NonNull;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONObject;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import info.nightscout.android.R;
import info.nightscout.android.UploaderApplication;
import info.nightscout.android.history.PumpHistoryHandler;
import info.nightscout.android.medtronic.UserLogMessage;
import info.nightscout.android.medtronic.service.MasterService;
import info.nightscout.android.model.medtronicNg.PumpHistoryCGM;
import info.nightscout.android.model.medtronicNg.PumpHistoryInterface;
import info.nightscout.android.model.medtronicNg.PumpStatusEvent;
import info.nightscout.android.model.store.DataStore;
import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;
import static info.nightscout.android.history.PumpHistorySender.SENDER_ID_XDRIP;
import static info.nightscout.android.utils.ToolKit.getWakeLock;
import static info.nightscout.android.utils.ToolKit.releaseWakeLock;
/**
* Created by jamorham on 17/11/2016.
*/
public class XDripPlusUploadService extends Service {
private static final String TAG = XDripPlusUploadService.class.getSimpleName();
private Context mContext;
private Realm mRealm;
private Realm storeRealm;
private DataStore dataStore;
private SimpleDateFormat ISO8601_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
private String device;
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate called");
mContext = this.getBaseContext();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy called");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "Received start id " + startId + " : " + intent);
if (intent != null) {
if (startId == 1)
new Upload().start();
else
Log.d(TAG, "Service already in progress with previous task");
}
return START_NOT_STICKY;
}
private class Upload extends Thread {
public void run() {
PowerManager.WakeLock wl = getWakeLock(mContext, TAG, 90000);
storeRealm = Realm.getInstance(UploaderApplication.getStoreConfiguration());
dataStore = storeRealm.where(DataStore.class).findFirst();
if (dataStore.isEnableXdripPlusUpload()) {
device = "NA";
mRealm = Realm.getDefaultInstance();
PumpHistoryHandler pumpHistoryHandler = new PumpHistoryHandler(mContext);
try {
checkAvailable();
RealmResults<PumpStatusEvent> pumpStatusEvents = mRealm
.where(PumpStatusEvent.class)
.sort("eventDate", Sort.DESCENDING)
.findAll();
if (pumpStatusEvents.size() > 0) {
device = pumpStatusEvents.first().getDeviceName();
doXDripUploadStatus(pumpStatusEvents.first());
}
List<PumpHistoryInterface> records = pumpHistoryHandler.getSenderRecordsREQ(SENDER_ID_XDRIP);
for (PumpHistoryInterface record : records) {
if (((PumpHistoryCGM) record).getSgv() > 0) doXDripUploadCGM((PumpHistoryCGM) record, device);
}
pumpHistoryHandler.setSenderRecordsACK(records, SENDER_ID_XDRIP);
if (!dataStore.isXdripPlusUploadAvailable()) {
UserLogMessage.send(mContext, UserLogMessage.TYPE.SHARE, String.format("{id;%s} {id;%s}",
R.string.ul_share__xdrip, R.string.ul_share__is_available));
storeRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {
dataStore.setXdripPlusUploadAvailable(true);
}
});
}
} catch (Exception e) {
Log.e(TAG, "Error:", e);
UserLogMessage.send(mContext, UserLogMessage.TYPE.WARN, String.format("{id;%s} {id;%s}",
R.string.ul_share__xdrip, R.string.ul_share__is_not_available));
storeRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {
dataStore.setXdripPlusUploadAvailable(false);
}
});
}
pumpHistoryHandler.close();
mRealm.close();
}
storeRealm.close();
releaseWakeLock(wl);
stopSelf();
}
}
private void doXDripUploadCGM(PumpHistoryCGM record, String device) throws Exception {
JSONArray entriesBody = new JSONArray();
JSONObject json = new JSONObject();
json.put("device", device);
json.put("type", "sgv");
json.put("date", record.getEventDate().getTime());
json.put("dateString", record.getEventDate());
json.put("sgv", record.getSgv());
String trend = record.getCgmTrend();
if (trend != null) json.put("direction", PumpHistoryCGM.NS_TREND.valueOf(trend).dexcom().string());
entriesBody.put(json);
sendBundle(mContext, "add", "entries", entriesBody);
}
private void doXDripUploadStatus(PumpStatusEvent record) throws Exception {
final JSONArray devicestatusBody = new JSONArray();
JSONObject json = new JSONObject();
json.put("uploaderBattery", MasterService.getUploaderBatteryLevel());
json.put("device", record.getDeviceName());
json.put("created_at", ISO8601_DATE_FORMAT.format(record.getEventDate()));
JSONObject pumpInfo = new JSONObject();
pumpInfo.put("clock", ISO8601_DATE_FORMAT.format(record.getEventDate()));
pumpInfo.put("reservoir", new BigDecimal(record.getReservoirAmount()).setScale(3, BigDecimal.ROUND_HALF_UP));
JSONObject iob = new JSONObject();
iob.put("timestamp", record.getEventDate());
iob.put("bolusiob", record.getActiveInsulin());
JSONObject battery = new JSONObject();
battery.put("percent", record.getBatteryPercentage());
pumpInfo.put("iob", iob);
pumpInfo.put("battery", battery);
json.put("pump", pumpInfo);
devicestatusBody.put(json);
sendBundle(mContext, "add", "devicestatus", devicestatusBody);
}
private void sendBundle(Context context, String action, String collection, JSONArray json) {
final Bundle bundle = new Bundle();
bundle.putString("action", action);
bundle.putString("collection", collection);
bundle.putString("data", json.toString());
final Intent intent = new Intent(Constants.XDRIP_PLUS_NS_EMULATOR);
intent.putExtras(bundle).addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendBroadcast(intent);
}
private void checkAvailable() throws Exception {
final Intent intent = new Intent(Constants.XDRIP_PLUS_NS_EMULATOR);
List<ResolveInfo> receivers = mContext.getPackageManager().queryBroadcastReceivers(intent, 0);
if (receivers.size() < 1) {
Log.w(TAG, "No xDrip receivers found.");
throw new Exception("No xDrip receivers found.");
} else {
Log.d(TAG, receivers.size() + " xDrip receivers");
}
}
public final class Constants {
public static final String ACTION_STATUS_MESSAGE = "info.nightscout.android.xdrip_plus.STATUS_MESSAGE";
public static final String EXTENDED_DATA = "info.nightscout.android.xdrip_plus.DATA";
private static final String XDRIP_PLUS_NS_EMULATOR = "com.eveningoutpost.dexdrip.NS_EMULATOR";
}
}