From 9e50e85da4a369cc0f865aa89f401090d90f88f6 Mon Sep 17 00:00:00 2001
From: Lennart Goedhart <lennart@omnibase.com.au>
Date: Thu, 26 May 2016 21:17:52 +1000
Subject: [PATCH] Code cleanup and minor refactoring to improve maintainability
 and the ability to internationalise the app. Fixes #43

---
 app/app.iml                                   |  21 +-
 app/build.gradle                              |  17 +-
 app/src/main/AndroidManifest.xml              |  27 +--
 .../info/nightscout/android/eula/Eula.java    |  11 +-
 .../medtronic/GetHmacAndKeyActivity.java      |  13 +-
 .../medtronic/Medtronic640gActivity.java      |  24 ++-
 .../android/medtronic/MedtronicCNLReader.java |   6 +-
 .../message/ContourNextLinkBinaryMessage.java |   3 +-
 .../service/MedtronicCNLService.java          |   7 +-
 .../android/upload/UploadHelper.java          | 186 +++---------------
 .../res/drawable-hdpi/ic_action_warning.png   | Bin 530 -> 0 bytes
 app/src/main/res/drawable-ldpi/icon36x36.png  | Bin 3810 -> 0 bytes
 app/src/main/res/layout/activity_login.xml    |   6 +-
 app/src/main/res/layout/adb.xml               |  64 +++---
 app/src/main/res/layout/widget_lock.xml       |  26 ---
 app/src/main/res/layout/widget_main.xml       |  35 ----
 app/src/main/res/menu/menu.xml                |   2 +-
 app/src/main/res/values-v14/dimens.xml        |   1 -
 app/src/main/res/values-w820dp/dimens.xml     |   1 -
 app/src/main/res/values/dimens.xml            |   1 -
 app/src/main/res/values/strings.xml           |  93 +--------
 .../main/res/xml/example_appwidget_info.xml   |   5 -
 22 files changed, 122 insertions(+), 427 deletions(-)
 delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_warning.png
 delete mode 100644 app/src/main/res/drawable-ldpi/icon36x36.png
 delete mode 100644 app/src/main/res/layout/widget_lock.xml
 delete mode 100644 app/src/main/res/layout/widget_main.xml
 delete mode 100644 app/src/main/res/xml/example_appwidget_info.xml

diff --git a/app/app.iml b/app/app.iml
index e311115..4a7d5c4 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -83,12 +83,13 @@
       <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/21.0.3/jars" />
-      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/21.0.3/jars" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/animated-vector-drawable/23.4.0/jars" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.4.0/jars" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-v4/23.4.0/jars" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.android.support/support-vector-drawable/23.4.0/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.crashlytics.sdk.android/answers/1.3.6/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.crashlytics.sdk.android/beta/1.1.4/jars" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/exploded-aar/com.crashlytics.sdk.android/crashlytics-core/2.3.8/jars" />
@@ -101,6 +102,7 @@
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
       <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
@@ -113,20 +115,21 @@
       <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
       <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
     </content>
-    <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
+    <orderEntry type="jdk" jdkName="Android API 23 Platform" jdkType="Android SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="library" exported="" name="physicaloidlibrary" level="project" />
+    <orderEntry type="library" exported="" name="support-annotations-23.4.0" level="project" />
     <orderEntry type="library" exported="" name="crashlytics-2.5.5" level="project" />
-    <orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />
     <orderEntry type="library" exported="" name="crashlytics-core-2.3.8" level="project" />
     <orderEntry type="library" exported="" name="beta-1.1.4" level="project" />
     <orderEntry type="library" exported="" name="logback-android-1.1.1-3" level="project" />
-    <orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />
-    <orderEntry type="library" exported="" name="mongo-java-driver-3.0.2" level="project" />
+    <orderEntry type="library" exported="" name="animated-vector-drawable-23.4.0" level="project" />
     <orderEntry type="library" exported="" name="commons-lang3-3.4" level="project" />
-    <orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
+    <orderEntry type="library" exported="" name="support-v4-23.4.0" level="project" />
     <orderEntry type="library" exported="" name="slf4j-api-1.7.2" level="project" />
     <orderEntry type="library" exported="" name="answers-1.3.6" level="project" />
+    <orderEntry type="library" exported="" name="support-vector-drawable-23.4.0" level="project" />
+    <orderEntry type="library" exported="" name="appcompat-v7-23.4.0" level="project" />
     <orderEntry type="library" exported="" name="fabric-1.3.10" level="project" />
