From 045bebb3a2021b523631deec76e8b8d47f7112dc Mon Sep 17 00:00:00 2001
From: Lennart Goedhart <lennart@omnibase.com.au>
Date: Sun, 16 Apr 2017 18:57:35 +1000
Subject: [PATCH] =?UTF-8?q?Cleanup=20of=20code=20from=20Android=20Studio?=
 =?UTF-8?q?=E2=80=99s=20=E2=80=9CInspect=20Code=E2=80=9D=20and=20=E2=80=9C?=
 =?UTF-8?q?Code=20Cleanup=E2=80=9D=20tools.=20Beginnings=20of=20Update=20c?=
 =?UTF-8?q?heck=20feature?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../integration/android/IntentIntegrator.java |   6 +-
 .../android/medtronic/MainActivity.java       | 114 ++++++++++--------
 .../android/medtronic/ManageCNLActivity.java  |   6 +-
 .../medtronic/message/BeginEHSMMessage.java   |   4 -
 .../ChannelNegotiateRequestMessage.java       |   3 +-
 .../CloseConnectionRequestMessage.java        |   2 -
 .../CloseConnectionResponseMessage.java       |   1 -
 .../ContourNextLinkCommandMessage.java        |   6 -
 .../message/ContourNextLinkMessage.java       |   1 -
 .../ContourNextLinkRequestMessage.java        |   4 +-
 .../ContourNextLinkResponseMessage.java       |   2 -
 .../medtronic/message/EndEHSMMessage.java     |   5 -
 .../medtronic/message/MessageUtils.java       |   3 +-
 .../message/OpenConnectionRequestMessage.java |   4 -
 .../OpenConnectionResponseMessage.java        |   1 -
 .../PumpBasalPatternRequestMessage.java       |   2 -
 .../message/PumpStatusResponseMessage.java    |  15 +--
 .../ReadHistoryInfoRequestMessage.java        |   2 -
 .../message/ReadInfoRequestMessage.java       |   2 -
 .../message/RequestLinkKeyRequestMessage.java |   4 -
 .../service/MedtronicCnlAlarmManager.java     |   2 -
 .../service/MedtronicCnlAlarmReceiver.java    |   8 --
 .../service/MedtronicCnlIntentService.java    |  64 +++++-----
 .../model/medtronicNg/PumpStatusEvent.java    |  89 +++++++-------
 .../android/settings/SettingsFragment.java    |  12 +-
 .../upload/nightscout/NightScoutUpload.java   |   1 -
 .../NightscoutUploadIntentService.java        |   5 +-
 .../android/utils/ConfigurationStore.java     |   1 -
 .../nightscout/android/utils/DataStore.java   |  13 +-
 .../nightscout/android/utils/HexDump.java     |  54 +++++----
 .../XDripPlusUploadIntentService.java         |   5 +-
 .../info/nightscout/api/DeviceEndpoints.java  |   1 -
 app/src/main/res/layout/activity_main.xml     |  13 +-
 app/src/main/res/layout/activity_status.xml   |   2 +-
 app/src/main/res/layout/cnl_item.xml          |   1 +
 35 files changed, 200 insertions(+), 258 deletions(-)

