From 81efbf5575a1db46d3f605f1e57fdd8b0389beaf Mon Sep 17 00:00:00 2001 From: Lennart Goedhart <lennart@omnibase.com.au> Date: Tue, 18 Apr 2017 06:56:33 +1000 Subject: [PATCH] =?UTF-8?q?Update=20okhttp=20version=20to=20match=20with?= =?UTF-8?q?=20AppUpdater=20version=20to=20fix=20crashing.=20Add=20?= =?UTF-8?q?=E2=80=9CCheck=20for=20App=20Update=E2=80=9D=20menu=20item.=20D?= =?UTF-8?q?on=E2=80=99t=20render=20trend=20arrows=20using=20HTML=20-=20use?= =?UTF-8?q?=20Unicode=20instead.=20Rename=20app=20from=20=E2=80=9CNS=20600?= =?UTF-8?q?=20Series=20Uploader=E2=80=9D=20to=20=E2=80=9C600=20Series=20Up?= =?UTF-8?q?loader=E2=80=9D.=20Experiment=20with=20adding=20status=20tiles.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 +- .../android/medtronic/MainActivity.java | 150 ++++++++-------- .../model/medtronicNg/PumpStatusEvent.java | 6 +- app/src/main/res/layout/activity_main.xml | 9 +- app/src/main/res/layout/activity_status.xml | 164 ++++++++++++++++-- app/src/main/res/values/strings.xml | 2 +- 6 files changed, 240 insertions(+), 101 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c5a1e8f..f2e7efc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -150,6 +150,8 @@ dependencies { compile 'com.android.support:support-v13:25.3.1' compile 'com.android.support:design:25.3.1' compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support:recyclerview-v7:25.3.1' + compile 'com.android.support:cardview-v7:25.3.1' compile 'org.apache.commons:commons-lang3:3.4' compile 'com.mikepenz:google-material-typeface:2.2.0.1.original@aar' compile 'uk.co.chrisjenx:calligraphy:2.2.0' @@ -158,12 +160,16 @@ dependencies { compile 'com.google.code.gson:gson:2.7' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' - compile 'com.squareup.okhttp3:okhttp:3.3.1' - compile 'com.squareup.okhttp3:logging-interceptor:3.3.1' + + // The version of okhttp3 *must* be the same as the version in AppUpdater + compile 'com.squareup.okhttp3:okhttp:3.6.0' + compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' + compile('com.crashlytics.sdk.android:crashlytics:2.6.7@aar') { transitive = true; } compile('com.mikepenz:materialdrawer:5.2.9@aar') { transitive = true } + compile 'com.github.javiersantos:AppUpdater:2.6.1' } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java index 18351da..92c67dc 100644 --- a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java +++ b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java @@ -29,7 +29,6 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.app.NotificationCompat; import android.support.v7.view.menu.ActionMenuItemView; import android.support.v7.widget.Toolbar; -import android.text.Html; import android.text.format.DateUtils; import android.util.Log; import android.view.Menu; @@ -40,6 +39,8 @@ import android.widget.TextView; import android.widget.TextView.BufferType; import android.widget.Toast; +import com.github.javiersantos.appupdater.AppUpdater; +import com.github.javiersantos.appupdater.enums.UpdateFrom; import com.jjoe64.graphview.DefaultLabelFormatter; import com.jjoe64.graphview.GraphView; import com.jjoe64.graphview.Viewport; @@ -74,7 +75,6 @@ import info.nightscout.android.medtronic.service.MedtronicCnlIntentService; import info.nightscout.android.model.medtronicNg.PumpInfo; import info.nightscout.android.model.medtronicNg.PumpStatusEvent; import info.nightscout.android.settings.SettingsActivity; -import info.nightscout.android.upload.nightscout.NightscoutUploadIntentService; import info.nightscout.android.utils.ConfigurationStore; import info.nightscout.android.utils.DataStore; import io.realm.Realm; @@ -99,7 +99,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc private PumpInfo mActivePump; private TextView mTextViewLog; // This will eventually move to a status page. private GraphView mChart; - private Intent mNightscoutUploadService; private Handler mUiRefreshHandler = new Handler(); private Runnable mUiRefreshRunnable = new RefreshDisplayRunnable(); private Realm mRealm; @@ -113,7 +112,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc * @return timestamp */ public static long getNextPoll(PumpStatusEvent pumpStatusData) { - long nextPoll = pumpStatusData.getEventDate().getTime() + pumpStatusData.getPumpTimeOffset(), + long nextPoll = pumpStatusData.getSgvDate().getTime() + pumpStatusData.getPumpTimeOffset(), now = System.currentTimeMillis(), pollInterval = ConfigurationStore.getInstance().getPollInterval(); @@ -137,21 +136,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc return nextPoll; } - public static String strFormatSGV(float sgvValue) { - ConfigurationStore configurationStore = ConfigurationStore.getInstance(); - if (configurationStore.isMmolxl()) { - NumberFormat sgvFormatter; - if (configurationStore.isMmolxlDecimals()) { - sgvFormatter = new DecimalFormat("0.00"); - } else { - sgvFormatter = new DecimalFormat("0.0"); - } - return sgvFormatter.format(sgvValue / MMOLXLFACTOR); - } else { - return String.valueOf(sgvValue); - } - } - @Override public void onCreate(Bundle savedInstanceState) { Log.i(TAG, "onCreate called"); @@ -164,8 +148,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc if (data.size() > 0) dataStore.setLastPumpStatus(data.first()); - mNightscoutUploadService = new Intent(this, NightscoutUploadIntentService.class); - setContentView(R.layout.activity_main); PreferenceManager.getDefaultSharedPreferences(getBaseContext()).registerOnSharedPreferenceChangeListener(this); @@ -257,7 +239,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc .withIcon(GoogleMaterial.Icon.gmd_settings) .withSelectable(false); final PrimaryDrawerItem itemRegisterUsb = new PrimaryDrawerItem() - .withName("Registered Devices") + .withName("Registered devices") .withIcon(GoogleMaterial.Icon.gmd_usb) .withSelectable(false); final PrimaryDrawerItem itemStopCollecting = new PrimaryDrawerItem() @@ -269,15 +251,15 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc .withIcon(GoogleMaterial.Icon.gmd_refresh) .withSelectable(false); final PrimaryDrawerItem itemUpdateProfile = new PrimaryDrawerItem() - .withName("Update Profile") + .withName("Update pump profile") .withIcon(GoogleMaterial.Icon.gmd_insert_chart) .withSelectable(false); final PrimaryDrawerItem itemClearLog = new PrimaryDrawerItem() - .withName("Clear Log") + .withName("Clear log") .withIcon(GoogleMaterial.Icon.gmd_clear_all) .withSelectable(false); final PrimaryDrawerItem itemCheckForUpdate = new PrimaryDrawerItem() - .withName("Check For Update") + .withName("Check for App update") .withIcon(GoogleMaterial.Icon.gmd_update) .withSelectable(false); @@ -318,7 +300,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc } else if (drawerItem.equals(itemClearLog)) { clearLogText(); } else if (drawerItem.equals(itemCheckForUpdate)) { - checkForUpdate(1); + checkForUpdateNow(); } return false; @@ -372,7 +354,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc if (isValueX) { return mFormat.format(new Date((long) value)); } else { - return sgvFormatter.format(value); + return MainActivity.strFormatSGV(value); } } } @@ -382,7 +364,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc @Override protected void onStart() { super.onStart(); - checkForUpdate(5); + checkForUpdateBackground(5); } @Override @@ -452,17 +434,20 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc statusMessageReceiver.clearMessages(); } - private void checkForUpdate(int checkEvery) { - /* + private void checkForUpdateNow() { + new AppUpdater(this) + .setUpdateFrom(UpdateFrom.JSON) + .setUpdateXML("https://raw.githubusercontent.com/pazaan/600SeriesAndroidUploader/master/app/update.json") + .showAppUpdated(true) // Show a dialog, even if there isn't an update + .start(); + } + + private void checkForUpdateBackground(int checkEvery) { new AppUpdater(this) .setUpdateFrom(UpdateFrom.JSON) - .setUpdateXML("https://raw.githubusercontent.com/javiersantos/AppUpdater/master/app/update-changelog.json") -// .setUpdateXML("https://raw.githubusercontent.com/javiersantos/AppUpdater/master/app/update.json") - .setDisplay(Display.DIALOG) - .showEvery(checkEvery) - .showAppUpdated(true) + .setUpdateXML("https://raw.githubusercontent.com/pazaan/600SeriesAndroidUploader/master/app/update.json") + .showEvery(checkEvery) // Only check for an update every `checkEvery` invocations .start(); - */ } private void startDisplayRefreshLoop() { @@ -479,7 +464,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc private void startCgmServiceDelayed(long delay) { RealmResults<PumpStatusEvent> results = mRealm.where(PumpStatusEvent.class) - .findAllSorted("eventDate", Sort.DESCENDING); + .findAllSorted("sgvDate", Sort.DESCENDING); if (results.size() > 0) { startCgmService(getNextPoll(results.first()) + delay); @@ -609,27 +594,6 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc startActivity(manageCNLIntent); } - private String renderTrendHtml(PumpStatusEvent.CGM_TREND trend) { - switch (trend) { - case DOUBLE_UP: - return "⇈"; - case SINGLE_UP: - return "↑"; - case FOURTY_FIVE_UP: - return "↗"; - case FLAT: - return "→"; - case FOURTY_FIVE_DOWN: - return "↘"; - case SINGLE_DOWN: - return "↓"; - case DOUBLE_DOWN: - return "⇊"; - default: - return "—"; - } - } - private PumpInfo getActivePump() { long activePumpMac = dataStore.getActivePumpMac(); if (activePumpMac != 0L && (mActivePump == null || !mActivePump.isValid() || mActivePump.getPumpMac() != activePumpMac)) { @@ -688,6 +652,44 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc return mActivePump; } + + public static String strFormatSGV(double sgvValue) { + ConfigurationStore configurationStore = ConfigurationStore.getInstance(); + + if (configurationStore.isMmolxl()) { + NumberFormat sgvFormatter; + if (configurationStore.isMmolxlDecimals()) { + sgvFormatter = new DecimalFormat("0.00"); + } else { + sgvFormatter = new DecimalFormat("0.0"); + } + return sgvFormatter.format(sgvValue / MMOLXLFACTOR); + } else { + return String.valueOf(sgvValue); + } + } + + public static String renderTrendSymbol(PumpStatusEvent.CGM_TREND trend) { + switch (trend) { + case DOUBLE_UP: + return "\u21c8"; + case SINGLE_UP: + return "\u2191"; + case FOURTY_FIVE_UP: + return "\u2197"; + case FLAT: + return "\u2192"; + case FOURTY_FIVE_DOWN: + return "\u2198"; + case SINGLE_DOWN: + return "\u2193"; + case DOUBLE_DOWN: + return "\u21ca"; + default: + return "\u2014"; + } + } + private class StatusMessageReceiver extends BroadcastReceiver { private class StatusMessage { private long timestamp; @@ -757,32 +759,32 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc // Get the most recently written CGM record for the active pump. PumpStatusEvent pumpStatusData = null; - // ignoring activePump atm - //PumpInfo pump = getActivePump(); - if (dataStore.getLastPumpStatus().getEventDate().getTime() > 0) { pumpStatusData = dataStore.getLastPumpStatus(); } updateChart(mRealm.where(PumpStatusEvent.class) - .greaterThan("eventDate", new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24)) - .findAllSorted("eventDate", Sort.ASCENDING)); + .greaterThan("sgvDate", new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24)) + .findAllSorted("sgvDate", Sort.ASCENDING)); if (pumpStatusData != null) { String sgvString; - if (configurationStore.isMmolxl()) { - float fBgValue = (float) pumpStatusData.getSgv(); - sgvString = sgvFormatter.format(fBgValue / MMOLXLFACTOR); - Log.d(TAG, sgvString + " mmol/L"); + if (pumpStatusData.isCgmActive()) { + sgvString = MainActivity.strFormatSGV(pumpStatusData.getSgv()); + ; + if (configurationStore.isMmolxl()) { + Log.d(TAG, sgvString + " mmol/L"); + } else { + Log.d(TAG, sgvString + " mg/dL"); + } } else { - sgvString = String.valueOf(pumpStatusData.getSgv()); - Log.d(TAG, sgvString + " mg/dL"); + sgvString = "\u2014"; // — } textViewBg.setText(sgvString); textViewBgTime.setText(DateUtils.getRelativeTimeSpanString(pumpStatusData.getEventDate().getTime())); - textViewTrend.setText(Html.fromHtml(renderTrendHtml(pumpStatusData.getCgmTrend()))); + textViewTrend.setText(MainActivity.renderTrendSymbol(pumpStatusData.getCgmTrend())); textViewIOB.setText(String.format(Locale.getDefault(), "%.2f", pumpStatusData.getActiveInsulin())); ActionMenuItemView batIcon = ((ActionMenuItemView) findViewById(R.id.status_battery)); @@ -850,11 +852,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc int pos = 0; for (PumpStatusEvent pumpStatus : results) { // turn your data into Entry objects - if (configurationStore.isMmolxl()) { - entries[pos++] = new DataPoint(pumpStatus.getEventDate(), (float) pumpStatus.getSgv() / MMOLXLFACTOR); - } else { - entries[pos++] = new DataPoint(pumpStatus.getEventDate(), (float) pumpStatus.getSgv()); - } + entries[pos++] = new DataPoint(pumpStatus.getSgvDate(), (double) pumpStatus.getSgv()); } if (mChart.getSeries().size() == 0) { @@ -879,7 +877,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc double sgv = dataPoint.getY(); StringBuilder sb = new StringBuilder(mFormat.format(new Date((long) dataPoint.getX())) + ": "); - sb.append(sgvFormatter.format(sgv)); + sb.append(MainActivity.strFormatSGV(sgv)); Toast.makeText(getBaseContext(), sb.toString(), Toast.LENGTH_SHORT).show(); } }); diff --git a/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java b/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java index 91f042b..fdc460f 100644 --- a/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java +++ b/app/src/main/java/info/nightscout/android/model/medtronicNg/PumpStatusEvent.java @@ -1,7 +1,10 @@ package info.nightscout.android.model.medtronicNg; +import java.text.DecimalFormat; +import java.text.NumberFormat; import java.util.Date; +import info.nightscout.android.utils.ConfigurationStore; import io.realm.RealmObject; import io.realm.annotations.Ignore; import io.realm.annotations.Index; @@ -81,7 +84,7 @@ public class PumpStatusEvent extends RealmObject { } public CGM_TREND getCgmTrend() { - if (cgmTrend == null) { + if (cgmTrend == null || !this.isCgmActive()) { return CGM_TREND.NOT_SET; } else { return CGM_TREND.valueOf(cgmTrend); @@ -341,5 +344,4 @@ public class PumpStatusEvent extends RealmObject { } } } - } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1830813..8ed60ee 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -52,10 +52,11 @@ android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_weight="1" + android:maxLines="1" android:text="-" + android:textAlignment="center" android:textAppearance="?android:attr/textAppearanceLarge" - android:textSize="70sp" - android:maxLines="1" /> + android:textSize="70sp" /> <LinearLayout android:layout_width="0dp" @@ -70,10 +71,10 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center|top" + android:maxLines="1" android:text="-" android:textAppearance="?android:attr/textAppearanceLarge" - android:textSize="40sp" - android:maxLines="1" /> + android:textSize="40sp" /> <TextView android:id="@+id/textview_units" diff --git a/app/src/main/res/layout/activity_status.xml b/app/src/main/res/layout/activity_status.xml index 8e68fc0..f67e096 100644 --- a/app/src/main/res/layout/activity_status.xml +++ b/app/src/main/res/layout/activity_status.xml @@ -26,40 +26,172 @@ </android.support.design.widget.AppBarLayout> <ScrollView + android:id="@+id/status_scroll_view" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:id="@+id/status_scroll_view" + android:layout_marginLeft="@dimen/activity_horizontal_margin" + android:layout_marginRight="@dimen/activity_horizontal_margin" android:fillViewport="true"> <LinearLayout - android:orientation="vertical" + android:id="@+id/x" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:layout_margin="5dp" + android:orientation="vertical"> <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Pump Status" android:id="@+id/status_pump_text_view" - android:maxLines="1" /> + style="?android:attr/listSeparatorTextViewStyle" + android:layout_height="wrap_content" + android:maxLines="1" + android:text="Pump Status" /> + + <GridLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <android.support.v7.widget.CardView + android:id="@+id/card_view" + android:layout_width="100dp" + android:layout_height="100dp" + android:layout_gravity="center" + app:cardCornerRadius="4dp"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="5dp"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="center" + app:srcCompat="@drawable/battery_0" /> + + <TextView + android:id="@+id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/textView" + android:text="Units Remaining" + android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/imageView" + android:layout_centerHorizontal="true" + android:layout_centerInParent="true" + android:text="150.250" + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.AppCompat.Headline" /> + </RelativeLayout> + + </android.support.v7.widget.CardView> + + <android.support.v7.widget.CardView + android:id="@+id/card_view" + android:layout_width="100dp" + android:layout_height="100dp" + android:layout_gravity="center" + app:cardCornerRadius="4dp"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="5dp"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="center" + app:srcCompat="@drawable/battery_0" /> + + <TextView + android:id="@+id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/textView" + android:text="Units Remaining" + android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/imageView" + android:layout_centerHorizontal="true" + android:layout_centerInParent="true" + android:text="150.250" + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.AppCompat.Headline" /> + </RelativeLayout> + + </android.support.v7.widget.CardView> + + <android.support.v7.widget.CardView + android:id="@+id/card_view" + android:layout_width="100dp" + android:layout_height="100dp" + android:layout_gravity="center" + app:cardCornerRadius="4dp"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="5dp"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="center" + app:srcCompat="@drawable/battery_0" /> + + <TextView + android:id="@+id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/textView" + android:text="Units Remaining" + android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@+id/imageView" + android:layout_centerHorizontal="true" + android:layout_centerInParent="true" + android:text="150.250" + android:textAlignment="center" + android:textAppearance="@style/TextAppearance.AppCompat.Headline" /> + </RelativeLayout> + + </android.support.v7.widget.CardView> + </GridLayout> <TextView - android:layout_width="wrap_content" + android:id="@+id/status_uploader_text_view" + style="?android:attr/listSeparatorTextViewStyle" android:layout_height="wrap_content" - android:text="Uploader Status" - android:id="@+id/status_uploader_text_view" /> + android:text="Uploader Status" /> <TextView - android:layout_width="wrap_content" + android:id="@+id/status_cgm_text_view" + style="?android:attr/listSeparatorTextViewStyle" android:layout_height="wrap_content" - android:text="CGM Status" - android:id="@+id/status_cgm_text_view" /> + android:text="CGM Status" /> <TextView - android:layout_width="wrap_content" + android:id="@+id/status_nightscout_text_view" + style="?android:attr/listSeparatorTextViewStyle" android:layout_height="wrap_content" - android:text="Nightscout Status" - android:id="@+id/status_nightscout_text_view" /> + android:text="Nightscout Status" /> </LinearLayout> </ScrollView> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5ede84c..00a38b6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ <resources> <string name="hello">---</string> - <string name="app_name">NS 600 Series Uploader</string> + <string name="app_name">600 Series Uploader</string> <string name="eula_title">Disclaimer</string> <string name="eula_accept">Accept</string> <string name="eula_refuse">Refuse</string> -- GitLab