From b93273d7064df30cc30824d267e5f84f57ad8ede Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Thu, 17 Nov 2016 21:51:29 +0100 Subject: [PATCH] wear status working --- .../nightscout/androidaps/db/TempBasal.java | 21 +++++++ .../androidaps/plugins/Wear/WearFragment.java | 3 + .../androidaps/plugins/Wear/WearPlugin.java | 46 ++++++++++---- .../ExternalStatusBroadcastReceier.java | 17 ------ .../ExternalStatusService.java | 61 ------------------- .../wearintegration/WatchUpdaterService.java | 38 +++++++++++- .../info/nightscout/androidaps/BIGChart.java | 53 +++++++++++----- 7 files changed, 132 insertions(+), 107 deletions(-) delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusBroadcastReceier.java delete mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusService.java diff --git a/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java b/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java index e1d7af8662..835fec8a59 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java +++ b/app/src/main/java/info/nightscout/androidaps/db/TempBasal.java @@ -204,4 +204,25 @@ public class TempBasal { } } + public String toStringShort() { + String extended = isExtended ? "E" : ""; + + if (isAbsolute) { + return extended + DecimalFormatter.to2Decimal(absolute) + "U/h "; + } else { // percent + return percent + "% "; + } + } + + public String toStringMedium() { + String extended = isExtended ? "E" : ""; + + if (isAbsolute) { + return extended + DecimalFormatter.to2Decimal(absolute) + "U/h (" + + getRealDuration() + "/" + duration + ") "; + } else { // percent + return percent + "% (" + getRealDuration() + "/" + duration + ") "; + } + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearFragment.java index c909d54fd9..ca54cc73b1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearFragment.java @@ -22,4 +22,7 @@ public class WearFragment implements FragmentBase { } + //TODO Adrian: setting for short/long status string + //TODO Adrian: resend buttons + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java index 23292a2df2..e4cca62d57 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java @@ -74,45 +74,67 @@ public class WearPlugin implements PluginBase { } - private void sendDataToWatch(){ - if (isEnabled(getType())) { - ctx.startService(new Intent(ctx, WatchUpdaterService.class)); + private void sendDataToWatch(boolean status, boolean basals, boolean bgValue){ + if (isEnabled(getType())) { //only start service when this plugin is enabled + + if(bgValue){ + ctx.startService(new Intent(ctx, WatchUpdaterService.class)); + } + + if(basals){ + //TODO send basals + } + + if(status){ + ctx.startService(new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_STATUS)); + } + + } } /* @Subscribe public void onStatusEvent(final EventPreferenceChange ev) { + + //TODO Adrian: probably a high/low mark change? Send it instantly? sendDataToWatch(); } @Subscribe public void onStatusEvent(final EventRefreshGui ev) { - sendDataToWatch(); + + //TODO Adrian: anything here that is not covered by other cases? + sendDataToWatch(); + } + +*/ + @Subscribe + public void onStatusEvent(final EventTreatmentChange ev) { + sendDataToWatch(true, true, false); } - @Subscribe - public void onStatusEvent(final EventTreatmentChange ev) { - sendDataToWatch(); - }*/ - @Subscribe public void onStatusEvent(final EventTempBasalChange ev) { - sendDataToWatch(); + sendDataToWatch(true, true, false); } @Subscribe public void onStatusEvent(final EventNewBG ev) { - sendDataToWatch(); + + sendDataToWatch(true, true, true); } /* @Subscribe public void onStatusEvent(final EventNewOpenLoopNotification ev) { + //TODO Adrian: Do they come through as notification cards already? update status? sendDataToWatch(); }*/ @Subscribe - public void onStatusEvent(final EventNewBasalProfile ev) { sendDataToWatch(); } + public void onStatusEvent(final EventNewBasalProfile ev) { + sendDataToWatch(false, true, false); + } public static boolean isEnabled() { return fragmentEnabled; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusBroadcastReceier.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusBroadcastReceier.java deleted file mode 100644 index 52958d99d0..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusBroadcastReceier.java +++ /dev/null @@ -1,17 +0,0 @@ -package info.nightscout.androidaps.plugins.Wear.wearintegration; - -import android.content.Context; -import android.content.Intent; -import android.support.v4.content.WakefulBroadcastReceiver; - -/** - * Created by adrian on 14/02/16. - */ -public class ExternalStatusBroadcastReceier extends WakefulBroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - startWakefulService(context, new Intent(context, ExternalStatusService.class) - .setAction(ExternalStatusService.ACTION_NEW_EXTERNAL_STATUSLINE) - .putExtras(intent)); - } -} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusService.java deleted file mode 100644 index c814b08df9..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/ExternalStatusService.java +++ /dev/null @@ -1,61 +0,0 @@ -package info.nightscout.androidaps.plugins.Wear.wearintegration; - -import android.app.IntentService; -import android.content.Context; -import android.content.Intent; -import android.os.PowerManager; -import android.preference.PreferenceManager; -import android.support.v4.content.WakefulBroadcastReceiver; - -/** - * Created by adrian on 14/02/16. - */ -public class ExternalStatusService extends IntentService{ - //constants - public static final String EXTRA_STATUSLINE = "com.eveningoutpost.dexdrip.Extras.Statusline"; - public static final String ACTION_NEW_EXTERNAL_STATUSLINE = "com.eveningoutpost.dexdrip.ExternalStatusline"; - public static final String RECEIVER_PERMISSION = "com.eveningoutpost.dexdrip.permissions.RECEIVE_EXTERNAL_STATUSLINE"; - public static final int MAX_LEN = 40; - - public ExternalStatusService() { - super("ExternalStatusService"); - setIntentRedelivery(true); - } - - - @Override - protected void onHandleIntent(Intent intent) { - - if (intent == null) - return; - - final String action = intent.getAction(); - - try { - - if (ACTION_NEW_EXTERNAL_STATUSLINE.equals(action)) { - String statusline = intent.getStringExtra(EXTRA_STATUSLINE); - - if(statusline.length() > MAX_LEN){ - statusline = statusline.substring(0, MAX_LEN); - } - - if(statusline != null) { - // send to wear - if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean("wear_sync", false)) { - startService(new Intent(this, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_STATUS).putExtra("externalStatusString", statusline)); - /*By integrating the watch part of Nightwatch we inherited the same wakelock - problems NW had - so adding the same quick fix for now. - TODO: properly "wakelock" the wear (and probably pebble) services - */ - PowerManager powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE); - powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, - "quickFix4").acquire(15000); - } - } - } - } finally { - WakefulBroadcastReceiver.completeWakefulIntent(intent); - } - } -} 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 29ecea717b..43dd6d01fe 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 @@ -24,8 +24,12 @@ import java.util.List; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; +import info.nightscout.androidaps.db.TempBasal; +import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.OpenAPSMA.IobTotal; import info.nightscout.androidaps.plugins.Wear.WearPlugin; import info.nightscout.client.data.NSProfile; import info.nightscout.utils.DecimalFormatter; @@ -102,7 +106,7 @@ public class WatchUpdaterService extends WearableListenerService implements } else if (ACTION_OPEN_SETTINGS.equals(action)) { sendNotification(); } else if (ACTION_SEND_STATUS.equals(action)) { - sendStatus(intent.getStringExtra("externalStatusString")); + sendStatus(); } else { sendData(); } @@ -248,8 +252,38 @@ public class WatchUpdaterService extends WearableListenerService implements } } - private void sendStatus(String status) { + private void sendStatus() { if (googleApiClient.isConnected()) { + + String status = ""; + + //TODO Adrian: Setting if short or medium string. + + boolean shortString = true; + + //Temp basal + PumpInterface pump = MainApp.getConfigBuilder(); + + if (pump.isTempBasalInProgress()) { + TempBasal activeTemp = pump.getTempBasal(); + if (shortString) { + status += activeTemp.toStringShort(); + } else { + status += activeTemp.toStringMedium(); + } + } + + //IOB + MainApp.getConfigBuilder().getActiveTreatments().updateTotalIOB(); + IobTotal bolusIob = MainApp.getConfigBuilder().getActiveTreatments().getLastCalculation().round(); + if (bolusIob == null) bolusIob = new IobTotal(); + MainApp.getConfigBuilder().getActiveTempBasals().updateTotalIOB(); + IobTotal basalIob = MainApp.getConfigBuilder().getActiveTempBasals().getLastCalculation().round(); + if (basalIob == null) basalIob = new IobTotal(); + status += (shortString?"":(getString(R.string.treatments_iob_label_string) + " ")) + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "(" + + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; + PutDataMapRequest dataMapRequest = PutDataMapRequest.create(NEW_STATUS_PATH); //unique content dataMapRequest.getDataMap().putDouble("timestamp", System.currentTimeMillis()); diff --git a/wear/src/main/java/info/nightscout/androidaps/BIGChart.java b/wear/src/main/java/info/nightscout/androidaps/BIGChart.java index 378dbd6cc6..c7ee2f30e4 100644 --- a/wear/src/main/java/info/nightscout/androidaps/BIGChart.java +++ b/wear/src/main/java/info/nightscout/androidaps/BIGChart.java @@ -78,6 +78,8 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre private String rawString = "000 | 000 | 000"; private String batteryString = "--"; private String sgvString = "--"; + private String externalStatusString = "no status"; + private TextView statusView; @Override public void onCreate() { @@ -122,8 +124,9 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre mDelta = (TextView) stub.findViewById(R.id.delta); mRelativeLayout = (RelativeLayout) stub.findViewById(R.id.main_layout); chart = (LineChartView) stub.findViewById(R.id.chart); + statusView = (TextView) stub.findViewById(R.id.aps_status); layoutSet = true; - showAgoRawBatt(); + showAgeAndStatus(); mRelativeLayout.measure(specW, specH); mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), mRelativeLayout.getMeasuredHeight()); @@ -185,7 +188,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre wakeLock.acquire(50); final java.text.DateFormat timeFormat = DateFormat.getTimeFormat(BIGChart.this); mTime.setText(timeFormat.format(System.currentTimeMillis())); - showAgoRawBatt(); + showAgeAndStatus(); if(ageLevel()<=0) { mSgv.setPaintFlags(mSgv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); @@ -204,11 +207,8 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getBundleExtra("data"); - if (bundle ==null){ - return; - } - DataMap dataMap = DataMap.fromBundle(bundle); - if (layoutSet) { + if (layoutSet && bundle !=null) { + DataMap dataMap = DataMap.fromBundle(bundle); wakeLock.acquire(50); sgvLevel = dataMap.getLong("sgvLevel"); batteryLevel = dataMap.getInt("batteryLevel"); @@ -227,7 +227,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre final java.text.DateFormat timeFormat = DateFormat.getTimeFormat(BIGChart.this); mTime.setText(timeFormat.format(System.currentTimeMillis())); - showAgoRawBatt(); + showAgeAndStatus(); String delta = dataMap.getString("delta"); @@ -254,20 +254,40 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre if (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(); - } else { - Log.d("ERROR: ", "DATA IS NOT YET SET"); + mRelativeLayout.measure(specW, specH); + mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), + mRelativeLayout.getMeasuredHeight()); + invalidate(); + setColor(); } } } - private void showAgoRawBatt() { + private void showAgeAndStatus() { - if( mTimestamp == null){ - return; + if( mTimestamp != null){ + mTimestamp.setText(readingAge(true)); + } + + boolean showStatus = sharedPrefs.getBoolean("showExternalStatus", false); + + + if(showStatus){ + statusView.setText(externalStatusString); + statusView.setVisibility(View.VISIBLE); + } else { + statusView.setVisibility(View.GONE); } - mTimestamp.setText(readingAge(true)); } public void setColor() { @@ -285,7 +305,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key){ setColor(); if(layoutSet){ - showAgoRawBatt(); + showAgeAndStatus(); mRelativeLayout.measure(specW, specH); mRelativeLayout.layout(0, 0, mRelativeLayout.getMeasuredWidth(), mRelativeLayout.getMeasuredHeight()); @@ -347,6 +367,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre protected void setColorDark() { mTime.setTextColor(Color.WHITE); + statusView.setTextColor(Color.WHITE); mRelativeLayout.setBackgroundColor(Color.BLACK); if (sgvLevel == 1) { mSgv.setTextColor(Color.YELLOW); @@ -404,6 +425,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre mTime.setTextColor(Color.BLACK); + statusView.setTextColor(Color.BLACK); if (chart != null) { highColor = Utils.COLOR_ORANGE; midColor = Color.BLUE; @@ -425,6 +447,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre mDelta.setTextColor(Color.RED); } mTimestamp.setTextColor(Color.WHITE); + statusView.setTextColor(Color.WHITE); mTime.setTextColor(Color.WHITE); if (chart != null) {