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