From a8793fa23f5ed60d2c34701f235d4d1005eaab24 Mon Sep 17 00:00:00 2001
From: Lennart Goedhart <lennart@omnibase.com.au>
Date: Sat, 30 Jul 2016 17:05:32 +0800
Subject: [PATCH] - Make the NightscoutUploadIntentService a wakeful service -
 Move the Nightscout upload to the MedtronicCnlIntentService, rather than
 firing from the MainActivity

---
 .../android/medtronic/MainActivity.java       | 63 ++++++-------------
 .../service/MedtronicCnlIntentService.java    | 12 ++++
 .../model/medtronicNg/PumpStatusEvent.java    |  2 +-
 .../NightscoutUploadIntentService.java        | 16 ++++-
 .../nightscout/NightscoutUploadReceiver.java  | 21 +++++++
 5 files changed, 68 insertions(+), 46 deletions(-)
 create mode 100644 app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadReceiver.java

diff --git a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
index 62183de..e52a79b 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
@@ -324,10 +324,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 initialPoll, MedtronicCnlIntentService.POLL_PERIOD_MS, pending);
     }
 
-    private void uploadCgmData() {
-        startService(mNightscoutUploadService);
-    }
-
     private void stopCgmService() {
         Log.i(TAG, "stopCgmService called");
 
@@ -452,7 +448,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                     .equalTo("pumpMac", MainActivity.activePumpMac)
                     .findFirst();
 
-            if (pump != null & pump.isValid()) {
+            if (pump != null && pump.isValid()) {
                 mActivePump = pump;
             }
         }
@@ -485,19 +481,21 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
             TextView textViewTrend = (TextView) findViewById(R.id.textview_trend);
             TextView textViewIOB = (TextView) findViewById(R.id.textview_iob);
 
-            // Get the most recently written CGM record.
+            // Get the most recently written CGM record for the active pump.
+            PumpStatusEvent pumpStatusData = null;
+
+            PumpInfo pump = getActivePump();
+
+            if (pump != null & pump.isValid()) {
+                pumpStatusData = pump.getPumpHistory().last();
+            }
+
             // FIXME - grab the last item from the activePump's getPumpHistory
             RealmResults<PumpStatusEvent> results =
                     mRealm.where(PumpStatusEvent.class)
                             .findAllSorted("eventDate", Sort.ASCENDING);
 
-            PumpStatusEvent pumpRecord = null;
-
-            if (results.size() > 0) {
-                pumpRecord = results.last();
-            }
-
-            if (pumpRecord == null) {
+            if (pumpStatusData == null) {
                 return;
             }
 
@@ -509,33 +507,22 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
 
             String sgvString, units;
             if (prefs.getBoolean("mmolxl", false)) {
-                float fBgValue = (float) pumpRecord.getSgv();
+                float fBgValue = (float) pumpStatusData.getSgv();
                 sgvString = df.format(fBgValue / 18.016f);
                 units = "mmol/L";
                 Log.d(TAG, "mmolxl true --> " + sgvString);
 
             } else {
-                sgvString = String.valueOf(pumpRecord.getSgv());
+                sgvString = String.valueOf(pumpStatusData.getSgv());
                 units = "mg/dL";
                 Log.d(TAG, "mmolxl false --> " + sgvString);
             }
 
             textViewBg.setText(sgvString);
             textViewUnits.setText(units);
-            textViewBgTime.setText(DateUtils.getRelativeTimeSpanString(pumpRecord.getEventDate().getTime()));
-            textViewTrend.setText(Html.fromHtml(renderTrendHtml(pumpRecord.getCgmTrend())));
-            textViewIOB.setText(String.format(Locale.getDefault(), "%.2f", pumpRecord.getActiveInsulin()));
-
-            /*
-            // Open Realm because we're in a different thread
-            Realm realm = Realm.getDefaultInstance();
-            if (MainActivity.mActivePump != null && MainActivity.mActivePump.isValid()) {
-                PumpInfo pump = MainActivity.mActivePump;
-                long pumpMac = pump.getPumpMac();
-                CgmStatusEvent cgmData = MainActivity.mActivePump.getCgmHistory().last();
-            }
-            realm.close();
-            */
+            textViewBgTime.setText(DateUtils.getRelativeTimeSpanString(pumpStatusData.getEventDate().getTime()));
+            textViewTrend.setText(Html.fromHtml(renderTrendHtml(pumpStatusData.getCgmTrend())));
+            textViewIOB.setText(String.format(Locale.getDefault(), "%.2f", pumpStatusData.getActiveInsulin()));
 
             // TODO - waiting for MPAndroidCharts 3.0.0. This will fix:
             // Date support
@@ -580,20 +567,13 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
 
             PumpInfo pump = getActivePump();
 
-            if (pump != null & pump.isValid()) {
-                long pumpMac = pump.getPumpMac();
+            if (pump != null && pump.isValid()) {
                 pumpStatusData = pump.getPumpHistory().last();
+            } else {
+                return;
             }
 
-            if (pumpStatusData != null) {
-                Log.d(TAG, "It's working yo");
-            }
-
-            PumpStatusEvent record = mRealm.where(PumpStatusEvent.class)
-                    .findAll()
-                    .last();
-
-            long nextPoll = record.getEventDate().getTime() + MedtronicCnlIntentService.POLL_GRACE_PERIOD_MS + MedtronicCnlIntentService.POLL_PERIOD_MS;
+            long nextPoll = pumpStatusData.getEventDate().getTime() + MedtronicCnlIntentService.POLL_GRACE_PERIOD_MS + MedtronicCnlIntentService.POLL_PERIOD_MS;
             startCgmService(nextPoll);
             Log.d(TAG, "Next Poll at " + new Date(nextPoll).toString());
 
@@ -617,9 +597,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 });
             }
 
