From e262ed97fb8ba4bc48c369871c8df03f56280ef2 Mon Sep 17 00:00:00 2001
From: Lennart Goedhart <lennart@omnibase.com.au>
Date: Sun, 22 May 2016 01:56:59 +1000
Subject: [PATCH] Fix #31 - Change all occurrences of BGL to SG (even in code)
 Fix #16 - show registered USB sticks in the registration activity Fix #14 -
 show successfully registered devices after CareLink login.

---
 .../medtronic/GetHmacAndKeyActivity.java      | 61 +++++++++----
 .../medtronic/Medtronic640gActivity.java      | 18 ++--
 .../android/medtronic/MedtronicCNLReader.java |  8 +-
 .../service/MedtronicCNLService.java          |  2 +-
 .../android/upload/MedtronicNG/CGMRecord.java |  4 +-
 .../android/upload/UploadHelper.java          |  4 +-
 app/src/main/res/layout/activity_login.xml    | 91 ++++++++++++-------
 app/src/main/res/menu/menu.xml                |  2 +-
 app/src/main/res/values/strings.xml           |  2 +
 app/src/main/res/xml/preferences.xml          |  2 +-
 10 files changed, 125 insertions(+), 69 deletions(-)

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 9cac9eb..162d148 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java
@@ -5,16 +5,19 @@ import android.animation.AnimatorListenerAdapter;
 import android.annotation.TargetApi;
 import android.app.Activity;
 import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
 import android.content.Loader;
 import android.database.Cursor;
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
+import android.text.Html;
 import android.text.TextUtils;
 import android.view.KeyEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
@@ -58,6 +61,8 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
     private EditText mPasswordView;
     private View mProgressView;
     private View mLoginFormView;
+    private TextView mRegisteredStickView;
+    private Button mCloseButton;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -78,16 +83,27 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
             }
         });
 
-        Button mUsernameSignInButton = (Button) findViewById(R.id.username_sign_in_button);
-        mUsernameSignInButton.setOnClickListener(new OnClickListener() {
+        Button usernameSignInButton = (Button) findViewById(R.id.username_sign_in_button);
+        usernameSignInButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
                 attemptLogin();
             }
         });
+        Button closeButton = (Button) findViewById(R.id.close_button);
+        closeButton.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();
     }
 
     /**
@@ -123,10 +139,6 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
             mUsernameView.setError(getString(R.string.error_field_required));
             focusView = mUsernameView;
             cancel = true;
-        } else if (!isUsernameValid(username)) {
-            mUsernameView.setError(getString(R.string.error_invalid_username));
-            focusView = mUsernameView;
-            cancel = true;
         }
 
         if (cancel) {
@@ -142,14 +154,6 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
         }
     }
 
-    private boolean isUsernameValid(String username) {
-        return true;
-    }
-
-    private boolean isPasswordValid(String password) {
-        return true;
-    }
-
     /**
      * Shows the progress UI and hides the login form.
      */
@@ -186,6 +190,24 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
         }
     }
 