+    <orderEntry type="library" exported="" name="org.apache.http.legacy-android-23" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 7ee69a9..45fe301 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -4,7 +4,7 @@ buildscript {
     }
 
     dependencies {
-        classpath 'io.fabric.tools:gradle:1.+'
+        classpath 'io.fabric.tools:gradle:1.21.6'
     }
 }
 plugins {
@@ -25,8 +25,10 @@ def gitVersion() {
 }
 
 android {
-    compileSdkVersion 21
+    compileSdkVersion 23
     buildToolsVersion "23.0.3"
+    // FIXME - replace with URLConnection. This is used in GetHmacAndKeyActivity.
+    useLibrary 'org.apache.http.legacy'
 
     applicationVariants.all { variant ->
         variant.resValue "string", "versionName", variant.versionName
@@ -35,7 +37,7 @@ android {
     defaultConfig {
         applicationId "info.nightscout.android"
         minSdkVersion 15
-        targetSdkVersion 21
+        targetSdkVersion 23
         versionName project.properties['version']
         versionCode gitVersion()
     }
@@ -47,10 +49,9 @@ android {
         }
     }
 
-    // FIXME - we really shouldn't be doing this.
-    // See https://github.com/pazaan/640gAndroidUploader/issues/43
     lintOptions {
-        abortOnError false
+        // TODO - 'InvalidPackage' is here because of logback. We can remove this if we remove logback.
+        disable 'InvalidPackage', 'TrulyRandom'
     }
 }
 
@@ -111,11 +112,9 @@ release {
 }
 
 dependencies {
-    compile 'com.android.support:appcompat-v7:21.+'
+    compile 'com.android.support:appcompat-v7:23.4.0'
     compile 'org.apache.commons:commons-lang3:3.4'
     compile files('libs/logback-android-1.1.1-3.jar')
-    compile files('libs/mongo-java-driver-3.0.2.jar')
-    compile files('libs/physicaloidlibrary.jar')
     compile files('libs/slf4j-api-1.7.2.jar')
     compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
         transitive = true;
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c7995f0..47d94a6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,9 +4,7 @@
     >
 
     <uses-sdk
-        android:maxSdkVersion="21"
-        android:minSdkVersion="15"
-        android:targetSdkVersion="21" />
+        android:maxSdkVersion="23" />
 
     <uses-feature android:name="android.hardware.usb.host" />
 
@@ -17,13 +15,13 @@
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
-    <android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
+        android:supportsRtl="true"
         android:theme="@style/AppBaseTheme" >
 
         <!-- I have set screenOrientation to "portrait" to avoid the restart of AsyncTasks when you rotate the phone -->
@@ -52,29 +50,10 @@
             android:icon="@drawable/ic_launcher"
             android:label="Settings" />
 
-        <service
-            android:name=".dexcom.DexcomG4Service"
-            android:icon="@drawable/ic_launcher" >
-        </service>
         <service
             android:name=".medtronic.service.MedtronicCNLService"
             android:icon="@drawable/ic_launcher" >
         </service>
-        <service
-            android:name=".widget.CGMWidgetUpdater"
-            android:icon="@drawable/ic_launcher"
-            android:label="@string/app_name" >
-        </service>
-
-        <receiver android:name=".widget.CGMWidget" >
-            <intent-filter>
-                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
-            </intent-filter>
-
-            <meta-data
-                android:name="android.appwidget.provider"
-                android:resource="@xml/example_appwidget_info" />
-        </receiver>
 
         <activity
             android:name=".medtronic.GetHmacAndKeyActivity"
diff --git a/app/src/main/java/info/nightscout/android/eula/Eula.java b/app/src/main/java/info/nightscout/android/eula/Eula.java
index eb90972..92ef18a 100644
--- a/app/src/main/java/info/nightscout/android/eula/Eula.java
+++ b/app/src/main/java/info/nightscout/android/eula/Eula.java
@@ -21,11 +21,10 @@ import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.content.SharedPreferences;
 
-import java.io.IOException;
 import java.io.BufferedReader;
-import java.io.InputStreamReader;
 import java.io.Closeable;
-import java.util.Map;
+import java.io.IOException;
+import java.io.InputStreamReader;
 
 import info.nightscout.android.R;
 
@@ -39,13 +38,12 @@ import info.nightscout.android.R;
 public class Eula {
     private static final String ASSET_EULA = "EULA";
     private static final String PREFERENCE_EULA_ACCEPTED = "IUNDERSTAND";
-    private static final String PREFERENCES_EULA = "Disclaimer";
     private static AlertDialog aDialog = null;
 
     /**
      * callback to let the activity know when the user has accepted the EULA.
      */
-    public static interface OnEulaAgreedTo {
+    public interface OnEulaAgreedTo {
 
         /**
          * Called when the user has accepted the eula and the dialog closes.
@@ -68,7 +66,6 @@ public class Eula {
         //final SharedPreferences preferences = activity.getSharedPreferences(PREFERENCES_EULA,
         //        Activity.MODE_PRIVATE);
 
-        Map<String, ?> preferencesAll = preferences.getAll();
         if (!preferences.getBoolean(PREFERENCE_EULA_ACCEPTED, false)) {
             final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
             builder.setTitle(R.string.eula_title);
@@ -113,7 +110,7 @@ public class Eula {
     }
 
     private static void accept(SharedPreferences preferences) {
-        preferences.edit().putBoolean(PREFERENCE_EULA_ACCEPTED, true).commit();
+        preferences.edit().putBoolean(PREFERENCE_EULA_ACCEPTED, true).apply();
     }
 
     private static void refuse(Activity activity) {
diff --git a/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java b/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java
index c0ebff1..6351a83 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java
@@ -90,19 +90,18 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
                 attemptLogin();
             }
         });
-        Button closeButton = (Button) findViewById(R.id.close_button);
-        closeButton.setOnClickListener(new OnClickListener() {
+
+        mLoginFormView = findViewById(R.id.login_form);
+        mProgressView = findViewById(R.id.login_progress);
+        mRegisteredStickView = (TextView)findViewById(R.id.registered_usb_devices);
+        mCloseButton = (Button)findViewById(R.id.close_button);
+        mCloseButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
                 finish();
             }
         });
 
-
-        mLoginFormView = findViewById(R.id.login_form);
-        mProgressView = findViewById(R.id.login_progress);
-        mRegisteredStickView = (TextView)findViewById(R.id.registered_usb_devices);
-        mCloseButton = (Button)findViewById(R.id.close_button);
         showRegisteredSticks();
     }
 
diff --git a/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java b/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java
index 34a77f0..2956563 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java
@@ -40,6 +40,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.text.DecimalFormat;
+import java.util.Locale;
 
 import info.nightscout.android.R;
 import info.nightscout.android.eula.Eula;
@@ -74,7 +75,6 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
     private TextView mDumpTextView;
     private Button b1;
     private TextView display;
-    private Intent service = null;
     private ServiceManager cgmService; // > service
 
     //Look for and launch the service, display status to user
@@ -125,15 +125,15 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
             mHandlerActive = true;
         }
 
-        b1.setText("Stop Uploading CGM Data");
+        b1.setText(R.string.button_text_stop_uploading_data);
         lnr.addView(b1);
         lnr2.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
         lnr3.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
         Button b2 = new Button(this);
-        b2.setText("Clear Log");
+        b2.setText(R.string.button_text_clear_log);
         b2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));
         Button b4 = new Button(this);
-        b4.setText("Get Now");
+        b4.setText(R.string.button_text_get_now);
         b4.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1.0f));
         lnr3.addView(b4);
 
@@ -186,13 +186,13 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
                         //mHandler.removeCallbacks(updateDataView);
                         keepServiceAlive = false;
                         stopCGMServices();
-                        b1.setText("Start Uploading CGM Data");
+                        b1.setText(R.string.button_text_start_uploading_data);
                         finish();
                     } else {
                         startCGMServices();
 
                         mHandlerActive = true;
-                        b1.setText("Stop Uploading CGM Data");
+                        b1.setText(R.string.button_text_stop_uploading_data);
                     }
                 }
 
@@ -327,9 +327,7 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
                         //mHandler.removeCallbacks(updateDataView);
                         mHandlerActive = false;
                     }
-                    b1.setText("Start Uploading CGM Data");
-                    mTitleTextView.setTextColor(Color.RED);
-                    mTitleTextView.setText("CGM Service Stopped");
+                    b1.setText(R.string.button_text_start_uploading_data);
                     stopCGMServices();
                 } else {
                     startCGMServices();
@@ -338,8 +336,8 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
                 }
             }
         } catch (Exception e) {
-            StringBuffer sb1 = new StringBuffer("");
-            sb1.append("EXCEPTION!!!!!! " + e.getMessage() + " " + e.getCause());
+            StringBuilder sb1 = new StringBuilder("");
+            sb1.append("EXCEPTION!!!!!! ").append(e.getMessage()).append(" ").append(e.getCause());
             for (StackTraceElement st : e.getStackTrace()) {
                 sb1.append(st.toString()).append("\n");
             }
@@ -407,7 +405,7 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
                                 df = new DecimalFormat("#.00");
                             else
                                 df = new DecimalFormat("#.0");
-                            String sgvString = "---";
+                            String sgvString;
                             String unitsString = "mg/dL";
                             if (prefs.getBoolean("mmolxl", false)) {
 
@@ -428,7 +426,7 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
 
                             mDumpTextView.setTextColor(Color.WHITE);
                             mDumpTextView.setText(Html.fromHtml(
-                                    String.format("<b>SG at:</b> %s<br/><b>Pump Time:</b> %s<br/><b>Active Insulin: </b>%.3f<br/><b>Rate of Change: </b>%s",
+                                    String.format( Locale.getDefault(), "<b>SG at:</b> %s<br/><b>Pump Time:</b> %s<br/><b>Active Insulin: </b>%.3f<br/><b>Rate of Change: </b>%s",
                                             DateUtils.formatDateTime(getBaseContext(), record.sgvDate.getTime(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME),
                                             DateUtils.formatDateTime(getBaseContext(), pumpStatusRecord.pumpDate.getTime(), DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME),
                                             pumpStatusRecord.activeInsulin,
diff --git a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
index cd1b6bb..763e917 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
@@ -141,7 +141,7 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
     // TODO - get rid of this - it should be in a message decoder
     private void checkControlMessage(byte[] msg, byte controlCharacter) throws IOException, TimeoutException, UnexpectedMessageException {
         if (msg.length != 1 || msg[0] != controlCharacter) {
-            throw new UnexpectedMessageException(String.format("Expected to get control character '%d' Got '%d'.",
+            throw new UnexpectedMessageException(String.format( Locale.getDefault(), "Expected to get control character '%d' Got '%d'.",
                     (int) controlCharacter, (int) msg[0]));
         }
     }
@@ -252,7 +252,7 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
                 if (responseBytes[76] == mPumpSession.getRadioChannel()) {
                     break;
                 } else {
-                    throw new IOException(String.format("Expected to get a message for channel %d. Got %d", mPumpSession.getRadioChannel(), responseBytes[76]));
+                    throw new IOException(String.format( Locale.getDefault(), "Expected to get a message for channel %d. Got %d", mPumpSession.getRadioChannel(), responseBytes[76]));
                 }
             } else {
                 mPumpSession.setRadioChannel((byte) 0);
@@ -338,7 +338,7 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
         cgmRecord.sgvDate = MessageUtils.decodeDateTime(rtc, offset);
         Medtronic640gActivity.pumpStatusRecord.recentBolusWizard = statusBuffer.get(0x48) != 0;
         Medtronic640gActivity.pumpStatusRecord.bolusWizardBGL = statusBuffer.getShort(0x49); // In mg/DL
-        long rawReservoirAmount = statusBuffer.getInt(0x2b) & 0xffffffff;
+        long rawReservoirAmount = statusBuffer.getInt(0x2b);
         Medtronic640gActivity.pumpStatusRecord.reservoirAmount = new BigDecimal(rawReservoirAmount / 10000f).setScale(3, BigDecimal.ROUND_HALF_UP);
         Medtronic640gActivity.pumpStatusRecord.batteryPercentage = (statusBuffer.get(0x2a));
     }
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java
index c0c8db8..1f773ef 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/ContourNextLinkBinaryMessage.java
@@ -4,6 +4,7 @@ import info.nightscout.android.medtronic.MedtronicCNLSession;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.util.Locale;
 
 /**
  * Created by lgoedhart on 26/03/2016.
@@ -76,7 +77,7 @@ public class ContourNextLinkBinaryMessage extends ContourNextLinkMessage{
         byte calculatedChecksum = (byte) (MessageUtils.oneByteSum(message.mPayload.array()) - messageChecksum);
 
         if (messageChecksum != calculatedChecksum) {
-            throw new ChecksumException(String.format("Expected to get %d. Got %d", (int) calculatedChecksum, (int) messageChecksum));
+            throw new ChecksumException(String.format(Locale.getDefault(), "Expected to get %d. Got %d", (int) calculatedChecksum, (int) messageChecksum));
         }
 
         return message;
diff --git a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java
index 3668744..2f1ca0b 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java
@@ -19,6 +19,7 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.Locale;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.TimeoutException;
@@ -164,7 +165,7 @@ public class MedtronicCNLService extends AbstractService {
                         send(Message.obtain(null, Medtronic640gActivity.Medtronic640gActivityHandler.MSG_ERROR, "Could not communicate with the 640g. Are you near the pump?"));
                         Log.i(TAG, "Could not communicate with the 640g. Are you near the pump?");
                     } else {
-                        send(Message.obtain(null, Medtronic640gActivity.Medtronic640gActivityHandler.MSG_STATUS, String.format("Connected to Contour Next Link on channel %d.", (int) radioChannel)));
+                        send(Message.obtain(null, Medtronic640gActivity.Medtronic640gActivityHandler.MSG_STATUS, String.format( Locale.getDefault(), "Connected to Contour Next Link on channel %d.", (int) radioChannel)));
                         Log.d(TAG, String.format("Connected to Contour Next Link on channel %d.", (int) radioChannel));
                         cnlReader.beginEHSMSession();
 
@@ -220,6 +221,9 @@ public class MedtronicCNLService extends AbstractService {
         return netInfo != null && netInfo.isConnectedOrConnecting();
     }
 
+    /*
+    // FIXME - when we want to enable notifications, start with this. We'll need to fix the icon to match
+    // the Android standards (linter will fail anyway)
     private void showNotification(String title, String message) {
         NotificationManagerCompat nm = NotificationManagerCompat.from(mContext);
 
@@ -238,6 +242,7 @@ public class MedtronicCNLService extends AbstractService {
                 .setContentIntent(contentIntent)
                 .build());
     }
+    */
 
     // FIXME - replace this with writing to the SQLite DB.
     private void writeData(CGMRecord mostRecentData) {
diff --git a/app/src/main/java/info/nightscout/android/upload/UploadHelper.java b/app/src/main/java/info/nightscout/android/upload/UploadHelper.java
index f5b720c..065a28a 100644
--- a/app/src/main/java/info/nightscout/android/upload/UploadHelper.java
+++ b/app/src/main/java/info/nightscout/android/upload/UploadHelper.java
@@ -3,17 +3,11 @@ package info.nightscout.android.upload;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.AsyncTask;
-import android.os.Messenger;
 import android.preference.PreferenceManager;
 import android.util.Log;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
 import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpPut;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.BasicResponseHandler;
 import org.apache.http.impl.client.DefaultHttpClient;
@@ -28,8 +22,6 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.security.MessageDigest;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -55,8 +47,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
     private static final int CONNECTION_TIMEOUT = 30 * 1000;
 
     Context context;
-    private int cgmSelected = Medtronic640gActivity.CNL_24;
-    private List<JSONObject> recordsNotUploadedList = new ArrayList<JSONObject>();
+	private List<JSONObject> recordsNotUploadedList = new ArrayList<JSONObject>();
     private List<JSONObject> recordsNotUploadedListJson = new ArrayList<JSONObject>();
 
     public static final Object isModifyingRecordsLock = new Object();
@@ -67,8 +58,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
     
     public UploadHelper(Context context, int cgmSelected) {
         this.context = context;
-        this.cgmSelected = cgmSelected;
-        settings = context.getSharedPreferences(MedtronicConstants.PREFS_NAME, 0);
+		settings = context.getSharedPreferences(MedtronicConstants.PREFS_NAME, 0);
         synchronized (isModifyingRecordsLock) {
 	        try {
 	        	long currentTime = System.currentTimeMillis();
@@ -80,7 +70,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 	    				editor.remove("recordsNotUploaded");
 	    			if (settings.contains("recordsNotUploadedJson"))
 	    				editor.remove("recordsNotUploadedJson");
-	            	editor.commit();
+	            	editor.apply();
 	    		}
 	        	if (settings.contains("recordsNotUploaded")){
 	        		JSONArray recordsNotUploaded = new JSONArray(settings.getString("recordsNotUploaded","[]"));
@@ -90,7 +80,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 	        		log.debug("retrieve older json records -->" +recordsNotUploaded.length());
 	            	SharedPreferences.Editor editor = settings.edit();
 	            	editor.remove("recordsNotUploaded");
-	            	editor.commit();
+	            	editor.apply();
 	            }	
 	        	if (settings.contains("recordsNotUploadedJson")){
 	        		JSONArray recordsNotUploadedJson = new JSONArray(settings.getString("recordsNotUploadedJson","[]"));
@@ -100,134 +90,23 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 	        		log.debug("retrieve older json records -->" +recordsNotUploadedJson.length());
 	            	SharedPreferences.Editor editor = settings.edit();
 	            	editor.remove("recordsNotUploadedJson");
-	            	editor.commit();
+	            	editor.apply();
 	            }	
 			} catch (Exception e) {
 				log.debug("ERROR Retrieving older list, I have lost them");
-				recordsNotUploadedList = new ArrayList<JSONObject>();
-				recordsNotUploadedListJson = new ArrayList<JSONObject>();
+				recordsNotUploadedList = new ArrayList<>();
+				recordsNotUploadedListJson = new ArrayList<>();
 				SharedPreferences.Editor editor = settings.edit();
 				if (settings.contains("recordsNotUploaded"))
 					editor.remove("recordsNotUploaded");
 				if (settings.contains("recordsNotUploadedJson"))
 					editor.remove("recordsNotUploadedJson");
-	        	editor.commit();
+	        	editor.apply();
 			}
         }
     }
-    
-    public UploadHelper(Context context, int cgmSelected, ArrayList<Messenger> mClients) {
-    	this(context, cgmSelected);
-    }
-	
-	private JSONArray doGetRequest(HttpClient client, String url, String filter, String sort, String limit, String apiKey){
-		JSONArray result = null;
-		 URI nUri = null;
-		 String query = "";
-		 if (filter != null && filter.length() > 0) {
-			 query += filter + "&";
-		 }
-		 if (sort != null && sort.length() > 0) {
-			 query += sort + "&";
-		 }
-		 if (limit != null && limit.length() > 0) {
-			 query += limit + "&";
-		 }
-		    try {
-				nUri = new URI("https", null, "api.mongolab.com", 443, url, query + "apiKey="+apiKey,null);
-			} catch (URISyntaxException e2) {
-				// TODO Auto-generated catch block
-				e2.printStackTrace();
-			}
-		    //URIUtils.
-		    HttpGet getRequest = new HttpGet(nUri);
-		    HttpPost postRequest = null;
-		    getRequest.addHeader("accept", "application/json");
-		    try {
-				HttpResponse response = client.execute(getRequest);
-				InputStream instream = response.getEntity().getContent();
-		        String sResult = convertStreamToString(instream);
-		        // now you have the string representation of the HTML request
-		        System.out.println("RESPONSE: " + sResult);
-		        instream.close();
-		        result = new JSONArray(sResult);
-			} catch (ClientProtocolException e1) {
-				// TODO Auto-generated catch block
-				e1.printStackTrace();
-			} catch (IOException e1) {
-				// TODO Auto-generated catch block
-				e1.printStackTrace();
-			} catch (Exception e2) {
-				// TODO Auto-generated catch block
-				e2.printStackTrace();
-			}
-		return result;
-	}
-	
-	private boolean doPutRequest(HttpClient client, String url, String filter, String apiKey, JSONObject data){
-		 String query = "";
-		 if (filter != null && filter.length() > 0) {
-			 query += filter + "&";
-		 }
-	
-		try {
-			URI nUri = null;
-		    try {
-				nUri = new URI("https", null, "api.mongolab.com", 443, url, query + "&apiKey="+apiKey,null);
-			} catch (URISyntaxException e2) {
-				// TODO Auto-generated catch block
-				e2.printStackTrace();
-				return false;
-			}
-			HttpPut putRequest = new HttpPut(nUri);
-			putRequest.setHeader("Accept", "application/json");
-			putRequest.setHeader("Content-type", "application/json");
-	        StringEntity se = new StringEntity(data.toString());
-	        putRequest.setEntity(se);
-	        HttpResponse resp = client.execute(putRequest);
-	        if (resp.getStatusLine().getStatusCode() > 201) {
-	        	Log.e("UploaderHelper", "The can't be uploaded");
-				log.error("The record can't be uploaded Code: "+resp.getStatusLine().getStatusCode());
-				return false;
-	        }
-		}catch(IllegalArgumentException ex){
-			log.error("UploaderHelper", "Illegal record");
-			return false;
-		}catch (Exception e){
-			Log.e("UploaderHelper", "The retried can't be uploaded");
-			log.error("The retried record can't be uploaded ", e);
-			return false;
-		}
-		return true;
-	}
-	
-	private boolean doPostRequest(HttpClient client, String url, String apiKey, JSONObject data){
-		URI nUri = null;
-		try {
-			nUri = new URI("https", null, "api.mongolab.com", 443, url, "apiKey="+apiKey, null);
-			HttpPost postRequest = new HttpPost(nUri);
-			postRequest.setHeader("Accept", "application/json");
-	        postRequest.setHeader("Content-type", "application/json");
-	        StringEntity se = new StringEntity(data.toString());
-	        postRequest.setEntity(se);
-	        HttpResponse resp = client.execute(postRequest);
-	        if (resp.getStatusLine().getStatusCode() > 201) {
-	        	Log.e("UploaderHelper", "The can't be uploaded");
-				log.error("The record can't be uploaded Code: "+resp.getStatusLine().getStatusCode());
-				return false;
-	        }
-		}catch(IllegalArgumentException ex){
-			log.error("UploaderHelper", "Illegal record");
-			return false;
-		}catch (Exception e){
-			Log.e("UploaderHelper", "The retried can't be uploaded");
-			log.error("The retried record can't be uploaded ", e);
-			return false;
-		}
-		return true;
-	}
 
-    /**
+	/**
      * doInBackground
      */
     protected Long doInBackground(Record... records) {
@@ -297,23 +176,22 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
     }
 
     private void doRESTUploadTo(String baseURI, Record[] records) {
-    	Integer typeSaved = null;
-        try {
+		try {
             int apiVersion = 0;
             if (baseURI.endsWith("/v1/")) apiVersion = 1;
 
-            String baseURL = null;
+            String baseURL;
             String secret = null;
             String[] uriParts = baseURI.split("@");
 
             if (uriParts.length == 1 && apiVersion == 0) {
                 baseURL = uriParts[0];
-            } else if (uriParts.length == 1 && apiVersion > 0) {
+            } else if (uriParts.length == 1) {
             	if (recordsNotUploadedListJson.size() > 0){
                  	JSONArray jsonArray = new JSONArray(recordsNotUploadedListJson);
                  	SharedPreferences.Editor editor = settings.edit();
                  	editor.putString("recordsNotUploaded", jsonArray.toString());
-                 	editor.commit();
+                 	editor.apply();
                  }
                 throw new Exception("Starting with API v1, a pass phase is required");
             } else if (uriParts.length == 2 && apiVersion > 0) {
@@ -323,8 +201,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
                 // new format URL!
 
                 if (secret.contains("http")) {
-                    String b = "http://";
-                    if (secret.contains("https")) {
+					if (secret.contains("https")) {
                         baseURL = "https://" + baseURL;
                     } else {
                         baseURL = "http://" + baseURL;
@@ -339,7 +216,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
                  	JSONArray jsonArray = new JSONArray(recordsNotUploadedListJson);
                  	SharedPreferences.Editor editor = settings.edit();
                  	editor.putString("recordsNotUploadedJson", jsonArray.toString());
-                 	editor.commit();
+                 	editor.apply();
                  }
                 throw new Exception(String.format("Unexpected baseURI: %s, uriParts.length: %s, apiVersion: %s", baseURI, uriParts.length, apiVersion));
             }
@@ -371,7 +248,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
                              	JSONArray jsonArray = new JSONArray(auxList);
                              	SharedPreferences.Editor editor = settings.edit();
                              	editor.putString("recordsNotUploaded", jsonArray.toString());
-                             	editor.commit();
+                             	editor.apply();
                              }
                             throw new Exception("Starting with API v1, a pass phase is required");
                         } else {
@@ -411,11 +288,9 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
             for (Record record : records) {
             	String postURL = baseURL; 
             	if (record instanceof GlucometerRecord){
-            		typeSaved = 0;
-            		postURL +=  "entries";
+					postURL +=  "entries";
             	}else{
-            		typeSaved = 0;
-            		postURL += "entries";
+					postURL += "entries";
             	}
                 Log.i(TAG, "postURL: " + postURL);
                 log.info( "postURL: " + postURL);
@@ -428,7 +303,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
                           	JSONArray jsonArray = new JSONArray(recordsNotUploadedListJson);
                           	SharedPreferences.Editor editor = settings.edit();
                           	editor.putString("recordsNotUploadedJson", jsonArray.toString());
-                          	editor.commit();
+                          	editor.apply();
                           }
                         throw new Exception("Starting with API v1, a pass phase is required");
                     } else {
@@ -469,16 +344,15 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 					ResponseHandler responseHandler = new BasicResponseHandler();
                     httpclient.execute(post, responseHandler);
                 } catch (Exception e) {
-                    if ((typeSaved != null) && (typeSaved == 0)){//Only EGV records are important enough.
-    	                if (recordsNotUploadedListJson.size() > 49){
-    	                	recordsNotUploadedListJson.remove(0);
-    	                	recordsNotUploadedListJson.add(49,json);
-    	            	}else{
-    	            		recordsNotUploadedListJson.add(json);
-    	            	}
+					//Only EGV records are important enough.
+					if (recordsNotUploadedListJson.size() > 49){
+                        recordsNotUploadedListJson.remove(0);
+                        recordsNotUploadedListJson.add(49,json);
+                    }else{
+                        recordsNotUploadedListJson.add(json);
                     }
 
-                    Log.w(TAG, "Unable to post data to: '" + post.getURI().toString() + "'", e);
+					Log.w(TAG, "Unable to post data to: '" + post.getURI().toString() + "'", e);
                     log.warn( "Unable to post data to: '" + post.getURI().toString() + "'", e);
                 }
             }
@@ -515,18 +389,18 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 	        		log.debug("retrieve older json records -->" +recordsNotUploadedJson.length());
 	            	SharedPreferences.Editor editor = settings.edit();
 	            	editor.remove("recordsNotUploadedJson");
-	            	editor.commit();	
+	            	editor.apply();
     			} catch (Exception e) {
     				log.debug("ERROR RETRIEVING OLDER LISTs, I HAVE LOST THEM");	
     				SharedPreferences.Editor editor = settings.edit();
     				if (settings.contains("recordsNotUploadedJson"))
     					editor.remove("recordsNotUploadedJson");
-    	        	editor.commit();
+    	        	editor.apply();
     			}
     	        JSONArray jsonArray = new JSONArray(recordsNotUploadedListJson);
             	SharedPreferences.Editor editor = settings.edit();
             	editor.putString("recordsNotUploadedJson", jsonArray.toString());
-            	editor.commit();
+            	editor.apply();
             }
         }
     }
@@ -594,7 +468,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 	    String line = null;
 	    try {
 	        while ((line = reader.readLine()) != null) {
-	            sb.append(line + "\n");
+	            sb.append(line).append("\n");
 	        }
 	    } catch (IOException e) {
 	        e.printStackTrace();
diff --git a/app/src/main/res/drawable-hdpi/ic_action_warning.png b/app/src/main/res/drawable-hdpi/ic_action_warning.png
deleted file mode 100644
index 98b90c257c20f82aabc9f8c8be5c77acca030bb6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 530
zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F<YIk|nMYCBgY=CFO}lsSJ)O
z`AMk?p1FzXsX?iUDV2pMQ*9U+7`J%3IEGZ*dJ}m%_pkxa);Tf84pt4~1@FHy<h^%%
zf66v)LH3dFdKWmY9QHV{pJ0+au#{2BBi419$}3?978b^BJ})OeQdV8x#XdchZ31Ho
zgQNr7gf%^nBmCb6it8_&yTLR5Glze7ebc+_Z$ErF3ZKne{Uv1v^T)_4hJy3vUE#g`
z6(1fpp8FJA!;tVW{Ds!p30%jQh#%RoftT%FTH*^<=3kR$v8yD0WbK>iS^0o3SC5l>
zZ4sk|lX?1#xQ7d)B^eIbSurd*_SpWYlg;^Kb4BLAPrM^w&1R=m`<jm-d(PVCuC>{7
zL#%Y_k|xVGvzM>X-ob9AlpB<>m79w}$1L^sG{g2SD~xBb-^iAVp1ZX5t2FELVvpWk
ze;E%Xd`|qkTHJ@ZD)*E`$gLx9a(q@>xSyZbx$)l5l%#n}v%b!aQlFWlD4Fo_*ws}E
zQSp)QGej?EDbAhnYRRPozZSY~%2BjoI<{lZD$V2PO&iVDu5+G|r@*)1d35<7k(Mmu
zW8Z!j8!$2KHDoxQyhwj%^`9$84|q@P+hXSUXR<)UK{K{h4kx{5&rJNiB*iE0<o+2(
l4Ll0WCm7~D32$IzaLrx3y7BcF9R>yl22WQ%mvv4FO#riQ;$#2-

diff --git a/app/src/main/res/drawable-ldpi/icon36x36.png b/app/src/main/res/drawable-ldpi/icon36x36.png
deleted file mode 100644
index 70129cd357610cb7912e7e6b50f15736e015f710..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3810
zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?a29w(7Bet#3xhBt!>l<H
z3=CZUna<7u0U7xv`NbLe1qz<d&I$!Z`DvLssSFGix8???hXlVAv;BVWi<5Up!xZoQ
zAW;s5AgAsIk%?+rikt#o9f}KYiUuAObaiEsKCz&Kxv#IGM>J4}r;F<b`xC`Qea(wI
zx=#ImSiLy=+Me&v&i>na-R}9C&vQ4QXFtHfGtI*|(6oVPrIVcCgXZH$jy-&$=g`Qd
zQota<u{lMt_^&b}!;d-}8*QZn?E4rPD=u?$FdXomeZWAb{XhRJr<pN~4K0iZN+w!(
zb2NxBI8^mHEn{$SV{Di^LoJwL0SiOI>Exux3<0_f3F`IFE;BUD{V}teks*4DqA25n
zi3|$DsU0p18P*JI&WClmGDH|Kh@^QRv1GWR%V6Lcp60=@VLQWta{}C(7&v$s3<5h^
zH5pi{84^w?D_1bI%w!O8`xI{TQG1=hb1epjikX{icB)vqHb!&k7P5zj>&a=H^Ay(>
zF-v4hoaLZ*sB)&HQKJd}gU@Fe7#2(v6@1YA`ESKJzIEr$ne}bsi`RX%pY6X=Qqtpp
zPtUI|aA06~SW<WKpN{@!sRnDdhTMOPRNt{=#Bnbu{ob9niQi!>!-AK$!ao;)!p3#s
zgq=5UK7I1!hSw3N=)_auwg1u&#UBX&oAa~I=Fj)95B5D$X*7y$bZ7bT;Lw>bK1*fJ
zPvUGzy7R2x{m*vp|9@mJD;@Dn+8LoG@;Feau+L>y&u62hN}W!VG>@uY`k(UXzRquE
zyZfdL8?x*et0(HNh)rhx=B+LeQF7qXcLs(}yYmlT(coZi$Y_3ezWo1t`@ilBR2dr5
zJSP=0FvPj2=!KlxY=4}Cfx%@#qt*sT=`RN*bPlk|9Av$7ko!-9S&Ng(kwZ=bPFyJs
zGDQiRYnq%i+Rko})k@I6;vj2sATXnCasi*-q0k+CwgvpZ5;^7_)Y#L=$>Ml|LpV|K
zRtIBJSA=pOhxp9aABqP(ScJM&6i#-C1S)w?H1#kH>IzW^^^pB!Tf}799^<xaqV)*|
zqozM?d)y7DG;RvCy~4BAdFKjqsTQ|I+!s<x3}^L=Etq|wXp59>kJ-ZK7glHR-|Dw>
zK5lT}g#^3tksJfPV~3qKTIg_2PCmU+X${ZnV^SN!)-dnx{F;1zV>ydZqw4`qGnR5E
zg+w_=j|iU#zZ)Ja6l7FP1aEPgb27IC9#U7Dyuy2n+AhJLM<kMr4BI0-bd;|N^$Y6@
zRChQZF;@}lbT(4oIf2P@<C2g|LYLew<pn9f)LA*(#6wDX^2u8%*_+rcr|2kXpJ;tD
z_sQWW#!sZ5D1M6Onw#WMxa3FhBaNU_SzeM)1)iEbWlNo5<QTemR?yuQ3qu4=`=gxJ
zF5DKhKCpd-uu17G%d^d5p59B>E}D8-DnmTud*=EVCA$RgPL=bUej)tQ>6h*=roUkR
zQqIHMCfa<wBV9vswgkIGx@5V;`WZgUBrkVM9uF}vH+((g`Aq(q`JoY7+q7y#C!XS(
z>NQnus<f7V$jVjAR^4009r`)+bV&coxZv7#ZlT7(k5_VDnYKD~)!cyB!P3F$E3H?w
zuS#E$A7a0xF7j_DTjXJ%!~V`o0vBwIf4t|I0(Y|H<_aCfY~IyvrH!UX)Ha^ISyQI9
zd&Xbc-QBjURxY%3Huf?O-yHOLN}4_U;~9lN=9KtxKG#@2{c~N{J(2gCk2Iy1nfUB9
zOpVE2HEsH|h}9me16RAh-fOn*?ee+H_PXwl{N2dsc-%`pM%_KV{~YVw=fO9F?=I(B
zF6L`%^>v-zs_doG3wOJe@6TKQZpOTQaSii)@|WMM-242OOs)RkkiWUVmVb5UiD28z
zqr!HZ=bVJiQPaYF8(ID1w?76t#~yZYUYa;Har(oSi90XaEWYa2>&D-cc`W9!%H!N)
zxyKf(v8gGldHcTdeK#w}cjq$AW!65{KF80VIlJiWwV9@~Z4Iv*J)ix2_VwBKw<knZ
zMCoi>v291H=cXr7%Oc-x+mqKCWf{3NA~Y&?v)kIaYgMo9Ub}m_;PRb*ll@lDyOw@<
z!^dqWx2@bRx#8&zw%hBr<!-A@OivO|-+px6;dhhwPOjZm+xyp+owxla-)h+?*}CE_
zMIu&VR`+I|oAb`T_UM;sFZI(S&I_EsVf=WT@M+B>nRA0@Uv^IyPv2SG{JEpM)4S=k
z-gG;?+0w`Ep4j`utK@58?8B-{U+2!=Jp0hw6}Q*FGkcf$uKmvZGbZyj=S3P9UpRci
z`9a{*i}u{}ry6A6UsLDr?BAHa^|`Wsvi`*IwbwUnUs}HEd*XX>yKi<y^B>ziwlTkF
zbT2agjQN4>C$^vVKb$`=zV*Iyz4HH*|5g7lGAwUUWlU%8Y;<glX8Qf3szz~tpS{)X
z)Nh+^zIE(bu+vf0vA=0;)6;`%6*Eq}nXp#z`|}y+CZ5aWYYnJ-aqR+o;<Lo=!*x9B
zt?jMhZT5Wy9T8F&4X2xyU%ca7eBb4l%QTmJv(pXzE!XRMnQGas(#x{BWxmT~m;Eul
zw8%48Bj!eU=6K6k>S?Vr%gfn!|Igdc?T_X@;(lB$K12URY(eG1bBDgPE*D#=C!}LF
z&B3R`&tl34M**!BVm+##gv(X?xGE3H9!gizzi4)`<A!sLmYm-w4=vxSNpB|ZF|AZN
zYP?kE>CP7Ql@s>(@cP`HZ8cA9R+&Psk*(EU!{$j7ClorZQuLj?E&Wycv$V3)Yf@V`
z{X3f1y<J~!D*MUo%@fwJM(T2Hb6WNyBueAD7W=03)bO<ZXFE?>PFp=s`|R5@n@`=I
zU_R&l{Qqx-4hcP+v~6jdcet)>#IwC?vMe{*6jt8mdMwJS-4@2S#%4#?Hm%&N{;S`H
zPhVHJSFOr7yD{$IsiuQl8M9w=hjKk_t$lsx`rBCl2>r<WTN8h^&6Tzj?d)17a$9`5
zX#EY1I~7l*+w)KDpLu7>mX)iI>`XbIb}8-UvwOPpqWPw+n*MA$UmowxTU&VVhi!TL
z^_%N${pn{lZtrg1=Dc(9ew!V8QkS1Rch=fIWJ$=EkY6EY?=Iclnt1(3-o<y))qB2~
zyt#Tide8U2b|?4U4rL7Wy_$A4^|$Bm&EM_Ub*_5(W7_ZB*tLGSg>R2DUt<2tuFSXX
z`pzp?WiQ!=1odCje(lb8Tz=obx$nz$dCho3d*>W`q+H-q`Q+ty&imixc&%=g^;EBU
z$bMPAOg3FsKg(&>r&(^ZgJ=DYPKw^;f5z_OwO9A5{<z<k=bvL@6Ito?Ipk#Kt(Q%g
zC#Qcp-!pgW+}b+5pLY^&FWOf9Jo()HEdKoWy97!eUUL24{oHzw^|_c&J4!xny8To*
zd`I}K^;Yq@uS#Co{F{8)|M>1XyJxN28I!&9UDe*L)oI^fO3yPtclXQQ%8z3IuU(yI
zX?u6?=c@egN56l)FLt-CNd51*)4Ok$tG`>j$A3@!7l*fwH=XacU$u|^cjw0YJM~!y
z$`^dTc*p%aTWj<Ae-pp<^E<Ql&+I?l#@qIKo`s#I<s<u|zc2qRcRrtTUTvQEzeWE}
zuM-#3ulsTJ_4RWXXIxx3{nPZx`*UlS{(W`ewdDHS#||Bn+jp|U*f8!(*zdOo%kPxS
zzF&Nw-~UOCLcPZSjGr67247hId$Q!@$^TiHXMFyXY^-~mfq{V~-O<;Pfnj4`&F{d;
z3=9kk$sR$z3=CDO3=9p;3=BX2GcYu~WMC*YU|@Kaz`$TNgMmRje^UHWHwFggzn(6R
zAr-gI+=%X&8Y;s6;r{oz#?$xoCnXC<RBEr>(9)yuvQ5OrsqJEP>qJ`@Cy^_`7lQ-+
zMIBuvm%6x2X>v99S-hy{O%hvH<}|N3DcRC@&ujLsNuIxar%d{}25z%Ar;p$KzxP`G
z-|P3(Pi{JMGv%mP`qj4A`G>Y<94On<I_qMYNY^wu+c)37Iagge)N#OM?VaE93Oa}W
zW*lN?T%oplL7v|9*UuHVEYSURc_PpAg)Fw7i?nqkE?vy?bpPG4*H~b|znJ~&rxlbg
zTUmKGR;*-R!Q+pMy*z`$`AwhxI(xWsg|Y68tCycPI{)^4@&0nK#<l5J)GwE?n=KZM
zZf6Si68gMr_Zq7m{>3|E%ng<^M%}CX5xPh2@TY`^Q!o65yZhxY$LPIY?L32xrR4KQ
z<;Vt)tcU*flV14>oqX{v@65;TEtfPMY%?D!-jSBiJJP&0<)%hX>YI!GUw=r<{&aAD
z<LSlqBAE;1w0HANclrPM)Wgen*nc-E6*y*GjEH39E_$5*A=`9;?hV<$W;)W&4yOxB
zzwo=4$**GjVr%x~SpTCgLx#-){?EU~weOvJ)MkO)o~FNs`vl%Ukn35`JfSd9`~LAY
zGk#0!^DVowfw!N1gWH*dSvF1mA6$?8Qn=O5c%dP4M(^ta_lo67cPp6ed008_aa^+P
zoM~8|xuw1N&;It=<q7<KuG2ys&UBUuKI41vP`85ZJzwbQPuryCCuzQ0{pixqi>p}o
z%wl5h{8P23&G&`Gi^U7;7HD?m=zj0~w?lDC7Dw`Dfj)_n#MG9YV+_mxC_hQ`|M2p>
zMXsjVY@t0f#h>hznEd#|cDLVx=aX`E8^Rv6TKL8Z*&PXId~_l~Z~do#TLf+%jp)lx
z%5}W3XsOldNvBlzKYu#2AT{TX)a%<HLo!^yYh2#PSnis3wr{8M4%Yjj@2*tx%@wu^
zWZcYM{^+e$!^%5O_j#t?6D+>G=m4L`tJcPCN#`F<Hw<_+|3icxV;;BQKluf&J6r!&
z<nv_T-1R`&hqupnJ=>J?EA9&3-?+)B?p*KsLw{cB{8kUzDQI1sWWMQj!Zb~uzgqWN
znGder$2F~HnrXX)+6&j`9t|lOXHNBrO37%5nezOrSksZx`r&VJ_@8U>YqZK1pIXMk
z8~My7>O)QT?A)`DO?lrf-52m<iBPYpv*(YQQL|E2Iv-~q^nSkW=Isk__Uya2Q15BE
z`|I9aJ0<U5V-0Xzrm%V2)0lYw87ha56urD6oF*{4U%IIL$K1oB*Jm9LIb)Q)eA_LP
z!c9rjGEZ!Z`e%0X@?v8f(<+C|X_3ZTuO90R?y=rnZ{HRA_s|MP)2ZHeGp{__?5TTf
z`uQJ6uk`B8>AALAZpk~p%M<OSw!7tOKlJ`nI*V_v?zi_0>$r6eT)LUOkAZ=K!PC{x
JWt~$(69CUeIJ*D<

diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index c81f8e8..d1f5cfe 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -20,14 +20,13 @@
         android:visibility="gone"/>
 
     <ScrollView
-        android:id="@+id/scroll_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
         <LinearLayout
             android:orientation="vertical"
             android:layout_width="match_parent"
-            android:layout_height="match_parent">
+            android:layout_height="wrap_content">
 
             <LinearLayout
                 android:id="@+id/login_form"
@@ -39,8 +38,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:textAppearance="?android:attr/textAppearanceMedium"
-                    android:text="@string/prompt_carelink_username_password"
-                    android:id="@+id/textView" />
+                    android:text="@string/prompt_carelink_username_password" />
 
                 <AutoCompleteTextView
                     android:id="@+id/username"
diff --git a/app/src/main/res/layout/adb.xml b/app/src/main/res/layout/adb.xml
index 43a947b..9e1dba2 100644
--- a/app/src/main/res/layout/adb.xml
+++ b/app/src/main/res/layout/adb.xml
@@ -5,43 +5,35 @@
     android:orientation="vertical"
     android:paddingTop="15dp">
 
-    <LinearLayout
-        android:orientation="vertical"
+    <TextView
+        android:id="@+id/demoTitle"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-        <TextView
-            android:id="@+id/demoTitle"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textSize="50sp"
-            android:gravity="center"
-            android:textStyle="bold"
-
-            android:text="@string/hello" />
-
-        <TextView
-            android:id="@+id/demoText"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textSize="20sp"
-
-             android:gravity="left" />
-
-        <ScrollView
-            android:id="@+id/demoScroller"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:padding="10dp">
-
-            <LinearLayout android:id="@+id/container"
-              android:orientation="vertical"
-              android:layout_width="fill_parent"
-              android:layout_height="fill_parent">
-          </LinearLayout>
-        </ScrollView>
-
-    </LinearLayout>
+        android:layout_height="wrap_content"
+        android:textSize="50sp"
+        android:gravity="center"
+        android:textStyle="bold"
+
+        android:text="@string/hello" />
+
+    <TextView
+        android:id="@+id/demoText"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:textSize="20sp"
+
+         android:gravity="start" />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="10dp">
+
+        <LinearLayout android:id="@+id/container"
+          android:orientation="vertical"
+          android:layout_width="fill_parent"
+          android:layout_height="wrap_content">
+      </LinearLayout>
+    </ScrollView>
 
 
 </LinearLayout>
diff --git a/app/src/main/res/layout/widget_lock.xml b/app/src/main/res/layout/widget_lock.xml
deleted file mode 100644
index 7aca06e..0000000
--- a/app/src/main/res/layout/widget_lock.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@android:color/background_dark"
-    android:orientation="horizontal"
-    android:padding="@dimen/widget_margin" >
-
-	    <TextView
-        android:id="@+id/sgv_id"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:text="@string/arrow_none"
-        android:textColor="#ffffff"
-        android:textSize="40sp"
-         android:gravity="center_vertical|right" />
-
-    <TextView
-        android:id="@+id/arrow_id"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:text="@string/arrow_none"
-        android:textColor="#ffffff"
-        android:textSize="18sp" 
-         android:gravity="center_vertical|right"/>
-</LinearLayout>
diff --git a/app/src/main/res/layout/widget_main.xml b/app/src/main/res/layout/widget_main.xml
deleted file mode 100644
index 0009b3b..0000000
--- a/app/src/main/res/layout/widget_main.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="@android:color/background_dark"
-    android:orientation="horizontal"
-    android:padding="@dimen/widget_margin" >
-
-    <ImageButton
-        android:id="@+id/imageButton1"
-        android:layout_width="48dp"
-        android:layout_height="match_parent"
-        android:background="#000000"
-        android:contentDescription="@string/but_contentDesc"
-        android:src="@drawable/ic_launcher" />
-
-    <TextView
-        android:id="@+id/sgv_id"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:text="@string/arrow_none"
-        android:textColor="#ffffff"
-        android:textSize="40sp"
-         android:gravity="center_vertical|right" />
-
-    <TextView
-        android:id="@+id/arrow_id"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:text="@string/arrow_none"
-        android:textColor="#ffffff"
-        android:textSize="18sp" 
-         android:gravity="center_vertical|right"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml
index eecdd81..66a8450 100644
--- a/app/src/main/res/menu/menu.xml
+++ b/app/src/main/res/menu/menu.xml
@@ -3,7 +3,7 @@
     <item
             android:id="@+id/menu_settings"
             android:orderInCategory="100"
-            android:title="Preferences">
+            android:title="@string/menu_name_preferences">
     </item>
     <item
             android:id="@+id/registerCNL"
diff --git a/app/src/main/res/values-v14/dimens.xml b/app/src/main/res/values-v14/dimens.xml
index f3eb5ba..55c1e59 100644
--- a/app/src/main/res/values-v14/dimens.xml
+++ b/app/src/main/res/values-v14/dimens.xml
@@ -3,6 +3,5 @@
     <!-- Default screen margins, per the Android Design guidelines. -->
     <dimen name="activity_horizontal_margin">16dp</dimen>
     <dimen name="activity_vertical_margin">16dp</dimen>
-    <dimen name="widget_margin">0dp</dimen>
 
 </resources>
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
index 45757d6..f3e7020 100644
--- a/app/src/main/res/values-w820dp/dimens.xml
+++ b/app/src/main/res/values-w820dp/dimens.xml
@@ -6,6 +6,5 @@
          would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively).
     -->
     <dimen name="activity_horizontal_margin">64dp</dimen>
-    <dimen name="widget_margin">8dp</dimen>
 
 </resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 09ea631..55c1e59 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -3,6 +3,5 @@
     <!-- Default screen margins, per the Android Design guidelines. -->
     <dimen name="activity_horizontal_margin">16dp</dimen>
     <dimen name="activity_vertical_margin">16dp</dimen>
-    <dimen name="widget_margin">8dp</dimen>
 
 </resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 71bd121..e6e6175 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -3,100 +3,18 @@
 
     <string name="hello">---</string>
     <string name="app_name">NS 640g Uploader</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-    <string name="sgv_id">sgv_id</string>
-    <string name="arrow_id">arrow_id</string>
-    <string name="arrow_none">---</string>
-    <string name="self_destruct">Close It</string>
-    <string name="but_contentDesc">Launch Nightscout</string>
     <string name="eula_title">Disclaimer</string>
     <string name="eula_accept">Accept</string>
     <string name="eula_refuse">Refuse</string>
-    <style name="ButtonText">
-    <item name="android:layout_width">fill_parent</item>
-    <item name="android:layout_height">wrap_content</item>
-    <item name="android:textColor">#ffffff</item>
-    <item name="android:gravity">center</item>
-    <item name="android:layout_margin">3dp</item>
-    <item name="android:textSize">30dp</item>
-    <item name="android:textStyle">bold</item>
-    <item name="android:shadowColor">#000000</item>
-    <item name="android:shadowDx">1</item>
-    <item name="android:shadowDy">1</item>
-    <item name="android:shadowRadius">2</item>
-	</style>
-	<string-array name="types">
-        <item>Contour NextLink 2.4</item>
-    </string-array>
-    <string-array name="types_values">
-     <item>1</item>
-     <item>2</item>
-        <item>3</item>
-    </string-array>
-     <string-array name="calib_types_values">
+    <string-array name="calib_types_values">
      <item>1</item>
      <item>2</item>
      <item>3</item>
     </string-array>
-    <string-array name="calibrationTypes">
-     <item>Glucometer</item>
-     <item>Medtronic Pump</item>
-     <item>Manual</item>
-    </string-array>
-     <string-array name="sourceTypes">
-     <item>Medtronic Sensor</item>
-     <item>Medtronic Pump</item>
-     <item>Both (sensor + pump support)</item>
-    </string-array>
-    <string-array name="pumpPeriodList">
-     <item>30 min.</item>
-     <item>60 min.</item>
-     <item>90 min.</item>
-     <item>120 min.</item>
-    </string-array>
-    <string-array name="pumpperiod_values">
-     <item>1</item>
-     <item>2</item>
-     <item>3</item>
-     <item>4</item>
-    </string-array>
-     <string-array name="historicPeriodList">
-     <item>5 min.</item>
-     <item>10 min.</item>
-     <item>15 min.</item>
-     <item>20 min.</item>
-    </string-array>
     <string-array name="levelList">
      <item>Error</item>
      <item>Info</item>
      <item>Debug</item>
-    </string-array>
-     <string-array name="historicMixPeriodList">
-     <item>10 min.</item>
-     <item>15 min.</item>
-     <item>20 min.</item>
-     <item>25 min.</item>
-     <item>30 min.</item>
-     <item>35 min.</item>
-     <item>40 min.</item>
-     <item>45 min.</item>
-     <item>50 min.</item>
-     <item>55 min.</item>
-     <item>60 min.</item>
-    </string-array>
-     <string-array name="historicMixPeriodVal">
-     <item>1</item>
-     <item>2</item>
-     <item>3</item>
-     <item>4</item>
-     <item>5</item>
-     <item>6</item>
-     <item>7</item>
-     <item>8</item>
-     <item>9</item>
-     <item>10</item>
-     <item>11</item>
     </string-array>
     <string name="title_activity_login">CareLink login</string>
 
@@ -105,13 +23,9 @@
     <string name="prompt_password">Password</string>
     <string name="action_sign_in">Retrieve keys for USB</string>
     <string name="action_sign_in_short">Retrieve keys</string>
-    <string name="error_invalid_username">This username is invalid</string>
     <string name="error_invalid_password">Password is required</string>
     <string name="error_incorrect_password">The Username or password is incorrect</string>
     <string name="error_field_required">This field is required</string>
-    <string name="permission_rationale">"Contacts permissions are needed for providing email
-        completions."
-    </string>
     <string name="preference_nightscout_url">Nightscout URL</string>
     <string name="preference_api_secret">API SECRET</string>
     <string name="prompt_carelink_username_password">Please enter your CareLink details.\nThey will not be stored.</string>
@@ -119,4 +33,9 @@
     <string name="register_contour_next_link">Register Contour Next Link</string>
     <string name="preferences_enable_crashlytics">prefs_enable_crashlytics</string>
     <string name="preferences_enable_answers">prefs_enable_answers</string>
+    <string name="menu_name_preferences">Preferences</string>
+    <string name="button_text_stop_uploading_data">Stop Uploading CGM Data</string>
+    <string name="button_text_clear_log">Clear Log</string>
+    <string name="button_text_get_now">Get Now</string>
+    <string name="button_text_start_uploading_data">Start Uploading CGM Data</string>
 </resources>
diff --git a/app/src/main/res/xml/example_appwidget_info.xml b/app/src/main/res/xml/example_appwidget_info.xml
deleted file mode 100644
index 475a742..0000000
--- a/app/src/main/res/xml/example_appwidget_info.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minResizeHeight="20dp" android:minWidth="70dp" android:resizeMode="horizontal|vertical" android:initialKeyguardLayout="@layout/widget_lock" android:minResizeWidth="70dp" android:minHeight="20dp" android:initialLayout="@layout/widget_main" android:updatePeriodMillis="10000" android:widgetCategory="home_screen|keyguard">
-    
-
-</appwidget-provider>
-- 
GitLab