-            // TODO - handle isOffline in NightscoutUploadIntentService?
-            uploadCgmData();
-
             refreshDisplay();
         }
     }
diff --git a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java
index ca0412b..bf3aadc 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java
@@ -1,6 +1,8 @@
 package info.nightscout.android.medtronic.service;
 
+import android.app.AlarmManager;
 import android.app.IntentService;
+import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -25,6 +27,7 @@ import info.nightscout.android.medtronic.message.UnexpectedMessageException;
 import info.nightscout.android.model.medtronicNg.ContourNextLinkInfo;
 import info.nightscout.android.model.medtronicNg.PumpInfo;
 import info.nightscout.android.model.medtronicNg.PumpStatusEvent;
+import info.nightscout.android.upload.nightscout.NightscoutUploadReceiver;
 import io.realm.Realm;
 import io.realm.RealmResults;
 
@@ -267,10 +270,19 @@ public class MedtronicCnlIntentService extends IntentService {
                 realm.close();
             }
 
+            // TODO - set status if offline or Nightscout not reachable
+            uploadToNightscout();
             MedtronicCnlAlarmReceiver.completeWakefulIntent(intent);
         }
     }
 
+    private void uploadToNightscout() {
+        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
+        Intent receiverIntent = new Intent(this, NightscoutUploadReceiver.class);
+        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, receiverIntent, 0);
+        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 1000L, pendingIntent);
+    }
+
     private boolean hasUsbHostFeature() {
         return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_USB_HOST);
     }
diff --git a/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java b/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java
index ac32887..aa8fe1c 100644
--- a/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java
+++ b/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java
@@ -87,7 +87,7 @@ public class PumpStatusEvent extends RealmObject {
         this.reservoirAmount = reservoirAmount;
     }
 
-    public boolean isRecentBolusWizard() {
+    public boolean hasRecentBolusWizard() {
         return recentBolusWizard;
     }
 
diff --git a/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadIntentService.java b/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadIntentService.java
index 477210d..f9a904d 100644
--- a/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadIntentService.java
+++ b/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadIntentService.java
@@ -85,6 +85,8 @@ public class NightscoutUploadIntentService extends IntentService {
         } catch (Exception e) {
             Log.e(TAG, "ERROR uploading data!!!!!", e);
         }
+
+        NightscoutUploadReceiver.completeWakefulIntent(intent);
     }
 
     private void doRESTUpload(SharedPreferences prefs, RealmResults<PumpStatusEvent> records) {
@@ -185,7 +187,7 @@ public class NightscoutUploadIntentService extends IntentService {
 
                 try {
                     // FIXME - Change this to bulk uploads
-                    populateV1APIEntry(json, record);
+                    populateSgvEntry(json, record);
                 } catch (Exception e) {
                     Log.w(TAG, "Unable to populate entry", e);
                     continue;
@@ -264,7 +266,7 @@ public class NightscoutUploadIntentService extends IntentService {
         httpclient.execute(post, responseHandler);
     }
 
-    private void populateV1APIEntry(JSONObject json, PumpStatusEvent pumpRecord) throws Exception {
+    private void populateSgvEntry(JSONObject json, PumpStatusEvent pumpRecord) throws Exception {
         // TODO replace with Retrofit/EntriesSerializer
         json.put("sgv", pumpRecord.getSgv());
         json.put("direction", EntriesSerializer.getDirectionString(pumpRecord.getCgmTrend()));
@@ -272,7 +274,17 @@ public class NightscoutUploadIntentService extends IntentService {
         json.put("type", "sgv");
         json.put("date", pumpRecord.getEventDate().getTime());
         json.put("dateString", pumpRecord.getEventDate());
+    }
 
+    private void populateMbgEntry(JSONObject json, PumpStatusEvent pumpRecord) throws Exception {
+        if(pumpRecord.hasRecentBolusWizard()) {
+            // TODO replace with Retrofit/EntriesSerializer
+            json.put("type", "mbg");
+            json.put("mbg", pumpRecord.getBolusWizardBGL());
+            json.put("device", pumpRecord.getDeviceName());
+            json.put("date", pumpRecord.getEventDate().getTime());
+            json.put("dateString", pumpRecord.getEventDate());
+        }
     }
 
     private boolean isOnline() {
diff --git a/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadReceiver.java b/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadReceiver.java
new file mode 100644
index 0000000..2eb58ca
--- /dev/null
+++ b/app/src/main/java/info/nightscout/android/upload/nightscout/NightscoutUploadReceiver.java
@@ -0,0 +1,21 @@
+package info.nightscout.android.upload.nightscout;
+
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.content.WakefulBroadcastReceiver;
+import android.util.Log;
+
+/**
+ * Created by lgoedhart on 14/07/2016.
+ */
+public class NightscoutUploadReceiver extends WakefulBroadcastReceiver {
+    private static final String TAG = NightscoutUploadReceiver.class.getSimpleName();
+
+    @Override
+    public void onReceive(final Context context, Intent intent) {
+        // Start the IntentService
+        Log.d(TAG, "Received broadcast message");
+        Intent service = new Intent(context, NightscoutUploadIntentService.class);
+        startWakefulService(context, service);
+    }
+}
-- 
GitLab