diff --git a/.travis.yml b/.travis.yml index 8429db4b11..6799bbf35f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ android: components: - platform-tools - tools - - build-tools-25.0.2 + - build-tools-26.0.2 - android-23 - extra-google-m2repository - extra-android-m2repository diff --git a/app/build.gradle b/app/build.gradle index 794626e34f..8c86af585e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ def generateGitBuild = { -> android { compileSdkVersion 23 - buildToolsVersion "25.0.2" + buildToolsVersion "26.0.2" defaultConfig { applicationId "info.nightscout.androidaps" diff --git a/app/src/main/java/info/nightscout/androidaps/Config.java b/app/src/main/java/info/nightscout/androidaps/Config.java index 63965b2e0c..874f75d2bf 100644 --- a/app/src/main/java/info/nightscout/androidaps/Config.java +++ b/app/src/main/java/info/nightscout/androidaps/Config.java @@ -4,7 +4,7 @@ package info.nightscout.androidaps; * Created by mike on 07.06.2016. */ public class Config { - public static int SUPPORTEDNSVERSION = 1000; // 0.10.00 + public static int SUPPORTEDNSVERSION = 1002; // 0.10.00 // MAIN FUCTIONALITY public static final boolean APS = BuildConfig.APS; diff --git a/app/src/main/java/info/nightscout/androidaps/Constants.java b/app/src/main/java/info/nightscout/androidaps/Constants.java index 46e8bc33a2..2d6ee910c8 100644 --- a/app/src/main/java/info/nightscout/androidaps/Constants.java +++ b/app/src/main/java/info/nightscout/androidaps/Constants.java @@ -54,11 +54,12 @@ public class Constants { //Screen: Threshold for width/height to go into small width/height layout public static final int SMALL_WIDTH = 320; - public static final int SMALL_HEIGHT = 320; + public static final int SMALL_HEIGHT = 480; //Autosens public static final double DEVIATION_TO_BE_EQUAL = 2.0; // Pump - public static final int PUMP_MAX_CONNECTION_TIME_IN_SECONDS = 60 - 1; + public static final int PUMP_MAX_CONNECTION_TIME_IN_SECONDS = 120 - 1; + public static final int MIN_WATCHDOG_INTERVAL_IN_SECONDS = 12 * 60; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index 5087d75bbd..e669f57068 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -2,6 +2,7 @@ package info.nightscout.androidaps.plugins.IobCobCalculator; import android.os.Handler; import android.os.HandlerThread; +import android.os.Process; import android.support.annotation.Nullable; import android.support.v4.util.LongSparseArray; @@ -134,7 +135,7 @@ public class IobCobCalculatorPlugin implements PluginBase { IobCobCalculatorPlugin() { MainApp.bus().register(this); if (sHandlerThread == null) { - sHandlerThread = new HandlerThread(IobCobCalculatorPlugin.class.getSimpleName()); + sHandlerThread = new HandlerThread(IobCobCalculatorPlugin.class.getSimpleName(), Process.THREAD_PRIORITY_LOWEST); sHandlerThread.start(); sHandler = new Handler(sHandlerThread.getLooper()); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java index 2bd61aa4a9..315e9724ce 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/NSDeviceStatus.java @@ -308,6 +308,15 @@ public class NSDeviceStatus { return Html.fromHtml(string.toString()); } + public static long getOpenApsTimestamp() { + + if (deviceStatusOpenAPSData.clockSuggested != 0) { + return deviceStatusOpenAPSData.clockSuggested; + } else { + return -1; + } + } + public Spanned getExtendedOpenApsStatus() { StringBuilder string = new StringBuilder(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index 2bf2e4fb4f..3aa8acb17e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -632,7 +632,14 @@ public class NSClientService extends Service { if (sgv.getMills() > latestDateInReceivedData) latestDateInReceivedData = sgv.getMills(); } - BroadcastSgvs.handleNewSgv(sgvs, MainApp.instance().getApplicationContext(), isDelta); + // Was that sgv more less 15 mins ago ? + boolean lessThan15MinAgo = false; + if((System.currentTimeMillis()-latestDateInReceivedData)/(60 * 1000L) < 15L ) + lessThan15MinAgo = true; + if(Notification.isAlarmForStaleData() && lessThan15MinAgo){ + MainApp.bus().post(new EventDismissNotification(Notification.NSALARM)); + } + BroadcastSgvs.handleNewSgv(sgvs, MainApp.instance().getApplicationContext(), isDelta); } MainApp.bus().post(new EventNSClientNewLog("LAST", DateUtil.dateAndTimeString(latestDateInReceivedData))); } catch (JSONException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index 2567c49868..35906187a6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -35,6 +35,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL static double amount; public static boolean bolusEnded = false; public static boolean running = true; + public static boolean stopPressed = false; public BolusProgressDialog() { super(); @@ -62,6 +63,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL progressBar.setMax(100); statusView.setText(MainApp.sResources.getString(R.string.waitingforpump)); setCancelable(false); + stopPressed = false; return view; } @@ -95,6 +97,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL switch (view.getId()) { case R.id.overview_bolusprogress_stop: log.debug("Stop bolus delivery button pressed"); + stopPressed = true; stopPressedView.setVisibility(View.VISIBLE); stopButton.setVisibility(View.INVISIBLE); ConfigBuilderPlugin.getActivePump().stopBolusDelivering(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index 35aa5b3385..0e3fa03c29 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -191,8 +191,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); int screen_width = dm.widthPixels; int screen_height = dm.heightPixels; - smallWidth = screen_width < Constants.SMALL_WIDTH; - smallHeight = screen_height < Constants.SMALL_HEIGHT; + smallWidth = screen_width <= Constants.SMALL_WIDTH; + smallHeight = screen_height <= Constants.SMALL_HEIGHT; boolean landscape = screen_height < screen_width; View view; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 5705e0f9b1..a0c2167391 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -191,7 +191,7 @@ public class GraphData { basalsLineSeries = new LineGraphSeries<>(basalLine); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); - paint.setStrokeWidth(2); + paint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity*2); paint.setPathEffect(new DashPathEffect(new float[]{2, 4}, 0)); paint.setColor(MainApp.sResources.getColor(R.color.basal)); basalsLineSeries.setCustomPaint(paint); @@ -201,7 +201,7 @@ public class GraphData { absoluteBasalsLineSeries = new LineGraphSeries<>(absoluteBasalLine); Paint absolutePaint = new Paint(); absolutePaint.setStyle(Paint.Style.STROKE); - absolutePaint.setStrokeWidth(4); + absolutePaint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity*2); absolutePaint.setColor(MainApp.sResources.getColor(R.color.basal)); absoluteBasalsLineSeries.setCustomPaint(absolutePaint); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java index f4d1d8aeda..d021820e95 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java @@ -30,7 +30,10 @@ import android.graphics.Path; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Typeface; - +import android.util.TypedValue; +// Added by Rumen for scalable text +import android.content.Context; +import info.nightscout.androidaps.MainApp; import com.jjoe64.graphview.GraphView; import com.jjoe64.graphview.series.BaseSeries; @@ -44,6 +47,13 @@ import java.util.Iterator; * @author jjoe64 */ public class PointsWithLabelGraphSeries extends BaseSeries { + // Default spSize + int spSize = 12; + // Convert the sp to pixels + Context context = MainApp.instance().getApplicationContext(); + float scaledTextSize = spSize * context.getResources().getDisplayMetrics().scaledDensity; + float scaledPxSize = context.getResources().getDisplayMetrics().scaledDensity * 1.5f; + /** * choose a predefined shape to render for * each data point. @@ -189,31 +199,31 @@ public class PointsWithLabelGraphSeries e if (value.getShape() == Shape.BG) { mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, value.getSize(), mPaint); + canvas.drawCircle(endX, endY, scaledPxSize, mPaint); } else if (value.getShape() == Shape.PREDICTION) { mPaint.setColor(value.getColor()); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, value.getSize(), mPaint); + canvas.drawCircle(endX, endY, scaledPxSize, mPaint); mPaint.setColor(value.getSecondColor()); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, value.getSize() / 3, mPaint); + canvas.drawCircle(endX, endY, scaledPxSize / 3, mPaint); } else if (value.getShape() == Shape.RECTANGLE) { - canvas.drawRect(endX-value.getSize(), endY-value.getSize(), endX+value.getSize(), endY+value.getSize(), mPaint); + canvas.drawRect(endX-scaledPxSize, endY-scaledPxSize, endX+scaledPxSize, endY+scaledPxSize, mPaint); } else if (value.getShape() == Shape.TRIANGLE) { mPaint.setStrokeWidth(0); Point[] points = new Point[3]; - points[0] = new Point((int)endX, (int)(endY-value.getSize())); - points[1] = new Point((int)(endX+value.getSize()), (int)(endY+value.getSize()*0.67)); - points[2] = new Point((int)(endX-value.getSize()), (int)(endY+value.getSize()*0.67)); + points[0] = new Point((int)endX, (int)(endY-scaledPxSize)); + points[1] = new Point((int)(endX+scaledPxSize), (int)(endY+scaledPxSize*0.67)); + points[2] = new Point((int)(endX-scaledPxSize), (int)(endY+scaledPxSize*0.67)); drawArrows(points, canvas, mPaint); } else if (value.getShape() == Shape.BOLUS) { mPaint.setStrokeWidth(0); Point[] points = new Point[3]; - points[0] = new Point((int)endX, (int)(endY-value.getSize())); - points[1] = new Point((int)(endX+value.getSize()), (int)(endY+value.getSize()*0.67)); - points[2] = new Point((int)(endX-value.getSize()), (int)(endY+value.getSize()*0.67)); + points[0] = new Point((int)endX, (int)(endY-scaledPxSize)); + points[1] = new Point((int)(endX+scaledPxSize), (int)(endY+scaledPxSize*0.67)); + points[2] = new Point((int)(endX-scaledPxSize), (int)(endY+scaledPxSize*0.67)); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); drawArrows(points, canvas, mPaint); if (value.getLabel() != null) { @@ -233,7 +243,7 @@ public class PointsWithLabelGraphSeries e Rect bounds = new Rect((int)endX, (int)endY + 3, (int) (xpluslength), (int) endY + 8); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawRect(bounds, mPaint); - mPaint.setTextSize((int) (value.getSize() * 2.5)); + mPaint.setTextSize((int) (scaledTextSize * 2.5)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); canvas.drawText(value.getLabel(), endX, endY, mPaint); @@ -241,7 +251,8 @@ public class PointsWithLabelGraphSeries e } else if (value.getShape() == Shape.PROFILE) { mPaint.setStrokeWidth(0); if (value.getLabel() != null) { - mPaint.setTextSize((int) (value.getSize() * 3)); + //mPaint.setTextSize((int) (scaledPxSize * 3)); + mPaint.setTextSize((float) (scaledTextSize*1.2)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); Rect bounds = new Rect(); mPaint.getTextBounds(value.getLabel(), 0, value.getLabel().length(), bounds); @@ -257,25 +268,26 @@ public class PointsWithLabelGraphSeries e } else if (value.getShape() == Shape.MBG) { mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5); - canvas.drawCircle(endX, endY, value.getSize(), mPaint); + float w = mPaint.getStrokeWidth(); + canvas.drawCircle(endX, endY, scaledPxSize, mPaint); } else if (value.getShape() == Shape.BGCHECK) { mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, value.getSize(), mPaint); + canvas.drawCircle(endX, endY, scaledPxSize, mPaint); if (value.getLabel() != null) { drawLabel45(endX, endY, value, canvas); } } else if (value.getShape() == Shape.ANNOUNCEMENT) { mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, value.getSize(), mPaint); + canvas.drawCircle(endX, endY, scaledPxSize, mPaint); if (value.getLabel() != null) { drawLabel45(endX, endY, value, canvas); } } else if (value.getShape() == Shape.GENERAL) { mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, value.getSize(), mPaint); + canvas.drawCircle(endX, endY, scaledPxSize, mPaint); if (value.getLabel() != null) { drawLabel45(endX, endY, value, canvas); } @@ -283,7 +295,7 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(0); if (value.getLabel() != null) { mPaint.setStrokeWidth(0); - mPaint.setTextSize((int) (value.getSize() * 3)); + mPaint.setTextSize((int) (scaledTextSize * 3)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); Rect bounds = new Rect(); mPaint.getTextBounds(value.getLabel(), 0, value.getLabel().length(), bounds); @@ -298,7 +310,7 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(0); if (value.getLabel() != null) { mPaint.setStrokeWidth(0); - mPaint.setTextSize((int) (value.getSize() * 3)); + mPaint.setTextSize(scaledTextSize); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); Rect bounds = new Rect(); mPaint.getTextBounds(value.getLabel(), 0, value.getLabel().length(), bounds); @@ -313,7 +325,7 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(0); if (value.getLabel() != null) { mPaint.setStrokeWidth(0); - mPaint.setTextSize((int) (value.getSize() * 3)); + mPaint.setTextSize(scaledTextSize * 3); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); Rect bounds = new Rect(); mPaint.getTextBounds(value.getLabel(), 0, value.getLabel().length(), bounds); @@ -364,26 +376,26 @@ public class PointsWithLabelGraphSeries e void drawLabel45(float endX, float endY, E value, Canvas canvas) { if (value.getLabel().startsWith("~")) { float px = endX; - float py = endY + value.getSize(); + float py = endY + scaledPxSize; canvas.save(); canvas.rotate(-45, px, py); - mPaint.setTextSize((int) (value.getSize() * 2.5)); + mPaint.setTextSize((float) (scaledTextSize*0.8)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); mPaint.setTextAlign(Paint.Align.RIGHT); - canvas.drawText(value.getLabel().substring(1), px - value.getSize(), py, mPaint); + canvas.drawText(value.getLabel().substring(1), px - scaledPxSize, py, mPaint); mPaint.setTextAlign(Paint.Align.LEFT); canvas.restore(); } else { float px = endX; - float py = endY - value.getSize(); + float py = endY - scaledPxSize; canvas.save(); canvas.rotate(-45, px, py); - mPaint.setTextSize((int) (value.getSize() * 2.5)); + mPaint.setTextSize((float) (scaledTextSize*0.8)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); - canvas.drawText(value.getLabel(), px + value.getSize(), py, mPaint); + canvas.drawText(value.getLabel(), px + scaledPxSize, py, mPaint); canvas.restore(); } } -} +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java index 160e14c98b..34ba82c27e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/Notification.java @@ -64,6 +64,8 @@ public class Notification { public NSAlarm nsAlarm = null; public Integer soundId = null; + public Notification() { + } public Notification(int id, Date date, String text, int level, Date validTo) { this.id = id; @@ -175,9 +177,10 @@ public class Notification { return false; } - static boolean isAlarmForStaleData() { - if (SP.getLong("snoozedTo", 0L) != 0L) { - if (System.currentTimeMillis() < SP.getLong("snoozedTo", 0L)) { + public static boolean isAlarmForStaleData(){ + long snoozedTo = SP.getLong("snoozedTo", 0L); + if(snoozedTo != 0L){ + if(System.currentTimeMillis() < SP.getLong("snoozedTo", 0L)) { //log.debug("Alarm is snoozed for next "+(SP.getLong("snoozedTo", 0L)-System.currentTimeMillis())/1000+" seconds"); return false; } @@ -188,16 +191,17 @@ public class Notification { long bgReadingAgo = System.currentTimeMillis() - bgReading.date; int bgReadingAgoMin = (int) (bgReadingAgo / (1000 * 60)); // Added for testing - //bgReadingAgoMin = 20; - log.debug("bgReadingAgoMin value is:" + bgReadingAgoMin); - Double threshold = NSSettingsStatus.getInstance().getThreshold("alarmTimeagoWarnMins"); + // bgReadingAgoMin = 20; boolean openAPSEnabledAlerts = NSSettingsStatus.getInstance().openAPSEnabledAlerts(); - log.debug("OpenAPS Alerts enabled: " + openAPSEnabledAlerts); - // if no thresshold from Ns get it loccally - if (threshold == null) threshold = SP.getDouble(R.string.key_nsalarm_staledatavalue, 15D); - // No threshold of OpenAPS Alarm so using the one for BG - // Added OpenAPSEnabledAlerts to alarm check - if ((bgReadingAgoMin > threshold && SP.getBoolean(R.string.key_nsalarm_staledata, false)) || (bgReadingAgoMin > threshold && openAPSEnabledAlerts)) { + //log.debug("bgReadingAgoMin value is:"+bgReadingAgoMin); + //log.debug("Stale alarm snoozed to: "+(System.currentTimeMillis() - snoozedTo)/60000L); + Double threshold = NSSettingsStatus.getInstance().getThreshold("alarmTimeagoWarnMins"); + //log.debug("OpenAPS Alerts enabled: "+openAPSEnabledAlerts); + // if no thresshold from Ns get it loccally + if(threshold == null) threshold = SP.getDouble(R.string.key_nsalarm_staledatavalue,15D); + // No threshold of OpenAPS Alarm so using the one for BG + // Added OpenAPSEnabledAlerts to alarm check + if((bgReadingAgoMin > threshold && SP.getBoolean(R.string.key_nsalarm_staledata, false))||(bgReadingAgoMin > threshold && openAPSEnabledAlerts)){ return true; } //snoozing for threshold diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java index b6a54f4ec1..a333faecea 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/SerialIOThread.java @@ -9,10 +9,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase; @@ -29,9 +25,6 @@ public class SerialIOThread extends Thread { private OutputStream mOutputStream = null; private BluetoothSocket mRfCommSocket; - private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); - private static ScheduledFuture scheduledDisconnection = null; - private boolean mKeepRunning = true; private byte[] mReadBuff = new byte[0]; @@ -64,7 +57,8 @@ public class SerialIOThread extends Thread { // process all messages we already got while (mReadBuff.length > 3) { // 3rd byte is packet size. continue only if we an determine packet size byte[] extractedBuff = cutMessageFromBuffer(); - if (extractedBuff == null) break; // message is not complete in buffer (wrong packet calls disconnection) + if (extractedBuff == null) + break; // message is not complete in buffer (wrong packet calls disconnection) int command = (extractedBuff[5] & 0xFF) | ((extractedBuff[4] << 8) & 0xFF00); @@ -85,7 +79,6 @@ public class SerialIOThread extends Thread { synchronized (message) { message.notify(); } - scheduleDisconnection(); } } } catch (Exception e) { @@ -177,23 +170,6 @@ public class SerialIOThread extends Thread { log.debug("Old firmware detected"); } } - scheduleDisconnection(); - } - - public void scheduleDisconnection() { - class DisconnectRunnable implements Runnable { - public void run() { - disconnect("scheduleDisconnection"); - scheduledDisconnection = null; - } - } - // prepare task for execution in 10 sec - // cancel waiting task to prevent sending multiple disconnections - if (scheduledDisconnection != null) - scheduledDisconnection.cancel(false); - Runnable task = new DisconnectRunnable(); - final int sec = 10; - scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS); } public void disconnect(String reason) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java index b3cc11cf2f..0aa4b176c7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java @@ -34,6 +34,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -365,6 +366,9 @@ public class DanaRExecutionService extends Service { } public boolean bolus(double amount, int carbs, final Treatment t) { + if (!isConnected()) return false; + if (BolusProgressDialog.stopPressed) return false; + bolusingTreatment = t; int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); MessageBase start; @@ -374,8 +378,6 @@ public class DanaRExecutionService extends Service { start = new MsgBolusStartWithSpeed(amount, preferencesSpeed); MsgBolusStop stop = new MsgBolusStop(amount, t); - if (!isConnected()) return false; - if (carbs > 0) { mSerialIOThread.sendMessage(new MsgSetCarbsEntry(System.currentTimeMillis(), carbs)); } @@ -431,22 +433,26 @@ public class DanaRExecutionService extends Service { } final Object o = new Object(); - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusingInterrupted", new Callback() { - @Override - public void run() { - if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old - t.insulin = danaRPump.lastBolusAmount; - log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); - } else { - log.debug("Bolus amount in history too old: " + danaRPump.lastBolusTime.toLocaleString()); + synchronized(o) { + ConfigBuilderPlugin.getCommandQueue().independentConnect("bolusingInterrupted", new Callback() { + @Override + public void run() { + if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old + t.insulin = danaRPump.lastBolusAmount; + log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); + } else { + log.debug("Bolus amount in history too old: " + danaRPump.lastBolusTime.toLocaleString()); + } + synchronized (o) { + o.notify(); + } } - o.notify(); + }); + try { + o.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); } - }); - try { - o.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); } } else { ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java index 566b32831f..8672afdcb0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/SerialIOThread.java @@ -9,10 +9,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -30,9 +26,6 @@ public class SerialIOThread extends Thread { private OutputStream mOutputStream = null; private BluetoothSocket mRfCommSocket; - private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); - private static ScheduledFuture scheduledDisconnection = null; - private boolean mKeepRunning = true; private byte[] mReadBuff = new byte[0]; @@ -65,7 +58,8 @@ public class SerialIOThread extends Thread { // process all messages we already got while (mReadBuff.length > 3) { // 3rd byte is packet size. continue only if we an determine packet size byte[] extractedBuff = cutMessageFromBuffer(); - if (extractedBuff == null) break; // message is not complete in buffer (wrong packet calls disconnection) + if (extractedBuff == null) + break; // message is not complete in buffer (wrong packet calls disconnection) int command = (extractedBuff[5] & 0xFF) | ((extractedBuff[4] << 8) & 0xFF00); @@ -86,7 +80,6 @@ public class SerialIOThread extends Thread { synchronized (message) { message.notify(); } - scheduleDisconnection(); } } } catch (Exception e) { @@ -178,23 +171,6 @@ public class SerialIOThread extends Thread { log.debug("Old firmware detected"); } } - scheduleDisconnection(); - } - - public void scheduleDisconnection() { - class DisconnectRunnable implements Runnable { - public void run() { - disconnect("scheduleDisconnection"); - scheduledDisconnection = null; - } - } - // prepare task for execution in 5 sec - // cancel waiting task to prevent sending multiple disconnections - if (scheduledDisconnection != null) - scheduledDisconnection.cancel(false); - Runnable task = new DisconnectRunnable(); - final int sec = 5; - scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS); } public void disconnect(String reason) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java index 9d656e47e5..4efff4a5ad 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java @@ -34,6 +34,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase; @@ -358,12 +359,13 @@ public class DanaRKoreanExecutionService extends Service { } public boolean bolus(double amount, int carbs, final Treatment t) { + if (!isConnected()) return false; + if (BolusProgressDialog.stopPressed) return false; + bolusingTreatment = t; MsgBolusStart start = new MsgBolusStart(amount); MsgBolusStop stop = new MsgBolusStop(amount, t); - if (!isConnected()) return false; - if (carbs > 0) { mSerialIOThread.sendMessage(new MsgSetCarbsEntry(System.currentTimeMillis(), carbs)); } @@ -387,48 +389,9 @@ public class DanaRKoreanExecutionService extends Service { } waitMsec(300); - EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.t = t; - bolusingEvent.percent = 99; - bolusingTreatment = null; + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); - int speed = 12; - - // try to find real amount if bolusing was interrupted or comm failed - if (t.insulin != amount) { - disconnect("bolusingInterrupted"); - long bolusDurationInMSec = (long) (amount * speed * 1000); - long expectedEnd = bolusStart + bolusDurationInMSec + 3000; - - while (System.currentTimeMillis() < expectedEnd) { - long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); - MainApp.bus().post(bolusingEvent); - SystemClock.sleep(1000); - } - - final Object o = new Object(); - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusingInterrupted", new Callback() { - @Override - public void run() { - if (danaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old - t.insulin = danaRPump.lastBolusAmount; - log.debug("Used bolus amount from history: " + danaRPump.lastBolusAmount); - } else { - log.debug("Bolus amount in history too old: " + danaRPump.lastBolusTime.toLocaleString()); - } - o.notify(); - } - }); - try { - o.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } else { - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); - } return true; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java index e5ad663bae..f927c107f1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java @@ -24,6 +24,7 @@ import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; @@ -191,6 +192,9 @@ public class DanaRSService extends Service { public boolean bolus(final double insulin, int carbs, long carbtime, Treatment t) { + if (!isConnected()) return false; + if (BolusProgressDialog.stopPressed) return false; + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); bolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); @@ -198,8 +202,6 @@ public class DanaRSService extends Service { DanaRS_Packet_Bolus_Set_Step_Bolus_Stop stop = new DanaRS_Packet_Bolus_Set_Step_Bolus_Stop(insulin, t); // initialize static variables DanaRS_Packet_Notify_Delivery_Complete complete = new DanaRS_Packet_Notify_Delivery_Complete(insulin, t); // initialize static variables - if (!isConnected()) return false; - if (carbs > 0) { // MsgSetCarbsEntry msg = new MsgSetCarbsEntry(carbtime, carbs); #### // bleComm.sendMessage(msg); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java index da9e44f925..343a176e56 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/SerialIOThread.java @@ -9,10 +9,6 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; @@ -30,9 +26,6 @@ public class SerialIOThread extends Thread { private OutputStream mOutputStream = null; private BluetoothSocket mRfCommSocket; - private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); - private static ScheduledFuture scheduledDisconnection = null; - private boolean mKeepRunning = true; private byte[] mReadBuff = new byte[0]; @@ -65,7 +58,8 @@ public class SerialIOThread extends Thread { // process all messages we already got while (mReadBuff.length > 3) { // 3rd byte is packet size. continue only if we an determine packet size byte[] extractedBuff = cutMessageFromBuffer(); - if (extractedBuff == null) break; // message is not complete in buffer (wrong packet calls disconnection) + if (extractedBuff == null) + break; // message is not complete in buffer (wrong packet calls disconnection) int command = (extractedBuff[5] & 0xFF) | ((extractedBuff[4] << 8) & 0xFF00); @@ -86,7 +80,6 @@ public class SerialIOThread extends Thread { synchronized (message) { message.notify(); } - scheduleDisconnection(); } } } catch (Exception e) { @@ -178,23 +171,6 @@ public class SerialIOThread extends Thread { log.debug("Old firmware detected"); } } - scheduleDisconnection(); - } - - public void scheduleDisconnection() { - class DisconnectRunnable implements Runnable { - public void run() { - disconnect("scheduleDisconnection"); - scheduledDisconnection = null; - } - } - // prepare task for execution in 10 sec - // cancel waiting task to prevent sending multiple disconnections - if (scheduledDisconnection != null) - scheduledDisconnection.cancel(false); - Runnable task = new DisconnectRunnable(); - final int sec = 10; - scheduledDisconnection = worker.schedule(task, sec, TimeUnit.SECONDS); } public void disconnect(String reason) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 664ff3743a..2020e6d14d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -34,6 +34,7 @@ import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.events.EventPumpStatusChanged; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.Overview.Dialogs.BolusProgressDialog; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.events.EventOverviewBolusProgress; @@ -357,6 +358,9 @@ public class DanaRv2ExecutionService extends Service { } public boolean bolus(final double amount, int carbs, long carbtime, final Treatment t) { + if (!isConnected()) return false; + if (BolusProgressDialog.stopPressed) return false; + MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); bolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); @@ -367,8 +371,6 @@ public class DanaRv2ExecutionService extends Service { start = new MsgBolusStartWithSpeed(amount, preferencesSpeed); MsgBolusStop stop = new MsgBolusStop(amount, t); - if (!isConnected()) return false; - if (carbs > 0) { MsgSetCarbsEntry msg = new MsgSetCarbsEntry(carbtime, carbs); mSerialIOThread.sendMessage(msg); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index 46e2608542..7acdd15d72 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; +import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -36,8 +37,11 @@ import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.TreatmentsInterface; +import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; import info.nightscout.androidaps.plugins.Wear.ActionStringHandler; import info.nightscout.androidaps.plugins.Wear.WearPlugin; @@ -119,11 +123,6 @@ public class WatchUpdaterService extends WearableListenerService implements @Override public int onStartCommand(Intent intent, int flags, int startId) { - double timestamp = 0; - if (intent != null) { - timestamp = intent.getDoubleExtra("timestamp", 0); - } - String action = null; if (intent != null) { action = intent.getAction(); @@ -241,23 +240,21 @@ public class WatchUpdaterService extends WearableListenerService implements } else if (lastBG.value < lowLine) { sgvLevel = -1; } - DataMap dataMap = new DataMap(); - int battery = getBatteryLevel(getApplicationContext()); + DataMap dataMap = new DataMap(); dataMap.putString("sgvString", lastBG.valueToUnitsToString(units)); - dataMap.putDouble("timestamp", lastBG.date); + dataMap.putLong("timestamp", lastBG.date); if (glucoseStatus == null) { dataMap.putString("slopeArrow", ""); - dataMap.putString("delta", ""); - dataMap.putString("avgDelta", ""); + dataMap.putString("delta", "--"); + dataMap.putString("avgDelta", "--"); } else { dataMap.putString("slopeArrow", slopeArrow(glucoseStatus.delta)); dataMap.putString("delta", deltastring(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units)); dataMap.putString("avgDelta", deltastring(glucoseStatus.avgdelta, glucoseStatus.avgdelta * Constants.MGDL_TO_MMOLL, units)); } - dataMap.putString("battery", "" + battery); + dataMap.putLong("sgvLevel", sgvLevel); - dataMap.putInt("batteryLevel", (battery >= 30) ? 1 : 0); dataMap.putDouble("sgvDouble", lastBG.value); dataMap.putDouble("high", highLine); dataMap.putDouble("low", lowLine); @@ -272,10 +269,20 @@ public class WatchUpdaterService extends WearableListenerService implements deltastring += "-"; } + + boolean detailed = SP.getBoolean("wear_detailed_delta", false); if (units.equals(Constants.MGDL)) { - deltastring += DecimalFormatter.to1Decimal(Math.abs(deltaMGDL)); + if (detailed) { + deltastring += DecimalFormatter.to1Decimal(Math.abs(deltaMGDL)); + } else { + deltastring += DecimalFormatter.to0Decimal(Math.abs(deltaMGDL)); + } } else { - deltastring += DecimalFormatter.to1Decimal(Math.abs(deltaMMOL)); + if (detailed){ + deltastring += DecimalFormatter.to2Decimal(Math.abs(deltaMMOL)); + } else { + deltastring += DecimalFormatter.to1Decimal(Math.abs(deltaMMOL)); + } } return deltastring; } @@ -470,7 +477,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (googleApiClient.isConnected()) { PutDataMapRequest dataMapRequest = PutDataMapRequest.create(OPEN_SETTINGS_PATH); //unique content - dataMapRequest.getDataMap().putDouble("timestamp", System.currentTimeMillis()); + dataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis()); dataMapRequest.getDataMap().putString("openSettings", "openSettings"); PutDataRequest putDataRequest = dataMapRequest.asPutDataRequest(); Wearable.DataApi.putDataItem(googleApiClient, putDataRequest); @@ -483,7 +490,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (googleApiClient.isConnected()) { PutDataMapRequest dataMapRequest = PutDataMapRequest.create(BOLUS_PROGRESS_PATH); //unique content - dataMapRequest.getDataMap().putDouble("timestamp", System.currentTimeMillis()); + dataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis()); dataMapRequest.getDataMap().putString("bolusProgress", "bolusProgress"); dataMapRequest.getDataMap().putString("progressstatus", status); dataMapRequest.getDataMap().putInt("progresspercent", progresspercent); @@ -498,7 +505,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (googleApiClient.isConnected()) { PutDataMapRequest dataMapRequest = PutDataMapRequest.create(ACTION_CONFIRMATION_REQUEST_PATH); //unique content - dataMapRequest.getDataMap().putDouble("timestamp", System.currentTimeMillis()); + dataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis()); dataMapRequest.getDataMap().putString("actionConfirmationRequest", "actionConfirmationRequest"); dataMapRequest.getDataMap().putString("title", title); dataMapRequest.getDataMap().putString("message", message); @@ -514,14 +521,57 @@ public class WatchUpdaterService extends WearableListenerService implements } private void sendStatus() { + if (googleApiClient.isConnected()) { - String status = generateStatusString(); + TreatmentsInterface treatmentsInterface = MainApp.getConfigBuilder(); + treatmentsInterface.updateTotalIOBTreatments(); + IobTotal bolusIob = treatmentsInterface.getLastCalculationTreatments().round(); + treatmentsInterface.updateTotalIOBTempBasals(); + IobTotal basalIob = treatmentsInterface.getLastCalculationTempBasals().round(); + + String iobSum = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); + String iobDetail = "(" + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; + String cobString = generateCOBString(); + String tempBasal = generateBasalString(treatmentsInterface); + + //bgi + String bgiString = ""; + Profile profile = MainApp.getConfigBuilder().getProfile(); + double bgi = -(bolusIob.activity + basalIob.activity) * 5 * profile.getIsf(); + bgiString = "" + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to1Decimal(bgi); + + String status = generateStatusString(profile, tempBasal,iobSum, iobDetail, bgiString); + + //batteries + int phoneBattery = getBatteryLevel(getApplicationContext()); + String rigBattery = NSDeviceStatus.getInstance().getUploaderStatus().trim(); + + + long openApsStatus = -1; + //OpenAPS status + if(Config.APS){ + //we are AndroidAPS + openApsStatus = LoopPlugin.lastRun != null && LoopPlugin.lastRun.lastEnact != null && LoopPlugin.lastRun.lastEnact.getTime() != 0 ? LoopPlugin.lastRun.lastEnact.getTime(): -1; + } else { + //NSClient or remote + openApsStatus = NSDeviceStatus.getOpenApsTimestamp(); + } PutDataMapRequest dataMapRequest = PutDataMapRequest.create(NEW_STATUS_PATH); //unique content - dataMapRequest.getDataMap().putDouble("timestamp", System.currentTimeMillis()); dataMapRequest.getDataMap().putString("externalStatusString", status); + dataMapRequest.getDataMap().putString("iobSum", iobSum); + dataMapRequest.getDataMap().putString("iobDetail", iobDetail); + dataMapRequest.getDataMap().putBoolean("detailedIob", mPrefs.getBoolean("wear_detailediob", false)); + dataMapRequest.getDataMap().putString("cob", cobString); + dataMapRequest.getDataMap().putString("tempBasal", tempBasal); + dataMapRequest.getDataMap().putString("battery", "" + phoneBattery); + dataMapRequest.getDataMap().putString("rigBattery", rigBattery); + dataMapRequest.getDataMap().putLong("openApsStatus", openApsStatus); + dataMapRequest.getDataMap().putString("bgi", bgiString); + dataMapRequest.getDataMap().putBoolean("showBgi", mPrefs.getBoolean("wear_showbgi", false)); + dataMapRequest.getDataMap().putInt("batteryLevel", (phoneBattery >= 30) ? 1 : 0); PutDataRequest putDataRequest = dataMapRequest.asPutDataRequest(); Wearable.DataApi.putDataItem(googleApiClient, putDataRequest); } else { @@ -536,7 +586,7 @@ public class WatchUpdaterService extends WearableListenerService implements PutDataMapRequest dataMapRequest = PutDataMapRequest.create(NEW_PREFERENCES_PATH); //unique content - dataMapRequest.getDataMap().putDouble("timestamp", System.currentTimeMillis()); + dataMapRequest.getDataMap().putLong("timestamp", System.currentTimeMillis()); dataMapRequest.getDataMap().putBoolean("wearcontrol", wearcontrol); PutDataRequest putDataRequest = dataMapRequest.asPutDataRequest(); Wearable.DataApi.putDataItem(googleApiClient, putDataRequest); @@ -546,10 +596,10 @@ public class WatchUpdaterService extends WearableListenerService implements } @NonNull - private String generateStatusString() { + private String generateStatusString(Profile profile, String tempBasal, String iobSum, String iobDetail, String bgiString) { + String status = ""; - Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { status = MainApp.sResources.getString(R.string.noprofile); return status; @@ -564,38 +614,45 @@ public class WatchUpdaterService extends WearableListenerService implements lastLoopStatus = true; } - //Temp basal - TreatmentsInterface treatmentsInterface = MainApp.getConfigBuilder(); - - TemporaryBasal activeTemp = treatmentsInterface.getTempBasalFromHistory(System.currentTimeMillis()); - if (activeTemp != null) { - status += activeTemp.toStringShort(); - + String iobString = ""; + if (mPrefs.getBoolean("wear_detailediob", false)) { + iobString = iobSum + " " + iobDetail; + } else { + iobString = iobSum + "U"; } - //IOB - treatmentsInterface.updateTotalIOBTreatments(); - IobTotal bolusIob = treatmentsInterface.getLastCalculationTreatments().round(); - treatmentsInterface.updateTotalIOBTempBasals(); - IobTotal basalIob = treatmentsInterface.getLastCalculationTempBasals().round(); - status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); + status += tempBasal + " " + iobString; - if (mPrefs.getBoolean("wear_detailediob", true)) { - status += "(" - + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" - + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; + //add BGI if shown, otherwise return + if (mPrefs.getBoolean("wear_showbgi", false)) { + status += " " + bgiString; } - if (!mPrefs.getBoolean("wear_showbgi", false)) { - return status; - } - - double bgi = -(bolusIob.activity + basalIob.activity) * 5 * profile.getIsf(); - - status += " " + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to2Decimal(bgi); return status; } + @NonNull + private String generateBasalString(TreatmentsInterface treatmentsInterface) { + + String basalStringResult = "-.--U/h"; + TemporaryBasal activeTemp = treatmentsInterface.getTempBasalFromHistory(System.currentTimeMillis()); + if (activeTemp != null) { + basalStringResult = activeTemp.toStringShort(); + } + return basalStringResult; + } + + @NonNull + private String generateCOBString() { + + String cobStringResult = "--"; + AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(System.currentTimeMillis()); + if (autosensData != null) { + cobStringResult = (int) autosensData.cob + "g"; + } + return cobStringResult; + } + @Override public void onDestroy() { if (googleApiClient != null && googleApiClient.isConnected()) { diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index 45efe4722d..59ac0e3ece 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -77,11 +77,7 @@ public class CommandQueue { private QueueThread thread = null; private PumpEnactResult executingNowError() { - PumpEnactResult result = new PumpEnactResult(); - result.success = false; - result.enacted = false; - result.comment = MainApp.sResources.getString(R.string.executingrightnow); - return result; + return new PumpEnactResult().success(false).enacted(false).comment(MainApp.sResources.getString(R.string.executingrightnow)); } public boolean isRunning(Command.CommandType type) { @@ -139,6 +135,13 @@ public class CommandQueue { } } + public static void independentConnect(String reason, Callback callback) { + CommandQueue tempCommandQueue = new CommandQueue(); + tempCommandQueue.readStatus(reason, callback); + QueueThread tempThread = new QueueThread(tempCommandQueue); + tempThread.start(); + } + // returns true if command is queued public boolean bolus(DetailedBolusInfo detailedBolusInfo, Callback callback) { Command.CommandType type = detailedBolusInfo.isSMB ? Command.CommandType.SMB_BOLUS : Command.CommandType.BOLUS; diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java index 36b43d2181..7baa6a313b 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java @@ -1,5 +1,6 @@ package info.nightscout.androidaps.queue; +import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.os.PowerManager; import android.os.SystemClock; @@ -16,6 +17,7 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventDismissBolusprogressIfRunning; import info.nightscout.androidaps.queue.events.EventQueueChanged; +import info.nightscout.utils.SP; /** * Created by mike on 09.11.2017. @@ -61,8 +63,27 @@ public class QueueThread extends Thread { MainApp.bus().post(new EventDismissBolusprogressIfRunning(new PumpEnactResult())); MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.connectiontimedout))); pump.stopConnecting(); - queue.clear(); - return; + + //BLUETOOTH-WATCHDOG + boolean watchdog = SP.getBoolean(R.string.key_btwatchdog, false); + long last_watchdog = SP.getLong(R.string.key_btwatchdog_lastbark, 0l); + watchdog = watchdog && System.currentTimeMillis() - last_watchdog > (Constants.MIN_WATCHDOG_INTERVAL_IN_SECONDS * 1000); + if(watchdog) { + log.debug("BT watchdog - toggeling the phonest bluetooth"); + //write time + SP.putLong(R.string.key_btwatchdog_lastbark, System.currentTimeMillis()); + //toggle BT + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + mBluetoothAdapter.disable(); + SystemClock.sleep(1000); + mBluetoothAdapter.enable(); + SystemClock.sleep(1000); + //start over again once after watchdog barked + connectionStartTime = System.currentTimeMillis(); + } else { + queue.clear(); + return; + } } if (!pump.isConnected()) { @@ -76,8 +97,8 @@ public class QueueThread extends Thread { if (queue.performing() == null) { // Pickup 1st command and set performing variable if (queue.size() > 0) { - log.debug("State: performing"); queue.pickup(); + log.debug("State: performing " + queue.performing().status()); MainApp.bus().post(new EventQueueChanged()); queue.performing().execute(); queue.resetPerforming(); diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java index 828f2c5bed..38ca9ee2a1 100644 --- a/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/receivers/KeepAliveReceiver.java @@ -16,6 +16,7 @@ import org.slf4j.LoggerFactory; import java.util.Date; +import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -81,7 +82,7 @@ public class KeepAliveReceiver extends BroadcastReceiver { boolean alarmTimeoutExpired = lastConnection.getTime() + pumpUnreachableThreshold() < System.currentTimeMillis(); boolean nextAlarmOccurrenceReached = SP.getLong("nextPumpDisconnectedAlarm", 0l) < System.currentTimeMillis(); - if (SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_pump_unreachable_alert), true) + if (Config.APS && SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_pump_unreachable_alert), true) && isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !ConfigBuilderPlugin.getActiveLoop().isDisconnected()) { Notification n = new Notification(Notification.PUMP_UNREACHABLE, MainApp.sResources.getString(R.string.pump_unreachable), Notification.URGENT); n.soundId = R.raw.alarm; @@ -145,4 +146,4 @@ public class KeepAliveReceiver extends BroadcastReceiver { nextPumpDisconnectedAlarm = Math.min(System.currentTimeMillis() + pumpUnreachableThreshold(), nextPumpDisconnectedAlarm); SP.putLong("nextPumpDisconnectedAlarm", nextPumpDisconnectedAlarm); } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/utils/DateUtil.java b/app/src/main/java/info/nightscout/utils/DateUtil.java index d2f35e0c99..c406568730 100644 --- a/app/src/main/java/info/nightscout/utils/DateUtil.java +++ b/app/src/main/java/info/nightscout/utils/DateUtil.java @@ -29,6 +29,7 @@ public class DateUtil { */ private static String FORMAT_DATE_ISO = "yyyy-MM-dd'T'HH:mm:ssZ"; private static String FORMAT_DATE_ISO_MSEC = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; + private static String FORMAT_DATE_ISO_MSEC_UTC = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; /** * Takes in an ISO date string of the following format: @@ -42,15 +43,31 @@ public class DateUtil { throws Exception { SimpleDateFormat f = new SimpleDateFormat(FORMAT_DATE_ISO, Locale.getDefault()); Date date; + f.setTimeZone(TimeZone.getTimeZone("UTC")); try { date = f.parse(isoDateString); + return date; } catch (ParseException e) { - f = new SimpleDateFormat(FORMAT_DATE_ISO_MSEC, Locale.getDefault()); - f.setTimeZone(TimeZone.getTimeZone("UTC")); - date = f.parse(isoDateString); } - return date; + + f = new SimpleDateFormat(FORMAT_DATE_ISO_MSEC, Locale.getDefault()); + f.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + date = f.parse(isoDateString); + return date; + } catch (ParseException e) { + } + + f = new SimpleDateFormat(FORMAT_DATE_ISO_MSEC_UTC, Locale.getDefault()); + f.setTimeZone(TimeZone.getTimeZone("UTC")); + try { + date = f.parse(isoDateString); + return date; + } catch (ParseException e) { + } + + throw new ParseException("Unparseable date: " + isoDateString, 0); } /** @@ -72,6 +89,7 @@ public class DateUtil { public static String toISOString(Date date) { return toISOString(date, FORMAT_DATE_ISO, TimeZone.getTimeZone("UTC")); } + public static String toISOString(long date) { return toISOString(new Date(date), FORMAT_DATE_ISO, TimeZone.getTimeZone("UTC")); } @@ -125,6 +143,7 @@ public class DateUtil { public static String dateAndTimeString(Date date) { return dateString(date) + " " + timeString(date); } + public static String dateAndTimeString(long mills) { return dateString(mills) + " " + timeString(mills); } @@ -146,19 +165,19 @@ public class DateUtil { } - public static String timeFrameString(long timeInMillis){ - long remainingTimeMinutes = timeInMillis/(1000*60); - long remainingTimeHours = remainingTimeMinutes/60; - remainingTimeMinutes = remainingTimeMinutes%60; - return "(" + ((remainingTimeHours >0)?(remainingTimeHours + "h "):"") + remainingTimeMinutes + "')"; + public static String timeFrameString(long timeInMillis) { + long remainingTimeMinutes = timeInMillis / (1000 * 60); + long remainingTimeHours = remainingTimeMinutes / 60; + remainingTimeMinutes = remainingTimeMinutes % 60; + return "(" + ((remainingTimeHours > 0) ? (remainingTimeHours + "h ") : "") + remainingTimeMinutes + "')"; } - public static String sinceString(long timestamp){ - return timeFrameString(System.currentTimeMillis()-timestamp); + public static String sinceString(long timestamp) { + return timeFrameString(System.currentTimeMillis() - timestamp); } - public static String untilString(long timestamp){ - return timeFrameString(timestamp- System.currentTimeMillis()); + public static String untilString(long timestamp) { + return timeFrameString(timestamp - System.currentTimeMillis()); } diff --git a/app/src/main/java/info/nightscout/utils/SP.java b/app/src/main/java/info/nightscout/utils/SP.java index 36ab3b05e7..16015d8956 100644 --- a/app/src/main/java/info/nightscout/utils/SP.java +++ b/app/src/main/java/info/nightscout/utils/SP.java @@ -65,7 +65,11 @@ public class SP { } static public long getLong(int resourceID, Long defaultValue) { - return SafeParse.stringToLong(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + try { + return sharedPreferences.getLong(MainApp.sResources.getString(resourceID), defaultValue); + } catch (Exception e) { + return SafeParse.stringToLong(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + } } static public long getLong(String key, Long defaultValue) { diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 71e911402b..3c8450676f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -276,7 +276,7 @@ Detener Parar pulsado Esperando bomba. Click to refresh. - Va a entregar% .2fU + Va a entregar %.2fU Configuración de visualización y monitoreo, y el análisis de los basales y ratios Comprobar que los datos de BG están disponibles en Nightscout, y que los datos de la bomba de insulina se están subiendo Empezar con bucle abierto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index ce50495e73..a2084cb0cb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -370,7 +370,7 @@ начало болюс доставлено - будет доставлено %.2 fU е инс + будет доставлено %.2fU е инс стоп остановлено нажат стоп diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 55b9d0c21e..f1cbb3cbb1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -780,10 +780,17 @@ missed_bg_readings_threshold Urgent Alarm INFO + bt_watchdog + bt_watchdog_last + Bluetooth + BT Watchdog + Switches off the phone\'s bluetooth for one second if no connection to the pump is possible. This may help on some phones where the bluetooth stack freezes. DexcomG5 App (patched) Upload BG data to NS dexcomg5_nsupload G5 upload settings Customized APK for download + Show detailed delta + Show delta with one more decimal place diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml index 0b284663f7..8056db4e3a 100644 --- a/app/src/main/res/xml/pref_advanced.xml +++ b/app/src/main/res/xml/pref_advanced.xml @@ -129,6 +129,16 @@ android:summary="@string/do_not_track_profile_switch_summary" android:title="@string/do_not_track_profile_switch" /> + + + + + diff --git a/app/src/main/res/xml/pref_wear.xml b/app/src/main/res/xml/pref_wear.xml index bd6c42725a..406e156ab3 100644 --- a/app/src/main/res/xml/pref_wear.xml +++ b/app/src/main/res/xml/pref_wear.xml @@ -4,24 +4,32 @@ android:key="wearplugin" android:title="@string/wear_settings"> - + - + - + + + + + - \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/utils/DateUtilTest.java b/app/src/test/java/info/nightscout/utils/DateUtilTest.java index f269253ba8..4b48148341 100644 --- a/app/src/test/java/info/nightscout/utils/DateUtilTest.java +++ b/app/src/test/java/info/nightscout/utils/DateUtilTest.java @@ -19,6 +19,7 @@ public class DateUtilTest { public void fromISODateStringTest() throws Exception { assertEquals( 1511124634417L, DateUtil.fromISODateString("2017-11-19T22:50:34.417+0200").getTime()); assertEquals( 1511124634000L, DateUtil.fromISODateString("2017-11-19T22:50:34+0200").getTime()); + assertEquals( 1512317365000L, DateUtil.fromISODateString("2017-12-03T16:09:25.000Z").getTime()); } diff --git a/build.gradle b/build.gradle index c2eea8e27f..c068560ec2 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f1b7430446..abee8033d2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Mar 05 11:39:37 CET 2017 +#Sun Dec 03 18:20:55 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/wear/build.gradle b/wear/build.gradle index ab2c9cfcb3..8dd8ee73e1 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -23,7 +23,7 @@ def generateGitBuild = { -> android { compileSdkVersion 23 - buildToolsVersion "25.0.2" + buildToolsVersion "26.0.2" defaultConfig { applicationId "info.nightscout.androidaps" diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 4db69169dd..e6c15d799d 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -34,6 +34,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + { public double sgv; public double high; public double low; - public double timestamp; + public long timestamp; - public BgWatchData(double aSgv, double aHigh, double aLow, double aTimestamp) { + public BgWatchData(double aSgv, double aHigh, double aLow, long aTimestamp) { this.sgv = aSgv; this.high = aHigh; this.low = aLow; diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java index 25fe619b2a..a9700c6092 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java @@ -69,7 +69,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre public boolean layoutSet = false; public BgGraphBuilder bgGraphBuilder; public LineChartView chart; - public double datetime; + public long datetime; public ArrayList bgDataList = new ArrayList<>(); public ArrayList tempWatchDataList = new ArrayList<>(); public ArrayList basalWatchDataList = new ArrayList<>(); @@ -281,7 +281,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre wakeLock.acquire(50); sgvLevel = dataMap.getLong("sgvLevel"); batteryLevel = dataMap.getInt("batteryLevel"); - datetime = dataMap.getDouble("timestamp"); + datetime = dataMap.getLong("timestamp"); rawString = dataMap.getString("rawString"); sgvString = dataMap.getString("sgvString"); batteryString = dataMap.getString("battery"); @@ -604,14 +604,14 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre double sgv = entry.getDouble("sgvDouble"); double high = entry.getDouble("high"); double low = entry.getDouble("low"); - double timestamp = entry.getDouble("timestamp"); + long timestamp = entry.getLong("timestamp"); bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); } } else { double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); - double timestamp = dataMap.getDouble("timestamp"); + long timestamp = dataMap.getLong("timestamp"); final int size = bgDataList.size(); if (size > 0) { diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java index bd3f49586c..cb82daf3eb 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java @@ -31,6 +31,7 @@ import com.ustwo.clockwise.wearable.WatchFace; import com.ustwo.clockwise.common.WatchFaceTime; import com.ustwo.clockwise.common.WatchShape; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -43,16 +44,19 @@ import lecho.lib.hellocharts.view.LineChartView; /** * Created by emmablack on 12/29/14. + * Updated by andrew-warrington on 11/15/17. */ public abstract class BaseWatchFace extends WatchFace implements SharedPreferences.OnSharedPreferenceChangeListener { public final static IntentFilter INTENT_FILTER; public static final long[] vibratePattern = {0,400,300,400,300,400}; - public TextView mTime, mSgv, mDirection, mTimestamp, mUploaderBattery, mDelta, mStatus; + public TextView mTime, mSgv, mDirection, mTimestamp, mUploaderBattery, mRigBattery, mDelta, mAvgDelta, mStatus, mBasalRate, mIOB1, mIOB2, mCOB1, mCOB2, mBgi, mLoop, mDay, mMonth, isAAPSv2, mHighLight, mLowLight; + public long datetime; public RelativeLayout mRelativeLayout; - public LinearLayout mLinearLayout; + public LinearLayout mLinearLayout, mLinearLayout2, mDate; public long sgvLevel = 0; - public int batteryLevel = 1; public int ageLevel = 1; + public int loopLevel = 1; + public int batteryLevel = 1; public int highColor = Color.YELLOW; public int lowColor = Color.RED; public int midColor = Color.WHITE; @@ -60,31 +64,41 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen public int basalBackgroundColor = Color.BLUE; public int basalCenterColor = Color.BLUE; public boolean lowResMode = false; - public int pointSize = 2; public boolean layoutSet = false; + public boolean bIsRound = false; + public int pointSize = 2; public int missed_readings_alert_id = 818; public BgGraphBuilder bgGraphBuilder; public LineChartView chart; - public double datetime; public ArrayList bgDataList = new ArrayList<>(); public ArrayList tempWatchDataList = new ArrayList<>(); public ArrayList basalWatchDataList = new ArrayList<>(); public PowerManager.WakeLock wakeLock; // related endTime manual layout public View layoutView; - private final Point displaySize = new Point(); - private int specW, specH; - + public final Point displaySize = new Point(); + public int specW, specH; private LocalBroadcastManager localBroadcastManager; private MessageReceiver messageReceiver; protected SharedPreferences sharedPrefs; - private String batteryString = "--"; - private String sgvString = "--"; - private String externalStatusString = "no status"; - private String avgDelta = ""; - private String delta = ""; + public boolean detailedIOB = false; + public boolean showBGI = false; + public long openApsStatus; + public String externalStatusString = "no status"; + public String sSgv = "---"; + public String sDirection = "--"; + public String sUploaderBattery = "--"; + public String sRigBattery = "--"; + public String sDelta = "--"; + public String sAvgDelta = "--"; + public String sBasalRate = "-.--U/h"; + public String sIOB1 = "IOB"; + public String sIOB2 = "-.--"; + public String sCOB1 = "Carb"; + public String sCOB2 = "--g"; + public String sBgi = "--"; @Override public void onCreate() { @@ -107,6 +121,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen protected void onLayout(WatchShape shape, Rect screenBounds, WindowInsets screenInsets) { super.onLayout(shape, screenBounds, screenInsets); layoutView.onApplyWindowInsets(screenInsets); + bIsRound = screenInsets.isRound(); } public void performViewSetup() { @@ -121,22 +136,37 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen @Override public void onLayoutInflated(WatchViewStub stub) { mTime = (TextView) stub.findViewById(R.id.watch_time); + mDay = (TextView) stub.findViewById(R.id.day); + mMonth = (TextView) stub.findViewById(R.id.month); + mDate = (LinearLayout) stub.findViewById(R.id.date_time); + mLoop = (TextView) stub.findViewById(R.id.loop); mSgv = (TextView) stub.findViewById(R.id.sgv); mDirection = (TextView) stub.findViewById(R.id.direction); mTimestamp = (TextView) stub.findViewById(R.id.timestamp); + mIOB1 = (TextView) stub.findViewById(R.id.iob_text); + mIOB2 = (TextView) stub.findViewById(R.id.iobView); + mCOB1 = (TextView) stub.findViewById(R.id.cob_text); + mCOB2 = (TextView) stub.findViewById(R.id.cobView); + mBgi = (TextView) stub.findViewById(R.id.bgiView); mStatus = (TextView) stub.findViewById(R.id.externaltstatus); + mBasalRate = (TextView) stub.findViewById(R.id.tmpBasal); mUploaderBattery = (TextView) stub.findViewById(R.id.uploader_battery); + mRigBattery = (TextView) stub.findViewById(R.id.rig_battery); mDelta = (TextView) stub.findViewById(R.id.delta); + mAvgDelta = (TextView) stub.findViewById(R.id.avgdelta); + isAAPSv2 = (TextView) stub.findViewById(R.id.AAPSv2); + mHighLight = (TextView) stub.findViewById(R.id.highLight); + mLowLight = (TextView) stub.findViewById(R.id.lowLight); mRelativeLayout = (RelativeLayout) stub.findViewById(R.id.main_layout); mLinearLayout = (LinearLayout) stub.findViewById(R.id.secondary_layout); + mLinearLayout2 = (LinearLayout) stub.findViewById(R.id.tertiary_layout); chart = (LineChartView) stub.findViewById(R.id.chart); layoutSet = true; - showAgoRawBattStatus(); - mRelativeLayout.measure(specW, specH); - mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), - mRelativeLayout.getMeasuredHeight()); + + setDataFields(); + } } - }); + ); ListenerService.requestData(this); wakeLock.acquire(50); } @@ -164,9 +194,10 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen @Override public void onDestroy() { - if(localBroadcastManager != null && messageReceiver != null){ - localBroadcastManager.unregisterReceiver(messageReceiver);} - if (sharedPrefs != null){ + if (localBroadcastManager != null && messageReceiver != null) { + localBroadcastManager.unregisterReceiver(messageReceiver); + } + if (sharedPrefs != null) { sharedPrefs.unregisterOnSharedPreferenceChangeListener(this); } super.onDestroy(); @@ -181,7 +212,8 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen @Override protected void onDraw(Canvas canvas) { - if(layoutSet) { + if (layoutSet) { + setupCharts(); this.mRelativeLayout.draw(canvas); Log.d("onDraw", "draw"); } @@ -191,17 +223,10 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen protected void onTimeChanged(WatchFaceTime oldTime, WatchFaceTime newTime) { if (layoutSet && (newTime.hasHourChanged(oldTime) || newTime.hasMinuteChanged(oldTime))) { wakeLock.acquire(50); - final java.text.DateFormat timeFormat = DateFormat.getTimeFormat(BaseWatchFace.this); - mTime.setText(timeFormat.format(System.currentTimeMillis())); - showAgoRawBattStatus(); - - if(ageLevel()<=0) { - mSgv.setPaintFlags(mSgv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - } else { - mSgv.setPaintFlags(mSgv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); - } + setDataFields(); missedReadingAlert(); + mRelativeLayout.measure(specW, specH); mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), mRelativeLayout.getMeasuredHeight()); @@ -212,108 +237,258 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen @Override public void onReceive(Context context, Intent intent) { - //data Bundle bundle = intent.getBundleExtra("data"); if (layoutSet && bundle != null) { DataMap dataMap = DataMap.fromBundle(bundle); wakeLock.acquire(50); sgvLevel = dataMap.getLong("sgvLevel"); - batteryLevel = dataMap.getInt("batteryLevel"); - datetime = dataMap.getDouble("timestamp"); - sgvString = dataMap.getString("sgvString"); - batteryString = dataMap.getString("battery"); - mSgv.setText(dataMap.getString("sgvString")); - - if(ageLevel()<=0) { - mSgv.setPaintFlags(mSgv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); - } else { - mSgv.setPaintFlags(mSgv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); - } - - final java.text.DateFormat timeFormat = DateFormat.getTimeFormat(BaseWatchFace.this); - mTime.setText(timeFormat.format(System.currentTimeMillis())); - - mDirection.setText(dataMap.getString("slopeArrow")); - avgDelta = dataMap.getString("avgDelta"); - delta = dataMap.getString("delta"); - - - showAgoRawBattStatus(); - - + datetime = dataMap.getLong("timestamp"); + sSgv = dataMap.getString("sgvString"); + sDirection = dataMap.getString("slopeArrow"); + sDelta = dataMap.getString("delta"); + sAvgDelta = dataMap.getString("avgDelta"); if (chart != null) { addToWatchSet(dataMap); setupCharts(); } - mRelativeLayout.measure(specW, specH); - mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), - mRelativeLayout.getMeasuredHeight()); - invalidate(); - setColor(); } - //status + bundle = intent.getBundleExtra("status"); if (layoutSet && bundle != null) { DataMap dataMap = DataMap.fromBundle(bundle); wakeLock.acquire(50); + sBasalRate = dataMap.getString("tempBasal"); + sUploaderBattery = dataMap.getString("battery"); + sRigBattery = dataMap.getString("rigBattery"); + detailedIOB = dataMap.getBoolean("detailedIob"); + sIOB1 = dataMap.getString("iobSum") + "U"; + sIOB2 = dataMap.getString("iobDetail"); + sCOB1 = "Carb"; + sCOB2 = dataMap.getString("cob"); + sBgi = dataMap.getString("bgi"); + showBGI = dataMap.getBoolean("showBgi"); externalStatusString = dataMap.getString("externalStatusString"); - - showAgoRawBattStatus(); - - mRelativeLayout.measure(specW, specH); - mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), - mRelativeLayout.getMeasuredHeight()); - invalidate(); - setColor(); + batteryLevel = dataMap.getInt("batteryLevel"); + openApsStatus = dataMap.getLong("openApsStatus"); } - //basals and temps + + setDataFields(); + bundle = intent.getBundleExtra("basals"); if (layoutSet && bundle != null) { DataMap dataMap = DataMap.fromBundle(bundle); wakeLock.acquire(500); - loadBasalsAndTemps(dataMap); + } - mRelativeLayout.measure(specW, specH); - mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), - mRelativeLayout.getMeasuredHeight()); - invalidate(); - setColor(); + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + invalidate(); + setColor(); + } + } + + public void setDataFields() { + + setDateAndTime(); + + if (mSgv != null) { + if (sharedPrefs.getBoolean("showBG", true)) { + mSgv.setText(sSgv); + mSgv.setVisibility(View.VISIBLE); + } else { + //leave the textview there but invisible, as a height holder for the empty space above the white line + mSgv.setVisibility(View.INVISIBLE); + mSgv.setText(""); + } + } + + strikeThroughSgvIfNeeded(); + + if (mDirection != null) { + if (sharedPrefs.getBoolean("show_direction", true)) { + mDirection.setText(sDirection); + mDirection.setVisibility(View.VISIBLE); + } else { + mDirection.setVisibility(View.GONE); + } + } + + if (mDelta != null) { + if (sharedPrefs.getBoolean("showDelta", true)) { + mDelta.setText(sDelta); + mDelta.setVisibility(View.VISIBLE); + } else { + mDelta.setVisibility(View.GONE); + } + } + + if (mAvgDelta != null) { + if (sharedPrefs.getBoolean("showAvgDelta", true)) { + mAvgDelta.setText(sAvgDelta); + mAvgDelta.setVisibility(View.VISIBLE); + } else { + mAvgDelta.setVisibility(View.GONE); + } + } + + if (mCOB1 != null && mCOB2 != null) { + mCOB2.setText(sCOB2); + if (sharedPrefs.getBoolean("show_cob", true)) { + mCOB1.setVisibility(View.VISIBLE); + mCOB2.setVisibility(View.VISIBLE); + } else { + mCOB1.setVisibility(View.GONE); + mCOB2.setVisibility(View.GONE); + } + //deal with cases where there is only the value shown for COB, and not the label + } else if (mCOB2 != null) { + mCOB2.setText(sCOB2); + if (sharedPrefs.getBoolean("show_cob", true)) { + mCOB2.setVisibility(View.VISIBLE); + } else { + mCOB2.setVisibility(View.GONE); + } + } + + if (mIOB1 != null && mIOB2 != null) { + if (sharedPrefs.getBoolean("show_iob", true)) { + mIOB1.setVisibility(View.VISIBLE); + mIOB2.setVisibility(View.VISIBLE); + if (detailedIOB) { + mIOB1.setText(sIOB1); + mIOB2.setText(sIOB2); + } else { + mIOB1.setText("IOB"); + mIOB2.setText(sIOB1); + } + } else { + mIOB1.setVisibility(View.GONE); + mIOB2.setVisibility(View.GONE); + } + //deal with cases where there is only the value shown for IOB, and not the label + } else if (mIOB2 != null) { + if (sharedPrefs.getBoolean("show_iob", true)) { + mIOB2.setVisibility(View.VISIBLE); + if (detailedIOB) { + mIOB2.setText(sIOB2); + } else { + mIOB2.setText(sIOB1); + } + } else { + mIOB2.setText(""); + } + } + + if (mTimestamp != null) { + if (sharedPrefs.getBoolean("showAgo", true)) { + if (isAAPSv2 != null) { + mTimestamp.setText(readingAge(true)); + } else { + if (sharedPrefs.getBoolean("showExternalStatus", true)) { + mTimestamp.setText(readingAge(true)); + } else { + mTimestamp.setText(readingAge(false)); + } + } + mTimestamp.setVisibility(View.VISIBLE); + } else { + mTimestamp.setVisibility(View.GONE); + } + } + + if (mUploaderBattery != null) { + if (sharedPrefs.getBoolean("show_uploader_battery", true)) { + if (isAAPSv2 != null) { + mUploaderBattery.setText(sUploaderBattery + "%"); + mUploaderBattery.setVisibility(View.VISIBLE); + } else { + if (sharedPrefs.getBoolean("showExternalStatus", true)) { + mUploaderBattery.setText("U: " + sUploaderBattery + "%"); + } else { + mUploaderBattery.setText("Uploader: " + sUploaderBattery + "%"); + } + } + } else { + mUploaderBattery.setVisibility(View.GONE); + } + } + + if (mRigBattery != null) { + if (sharedPrefs.getBoolean("show_rig_battery", false)) { + mRigBattery.setText(sRigBattery); + mRigBattery.setVisibility(View.VISIBLE); + } else { + mRigBattery.setVisibility(View.GONE); + } + } + + if (mBasalRate != null) { + if (sharedPrefs.getBoolean("show_temp_basal", true)) { + mBasalRate.setText(sBasalRate); + mBasalRate.setVisibility(View.VISIBLE); + } else { + mBasalRate.setVisibility(View.GONE); + } + } + + if (mBgi != null) { + if (showBGI) { + mBgi.setText(sBgi); + mBgi.setVisibility(View.VISIBLE); + } else { + mBgi.setVisibility(View.GONE); + } + } + + if (mStatus != null) { + if (sharedPrefs.getBoolean("showExternalStatus", true)) { + mStatus.setText(externalStatusString); + mStatus.setVisibility(View.VISIBLE); + } else { + mStatus.setVisibility(View.GONE); + } + } + + if (mLoop != null) { + if (sharedPrefs.getBoolean("showExternalStatus", true)) { + mLoop.setVisibility(View.VISIBLE); + if (openApsStatus != -1) { + int mins = (int) ((System.currentTimeMillis() - openApsStatus) / 1000 / 60); + mLoop.setText(mins + "'"); + if (mins > 14) { + loopLevel = 0; + mLoop.setBackgroundResource(R.drawable.loop_red_25); + } else { + loopLevel = 1; + mLoop.setBackgroundResource(R.drawable.loop_green_25); + } + } else { + mLoop.setText("-'"); + } + } else { + mLoop.setVisibility(View.GONE); } } } - private void showAgoRawBattStatus() { + public void setDateAndTime() { + final java.text.DateFormat timeFormat = DateFormat.getTimeFormat(BaseWatchFace.this); + mTime.setText(timeFormat.format(System.currentTimeMillis())); - boolean showAvgDelta = sharedPrefs.getBoolean("showAvgDelta", true); - mDelta.setText(delta); - if(showAvgDelta){ - mDelta.append(" " + avgDelta); - } - - - if( mTimestamp == null || mUploaderBattery == null|| mStatus == null){ - return; - } - - boolean showStatus = sharedPrefs.getBoolean("showExternalStatus", true); - - if(showStatus){ - //use short forms - mTimestamp.setText(readingAge(true)); - mUploaderBattery.setText("U: " + batteryString + "%"); - } else { - mTimestamp.setText(readingAge(false)); - mUploaderBattery.setText("Uploader: " + batteryString + "%"); - } - - - if (showStatus) { - mStatus.setVisibility(View.VISIBLE); - mStatus.setText("S: " + externalStatusString); - } else { - mStatus.setVisibility(View.GONE); + if (mDate != null && mDay != null && mMonth != null) { + if (sharedPrefs.getBoolean("show_date", false)) { + Date today = new Date(); + SimpleDateFormat sdfDay = new SimpleDateFormat("dd"); + SimpleDateFormat sdfMonth = new SimpleDateFormat("MMM"); + mDay.setText(sdfDay.format(today)); + mMonth.setText(sdfMonth.format(today)); + mDate.setVisibility(View.VISIBLE); + } else { + mDate.setVisibility(View.GONE); + } } } @@ -327,6 +502,18 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen } } + public void strikeThroughSgvIfNeeded() { + if (mSgv !=null) { + if (sharedPrefs.getBoolean("showBG", true)) { + if (ageLevel() <= 0) { + mSgv.setPaintFlags(mSgv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else { + mSgv.setPaintFlags(mSgv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); + } + } + } + } + protected void onWatchModeChanged(WatchMode watchMode) { if(lowResMode ^ isLowRes(watchMode)){ //if there was a change in lowResMode @@ -339,25 +526,22 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen } private boolean isLowRes(WatchMode watchMode) { - return (watchMode == WatchMode.LOW_BIT) || (watchMode == WatchMode.LOW_BIT_BURN_IN) || (watchMode == WatchMode.LOW_BIT_BURN_IN); + return (watchMode == WatchMode.LOW_BIT) || (watchMode == WatchMode.LOW_BIT_BURN_IN); // || (watchMode == WatchMode.LOW_BIT_BURN_IN); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){ - setColor(); + if(layoutSet){ - showAgoRawBattStatus(); - mRelativeLayout.measure(specW, specH); - mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), - mRelativeLayout.getMeasuredHeight()); + setDataFields(); } invalidate(); } -protected abstract void setColorDark(); + + protected abstract void setColorDark(); protected abstract void setColorBright(); protected abstract void setColorLowRes(); - public void missedReadingAlert() { int minutes_since = (int) Math.floor(timeSince()/(1000*60)); if(minutes_since >= 16 && ((minutes_since - 16) % 5) == 0) { @@ -374,14 +558,14 @@ protected abstract void setColorDark(); double sgv = entry.getDouble("sgvDouble"); double high = entry.getDouble("high"); double low = entry.getDouble("low"); - double timestamp = entry.getDouble("timestamp"); + long timestamp = entry.getLong("timestamp"); bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); } } else { double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); - double timestamp = dataMap.getDouble("timestamp"); + long timestamp = dataMap.getLong("timestamp"); final int size = bgDataList.size(); if (size > 0) { diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java index 28e470adab..2adf432fa3 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java @@ -30,8 +30,8 @@ public class BgGraphBuilder { private ArrayList basalWatchDataList; public List tempWatchDataList; private int timespan; - public double end_time; - public double start_time; + public long end_time; + public long start_time; public double fuzzyTimeDenom = (1000 * 60 * 1); public Context context; public double highMark; @@ -47,7 +47,7 @@ public class BgGraphBuilder { public int basalBackgroundColor; public boolean singleLine = false; - private double endHour; + private long endHour; private List inRangeValues = new ArrayList(); private List highValues = new ArrayList(); private List lowValues = new ArrayList(); @@ -316,8 +316,8 @@ public class BgGraphBuilder { GregorianCalendar today = new GregorianCalendar(now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH)); SimpleDateFormat timeFormat = new SimpleDateFormat(is24? "HH" : "h a"); timeFormat.setTimeZone(TimeZone.getDefault()); - double start_hour = today.getTime().getTime(); - double timeNow = System.currentTimeMillis(); + long start_hour = today.getTime().getTime(); + long timeNow = System.currentTimeMillis(); for (int l = 0; l <= 24; l++) { if ((start_hour + (60000 * 60 * (l))) < timeNow) { if ((start_hour + (60000 * 60 * (l + 1))) >= timeNow) { @@ -332,7 +332,7 @@ public class BgGraphBuilder { //Add whole hours endTime the axis (as long as they are more than 15 mins away from the current time) for (int l = 0; l <= 24; l++) { - double timestamp = endHour - (60000 * 60 * l); + long timestamp = endHour - (60000 * 60 * l); if((timestamp - timeNow < 0) && (timestamp > start_time)) { if(Math.abs(timestamp - timeNow) > (1000 * 60 * 8 * timespan)){ xAxisValues.add(new AxisValue(fuzz(timestamp), (timeFormat.format(timestamp)).toCharArray())); @@ -350,7 +350,7 @@ public class BgGraphBuilder { return xAxis; } - public float fuzz(double value) { - return (float) Math.round(value / fuzzyTimeDenom); + public float fuzz(long value) { + return (float) Math.round(value / fuzzyTimeDenom); } } diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java index 73930d8365..7c62ba6b0f 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java @@ -73,7 +73,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh private int batteryLevel = 0; - private double datetime = 0; + private long datetime = 0; private String direction = ""; private String delta = ""; private String avgDelta = ""; @@ -433,11 +433,11 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh } - private synchronized double getDatetime() { + private synchronized long getDatetime() { return datetime; } - private synchronized void setDatetime(double datetime) { + private synchronized void setDatetime(long datetime) { this.datetime = datetime; } @@ -534,7 +534,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh Log.d("CircleWatchface", "sgv string : " + getSgvString()); setDelta(dataMap.getString("delta")); setAvgDelta(dataMap.getString("avgDelta")); - setDatetime(dataMap.getDouble("timestamp")); + setDatetime(dataMap.getLong("timestamp")); addToWatchSet(dataMap); @@ -576,7 +576,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); - double timestamp = dataMap.getDouble("timestamp"); + long timestamp = dataMap.getLong("timestamp"); bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); } else if (!sharedPrefs.getBoolean("animation", false)) { // don't load history at once if animations are set (less resource consumption) @@ -586,7 +586,7 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh double sgv = entry.getDouble("sgvDouble"); double high = entry.getDouble("high"); double low = entry.getDouble("low"); - double timestamp = entry.getDouble("timestamp"); + long timestamp = entry.getLong("timestamp"); bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); } } else diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/Cockpit.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/Cockpit.java new file mode 100644 index 0000000000..a275752cf9 --- /dev/null +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/Cockpit.java @@ -0,0 +1,126 @@ +package info.nightscout.androidaps.watchfaces; + +import android.content.Intent; +import android.support.wearable.watchface.WatchFaceStyle; +import android.view.LayoutInflater; +import android.view.View; + +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.interaction.menus.MainMenuActivity; + +/** + * Created by andrew-warrington on 18/11/2017. + */ + +public class Cockpit extends BaseWatchFace { + + private long sgvTapTime = 0; + + @Override + public void onCreate() { + super.onCreate(); + LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); + layoutView = inflater.inflate(R.layout.activity_cockpit, null); + performViewSetup(); + } + + @Override + protected void onTapCommand(int tapType, int x, int y, long eventTime) { + + if (mSgv != null) { + + int extra = (mSgv.getRight() - mSgv.getLeft()) / 2; + if (tapType == TAP_TYPE_TAP && + x + extra >= mSgv.getLeft() && + x - extra <= mSgv.getRight() && + y >= mSgv.getTop() && + y <= mSgv.getBottom()) { + if (eventTime - sgvTapTime < 800) { + Intent intent = new Intent(this, MainMenuActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + sgvTapTime = eventTime; + } + } + } + + @Override + protected WatchFaceStyle getWatchFaceStyle() { + return new WatchFaceStyle.Builder(this).setAcceptsTapEvents(true).build(); + } + + protected void setColorDark() { + + mRelativeLayout.setBackgroundResource(R.drawable.airplane_cockpit_outside_clouds); + setTextSizes(); + + if (mHighLight != null && mLowLight != null) { + if (sgvLevel == 1) { + mHighLight.setBackgroundResource(R.drawable.airplane_led_yellow_lit); + mLowLight.setBackgroundResource(R.drawable.airplane_led_grey_unlit); + } else if (sgvLevel == 0) { + mHighLight.setBackgroundResource(R.drawable.airplane_led_grey_unlit); + mLowLight.setBackgroundResource(R.drawable.airplane_led_grey_unlit); + } else if (sgvLevel == -1) { + mHighLight.setBackgroundResource(R.drawable.airplane_led_grey_unlit); + mLowLight.setBackgroundResource(R.drawable.airplane_led_red_lit); + } + } + + if (loopLevel == 1) { + mLoop.setBackgroundResource(R.drawable.loop_green_25); + } else { + mLoop.setBackgroundResource(R.drawable.loop_red_25); + } + + invalidate(); + + } + + protected void setColorLowRes() { + mRelativeLayout.setBackgroundResource(R.drawable.airplane_cockpit_outside_clouds_lowres); + + } + + protected void setColorBright() { + setColorDark(); + } + + protected void setTextSizes() { + + if (mIOB2 != null) { + if (detailedIOB) { + if (bIsRound) { + mIOB2.setTextSize(10); + } else { + mIOB2.setTextSize(9); + } + } else { + if (bIsRound) { + mIOB2.setTextSize(13); + } else { + mIOB2.setTextSize(12); + } + } + } + + if ((mUploaderBattery.getVisibility() != View.GONE) && (mRigBattery.getVisibility() != View.GONE)) { + if (bIsRound) { + mUploaderBattery.setTextSize(12); + mRigBattery.setTextSize(12); + } else { + mUploaderBattery.setTextSize(10); + mRigBattery.setTextSize(10); + } + } else { + if (bIsRound) { + mUploaderBattery.setTextSize(13); + mRigBattery.setTextSize(13); + } else { + mUploaderBattery.setTextSize(12); + mRigBattery.setTextSize(12); + } + } + } +} \ No newline at end of file diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/Home2.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/Home2.java new file mode 100644 index 0000000000..367b93a729 --- /dev/null +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/Home2.java @@ -0,0 +1,241 @@ +package info.nightscout.androidaps.watchfaces; + +import android.content.Intent; +import android.graphics.Color; +import android.support.v4.content.ContextCompat; +import android.support.wearable.watchface.WatchFaceStyle; +import android.view.LayoutInflater; + +import com.ustwo.clockwise.common.WatchMode; + +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.interaction.menus.MainMenuActivity; + +public class Home2 extends BaseWatchFace { + + private long chartTapTime = 0; + private long sgvTapTime = 0; + + @Override + public void onCreate() { + super.onCreate(); + LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); + layoutView = inflater.inflate(R.layout.activity_home_2, null); + performViewSetup(); + } + + @Override + protected void onTapCommand(int tapType, int x, int y, long eventTime) { + + int extra = mSgv!=null?(mSgv.getRight() - mSgv.getLeft())/2:0; + + if (tapType == TAP_TYPE_TAP&& + x >=chart.getLeft() && + x <= chart.getRight()&& + y >= chart.getTop() && + y <= chart.getBottom()){ + if (eventTime - chartTapTime < 800){ + changeChartTimeframe(); + } + chartTapTime = eventTime; + } else if (tapType == TAP_TYPE_TAP&& + x + extra >=mSgv.getLeft() && + x - extra <= mSgv.getRight()&& + y >= mSgv.getTop() && + y <= mSgv.getBottom()){ + if (eventTime - sgvTapTime < 800){ + Intent intent = new Intent(this, MainMenuActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + sgvTapTime = eventTime; + } + } + + private void changeChartTimeframe() { + int timeframe = Integer.parseInt(sharedPrefs.getString("chart_timeframe", "3")); + timeframe = (timeframe%5) + 1; + sharedPrefs.edit().putString("chart_timeframe", "" + timeframe).commit(); + } + + @Override + protected WatchFaceStyle getWatchFaceStyle(){ + return new WatchFaceStyle.Builder(this).setAcceptsTapEvents(true).build(); + } + + protected void setColorDark() { + mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); + mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); + mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); + mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mIOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mIOB2.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mCOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mCOB2.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mDay.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mMonth.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mLoop.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + + setTextSizes(); + + if (sgvLevel == 1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor)); + } else if (sgvLevel == 0) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + } else if (sgvLevel == -1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor)); + } + + if (ageLevel == 1) { + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + } else { + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld)); + } + + if (batteryLevel == 1) { + mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBattery)); + } else { + mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_uploaderBatteryEmpty)); + } + mRigBattery.setTextColor(Color.BLACK); + mDelta.setTextColor(Color.BLACK); + mAvgDelta.setTextColor(Color.BLACK); + mBasalRate.setTextColor(Color.BLACK); + mBgi.setTextColor(Color.BLACK); + + if (loopLevel == 1) { + mLoop.setBackgroundResource(R.drawable.loop_green_25); + } else { + mLoop.setBackgroundResource(R.drawable.loop_red_25); + } + + if (chart != null) { + highColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor); + lowColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor); + midColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor); + gridColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_gridColor); + basalBackgroundColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_dark); + basalCenterColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_light); + pointSize = 2; + setupCharts(); + } + } + + protected void setColorLowRes() { + mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); + mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); + mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); + mLoop.setBackgroundResource(R.drawable.loop_grey_25); + mLoop.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_Timestamp)); + mDelta.setTextColor(Color.BLACK); + mAvgDelta.setTextColor(Color.BLACK); + mRigBattery.setTextColor(Color.BLACK); + mUploaderBattery.setTextColor(Color.BLACK); + mBasalRate.setTextColor(Color.BLACK); + mBgi.setTextColor(Color.BLACK); + mIOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mIOB2.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mCOB1.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mCOB2.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mDay.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mMonth.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime)); + if (chart != null) { + highColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor); + lowColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor); + midColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor); + gridColor = ContextCompat.getColor(getApplicationContext(), R.color.dark_gridColor); + basalBackgroundColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_dark_lowres); + basalCenterColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_light_lowres); + pointSize = 2; + setupCharts(); + } + setTextSizes(); + } + + protected void setColorBright() { + + if (getCurrentWatchMode() == WatchMode.INTERACTIVE) { + mLinearLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_stripe_background)); + mLinearLayout2.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); + mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); + mTime.setTextColor(Color.BLACK); + mIOB1.setTextColor(Color.BLACK); + mIOB2.setTextColor(Color.BLACK); + mCOB1.setTextColor(Color.BLACK); + mCOB2.setTextColor(Color.BLACK); + mDay.setTextColor(Color.BLACK); + mMonth.setTextColor(Color.BLACK); + mLoop.setTextColor(Color.BLACK); + + setTextSizes(); + + if (sgvLevel == 1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); + } else if (sgvLevel == 0) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_midColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_midColor)); + } else if (sgvLevel == -1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_lowColor)); + mDirection.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_lowColor)); + } + + if (ageLevel == 1) { + mTimestamp.setTextColor(Color.BLACK); + } else { + mTimestamp.setTextColor(Color.RED); + } + + if (batteryLevel == 1) { + mUploaderBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + } else { + mUploaderBattery.setTextColor(Color.RED); + } + mRigBattery.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mBasalRate.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + mBgi.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_midColor)); + + if (loopLevel == 1) { + mLoop.setBackgroundResource(R.drawable.loop_green_25); + } else { + mLoop.setBackgroundResource(R.drawable.loop_red_25); + } + + if (chart != null) { + highColor = ContextCompat.getColor(getApplicationContext(), R.color.light_highColor); + lowColor = ContextCompat.getColor(getApplicationContext(), R.color.light_lowColor); + midColor = ContextCompat.getColor(getApplicationContext(), R.color.light_midColor); + gridColor = ContextCompat.getColor(getApplicationContext(), R.color.light_gridColor); + basalBackgroundColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_light); + basalCenterColor = ContextCompat.getColor(getApplicationContext(), R.color.basal_dark); + pointSize = 2; + setupCharts(); + } + } else { + setColorDark(); + } + } + + protected void setTextSizes() { + + if (mIOB1 != null && mIOB2 != null) { + + if (detailedIOB) { + mIOB1.setTextSize(14); + mIOB2.setTextSize(10); + } else { + mIOB1.setTextSize(10); + mIOB2.setTextSize(14); + } + } + } +} diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java index 9bb452c480..328f101497 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java @@ -59,7 +59,7 @@ public class NOChart extends WatchFace implements SharedPreferences.OnSharedPref public int ageLevel = 1; public boolean lowResMode = false; public boolean layoutSet = false; - public double datetime; + public long datetime; public ArrayList bgDataList = new ArrayList<>(); public ArrayList tempWatchDataList = new ArrayList<>(); public ArrayList basalWatchDataList = new ArrayList<>(); @@ -252,7 +252,7 @@ public class NOChart extends WatchFace implements SharedPreferences.OnSharedPref wakeLock.acquire(50); sgvLevel = dataMap.getLong("sgvLevel"); batteryLevel = dataMap.getInt("batteryLevel"); - datetime = dataMap.getDouble("timestamp"); + datetime = dataMap.getLong("timestamp"); sgvString = dataMap.getString("sgvString"); mSgv.setText(dataMap.getString("sgvString")); diff --git a/wear/src/main/res/drawable/airplane_cockpit.png b/wear/src/main/res/drawable/airplane_cockpit.png new file mode 100644 index 0000000000..84da13abc7 Binary files /dev/null and b/wear/src/main/res/drawable/airplane_cockpit.png differ diff --git a/wear/src/main/res/drawable/airplane_cockpit_outside_clouds.png b/wear/src/main/res/drawable/airplane_cockpit_outside_clouds.png new file mode 100644 index 0000000000..dca7e49079 Binary files /dev/null and b/wear/src/main/res/drawable/airplane_cockpit_outside_clouds.png differ diff --git a/wear/src/main/res/drawable/airplane_cockpit_outside_clouds_lowres.png b/wear/src/main/res/drawable/airplane_cockpit_outside_clouds_lowres.png new file mode 100644 index 0000000000..e264408816 Binary files /dev/null and b/wear/src/main/res/drawable/airplane_cockpit_outside_clouds_lowres.png differ diff --git a/wear/src/main/res/drawable/airplane_led_grey_unlit.png b/wear/src/main/res/drawable/airplane_led_grey_unlit.png new file mode 100644 index 0000000000..614510d717 Binary files /dev/null and b/wear/src/main/res/drawable/airplane_led_grey_unlit.png differ diff --git a/wear/src/main/res/drawable/airplane_led_red_lit.png b/wear/src/main/res/drawable/airplane_led_red_lit.png new file mode 100644 index 0000000000..9f4d98073d Binary files /dev/null and b/wear/src/main/res/drawable/airplane_led_red_lit.png differ diff --git a/wear/src/main/res/drawable/airplane_led_yellow_lit.png b/wear/src/main/res/drawable/airplane_led_yellow_lit.png new file mode 100644 index 0000000000..cca76f6b2a Binary files /dev/null and b/wear/src/main/res/drawable/airplane_led_yellow_lit.png differ diff --git a/wear/src/main/res/drawable/loop_green_25.png b/wear/src/main/res/drawable/loop_green_25.png new file mode 100644 index 0000000000..37076d5577 Binary files /dev/null and b/wear/src/main/res/drawable/loop_green_25.png differ diff --git a/wear/src/main/res/drawable/loop_grey_25.png b/wear/src/main/res/drawable/loop_grey_25.png new file mode 100644 index 0000000000..781f68d17d Binary files /dev/null and b/wear/src/main/res/drawable/loop_grey_25.png differ diff --git a/wear/src/main/res/drawable/loop_red_25.png b/wear/src/main/res/drawable/loop_red_25.png new file mode 100644 index 0000000000..e9dcdb0da3 Binary files /dev/null and b/wear/src/main/res/drawable/loop_red_25.png differ diff --git a/wear/src/main/res/drawable/watchface_cockpit.png b/wear/src/main/res/drawable/watchface_cockpit.png new file mode 100644 index 0000000000..88f7bb70a3 Binary files /dev/null and b/wear/src/main/res/drawable/watchface_cockpit.png differ diff --git a/wear/src/main/res/drawable/watchface_graph_2.png b/wear/src/main/res/drawable/watchface_graph_2.png new file mode 100644 index 0000000000..de0aab2d42 Binary files /dev/null and b/wear/src/main/res/drawable/watchface_graph_2.png differ diff --git a/wear/src/main/res/layout/activity_cockpit.xml b/wear/src/main/res/layout/activity_cockpit.xml new file mode 100644 index 0000000000..06c1cd036d --- /dev/null +++ b/wear/src/main/res/layout/activity_cockpit.xml @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/wear/src/main/res/layout/activity_home_2.xml b/wear/src/main/res/layout/activity_home_2.xml new file mode 100644 index 0000000000..1b3dd0be51 --- /dev/null +++ b/wear/src/main/res/layout/activity_home_2.xml @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/wear/src/main/res/layout/rect_activity_home_2.xml b/wear/src/main/res/layout/rect_activity_home_2.xml new file mode 100644 index 0000000000..88f55404bc --- /dev/null +++ b/wear/src/main/res/layout/rect_activity_home_2.xml @@ -0,0 +1,369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wear/src/main/res/layout/rect_cockpit.xml b/wear/src/main/res/layout/rect_cockpit.xml new file mode 100644 index 0000000000..88bda0917c --- /dev/null +++ b/wear/src/main/res/layout/rect_cockpit.xml @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wear/src/main/res/layout/round_activity_home_2.xml b/wear/src/main/res/layout/round_activity_home_2.xml new file mode 100644 index 0000000000..837dc979e3 --- /dev/null +++ b/wear/src/main/res/layout/round_activity_home_2.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wear/src/main/res/layout/round_cockpit.xml b/wear/src/main/res/layout/round_cockpit.xml new file mode 100644 index 0000000000..b2892c20db --- /dev/null +++ b/wear/src/main/res/layout/round_cockpit.xml @@ -0,0 +1,491 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/wear/src/main/res/values/strings.xml b/wear/src/main/res/values/strings.xml index 0644100b47..a7f34c08b1 100644 --- a/wear/src/main/res/values/strings.xml +++ b/wear/src/main/res/values/strings.xml @@ -20,8 +20,6 @@ 5 - - Default Quick righty @@ -38,6 +36,7 @@ AAPS + AAPSv2 AAPS(Large) AAPS(BigChart) AAPS(NoChart) diff --git a/wear/src/main/res/xml/preferences.xml b/wear/src/main/res/xml/preferences.xml index 2d97a82931..1846ce4939 100644 --- a/wear/src/main/res/xml/preferences.xml +++ b/wear/src/main/res/xml/preferences.xml @@ -18,26 +18,34 @@ app:wear_iconOff="@drawable/settings_off" app:wear_iconOn="@drawable/settings_on" /> - - + + + + @@ -51,19 +59,47 @@ + + + + + + + + - + + + + +