diff --git a/app/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java b/app/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
index 4eb5681..3924ee0 100644
--- a/app/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
+++ b/app/src/main/java/com/google/zxing/integration/android/IntentIntegrator.java
@@ -147,7 +147,7 @@ public class IntentIntegrator {
   private String buttonYes;
   private String buttonNo;
   private List<String> targetApplications;
-  private final Map<String,Object> moreExtras = new HashMap<String,Object>(3);
+  private final Map<String,Object> moreExtras = new HashMap<>(3);
 
   /**
    * @param activity {@link Activity} invoking the integration
@@ -320,7 +320,7 @@ public class IntentIntegrator {
     }
     intentScan.setPackage(targetAppPackage);
     intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-    intentScan.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intentScan.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
     attachMoreExtras(intentScan);
     startActivityForResult(intentScan, REQUEST_CODE);
     return null;
@@ -466,7 +466,7 @@ public class IntentIntegrator {
     }
     intent.setPackage(targetAppPackage);
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
-    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
     attachMoreExtras(intent);
     if (fragment == null) {
       activity.startActivity(intent);
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 7634801..18351da 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
@@ -114,8 +114,8 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
      */
     public static long getNextPoll(PumpStatusEvent pumpStatusData) {
         long nextPoll = pumpStatusData.getEventDate().getTime() + pumpStatusData.getPumpTimeOffset(),
-            now = System.currentTimeMillis(),
-            pollInterval = ConfigurationStore.getInstance().getPollInterval();
+                now = System.currentTimeMillis(),
+                pollInterval = ConfigurationStore.getInstance().getPollInterval();
 
         // align to next poll slot
         if (nextPoll + 2 * 60 * 60 * 1000 < now) { // last event more than 2h old -> could be a calibration
@@ -262,16 +262,24 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 .withSelectable(false);
         final PrimaryDrawerItem itemStopCollecting = new PrimaryDrawerItem()
                 .withName("Stop collecting data")
-                .withIcon(GoogleMaterial.Icon.gmd_stop)
+                .withIcon(GoogleMaterial.Icon.gmd_power_settings_new)
                 .withSelectable(false);
         final PrimaryDrawerItem itemGetNow = new PrimaryDrawerItem()
                 .withName("Read data now")
-                .withIcon(GoogleMaterial.Icon.gmd_play_arrow)
+                .withIcon(GoogleMaterial.Icon.gmd_refresh)
+                .withSelectable(false);
+        final PrimaryDrawerItem itemUpdateProfile = new PrimaryDrawerItem()
+                .withName("Update Profile")
+                .withIcon(GoogleMaterial.Icon.gmd_insert_chart)
                 .withSelectable(false);
         final PrimaryDrawerItem itemClearLog = new PrimaryDrawerItem()
                 .withName("Clear Log")
                 .withIcon(GoogleMaterial.Icon.gmd_clear_all)
                 .withSelectable(false);
+        final PrimaryDrawerItem itemCheckForUpdate = new PrimaryDrawerItem()
+                .withName("Check For Update")
+                .withIcon(GoogleMaterial.Icon.gmd_update)
+                .withSelectable(false);
 
         new DrawerBuilder()
                 .withActivity(this)
@@ -286,10 +294,12 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 .withSelectedItem(-1)
                 .addDrawerItems(
                         itemSettings,
+                        itemUpdateProfile,
                         itemRegisterUsb,
-                        itemStopCollecting,
+                        itemCheckForUpdate,
+                        itemClearLog,
                         itemGetNow,
-                        itemClearLog
+                        itemStopCollecting
                 )
                 .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                     @Override
@@ -307,6 +317,8 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                             startCgmService(0);
                         } else if (drawerItem.equals(itemClearLog)) {
                             clearLogText();
+                        } else if (drawerItem.equals(itemCheckForUpdate)) {
+                            checkForUpdate(1);
                         }
 
                         return false;
@@ -351,20 +363,28 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
         mChart.getGridLabelRenderer().setNumHorizontalLabels(6);
         mChart.getGridLabelRenderer().setHumanRounding(false);
 
-        mChart.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter() {
-            DateFormat mFormat = new SimpleDateFormat("HH:mm");  // 24 hour format forced to fix label overlap
+        mChart.getGridLabelRenderer().setLabelFormatter(
+                new DefaultLabelFormatter() {
+                    DateFormat mFormat = new SimpleDateFormat("HH:mm", Locale.US);  // 24 hour format forced to fix label overlap
 
-            @Override
-            public String formatLabel(double value, boolean isValueX) {
-                if (isValueX) {
-                    return mFormat.format(new Date((long) value));
-                } else {
-                        return sgvFormatter.format(value);
+                    @Override
+                    public String formatLabel(double value, boolean isValueX) {
+                        if (isValueX) {
+                            return mFormat.format(new Date((long) value));
+                        } else {
+                            return sgvFormatter.format(value);
+                        }
+                    }
                 }
-            }}
         );
     }
 
+    @Override
+    protected void onStart() {
+        super.onStart();
+        checkForUpdate(5);
+    }
+
     @Override
     protected void onPostCreate(Bundle savedInstanceState) {
         super.onPostCreate(savedInstanceState);
@@ -430,7 +450,19 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
 
     private void clearLogText() {
         statusMessageReceiver.clearMessages();
-        //mTextViewLog.setText("", BufferType.EDITABLE);
+    }
+
+    private void checkForUpdate(int checkEvery) {
+        /*
+        new AppUpdater(this)
+                .setUpdateFrom(UpdateFrom.JSON)
+                .setUpdateXML("https://raw.githubusercontent.com/javiersantos/AppUpdater/master/app/update-changelog.json")
+//                .setUpdateXML("https://raw.githubusercontent.com/javiersantos/AppUpdater/master/app/update.json")
+                .setDisplay(Display.DIALOG)
+                .showEvery(checkEvery)
+                .showAppUpdated(true)
+                .start();
+          */
     }
 
     private void startDisplayRefreshLoop() {
@@ -452,7 +484,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
         if (results.size() > 0) {
             startCgmService(getNextPoll(results.first()) + delay);
         } else {
-            startCgmService(System.currentTimeMillis() + (delay==0?1000:delay));
+            startCgmService(System.currentTimeMillis() + (delay == 0 ? 1000 : delay));
         }
     }
 
@@ -468,10 +500,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
         MedtronicCnlAlarmManager.setAlarm(initialPoll);
     }
 
-    private void uploadCgmData() {
-        startService(mNightscoutUploadService);
-    }
-
     private void stopCgmService() {
         Log.i(TAG, "stopCgmService called");
         MedtronicCnlAlarmManager.cancelAlarm();
@@ -607,7 +635,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
         if (activePumpMac != 0L && (mActivePump == null || !mActivePump.isValid() || mActivePump.getPumpMac() != activePumpMac)) {
             if (mActivePump != null) {
                 // remove listener on old pump
-                mActivePump.removeChangeListeners();
+                mActivePump.removeAllChangeListeners();
                 mActivePump = null;
             }
 
@@ -620,6 +648,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 mActivePump = pump;
                 mActivePump.addChangeListener(new RealmChangeListener<PumpInfo>() {
                     long lastQueryTS = 0;
+
                     @Override
                     public void onChange(PumpInfo pump) {
                         // prevent double updating after deleting old events below
@@ -664,37 +693,21 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
             private long timestamp;
             private String message;
 
-            public StatusMessage(String message) {
+            StatusMessage(String message) {
                 this(System.currentTimeMillis(), message);
             }
 
-            public StatusMessage(long timestamp, String message) {
+            StatusMessage(long timestamp, String message) {
                 this.timestamp = timestamp;
                 this.message = message;
             }
 
-            public long getTimestamp() {
-                return timestamp;
-            }
-
-            public void setTimestamp(long timestamp) {
-                this.timestamp = timestamp;
-            }
-
-            public String getMessage() {
-                return message;
-            }
-
-            public void setMessage(String message) {
-                this.message = message;
-            }
-
             public String toString() {
                 return DateFormat.getTimeInstance(DateFormat.MEDIUM).format(timestamp) + ": " + message;
             }
         }
 
-        private Queue<StatusMessage> messages = new ArrayBlockingQueue<>(400);
+        private final Queue<StatusMessage> messages = new ArrayBlockingQueue<>(400);
 
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -730,7 +743,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
     private class RefreshDisplayRunnable implements Runnable {
         @Override
         public void run() {
-            // UI elements - TODO do these need to be members?
             TextView textViewBg = (TextView) findViewById(R.id.textview_bg);
             TextView textViewBgTime = (TextView) findViewById(R.id.textview_bg_time);
             TextView textViewUnits = (TextView) findViewById(R.id.textview_units);
@@ -753,7 +765,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
             }
 
             updateChart(mRealm.where(PumpStatusEvent.class)
-                    .greaterThan("eventDate", new Date(System.currentTimeMillis() - 1000*60*60*24))
+                    .greaterThan("eventDate", new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24))
                     .findAllSorted("eventDate", Sort.ASCENDING));
 
             if (pumpStatusData != null) {
@@ -769,6 +781,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
 
                 textViewBg.setText(sgvString);
                 textViewBgTime.setText(DateUtils.getRelativeTimeSpanString(pumpStatusData.getEventDate().getTime()));
+
                 textViewTrend.setText(Html.fromHtml(renderTrendHtml(pumpStatusData.getCgmTrend())));
                 textViewIOB.setText(String.format(Locale.getDefault(), "%.2f", pumpStatusData.getActiveInsulin()));
 
@@ -833,13 +846,10 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
             }
 
             DataPoint[] entries = new DataPoint[size];
-            final long left = System.currentTimeMillis() - chartZoom * 60 * 60 * 1000;
 
             int pos = 0;
-            for (PumpStatusEvent pumpStatus: results) {
+            for (PumpStatusEvent pumpStatus : results) {
                 // turn your data into Entry objects
-                int sgv = pumpStatus.getSgv();
-
                 if (configurationStore.isMmolxl()) {
                     entries[pos++] = new DataPoint(pumpStatus.getEventDate(), (float) pumpStatus.getSgv() / MMOLXLFACTOR);
                 } else {
@@ -879,11 +889,11 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                     public void draw(Canvas canvas, Paint paint, float x, float y, DataPointInterface dataPoint) {
                         double sgv = dataPoint.getY();
                         boolean mmolxl = configurationStore.isMmolxl();
-                        if (sgv < (mmolxl?4.5:80))
+                        if (sgv < (mmolxl ? 4.5 : 80))
                             paint.setColor(Color.RED);
-                        else if (sgv <= (mmolxl?10:180))
+                        else if (sgv <= (mmolxl ? 10 : 180))
                             paint.setColor(Color.GREEN);
-                        else if (sgv <= (mmolxl?14:260))
+                        else if (sgv <= (mmolxl ? 14 : 260))
                             paint.setColor(Color.YELLOW);
                         else
                             paint.setColor(Color.RED);
@@ -899,7 +909,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 }
             }
 
-            // set vieport to latest SGV
+            // set viewport to latest SGV
             long lastSGVTimestamp = (long) mChart.getSeries().get(0).getHighestValueX();
             if (!hasZoomedChart) {
                 mChart.getViewport().setMaxX(lastSGVTimestamp);
@@ -968,7 +978,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
             if (arg1.getAction().equalsIgnoreCase(Intent.ACTION_BATTERY_LOW)
                     || arg1.getAction().equalsIgnoreCase(Intent.ACTION_BATTERY_CHANGED)
                     || arg1.getAction().equalsIgnoreCase(Intent.ACTION_BATTERY_OKAY)) {
-                dataStore.setUplooaderBatteryLevel(arg1.getIntExtra(BatteryManager.EXTRA_LEVEL, 0));
+                dataStore.setUploaderBatteryLevel(arg1.getIntExtra(BatteryManager.EXTRA_LEVEL, 0));
             }
         }
     }
diff --git a/app/src/main/java/info/nightscout/android/medtronic/ManageCNLActivity.java b/app/src/main/java/info/nightscout/android/medtronic/ManageCNLActivity.java
index 095b812..78d5547 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/ManageCNLActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/ManageCNLActivity.java
@@ -1,10 +1,8 @@
 package info.nightscout.android.medtronic;
 
 import android.content.Context;
-import android.content.DialogInterface;
 import android.graphics.Color;
 import android.os.Bundle;
-import android.support.v7.app.AlertDialog;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
 import android.view.LayoutInflater;
@@ -57,7 +55,7 @@ public class ManageCNLActivity extends AppCompatActivity {
         mRealm = Realm.getDefaultInstance();
 
         //generate list
-        ArrayList<ContourNextLinkInfo> list = new ArrayList<ContourNextLinkInfo>();
+        ArrayList<ContourNextLinkInfo> list = new ArrayList<>();
 
         list.addAll(mRealm.where(ContourNextLinkInfo.class).findAll());
 
@@ -123,7 +121,7 @@ public class ManageCNLActivity extends AppCompatActivity {
             View view = convertView;
             if (view == null) {
                 LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-                view = inflater.inflate(R.layout.cnl_item, null);
+                view = inflater.inflate(R.layout.cnl_item, parent, false);
             }
 
             //Handle TextView and display string from your list
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/BeginEHSMMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/BeginEHSMMessage.java
index 3902beb..7a2d11b 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/BeginEHSMMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/BeginEHSMMessage.java
@@ -1,9 +1,5 @@
 package info.nightscout.android.medtronic.message;
 
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ChannelNegotiateRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ChannelNegotiateRequestMessage.java
index 84dc029..abf2348 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ChannelNegotiateRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ChannelNegotiateRequestMessage.java
@@ -31,9 +31,8 @@ public class ChannelNegotiateRequestMessage extends MedtronicRequestMessage<Chan
         readMessage(mDevice);
         // The 0x80 message
         Log.d(TAG, "negotiateChannel: Reading 0x80 message");
-        ChannelNegotiateResponseMessage response = this.getResponse(readMessage(mDevice));
 
-        return response;
+        return this.getResponse(readMessage(mDevice));
     }
 
     @Override
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java
index bc656cb..9122793 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java
@@ -1,9 +1,7 @@
 package info.nightscout.android.medtronic.message;
 
 import java.io.IOException;
-import java.util.concurrent.TimeoutException;
 
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionResponseMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionResponseMessage.java
index d1d101e..7f189e3 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionResponseMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionResponseMessage.java
@@ -1,6 +1,5 @@
 package info.nightscout.android.medtronic.message;
 
-import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
 
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java
index 36b7530..7a948f0 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkCommandMessage.java
@@ -1,12 +1,6 @@
 package info.nightscout.android.medtronic.message;
 
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.exception.ChecksumException;
-import info.nightscout.android.medtronic.exception.EncryptionException;
-import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
 
 /**
  * Created by lgoedhart on 26/03/2016.
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkMessage.java
index 8c340cb..beeb024 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkMessage.java
@@ -8,7 +8,6 @@ import java.nio.ByteBuffer;
 import java.util.concurrent.TimeoutException;
 
 import info.nightscout.android.USB.UsbHidDriver;
-import info.nightscout.android.medtronic.MainActivity;
 import info.nightscout.android.utils.HexDump;
 
 /**
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkRequestMessage.java
index cd25fed..681bd90 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkRequestMessage.java
@@ -36,10 +36,8 @@ public abstract class ContourNextLinkRequestMessage<T> extends ContourNextLinkMe
             }
         }
 
-        T response = this.getResponse(readMessage(mDevice)); //new ContourNextLinkCommandResponse();
-
         // FIXME - We need to care what the response message is - wrong MAC and all that
-        return response;
+        return this.getResponse(readMessage(mDevice));
     }
 
     protected abstract <T> T getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException, UnexpectedMessageException, TimeoutException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkResponseMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkResponseMessage.java
index d20a561..614a2c4 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkResponseMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkResponseMessage.java
@@ -1,8 +1,6 @@
 package info.nightscout.android.medtronic.message;
 
-import java.io.IOException;
 import java.util.Locale;
-import java.util.concurrent.TimeoutException;
 
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/EndEHSMMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/EndEHSMMessage.java
index 5335d4c..bb68120 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/EndEHSMMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/EndEHSMMessage.java
@@ -1,13 +1,8 @@
 package info.nightscout.android.medtronic.message;
 
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
-import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
 
 /**
  * Created by lgoedhart on 26/03/2016.
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/MessageUtils.java b/app/src/main/java/info/nightscout/android/medtronic/message/MessageUtils.java
index 5b80080..f5a80e0 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/MessageUtils.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/MessageUtils.java
@@ -66,7 +66,6 @@ public class MessageUtils {
         // However, the time the pump *means* is Fri, 13 May 2016 21:07:48 in our own timezone
         long offsetFromUTC = currentTz.getOffset(Calendar.getInstance().getTimeInMillis());
 
-        Date pumpDate = new Date((( baseTime + rtc + offset ) * 1000 ) - offsetFromUTC );
-        return pumpDate;
+        return new Date((( baseTime + rtc + offset ) * 1000 ) - offsetFromUTC );
     }
 }
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionRequestMessage.java
index 8586986..8083247 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionRequestMessage.java
@@ -1,9 +1,5 @@
 package info.nightscout.android.medtronic.message;
 
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionResponseMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionResponseMessage.java
index 1f8e6df..d20c421 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionResponseMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/OpenConnectionResponseMessage.java
@@ -1,6 +1,5 @@
 package info.nightscout.android.medtronic.message;
 
-import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
 
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/PumpBasalPatternRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/PumpBasalPatternRequestMessage.java
index aa71df2..18be618 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/PumpBasalPatternRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/PumpBasalPatternRequestMessage.java
@@ -1,9 +1,7 @@
 package info.nightscout.android.medtronic.message;
 
 import java.io.IOException;
-import java.util.concurrent.TimeoutException;
 
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusResponseMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusResponseMessage.java
index 31b6667..6a70ee7 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusResponseMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusResponseMessage.java
@@ -6,7 +6,6 @@ import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Date;
-import java.util.Locale;
 
 import info.nightscout.android.BuildConfig;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
@@ -47,9 +46,6 @@ public class PumpStatusResponseMessage extends MedtronicSendMessageResponseMessa
     private boolean recentBolusWizard; // Whether a bolus wizard has been run recently
     private int bolusWizardBGL; // in mg/dL. 0 means no recent bolus wizard reading.
 
-    private long rtc;
-    private long offset;
-
     protected PumpStatusResponseMessage(MedtronicCnlSession pumpSession, byte[] payload) throws EncryptionException, ChecksumException, UnexpectedMessageException {
         super(pumpSession, payload);
 
@@ -115,6 +111,8 @@ public class PumpStatusResponseMessage extends MedtronicSendMessageResponseMessa
 
         // CGM SGV
         sgv = (statusBuffer.getShort(0x35) & 0x0000ffff); // In mg/DL. 0 means no CGM reading
+        long rtc;
+        long offset;
         if ((sgv & 0x200) == 0x200) {
             // Sensor error. Let's reset. FIXME - solve this more elegantly later
             sgv = 0;
@@ -128,7 +126,6 @@ public class PumpStatusResponseMessage extends MedtronicSendMessageResponseMessa
         }
 
         // SGV Date
-        // TODO - this should go in the sgvDate, and eventDate should be the time of this poll.
         sgvDate = MessageUtils.decodeDateTime(rtc, offset);
         Log.d(TAG, "original sgv date: " + sgvDate);
 
@@ -184,13 +181,10 @@ public class PumpStatusResponseMessage extends MedtronicSendMessageResponseMessa
         // Active insulin
         pumpRecord.setActiveInsulin(activeInsulin);
 
-        // CGM SGV
+        // CGM SGV data
         pumpRecord.setSgv(sgv);
         pumpRecord.setSgvDate(new Date(sgvDate.getTime() - pumpRecord.getPumpTimeOffset()));
-
-        // SGV Date
         pumpRecord.setCgmTrend(cgmTrend);
-        pumpRecord.setEventDate(new Date(sgvDate.getTime() - pumpRecord.getPumpTimeOffset()));
 
         // Predictive low suspend
         // TODO - there is more status info in this byte other than just a boolean yes/no
@@ -198,7 +192,8 @@ public class PumpStatusResponseMessage extends MedtronicSendMessageResponseMessa
 
         // Recent Bolus Wizard BGL
         pumpRecord.setRecentBolusWizard(recentBolusWizard);
-        if (/*recentBolusWizard && */activeInsulin > DataStore.getInstance().getLastPumpStatus().getActiveInsulin()) {  // there is a BolusWizard usage & the IOB increaseed
+        // there is a BolusWizard usage & the IOB increased
+        if (activeInsulin > DataStore.getInstance().getLastPumpStatus().getActiveInsulin()) {
             pumpRecord.setBolusWizardBGL(bolusWizardBGL); // In mg/DL
         } else {
             pumpRecord.setBolusWizardBGL(0); // In mg/DL
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ReadHistoryInfoRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ReadHistoryInfoRequestMessage.java
index ff7a2f6..c64ba27 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ReadHistoryInfoRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ReadHistoryInfoRequestMessage.java
@@ -1,9 +1,7 @@
 package info.nightscout.android.medtronic.message;
 
 import java.io.IOException;
-import java.util.concurrent.TimeoutException;
 
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ReadInfoRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ReadInfoRequestMessage.java
index c357cd5..01c63ce 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ReadInfoRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ReadInfoRequestMessage.java
@@ -1,9 +1,7 @@
 package info.nightscout.android.medtronic.message;
 
 import java.io.IOException;
-import java.util.concurrent.TimeoutException;
 
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/RequestLinkKeyRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/RequestLinkKeyRequestMessage.java
index bc2d018..1814fe8 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/RequestLinkKeyRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/RequestLinkKeyRequestMessage.java
@@ -1,9 +1,5 @@
 package info.nightscout.android.medtronic.message;
 
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
-import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmManager.java b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmManager.java
index b4f2e15..358cc20 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmManager.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmManager.java
@@ -5,12 +5,10 @@ import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Build;
-import android.support.v4.content.WakefulBroadcastReceiver;
 import android.util.Log;
 
 import java.util.Date;
 
-import info.nightscout.android.medtronic.MainActivity;
 import info.nightscout.android.utils.ConfigurationStore;
 
 /**
diff --git a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmReceiver.java b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmReceiver.java
index d86076c..ad90871 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmReceiver.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlAlarmReceiver.java
@@ -1,20 +1,12 @@
 package info.nightscout.android.medtronic.service;
 
-import android.app.Activity;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
-import android.os.Build;
-import android.preference.PreferenceManager;
 import android.support.v4.content.WakefulBroadcastReceiver;
 import android.util.Log;
 
 import java.util.Date;
 
-import info.nightscout.android.medtronic.MainActivity;
-
 /**
  * Created by lgoedhart on 14/07/2016.
  */
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 befd34c..52d5c59 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
@@ -165,7 +165,7 @@ public class MedtronicCnlIntentService extends IntentService {
             return;
         }
 
-        DateFormat df = new SimpleDateFormat("HH:mm:ss");
+        DateFormat df = new SimpleDateFormat("HH:mm:ss", Locale.US);
 
         MedtronicCnlReader cnlReader = new MedtronicCnlReader(mHidDevice);
 
@@ -225,7 +225,7 @@ public class MedtronicCnlIntentService extends IntentService {
                 if (radioChannel == 0) {
                     sendStatus("Could not communicate with the pump. Is it nearby?");
                     Log.i(TAG, "Could not communicate with the pump. Is it nearby?");
-                    pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L); // reduce polling interval to half until pump is available
+                    pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway() ? 2L : 1L); // reduce polling interval to half until pump is available
                 } else {
                     dataStore.setActivePumpMac(pumpMAC);
 
@@ -251,36 +251,27 @@ public class MedtronicCnlIntentService extends IntentService {
                     pumpRecord.setPumpDate(new Date(pumpTime - pumpOffset));
                     cnlReader.updatePumpStatus(pumpRecord);
 
-                    if (pumpRecord.getSgv() != 0) {
-                        String offsetSign = "";
-                        if (pumpOffset > 0) {
-                            offsetSign = "+";
-                        }
-                        sendStatus("SGV: " + MainActivity.strFormatSGV(pumpRecord.getSgv()) + "  At: " + df.format(pumpRecord.getEventDate().getTime()) + "  Pump: " + offsetSign + (pumpOffset / 1000L) + "sec");  //note: event time is currently stored with offset
-
-                        // Check if pump sent old event when new expected and schedule a re-poll
-                        if (((pumpRecord.getEventDate().getTime() - dataStore.getLastPumpStatus().getEventDate().getTime()) < 5000L) && ((timePollExpected - timePollStarted) < 5000L)) {
-                            pollInterval = 90000L; // polling interval set to 90 seconds
-                            sendStatus("Pump sent old SGV event, re-polling...");
-                        }
-
-                        //MainActivity.timeLastGoodSGV =  pumpRecord.getEventDate().getTime(); // track last good sgv event time
-                        //MainActivity.pumpBattery =  pumpRecord.getBatteryPercentage(); // track pump battery
-                        dataStore.clearUnavailableSGVCount(); // reset unavailable sgv count
-
-                        // Check that the record doesn't already exist before committing
-                        RealmResults<PumpStatusEvent> checkExistingRecords = activePump.getPumpHistory()
-                                .where()
-                                .equalTo("eventDate", pumpRecord.getEventDate())    // >>>>>>> check as event date may not = exact pump event date due to it being stored with offset added this could lead to dup events due to slight variability in time offset
-                                .equalTo("sgv", pumpRecord.getSgv())
-                                .findAll();
+                    String offsetSign = "";
+                    if (pumpOffset > 0) {
+                        offsetSign = "+";
+                    }
+                    sendStatus("SGV: " + MainActivity.strFormatSGV(pumpRecord.getSgv()) + "  At: " + df.format(pumpRecord.getEventDate().getTime()) + "  Pump: " + offsetSign + (pumpOffset / 1000L) + "sec");  //note: event time is currently stored with offset
+
+                    // Check if pump sent old event when new expected and schedule a re-poll
+                    if (pumpRecord != null &&
+                            dataStore.getLastPumpStatus() != null &&
+                            dataStore.getLastPumpStatus().getPumpDate() != null &&
+                            ((pumpRecord.getPumpDate().getTime() - dataStore.getLastPumpStatus().getPumpDate().getTime()) < 5000L) &&
+                            ((timePollExpected - timePollStarted) < 5000L)) {
+                        pollInterval = 90000L; // polling interval set to 90 seconds
+                        sendStatus("Pump sent old SGV event, re-polling...");
+                    }
 
-                        // There should be the 1 record we've already added in this transaction.
-                        if (checkExistingRecords.size() == 0) {
-                            activePump.getPumpHistory().add(pumpRecord);
-                            dataStore.setLastPumpStatus(pumpRecord);
-                        }
+                    activePump.getPumpHistory().add(pumpRecord);
+                    dataStore.setLastPumpStatus(pumpRecord);
 
+                    if (pumpRecord.getSgv() != 0) {
+                        dataStore.clearUnavailableSGVCount(); // reset unavailable sgv count
                     } else {
                         sendStatus("SGV: unavailable from pump");
                         dataStore.incUnavailableSGVCount(); // poll clash detection
@@ -294,11 +285,11 @@ public class MedtronicCnlIntentService extends IntentService {
             } catch (UnexpectedMessageException e) {
                 Log.e(TAG, "Unexpected Message", e);
                 sendStatus("Communication Error: " + e.getMessage());
-                pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L);
+                pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway() ? 2L : 1L);
             } catch (TimeoutException e) {
                 Log.e(TAG, "Timeout communicating with the Contour Next Link.", e);
                 sendStatus("Timeout communicating with the Contour Next Link.");
-                pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L);
+                pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway() ? 2L : 1L);
             } catch (NoSuchAlgorithmException e) {
                 Log.e(TAG, "Could not determine CNL HMAC", e);
                 sendStatus("Error connecting to Contour Next Link: Hashing error.");
@@ -307,7 +298,8 @@ public class MedtronicCnlIntentService extends IntentService {
                     cnlReader.closeConnection();
                     cnlReader.endPassthroughMode();
                     cnlReader.endControlMode();
-                } catch (NoSuchAlgorithmException e) {}
+                } catch (NoSuchAlgorithmException e) {
+                }
 
             }
         } catch (IOException e) {
@@ -352,9 +344,8 @@ public class MedtronicCnlIntentService extends IntentService {
             if (dataStore.getUnavailableSGVCount() > 0) {
                 if (timeLastGoodSGV == 0) {
                     nextRequestedPollTime += POLL_PERIOD_MS / 5L; // if there is a uploader/sensor poll clash on startup then this will push the next attempt out by 60 seconds
-                }
-                else if (dataStore.getUnavailableSGVCount() > 2) {
-                    sendStatus("Warning: No SGV available from pump for " +dataStore.getUnavailableSGVCount() + " attempts");
+                } else if (dataStore.getUnavailableSGVCount() > 2) {
+                    sendStatus("Warning: No SGV available from pump for " + dataStore.getUnavailableSGVCount() + " attempts");
                     nextRequestedPollTime += ((long) ((dataStore.getUnavailableSGVCount() - 2) % 5)) * (POLL_PERIOD_MS / 10L); // adjust poll time in 1/10 steps to avoid potential poll clash (max adjustment at 5/10)
                 }
             }
@@ -402,7 +393,6 @@ public class MedtronicCnlIntentService extends IntentService {
         public static final String ACTION_STATUS_MESSAGE = "info.nightscout.android.medtronic.service.STATUS_MESSAGE";
         public static final String ACTION_NO_USB_PERMISSION = "info.nightscout.android.medtronic.service.NO_USB_PERMISSION";
         public static final String ACTION_USB_PERMISSION = "info.nightscout.android.medtronic.USB_PERMISSION";
-        public static final String ACTION_REFRESH_DATA = "info.nightscout.android.medtronic.service.CGM_DATA";
         public static final String ACTION_USB_REGISTER = "info.nightscout.android.medtronic.USB_REGISTER";
         public static final String ACTION_UPDATE_PUMP = "info.nightscout.android.medtronic.UPDATE_PUMP";
 
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 052733e..91f042b 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
@@ -9,7 +9,7 @@ import io.realm.annotations.Index;
 /**
  * Created by lgoedhart on 4/06/2016.
  */
-public class PumpStatusEvent extends RealmObject  {
+public class PumpStatusEvent extends RealmObject {
     @Index
     private Date eventDate; // The actual time of the event (assume the capture device eventDate/time is accurate)
     private Date pumpDate; // The eventDate/time on the pump at the time of the event
@@ -45,13 +45,16 @@ public class PumpStatusEvent extends RealmObject  {
     @Index
     private boolean uploaded = false;
 
+    public PumpStatusEvent() {
+        // The the eventDate to now.
+        this.eventDate = new Date();
+    }
+
     public Date getEventDate() {
         return eventDate;
     }
 
-    public void setEventDate(Date eventDate) {
-        this.eventDate = eventDate;
-    }
+    // No EventDate setter. The eventDate is set at the time that the PumpStatusEvent is created.
 
     public Date getPumpDate() {
         return pumpDate;
@@ -78,7 +81,15 @@ public class PumpStatusEvent extends RealmObject  {
     }
 
     public CGM_TREND getCgmTrend() {
-        return CGM_TREND.valueOf(cgmTrend);
+        if (cgmTrend == null) {
+            return CGM_TREND.NOT_SET;
+        } else {
+            return CGM_TREND.valueOf(cgmTrend);
+        }
+    }
+
+    public void setCgmTrend(String cgmTrend) {
+        this.cgmTrend = cgmTrend;
     }
 
     public String getCgmTrendString() {
@@ -92,10 +103,6 @@ public class PumpStatusEvent extends RealmObject  {
             this.cgmTrend = CGM_TREND.NOT_SET.name();
     }
 
-    public void setCgmTrend(String cgmTrend) {
-        this.cgmTrend = cgmTrend;
-    }
-
     public float getActiveInsulin() {
         return activeInsulin;
     }
@@ -268,6 +275,38 @@ public class PumpStatusEvent extends RealmObject  {
         this.pumpTimeOffset = pumpTimeOffset;
     }
 
+    @Override
+    public String toString() {
+        return "PumpStatusEvent{" +
+                "eventDate=" + eventDate +
+                ", pumpDate=" + pumpDate +
+                ", deviceName='" + deviceName + '\'' +
+                ", suspended=" + suspended +
+                ", bolusing=" + bolusing +
+                ", deliveringInsulin=" + deliveringInsulin +
+                ", tempBasalActive=" + tempBasalActive +
+                ", cgmActive=" + cgmActive +
+                ", activeBasalPattern=" + activeBasalPattern +
+                ", basalRate=" + basalRate +
+                ", tempBasalRate=" + tempBasalRate +
+                ", tempBasalPercentage=" + tempBasalPercentage +
+                ", tempBasalMinutesRemaining=" + tempBasalMinutesRemaining +
+                ", basalUnitsDeliveredToday=" + basalUnitsDeliveredToday +
+                ", batteryPercentage=" + batteryPercentage +
+                ", reservoirAmount=" + reservoirAmount +
+                ", minutesOfInsulinRemaining=" + minutesOfInsulinRemaining +
+                ", activeInsulin=" + activeInsulin +
+                ", sgv=" + sgv +
+                ", sgvDate=" + sgvDate +
+                ", lowSuspendActive=" + lowSuspendActive +
+                ", cgmTrend='" + cgmTrend + '\'' +
+                ", recentBolusWizard=" + recentBolusWizard +
+                ", bolusWizardBGL=" + bolusWizardBGL +
+                ", pumpTimeOffset=" + pumpTimeOffset +
+                ", uploaded=" + uploaded +
+                '}';
+    }
+
     public enum CGM_TREND {
         NONE,
         DOUBLE_UP,
@@ -302,37 +341,5 @@ public class PumpStatusEvent extends RealmObject  {
             }
         }
     }
-    
-    @Override
-    public String toString() {
-        return "PumpStatusEvent{" +
-                "eventDate=" + eventDate +
-                ", pumpDate=" + pumpDate +
-                ", deviceName='" + deviceName + '\'' +
-                ", suspended=" + suspended +
-                ", bolusing=" + bolusing +
-                ", deliveringInsulin=" + deliveringInsulin +
-                ", tempBasalActive=" + tempBasalActive +
-                ", cgmActive=" + cgmActive +
-                ", activeBasalPattern=" + activeBasalPattern +
-                ", basalRate=" + basalRate +
-                ", tempBasalRate=" + tempBasalRate +
-                ", tempBasalPercentage=" + tempBasalPercentage +
-                ", tempBasalMinutesRemaining=" + tempBasalMinutesRemaining +
-                ", basalUnitsDeliveredToday=" + basalUnitsDeliveredToday +
-                ", batteryPercentage=" + batteryPercentage +
-                ", reservoirAmount=" + reservoirAmount +
-                ", minutesOfInsulinRemaining=" + minutesOfInsulinRemaining +
-                ", activeInsulin=" + activeInsulin +
-                ", sgv=" + sgv +
-                ", sgvDate=" + sgvDate +
-                ", lowSuspendActive=" + lowSuspendActive +
-                ", cgmTrend='" + cgmTrend + '\'' +
-                ", recentBolusWizard=" + recentBolusWizard +
-                ", bolusWizardBGL=" + bolusWizardBGL +
-                ", pumpTimeOffset=" + pumpTimeOffset +
-                ", uploaded=" + uploaded +
-                '}';
-    }
 
 }
diff --git a/app/src/main/java/info/nightscout/android/settings/SettingsFragment.java b/app/src/main/java/info/nightscout/android/settings/SettingsFragment.java
index a6156e5..b42a106 100644
--- a/app/src/main/java/info/nightscout/android/settings/SettingsFragment.java
+++ b/app/src/main/java/info/nightscout/android/settings/SettingsFragment.java
@@ -10,15 +10,9 @@ import android.preference.MultiSelectListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
 import android.preference.PreferenceFragment;
-import android.support.annotation.Nullable;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
 
 import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.zxing.integration.android.IntentIntegrator;
 import com.google.zxing.integration.android.IntentResult;
@@ -27,7 +21,6 @@ import java.net.MalformedURLException;
 import java.net.URL;
 
 import info.nightscout.android.R;
-import info.nightscout.android.medtronic.message.PumpTimeResponseMessage;
 
 public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
     private static final String TAG = SettingsFragment.class.getSimpleName();
@@ -151,7 +144,8 @@ public class SettingsFragment extends PreferenceFragment implements OnSharedPref
                 Log.d(TAG, "scanResult returns: " + scanResult.toString());
 
                 JsonParser json = new JsonParser();
-                JsonElement jsonElement = json.parse(scanResult.getContents());
+                String resultContents = scanResult.getContents() == null ? "" : scanResult.getContents();
+                JsonElement jsonElement = json.parse(resultContents);
                 if (jsonElement != null && jsonElement.isJsonObject()) {
                     jsonElement = (jsonElement.getAsJsonObject()).get("rest");
                     if (jsonElement != null && jsonElement.isJsonObject()) {
@@ -163,7 +157,7 @@ public class SettingsFragment extends PreferenceFragment implements OnSharedPref
                             try {
                                 URL uri = new URL(endpoint);
 
-                                StringBuffer url = new StringBuffer(uri.getProtocol())
+                                StringBuilder url = new StringBuilder(uri.getProtocol())
                                         .append("://").append(uri.getHost());
                                 if (uri.getPort() > -1)
                                     url.append(":").append(uri.getPort());
diff --git a/app/src/main/java/info/nightscout/android/upload/nightscout/NightScoutUpload.java b/app/src/main/java/info/nightscout/android/upload/nightscout/NightScoutUpload.java
index 4fe14f2..f29c2b8 100644
--- a/app/src/main/java/info/nightscout/android/upload/nightscout/NightScoutUpload.java
+++ b/app/src/main/java/info/nightscout/android/upload/nightscout/NightScoutUpload.java
@@ -29,7 +29,6 @@ import info.nightscout.api.DeviceEndpoints.PumpInfo;
 import info.nightscout.api.DeviceEndpoints.DeviceStatus;
 import okhttp3.ResponseBody;
 import retrofit2.Response;
-import retrofit2.Retrofit;
 
 class NightScoutUpload {
 
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 74afe68..0382189 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
@@ -21,7 +21,6 @@ public class NightscoutUploadIntentService extends IntentService {
     private static final String TAG = NightscoutUploadIntentService.class.getSimpleName();
 
     private Context mContext;
-    private Realm mRealm;
     private NightScoutUpload mNightScoutUpload;
 
     public NightscoutUploadIntentService() {
@@ -49,7 +48,7 @@ public class NightscoutUploadIntentService extends IntentService {
     @Override
     protected void onHandleIntent(Intent intent) {
         Log.d(TAG, "onHandleIntent called");
-        mRealm = Realm.getDefaultInstance();
+        Realm mRealm = Realm.getDefaultInstance();
 
         RealmResults<PumpStatusEvent> records = mRealm
                 .where(PumpStatusEvent.class)
@@ -68,7 +67,7 @@ public class NightscoutUploadIntentService extends IntentService {
                     String urlSetting = prefs.getString(mContext.getString(R.string.preference_nightscout_url), "");
                     String secretSetting = prefs.getString(mContext.getString(R.string.preference_api_secret), "YOURAPISECRET");
                     Boolean uploadSuccess = mNightScoutUpload.doRESTUpload(urlSetting,
-                            secretSetting, DataStore.getInstance().getUplooaderBatteryLevel(), records);
+                            secretSetting, DataStore.getInstance().getUploaderBatteryLevel(), records);
                     if (uploadSuccess) {
                         mRealm.beginTransaction();
                         for (PumpStatusEvent updateRecord : records) {
diff --git a/app/src/main/java/info/nightscout/android/utils/ConfigurationStore.java b/app/src/main/java/info/nightscout/android/utils/ConfigurationStore.java
index 1a4fca0..a45c63f 100644
--- a/app/src/main/java/info/nightscout/android/utils/ConfigurationStore.java
+++ b/app/src/main/java/info/nightscout/android/utils/ConfigurationStore.java
@@ -2,7 +2,6 @@ package info.nightscout.android.utils;
 
 
 import info.nightscout.android.medtronic.service.MedtronicCnlIntentService;
-import info.nightscout.android.model.medtronicNg.PumpStatusEvent;
 
 /**
  * Created by volker on 30.03.2017.
diff --git a/app/src/main/java/info/nightscout/android/utils/DataStore.java b/app/src/main/java/info/nightscout/android/utils/DataStore.java
index a61fbf7..fbd2a02 100644
--- a/app/src/main/java/info/nightscout/android/utils/DataStore.java
+++ b/app/src/main/java/info/nightscout/android/utils/DataStore.java
@@ -1,8 +1,6 @@
 package info.nightscout.android.utils;
 
 
-import com.bugfender.sdk.a.a.k.a;
-
 import java.util.Date;
 
 import info.nightscout.android.model.medtronicNg.PumpStatusEvent;
@@ -16,7 +14,7 @@ public class DataStore {
     private static DataStore instance;
 
     private PumpStatusEvent lastPumpStatus;
-    private int uplooaderBatteryLevel = 0;
+    private int uploaderBatteryLevel = 0;
     private int unavailableSGVCount = 0;
     private long activePumpMac = 0;
 
@@ -28,7 +26,6 @@ public class DataStore {
 
             // set some initial dummy values
             PumpStatusEvent dummyStatus = new PumpStatusEvent();
-            dummyStatus.setEventDate(new Date(0));
 
             // bypass setter to avoid dealing with a real Realm object
             instance.lastPumpStatus = dummyStatus;
@@ -48,12 +45,12 @@ public class DataStore {
         if (!realm.isClosed()) realm.close();
     }
 
-    public int getUplooaderBatteryLevel() {
-        return uplooaderBatteryLevel;
+    public int getUploaderBatteryLevel() {
+        return uploaderBatteryLevel;
     }
 
-    public void setUplooaderBatteryLevel(int uplooaderBatteryLevel) {
-        this.uplooaderBatteryLevel = uplooaderBatteryLevel;
+    public void setUploaderBatteryLevel(int uploaderBatteryLevel) {
+        this.uploaderBatteryLevel = uploaderBatteryLevel;
     }
 
     public int getUnavailableSGVCount() {
diff --git a/app/src/main/java/info/nightscout/android/utils/HexDump.java b/app/src/main/java/info/nightscout/android/utils/HexDump.java
index ff441ce..002ab6b 100644
--- a/app/src/main/java/info/nightscout/android/utils/HexDump.java
+++ b/app/src/main/java/info/nightscout/android/utils/HexDump.java
@@ -37,7 +37,9 @@ public class HexDump {
 
         result.append("\n          ");
         for (int i = 0; i < Math.min(16, array.length); i++) {
-            result.append(" ?" + HEX_DIGITS[i]);
+            result
+                    .append(" ?")
+                    .append(HEX_DIGITS[i]);
         }
         result.append("\n0x");
 
@@ -105,6 +107,7 @@ public class HexDump {
 
         return new String(buf);
     }
+
     public static String toHexString(int i) {
         return toHexString(toByteArray(i));
     }
@@ -140,8 +143,8 @@ public class HexDump {
     public static byte[] hexStringToByteArray(String hexString) {
         int length = hexString.length();
         byte[] buffer = new byte[length / 2];
-        if (length% 2 == 1)
-        	length--;
+        if (length % 2 == 1)
+            length--;
         for (int i = 0; i < length; i += 2) {
             buffer[i / 2] = (byte) ((toByte(hexString.charAt(i)) << 4) | toByte(hexString
                     .charAt(i + 1)));
@@ -149,36 +152,39 @@ public class HexDump {
 
         return buffer;
     }
-    
-    public static int unsignedByte(byte b){
-    	return  (b & 0xFF);
+
+    public static int unsignedByte(byte b) {
+        return (b & 0xFF);
     }
-    
-    public static byte bUnsignedByte(byte b){
-    	return  (byte)(b & 0xFF);
+
+    public static byte bUnsignedByte(byte b) {
+        return (byte) (b & 0xFF);
     }
+
+    @SuppressWarnings("ResultOfMethodCallIgnored")
     public static boolean isHexaNumber(String cadena) {
         try {
-            Long.parseLong(cadena,16);
+            Long.parseLong(cadena, 16);
             return true;
         } catch (NumberFormatException nfe) {
             return false;
         }
     }
-    
-    public static int byteArrayToInt (byte[] arr){
-    	int length = arr.length;
-    	int mult = 1;
-    	int res = 0;
-    	if (length > 0 && length <5){
-    		for (int i = length-1; i >= 0; i--){
-    			res += unsignedByte(arr[i])*mult;
-    			mult *=256;
-    		}
-    	}
-    	return res;
+
+    public static int byteArrayToInt(byte[] arr) {
+        int length = arr.length;
+        int mult = 1;
+        int res = 0;
+        if (length > 0 && length < 5) {
+            for (int i = length - 1; i >= 0; i--) {
+                res += unsignedByte(arr[i]) * mult;
+                mult *= 256;
+            }
+        }
+        return res;
     }
-    public static short byteArrayToShort (byte[] arr){
-    	return (short) (unsignedByte(arr[0])*256 + unsignedByte(arr[1]));
+
+    public static short byteArrayToShort(byte[] arr) {
+        return (short) (unsignedByte(arr[0]) * 256 + unsignedByte(arr[1]));
     }
 }
diff --git a/app/src/main/java/info/nightscout/android/xdrip_plus/XDripPlusUploadIntentService.java b/app/src/main/java/info/nightscout/android/xdrip_plus/XDripPlusUploadIntentService.java
index d27f95e..20a1183 100644
--- a/app/src/main/java/info/nightscout/android/xdrip_plus/XDripPlusUploadIntentService.java
+++ b/app/src/main/java/info/nightscout/android/xdrip_plus/XDripPlusUploadIntentService.java
@@ -33,7 +33,6 @@ public class XDripPlusUploadIntentService extends IntentService {
     private static final String TAG = XDripPlusUploadIntentService.class.getSimpleName();
     private static final SimpleDateFormat ISO8601_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());
     Context mContext;
-    private Realm mRealm;
 
     public XDripPlusUploadIntentService() {
         super(XDripPlusUploadIntentService.class.getName());
@@ -58,7 +57,7 @@ public class XDripPlusUploadIntentService extends IntentService {
     @Override
     protected void onHandleIntent(Intent intent) {
         Log.d(TAG, "onHandleIntent called");
-        mRealm = Realm.getDefaultInstance();
+        Realm mRealm = Realm.getDefaultInstance();
 
         RealmResults<PumpStatusEvent> all_records = mRealm
                 .where(PumpStatusEvent.class)
@@ -116,7 +115,7 @@ public class XDripPlusUploadIntentService extends IntentService {
 
     private void addDeviceStatus(JSONArray devicestatusArray, PumpStatusEvent record) throws Exception {
         JSONObject json = new JSONObject();
-        json.put("uploaderBattery", DataStore.getInstance().getUplooaderBatteryLevel());
+        json.put("uploaderBattery", DataStore.getInstance().getUploaderBatteryLevel());
         json.put("device", record.getDeviceName());
         json.put("created_at", ISO8601_DATE_FORMAT.format(record.getPumpDate()));
 
diff --git a/app/src/main/java/info/nightscout/api/DeviceEndpoints.java b/app/src/main/java/info/nightscout/api/DeviceEndpoints.java
index 1bf66b2..f528c75 100644
--- a/app/src/main/java/info/nightscout/api/DeviceEndpoints.java
+++ b/app/src/main/java/info/nightscout/api/DeviceEndpoints.java
@@ -6,7 +6,6 @@ import java.util.Date;
 import okhttp3.ResponseBody;
 import retrofit2.Call;
 import retrofit2.http.Body;
-import retrofit2.http.Header;
 import retrofit2.http.Headers;
 import retrofit2.http.POST;
 
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 3dfa265..1830813 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -52,10 +52,10 @@
                 android:layout_height="wrap_content"
                 android:layout_gravity="bottom"
                 android:layout_weight="1"
-                android:singleLine="true"
                 android:text="-"
                 android:textAppearance="?android:attr/textAppearanceLarge"
-                android:textSize="70sp" />
+                android:textSize="70sp"
+                android:maxLines="1" />
 
             <LinearLayout
                 android:layout_width="0dp"
@@ -70,19 +70,19 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="center|top"
-                    android:singleLine="true"
                     android:text="-"
                     android:textAppearance="?android:attr/textAppearanceLarge"
-                    android:textSize="40sp" />
+                    android:textSize="40sp"
+                    android:maxLines="1" />
 
                 <TextView
                     android:id="@+id/textview_units"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_gravity="center_horizontal"
-                    android:singleLine="true"
                     android:text="mmol/L"
-                    android:textAppearance="?android:attr/textAppearanceSmall" />
+                    android:textAppearance="?android:attr/textAppearanceSmall"
+                    android:maxLines="1" />
 
             </LinearLayout>
 
@@ -128,7 +128,6 @@
         android:id="@+id/scrollView"
         android:layout_width="match_parent"
         android:layout_height="fill_parent">
-        android:gravity="bottom"
 
         <LinearLayout
             android:orientation="vertical"
diff --git a/app/src/main/res/layout/activity_status.xml b/app/src/main/res/layout/activity_status.xml
index 5a7529d..8e68fc0 100644
--- a/app/src/main/res/layout/activity_status.xml
+++ b/app/src/main/res/layout/activity_status.xml
@@ -41,7 +41,7 @@
                 android:layout_height="wrap_content"
                 android:text="Pump Status"
                 android:id="@+id/status_pump_text_view"
-                android:singleLine="true" />
+                android:maxLines="1" />
 
             <TextView
                 android:layout_width="wrap_content"
diff --git a/app/src/main/res/layout/cnl_item.xml b/app/src/main/res/layout/cnl_item.xml
index 5ce73b2..2fb909e 100644
--- a/app/src/main/res/layout/cnl_item.xml
+++ b/app/src/main/res/layout/cnl_item.xml
@@ -10,6 +10,7 @@
         android:layout_centerVertical="true"
         android:layout_alignParentLeft="true"
         android:paddingLeft="8dp"
+        android:paddingRight="8dp"
         android:textSize="18sp"
         android:textStyle="bold" />
 
-- 
GitLab