+    private void showRegisteredSticks() {
+        CNLConfigDbHelper configDbHelper = new CNLConfigDbHelper(getBaseContext());
+        Cursor cursor = configDbHelper.getAllRows();
+
+        String deviceTableHtml = "<big><b>Registered Devices</b></big><br/>";
+
+        while( !cursor.isAfterLast() ) {
+            String longSerial = cursor.getString(cursor.getColumnIndex(CNLConfigContract.ConfigEntry.COLUMN_NAME_STICK_SERIAL));
+            String key = cursor.getString(cursor.getColumnIndex(CNLConfigContract.ConfigEntry.COLUMN_NAME_KEY));
+
+            deviceTableHtml += String.format("<b>Serial Number:</b> %s<br/><b>Key:</b> %s<br/>", longSerial, key );
+
+            cursor.moveToNext();
+        }
+
+        mRegisteredStickView.setText(Html.fromHtml( deviceTableHtml ));
+    }
+
     @Override
     public Loader<Cursor> onCreateLoader(int id, Bundle args) {
         return null;
@@ -218,7 +240,7 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
             try {
                 DefaultHttpClient client = new DefaultHttpClient();
                 HttpPost loginPost = new HttpPost("https://carelink.minimed.eu/patient/j_security_check");
-                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
+                List<NameValuePair> nameValuePairs = new ArrayList<>();
                 nameValuePairs.add(new BasicNameValuePair("j_username", mUsername));
                 nameValuePairs.add(new BasicNameValuePair("j_password", mPassword));
                 nameValuePairs.add(new BasicNameValuePair("j_character_encoding", "UTF-8"));
@@ -289,11 +311,16 @@ public class GetHmacAndKeyActivity extends Activity implements LoaderCallbacks<C
         @Override
         protected void onPostExecute(final Boolean success) {
             mHmacAndKeyTask = null;
-            showProgress(false);
 
             if (success) {
-                finish();
+                showRegisteredSticks();
+                mCloseButton.setVisibility(View.VISIBLE);
+                mLoginFormView.setVisibility(View.GONE);
+                mProgressView.setVisibility(View.GONE);
+                InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
+                imm.hideSoftInputFromWindow(mLoginFormView.getWindowToken(), 0);
             } else {
+                showProgress(false);
                 mPasswordView.setError(getString(R.string.error_incorrect_password));
                 mPasswordView.requestFocus();
             }
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 6b2518b..e165811 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java
@@ -126,31 +126,31 @@ public class Medtronic640gActivity extends Activity implements OnSharedPreferenc
                                 df = new DecimalFormat("#.00");
                             else
                                 df = new DecimalFormat("#.0");
-                            String bglString = "---";
+                            String sgvString = "---";
                             String unitsString = "mg/dL";
                             if (prefs.getBoolean("mmolxl", false)) {
                                 try {
-                                    float fBgValue = Float.valueOf(record.sensorBGL);
-                                    bglString = df.format(fBgValue / 18.016f);
+                                    float fBgValue = Float.valueOf(record.sgv);
+                                    sgvString = df.format(fBgValue / 18.016f);
                                     unitsString = "mmol/L";
-                                    log.info("mmolxl true --> " + bglString);
+                                    log.info("mmolxl true --> " + sgvString);
                                 } catch (Exception e) {
 
                                 }
                             } else {
-                                bglString = String.valueOf(record.sensorBGL);
-                                log.info("mmolxl false --> " + bglString);
+                                sgvString = String.valueOf(record.sgv);
+                                log.info("mmolxl false --> " + sgvString);
                             }
 
                             //mTitleTextView.setTextColor(Color.YELLOW);
                             mTitleTextView.setText(Html.fromHtml(
                                     String.format( "<big><b>%s</b></big> <small>%s %s</small>",
-                                            bglString, unitsString, renderTrendHtml(record.getTrend()))));
+                                            sgvString, unitsString, renderTrendHtml(record.getTrend()))));
 
                             mDumpTextView.setTextColor(Color.WHITE);
                             mDumpTextView.setText(Html.fromHtml(
-                                String.format( "<b>BGL 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.sensorBGLDate.getTime(),DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_TIME),
+                                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",
+                                    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,
                                     record.direction
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 e392fc1..7457a77 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
@@ -321,12 +321,12 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
         // Read the data into the record
         long rawActiveInsulin = statusBuffer.getShort(0x33) & 0x0000ffff;
         Medtronic640gActivity.pumpStatusRecord.activeInsulin = new BigDecimal( rawActiveInsulin / 10000f ).setScale(3, BigDecimal.ROUND_HALF_UP);
-        pumpRecord.sensorBGL = statusBuffer.getShort(0x35) & 0x0000ffff; // In mg/DL. 0 means no CGM reading
+        pumpRecord.sgv = statusBuffer.getShort(0x35) & 0x0000ffff; // In mg/DL. 0 means no CGM reading
         long rtc;
         long offset;
-        if( ( pumpRecord.sensorBGL & 0x200 ) == 0x200 ) {
+        if( ( pumpRecord.sgv & 0x200 ) == 0x200 ) {
             // Sensor error. Let's reset. FIXME - solve this more elegantly later
-            pumpRecord.sensorBGL = 0;
+            pumpRecord.sgv = 0;
             rtc = 0;
             offset = 0;
             pumpRecord.setTrend(CGMRecord.TREND.NOT_SET);
@@ -335,7 +335,7 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
             offset = statusBuffer.getInt(0x3b);
             pumpRecord.setTrend(CGMRecord.fromMessageByte( statusBuffer.get(0x40)));
         }
-        pumpRecord.sensorBGLDate = MessageUtils.decodeDateTime(rtc, offset);
+        pumpRecord.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;
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 da0e890..e045626 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
@@ -180,7 +180,7 @@ public class MedtronicCNLService extends AbstractService {
                     cnlReader.endControlMode();
                 }
             } catch (IOException e) {
-                Log.e(TAG, "Error getting BGLs", e);
+                Log.e(TAG, "Error getting SGVs", e);
                 send(Message.obtain(null, Medtronic640gActivity.DexcomG4ActivityHandler.MSG_ERROR, "Error connecting to Contour Next Link."));
             } catch (ChecksumException e) {
                 Log.e(TAG, "Checksum error", e);
diff --git a/app/src/main/java/info/nightscout/android/upload/MedtronicNG/CGMRecord.java b/app/src/main/java/info/nightscout/android/upload/MedtronicNG/CGMRecord.java
index 75bc872..616cbe0 100644
--- a/app/src/main/java/info/nightscout/android/upload/MedtronicNG/CGMRecord.java
+++ b/app/src/main/java/info/nightscout/android/upload/MedtronicNG/CGMRecord.java
@@ -31,8 +31,8 @@ public class CGMRecord extends DeviceRecord implements Serializable {
     private TREND trend = TREND.NOT_SET;
 
     //public Date pumpDate = new Date(); // Store as a date, so we can parse to string later.
-    public int sensorBGL = 0; // in mg/dL. 0 means no sensor reading
-    public Date sensorBGLDate = new Date();
+    public int sgv = 0; // in mg/dL. 0 means no sensor reading
+    public Date sgvDate = new Date();
     public String direction;
 
     public void setTrend( TREND trend ) {
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 f12e8d5..3fd0917 100644
--- a/app/src/main/java/info/nightscout/android/upload/UploadHelper.java
+++ b/app/src/main/java/info/nightscout/android/upload/UploadHelper.java
@@ -719,7 +719,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
     
     private void populateV1APIEntry(JSONObject json, Record oRecord) throws Exception {
 		if (oRecord instanceof CGMRecord) {
-			json.put("date", ((CGMRecord) oRecord).sensorBGLDate.getTime());
+			json.put("date", ((CGMRecord) oRecord).sgvDate.getTime());
 			json.put("dateString",  oRecord.displayTime);
 		} else {
 			Date date = DATE_FORMAT.parse(oRecord.displayTime);
@@ -733,7 +733,7 @@ public class UploadHelper extends AsyncTask<Record, Integer, Long> {
 			json.put("mbg", ((GlucometerRecord) oRecord).numGlucometerValue);
 		}else if (oRecord instanceof CGMRecord){
 				CGMRecord pumpRecord = (CGMRecord) oRecord;
-				json.put("sgv", pumpRecord.sensorBGL);
+				json.put("sgv", pumpRecord.sgv);
 				json.put("direction", pumpRecord.direction);
 				json.put("device", pumpRecord.getDeviceName());
 				json.put("type", "sgv");
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 16cf290..c81f8e8 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -19,54 +19,81 @@
         android:layout_marginBottom="8dp"
         android:visibility="gone"/>
 
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="Please enter your CareLink username and password to retrieve the encryption key for this USB stick. Your username and password will not be stored."
-        android:id="@+id/textView" />
-
     <ScrollView
-        android:id="@+id/login_form"
+        android:id="@+id/scroll_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
 
         <LinearLayout
-            android:id="@+id/user_login_form"
+            android:orientation="vertical"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical">
+            android:layout_height="match_parent">
 
-            <AutoCompleteTextView
-                android:id="@+id/username"
+            <LinearLayout
+                android:id="@+id/login_form"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:hint="@string/prompt_username"
-                android:inputType="text"
-                android:maxLines="1"
-                android:singleLine="true"/>
+                android:orientation="vertical">
+
+                <TextView
+                    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" />
+
+                <AutoCompleteTextView
+                    android:id="@+id/username"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:hint="@string/prompt_username"
+                    android:inputType="text"
+                    android:maxLines="1"
+                    android:singleLine="true"/>
+
+                <EditText
+                    android:id="@+id/password"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:hint="@string/prompt_password"
+                    android:imeActionId="@+id/login"
+                    android:imeActionLabel="@string/action_sign_in_short"
+                    android:imeOptions="actionUnspecified"
+                    android:inputType="textPassword"
+                    android:maxLines="1"
+                    android:singleLine="true"/>
 
-            <EditText
-                android:id="@+id/password"
+                <Button
+                    android:id="@+id/username_sign_in_button"
+                    style="?android:textAppearanceSmall"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="16dp"
+                    android:text="@string/action_sign_in"
+                    android:textStyle="bold"/>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:orientation="horizontal"
                 android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:hint="@string/prompt_password"
-                android:imeActionId="@+id/login"
-                android:imeActionLabel="@string/action_sign_in_short"
-                android:imeOptions="actionUnspecified"
-                android:inputType="textPassword"
-                android:maxLines="1"
-                android:singleLine="true"/>
+                android:layout_height="match_parent">
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:id="@+id/registered_usb_devices" />
+            </LinearLayout>
 
             <Button
-                android:id="@+id/username_sign_in_button"
-                style="?android:textAppearanceSmall"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:text="@string/action_sign_in"
-                android:textStyle="bold"/>
+                android:text="@string/close"
+                android:id="@+id/close_button"
+                android:layout_gravity="center_horizontal"
+                android:visibility="invisible" />
 
         </LinearLayout>
     </ScrollView>
+
 </LinearLayout>
diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml
index 894bd50..7cdc923 100644
--- a/app/src/main/res/menu/menu.xml
+++ b/app/src/main/res/menu/menu.xml
@@ -8,6 +8,6 @@
     <item
             android:id="@+id/registerCNL"
             android:orderInCategory="100"
-            android:title="Register USB Stick">
+            android:title="Register Contour Next Link">
     </item>
 </menu>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7f609a6..cdc43a8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -115,4 +115,6 @@
     </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>
+    <string name="close">Close</string>
 </resources>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index 5117963..55b0184 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -26,7 +26,7 @@
             android:title="REST API Upload"
             android:key="EnableRESTUpload"
             android:disableDependentsState="false"
-            android:summary="Enable upload of BGL data to Nightscout">
+            android:summary="Enable upload of data to Nightscout">
     </info.nightscout.android.utils.CustomSwitchPreference>
     <EditTextPreference
             android:dependency="EnableRESTUpload"
-- 
GitLab