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/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/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1dd663764a..e8918979b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -782,6 +782,7 @@ 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_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/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 @@ + + + + + + + + - + + + + +