From f0521c01974cf6c916896bcc66652b91849a6123 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Fri, 30 Jun 2017 01:48:12 +0200 Subject: [PATCH] nighttime watchface --- wear/build.gradle | 2 + wear/src/main/AndroidManifest.xml | 18 + .../androidaps/watchfaces/NOChart.java | 520 ++++++++++++++++++ .../main/res/drawable/watchface_nochart.png | Bin 0 -> 13392 bytes wear/src/main/res/layout/activity_nochart.xml | 12 + .../main/res/layout/rect_activity_nochart.xml | 108 ++++ .../res/layout/round_activity_nochart.xml | 108 ++++ 7 files changed, 768 insertions(+) create mode 100644 wear/src/main/java/info/nightscout/androidaps/watchfaces/NOChart.java create mode 100755 wear/src/main/res/drawable/watchface_nochart.png create mode 100644 wear/src/main/res/layout/activity_nochart.xml create mode 100644 wear/src/main/res/layout/rect_activity_nochart.xml create mode 100644 wear/src/main/res/layout/round_activity_nochart.xml diff --git a/wear/build.gradle b/wear/build.gradle index 241fedbe9a..26779263e2 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -27,6 +27,7 @@ android { resValue "string", "label_xdrip", "AAPS" resValue "string", "label_xdrip_large", "AAPS(Large)" resValue "string", "label_xdrip_big_chart", "AAPS(BigChart)" + resValue "string", "label_xdrip_no_chart", "AAPS(NoChart)" resValue "string", "label_xdrip_circle", "AAPS(Circle)" resValue "string", "label_xdrip_activity", "AAPS Prefs." resValue "string", "app_settings", "AAPS Settings" @@ -39,6 +40,7 @@ android { resValue "string", "label_xdrip", "AAPS" resValue "string", "label_xdrip_large", "AAPS(Large)" resValue "string", "label_xdrip_big_chart", "AAPS(BigChart)" + resValue "string", "label_xdrip_no_chart", "AAPS(NoChart)" resValue "string", "label_xdrip_circle", "AAPS(Circle)" resValue "string", "label_xdrip_activity", "AAPS Prefs." resValue "string", "app_settings", "AAPS Settings" diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index 8909f8a3f8..fc40e930cd 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -34,6 +34,24 @@ + + + + + + + + + + bgDataList = new ArrayList<>(); + public ArrayList tempWatchDataList = new ArrayList<>(); + public ArrayList basalWatchDataList = new ArrayList<>(); + public PowerManager.WakeLock wakeLock; + public View layoutView; + private final Point displaySize = new Point(); + private int specW, specH; + private int animationAngle = 0; + private boolean isAnimated = false; + + private LocalBroadcastManager localBroadcastManager; + private MessageReceiver messageReceiver; + + protected SharedPreferences sharedPrefs; + private String sgvString = "--"; + private String externalStatusString = "no status"; + private TextView statusView; + private long sgvTapTime = 0l; + + @Override + public void onCreate() { + super.onCreate(); + Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)) + .getDefaultDisplay(); + display.getSize(displaySize); + wakeLock = ((PowerManager) getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Clock"); + + specW = View.MeasureSpec.makeMeasureSpec(displaySize.x, + View.MeasureSpec.EXACTLY); + specH = View.MeasureSpec.makeMeasureSpec(displaySize.y, + View.MeasureSpec.EXACTLY); + sharedPrefs = PreferenceManager + .getDefaultSharedPreferences(this); + sharedPrefs.registerOnSharedPreferenceChangeListener(this); + LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + layoutView = inflater.inflate(R.layout.activity_nochart, null); + performViewSetup(); + } + + @Override + protected void onLayout(WatchShape shape, Rect screenBounds, WindowInsets screenInsets) { + super.onLayout(shape, screenBounds, screenInsets); + layoutView.onApplyWindowInsets(screenInsets); + } + + public void performViewSetup() { + final WatchViewStub stub = (WatchViewStub) layoutView.findViewById(R.id.watch_view_stub); + IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND); + + messageReceiver = new MessageReceiver(); + localBroadcastManager = LocalBroadcastManager.getInstance(this); + localBroadcastManager.registerReceiver(messageReceiver, messageFilter); + + stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() { + @Override + public void onLayoutInflated(WatchViewStub stub) { + mTime = (TextView) stub.findViewById(R.id.watch_time); + mSgv = (TextView) stub.findViewById(R.id.sgv); + mTimestamp = (TextView) stub.findViewById(R.id.timestamp); + mDelta = (TextView) stub.findViewById(R.id.delta); + mAvgDelta = (TextView) stub.findViewById(R.id.avgdelta); + mRelativeLayout = (RelativeLayout) stub.findViewById(R.id.main_layout); + statusView = (TextView) stub.findViewById(R.id.aps_status); + layoutSet = true; + showAgeAndStatus(); + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + } + }); + ListenerService.requestData(this); + wakeLock.acquire(50); + } + + @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 + 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; + } + } + + protected void onWatchModeChanged(WatchMode watchMode) { + + if(lowResMode ^ isLowRes(watchMode)){ //if there was a change in lowResMode + lowResMode = isLowRes(watchMode); + setColor(); + } else if (! sharedPrefs.getBoolean("dark", true)){ + //in bright mode: different colours if active: + setColor(); + } + } + + private boolean isLowRes(WatchMode watchMode) { + return (watchMode == WatchMode.LOW_BIT) || (watchMode == WatchMode.LOW_BIT_BURN_IN) || (watchMode == WatchMode.LOW_BIT_BURN_IN); + } + + + @Override + protected WatchFaceStyle getWatchFaceStyle(){ + return new WatchFaceStyle.Builder(this).setAcceptsTapEvents(true).build(); + } + + + + public int ageLevel() { + if(timeSince() <= (1000 * 60 * 12)) { + return 1; + } else { + return 0; + } + } + + public double timeSince() { + return System.currentTimeMillis() - datetime; + } + + public String readingAge(boolean shortString) { + if (datetime == 0) { return shortString?"--'":"-- Minute ago"; } + int minutesAgo = (int) Math.floor(timeSince()/(1000*60)); + if (minutesAgo == 1) { + return minutesAgo + (shortString?"'":" Minute ago"); + } + return minutesAgo + (shortString?"'":" Minutes ago"); + } + + @Override + public void onDestroy() { + if(localBroadcastManager != null && messageReceiver != null){ + localBroadcastManager.unregisterReceiver(messageReceiver);} + if (sharedPrefs != null){ + sharedPrefs.unregisterOnSharedPreferenceChangeListener(this); + } + super.onDestroy(); + } + + static { + INTENT_FILTER = new IntentFilter(); + INTENT_FILTER.addAction(Intent.ACTION_TIME_TICK); + INTENT_FILTER.addAction(Intent.ACTION_TIMEZONE_CHANGED); + INTENT_FILTER.addAction(Intent.ACTION_TIME_CHANGED); + } + + @Override + protected void onDraw(Canvas canvas) { + if(layoutSet) { + this.mRelativeLayout.draw(canvas); + Log.d("onDraw", "draw"); + } + } + + @Override + 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(NOChart.this); + mTime.setText(timeFormat.format(System.currentTimeMillis())); + showAgeAndStatus(); + + if(ageLevel()<=0) { + mSgv.setPaintFlags(mSgv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); + } else { + mSgv.setPaintFlags(mSgv.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG); + } + + missedReadingAlert(); + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + } + } + + public class MessageReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + 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"); + 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(NOChart.this); + mTime.setText(timeFormat.format(System.currentTimeMillis())); + + showAgeAndStatus(); + + String delta = dataMap.getString("delta"); + + if (delta.endsWith(" mg/dl")) { + mDelta.setText(delta.substring(0, delta.length() - 6)); + } else if (delta.endsWith(" mmol/l")||delta.endsWith(" mmol")) { + mDelta.setText(delta.substring(0, delta.length() - 5)); + } else { + mDelta.setText(delta); + } + + + String avgDelta = dataMap.getString("avgDelta"); + + if (delta.endsWith(" mg/dl")) { + mAvgDelta.setText(avgDelta.substring(0, avgDelta.length() - 6)); + } else if (avgDelta.endsWith(" mmol/l")||avgDelta.endsWith(" mmol")) { + mAvgDelta.setText(avgDelta.substring(0, avgDelta.length() - 5)); + } else { + mAvgDelta.setText(avgDelta); + } + + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + invalidate(); + setColor(); + + //start animation? + // dataMap.getDataMapArrayList("entries") == null -> not on "resend data". + if (!lowResMode && (sharedPrefs.getBoolean("animation", false) && dataMap.getDataMapArrayList("entries") == null && (sgvString.equals("100") || sgvString.equals("5.5") || sgvString.equals("5,5")))) { + startAnimation(); + } + } + //status + bundle = intent.getBundleExtra("status"); + if (layoutSet && bundle != null) { + DataMap dataMap = DataMap.fromBundle(bundle); + wakeLock.acquire(50); + externalStatusString = dataMap.getString("externalStatusString"); + + showAgeAndStatus(); + + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + invalidate(); + setColor(); + } + //basals and temps + 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(); + } + } + } + + private void loadBasalsAndTemps(DataMap dataMap) { + ArrayList temps = dataMap.getDataMapArrayList("temps"); + if (temps != null) { + tempWatchDataList = new ArrayList<>(); + for (DataMap temp : temps) { + TempWatchData twd = new TempWatchData(); + twd.startTime = temp.getLong("starttime"); + twd.startBasal = temp.getDouble("startBasal"); + twd.endTime = temp.getLong("endtime"); + twd.endBasal = temp.getDouble("endbasal"); + twd.amount = temp.getDouble("amount"); + tempWatchDataList.add(twd); + } + } + ArrayList basals = dataMap.getDataMapArrayList("basals"); + if (basals != null) { + basalWatchDataList = new ArrayList<>(); + for (DataMap basal : basals) { + BasalWatchData bwd = new BasalWatchData(); + bwd.startTime = basal.getLong("starttime"); + bwd.endTime = basal.getLong("endtime"); + bwd.amount = basal.getDouble("amount"); + basalWatchDataList.add(bwd); + } + } + } + + private void showAgeAndStatus() { + + if( mTimestamp != null){ + mTimestamp.setText(readingAge(true)); + } + boolean showAvgDelta = sharedPrefs.getBoolean("showAvgDelta", true); + + if(showAvgDelta){ + mAvgDelta.setVisibility(View.VISIBLE); + } else { + mAvgDelta.setVisibility(View.GONE); + } + statusView.setText(externalStatusString); + statusView.setVisibility(View.VISIBLE); + } + + public void setColor() { + if(lowResMode){ + setColorLowRes(); + } else if (sharedPrefs.getBoolean("dark", true)) { + setColorDark(); + } else { + setColorBright(); + } + + } + + + + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){ + setColor(); + if(layoutSet){ + showAgeAndStatus(); + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + } + invalidate(); + } + + protected void updateRainbow() { + animationAngle = (animationAngle + 1) % 360; + //Animation matrix: + int[] rainbow = {Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE + , Color.CYAN}; + Shader shader = new LinearGradient(0, 0, 0, 20, rainbow, + null, Shader.TileMode.MIRROR); + Matrix matrix = new Matrix(); + matrix.setRotate(animationAngle); + shader.setLocalMatrix(matrix); + mSgv.getPaint().setShader(shader); + invalidate(); + } + + private synchronized void setIsAnimated(boolean isAnimated) { + this.isAnimated = isAnimated; + } + + void startAnimation() { + Log.d("CircleWatchface", "start startAnimation"); + + Thread animator = new Thread() { + + + public void run() { + setIsAnimated(true); + for (int i = 0; i <= 8 * 1000 / 40; i++) { + updateRainbow(); + try { + Thread.sleep(40); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + mSgv.getPaint().setShader(null); + setIsAnimated(false); + invalidate(); + setColor(); + + System.gc(); + } + }; + + animator.start(); + } + + protected void setColorLowRes() { + mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime)); + statusView.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); + mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); + mSgv.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)); + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_Timestamp)); + } + + protected void setColorDark() { + mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_mTime)); + statusView.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_statusView)); + mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_background)); + if (sgvLevel == 1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor)); + mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor)); + mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_highColor)); + } else if (sgvLevel == 0) { + mSgv.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)); + } else if (sgvLevel == -1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor)); + mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor)); + mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_lowColor)); + } + + if (ageLevel == 1) { + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_Timestamp)); + } else { + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.dark_TimestampOld)); + } + } + + + protected void setColorBright() { + + if (getCurrentWatchMode() == WatchMode.INTERACTIVE) { + mTime.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_bigchart_time)); + statusView.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_bigchart_status)); + mRelativeLayout.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.light_background)); + if (sgvLevel == 1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); + mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); + mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_highColor)); + } else if (sgvLevel == 0) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_midColor)); + mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_midColor)); + mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_midColor)); + } else if (sgvLevel == -1) { + mSgv.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_lowColor)); + mDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_lowColor)); + mAvgDelta.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_lowColor)); + } + + if (ageLevel == 1) { + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_mTimestamp1)); + } else { + mTimestamp.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.light_mTimestamp)); + } + } else { + setColorDark(); + } + } + + public void missedReadingAlert() { + int minutes_since = (int) Math.floor(timeSince()/(1000*60)); + if(minutes_since >= 16 && ((minutes_since - 16) % 5) == 0) { + ListenerService.requestData(this); // attempt endTime recover missing data + } + } +} \ No newline at end of file diff --git a/wear/src/main/res/drawable/watchface_nochart.png b/wear/src/main/res/drawable/watchface_nochart.png new file mode 100755 index 0000000000000000000000000000000000000000..c0e9e677474496a2670521664e933171d6eb7d8e GIT binary patch literal 13392 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 literal 0 HcmV?d00001 diff --git a/wear/src/main/res/layout/activity_nochart.xml b/wear/src/main/res/layout/activity_nochart.xml new file mode 100644 index 0000000000..4b7198aa78 --- /dev/null +++ b/wear/src/main/res/layout/activity_nochart.xml @@ -0,0 +1,12 @@ + + diff --git a/wear/src/main/res/layout/rect_activity_nochart.xml b/wear/src/main/res/layout/rect_activity_nochart.xml new file mode 100644 index 0000000000..47938873b2 --- /dev/null +++ b/wear/src/main/res/layout/rect_activity_nochart.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wear/src/main/res/layout/round_activity_nochart.xml b/wear/src/main/res/layout/round_activity_nochart.xml new file mode 100644 index 0000000000..47938873b2 --- /dev/null +++ b/wear/src/main/res/layout/round_activity_nochart.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +