From 67f21537ea79ec94c2e8a9254f83127158ce4b8a Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Sat, 6 May 2017 15:18:19 +0200 Subject: [PATCH 1/3] send status to xDrip --- app/src/main/AndroidManifest.xml | 2 + .../info/nightscout/androidaps/MainApp.java | 3 + .../androidaps/PreferencesActivity.java | 6 + .../XDripStatusline/StatuslineFragment.java | 29 +++ .../XDripStatusline/StatuslinePlugin.java | 206 ++++++++++++++++++ app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/pref_xdripstatus.xml | 14 ++ 7 files changed, 263 insertions(+) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslineFragment.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java create mode 100644 app/src/main/res/xml/pref_xdripstatus.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ab45d3d4f5..4b604b2799 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 4a81dea124..fab46087be 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -52,6 +52,8 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsFragment; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpFragment; import info.nightscout.androidaps.plugins.Wear.WearFragment; import info.nightscout.androidaps.plugins.Persistentnotification.PersistentNotificationPlugin; +import info.nightscout.androidaps.plugins.XDripStatusline.StatuslineFragment; +import info.nightscout.androidaps.plugins.XDripStatusline.StatuslinePlugin; import info.nightscout.androidaps.receivers.KeepAliveReceiver; import io.fabric.sdk.android.Fabric; @@ -117,6 +119,7 @@ public class MainApp extends Application { if (Config.SMSCOMMUNICATORENABLED) pluginsList.add(SmsCommunicatorFragment.getPlugin()); if (Config.WEAR) pluginsList.add(WearFragment.getPlugin(this)); + pluginsList.add(StatuslineFragment.getPlugin(this)); pluginsList.add(new PersistentNotificationPlugin(this)); pluginsList.add(NSClientInternalFragment.getPlugin()); diff --git a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java index 51394f28f9..ed7f780547 100644 --- a/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/PreferencesActivity.java @@ -21,6 +21,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalPlugi import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin; import info.nightscout.androidaps.plugins.PumpVirtual.VirtualPumpPlugin; import info.nightscout.androidaps.plugins.Wear.WearPlugin; +import info.nightscout.androidaps.plugins.XDripStatusline.StatuslinePlugin; import info.nightscout.utils.LocaleHelper; public class PreferencesActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -138,6 +139,11 @@ public class PreferencesActivity extends PreferenceActivity implements SharedPre } } + StatuslinePlugin statuslinePlugin = (StatuslinePlugin) MainApp.getSpecificPlugin(StatuslinePlugin.class); + if (statuslinePlugin != null && statuslinePlugin.isEnabled(PluginBase.GENERAL)) { + addPreferencesFromResource(R.xml.pref_xdripstatus); + } + initSummary(getPreferenceScreen()); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslineFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslineFragment.java new file mode 100644 index 0000000000..ba2cbc0783 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslineFragment.java @@ -0,0 +1,29 @@ +package info.nightscout.androidaps.plugins.XDripStatusline; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import info.nightscout.androidaps.R; + +/** + * Created by adrian on 17/11/16. + */ + +public class StatuslineFragment extends Fragment { + + private static StatuslinePlugin statuslinePlugin; + + public static StatuslinePlugin getPlugin(Context ctx) { + + if (statuslinePlugin == null) { + statuslinePlugin = new StatuslinePlugin(ctx); + } + + return statuslinePlugin; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java new file mode 100644 index 0000000000..8da9977965 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -0,0 +1,206 @@ +package info.nightscout.androidaps.plugins.XDripStatusline; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; + +import com.squareup.otto.Subscribe; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.data.IobTotal; +import info.nightscout.androidaps.db.TempBasal; +import info.nightscout.androidaps.events.EventNewBG; +import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.events.EventRefreshGui; +import info.nightscout.androidaps.events.EventTempBasalChange; +import info.nightscout.androidaps.events.EventTreatmentChange; +import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.utils.DecimalFormatter; +import info.nightscout.utils.ToastUtils; + +/** + * Created by adrian on 17/11/16. + */ + +public class StatuslinePlugin implements PluginBase { + + static boolean fragmentEnabled = false; + private static boolean lastLoopStatus; + + private final Context ctx; + SharedPreferences mPrefs; + + StatuslinePlugin(Context ctx) { + this.ctx = ctx; + this.mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx); + MainApp.bus().register(this); + } + + @Override + public int getType() { + return PluginBase.GENERAL; + } + + @Override + public String getFragmentClass() { + return StatuslineFragment.class.getName(); + } + + @Override + public String getName() { + return ctx.getString(R.string.xdripstatus); + } + + @Override + public String getNameShort() { + String name = MainApp.sResources.getString(R.string.xdripstatus_shortname); + if (!name.trim().isEmpty()){ + //only if translation exists + return name; + } + // use long name as fallback + return getName(); + } + + @Override + public boolean isEnabled(int type) { + return type == GENERAL && fragmentEnabled; + } + + @Override + public boolean isVisibleInTabs(int type) { + return false; + } + + @Override + public boolean canBeHidden(int type) { + return true; + } + + @Override + public boolean hasFragment() { + return false; + } + + @Override + public boolean showInList(int type) { + return true; + } + + @Override + public void setFragmentEnabled(int type, boolean fragmentEnabled) { + if (type == GENERAL) { + this.fragmentEnabled = fragmentEnabled; + } + } + + @Override + public void setFragmentVisible(int type, boolean fragmentVisible) { + // do nothing, no gui + } + + + + private void sendStatus() { + if(!fragmentEnabled) return; + + String status = ""; + boolean shortString = true; // make setting? + + LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + + if (activeloop != null && !activeloop.isEnabled(PluginBase.LOOP)) { + status += ctx.getString(R.string.disabledloop) + "\n"; + lastLoopStatus = false; + } else if (activeloop != null && activeloop.isEnabled(PluginBase.LOOP)) { + lastLoopStatus = 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(); + MainApp.getConfigBuilder().getActiveTempBasals().updateTotalIOB(); + IobTotal basalIob = MainApp.getConfigBuilder().getActiveTempBasals().getLastCalculation().round(); + status += (shortString?"":(ctx.getString(R.string.treatments_iob_label_string) + " ")) + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); + + + if (mPrefs.getBoolean("xdripstatus_detailediob", true)) { + status += "(" + + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; + } + + //constants + String EXTRA_STATUSLINE = "com.eveningoutpost.dexdrip.Extras.Statusline"; + String ACTION_NEW_EXTERNAL_STATUSLINE = "com.eveningoutpost.dexdrip.ExternalStatusline"; + String RECEIVER_PERMISSION = "com.eveningoutpost.dexdrip.permissions.RECEIVE_EXTERNAL_STATUSLINE"; + //sendData + final Bundle bundle = new Bundle(); + bundle.putString(EXTRA_STATUSLINE, status); + Intent intent = new Intent(ACTION_NEW_EXTERNAL_STATUSLINE); + intent.putExtras(bundle); + intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); + ctx.sendBroadcast(intent, RECEIVER_PERMISSION); + + ToastUtils.showToastInUiThread(ctx, "status: " + status); + + } + + + + @Subscribe + public void onStatusEvent(final EventPreferenceChange ev) { + // status may be formated differently + sendStatus(); + } + + @Subscribe + public void onStatusEvent(final EventTreatmentChange ev) { + sendStatus(); + } + + @Subscribe + public void onStatusEvent(final EventTempBasalChange ev) { + sendStatus(); + } + + @Subscribe + public void onStatusEvent(final EventNewBG ev) { + sendStatus(); + } + + @Subscribe + public void onStatusEvent(final EventRefreshGui ev) { + + LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + if (activeloop == null) return; + + if((lastLoopStatus != activeloop.isEnabled(PluginBase.LOOP))) { + sendStatus(); + } + } + + + + public static boolean isEnabled() { + return fragmentEnabled; + } + +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df2dcc3a71..4370d8f297 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -600,4 +600,7 @@ About Missing SMS permission DEV + xDrip Status (watch) + xDrip Statusline (watch) + xds diff --git a/app/src/main/res/xml/pref_xdripstatus.xml b/app/src/main/res/xml/pref_xdripstatus.xml new file mode 100644 index 0000000000..b11830df5d --- /dev/null +++ b/app/src/main/res/xml/pref_xdripstatus.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file From da0334eb1935add9b4b6516d261477b72be0f72a Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Mon, 8 May 2017 16:23:59 +0200 Subject: [PATCH 2/3] xdrip statusline reformat --- .../XDripStatusline/StatuslinePlugin.java | 114 ++++++++++-------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index 8da9977965..7e999d742d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; +import android.support.annotation.NonNull; import com.squareup.otto.Subscribe; @@ -21,7 +22,6 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.utils.DecimalFormatter; -import info.nightscout.utils.ToastUtils; /** * Created by adrian on 17/11/16. @@ -29,6 +29,12 @@ import info.nightscout.utils.ToastUtils; public class StatuslinePlugin implements PluginBase { + //broadcast related 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"; + + static boolean fragmentEnabled = false; private static boolean lastLoopStatus; @@ -37,8 +43,10 @@ public class StatuslinePlugin implements PluginBase { StatuslinePlugin(Context ctx) { this.ctx = ctx; - this.mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx); - MainApp.bus().register(this); + this.mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx); + + if (fragmentEnabled) + MainApp.bus().register(this); } @Override @@ -59,7 +67,7 @@ public class StatuslinePlugin implements PluginBase { @Override public String getNameShort() { String name = MainApp.sResources.getString(R.string.xdripstatus_shortname); - if (!name.trim().isEmpty()){ + if (!name.trim().isEmpty()) { //only if translation exists return name; } @@ -96,6 +104,11 @@ public class StatuslinePlugin implements PluginBase { public void setFragmentEnabled(int type, boolean fragmentEnabled) { if (type == GENERAL) { this.fragmentEnabled = fragmentEnabled; + + if (fragmentEnabled) + MainApp.bus().register(this); + else + MainApp.bus().unregister(this); } } @@ -105,52 +118,10 @@ public class StatuslinePlugin implements PluginBase { } - private void sendStatus() { - if(!fragmentEnabled) return; - - String status = ""; - boolean shortString = true; // make setting? - LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + String status = buildStatusString(); - if (activeloop != null && !activeloop.isEnabled(PluginBase.LOOP)) { - status += ctx.getString(R.string.disabledloop) + "\n"; - lastLoopStatus = false; - } else if (activeloop != null && activeloop.isEnabled(PluginBase.LOOP)) { - lastLoopStatus = 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(); - MainApp.getConfigBuilder().getActiveTempBasals().updateTotalIOB(); - IobTotal basalIob = MainApp.getConfigBuilder().getActiveTempBasals().getLastCalculation().round(); - status += (shortString?"":(ctx.getString(R.string.treatments_iob_label_string) + " ")) + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); - - - if (mPrefs.getBoolean("xdripstatus_detailediob", true)) { - status += "(" - + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" - + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; - } - - //constants - String EXTRA_STATUSLINE = "com.eveningoutpost.dexdrip.Extras.Statusline"; - String ACTION_NEW_EXTERNAL_STATUSLINE = "com.eveningoutpost.dexdrip.ExternalStatusline"; - String RECEIVER_PERMISSION = "com.eveningoutpost.dexdrip.permissions.RECEIVE_EXTERNAL_STATUSLINE"; //sendData final Bundle bundle = new Bundle(); bundle.putString(EXTRA_STATUSLINE, status); @@ -158,11 +129,49 @@ public class StatuslinePlugin implements PluginBase { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); ctx.sendBroadcast(intent, RECEIVER_PERMISSION); - - ToastUtils.showToastInUiThread(ctx, "status: " + status); - } + @NonNull + private String buildStatusString() { + String status = ""; + boolean shortString = true; // make setting? + + LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); + + if (activeloop != null && !activeloop.isEnabled(PluginBase.LOOP)) { + status += ctx.getString(R.string.disabledloop) + "\n"; + lastLoopStatus = false; + } else if (activeloop != null && activeloop.isEnabled(PluginBase.LOOP)) { + lastLoopStatus = 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(); + MainApp.getConfigBuilder().getActiveTempBasals().updateTotalIOB(); + IobTotal basalIob = MainApp.getConfigBuilder().getActiveTempBasals().getLastCalculation().round(); + status += (shortString ? "" : (ctx.getString(R.string.treatments_iob_label_string) + " ")) + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); + + + if (mPrefs.getBoolean("xdripstatus_detailediob", true)) { + status += "(" + + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; + } + return status; + } @Subscribe @@ -189,16 +198,17 @@ public class StatuslinePlugin implements PluginBase { @Subscribe public void onStatusEvent(final EventRefreshGui ev) { + //Filter events where loop is (de)activated + LoopPlugin activeloop = MainApp.getConfigBuilder().getActiveLoop(); if (activeloop == null) return; - if((lastLoopStatus != activeloop.isEnabled(PluginBase.LOOP))) { + if ((lastLoopStatus != activeloop.isEnabled(PluginBase.LOOP))) { sendStatus(); } } - public static boolean isEnabled() { return fragmentEnabled; } From 63b9a06431d751de5ce886ad937f56ad7d64dd97 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Mon, 8 May 2017 16:34:45 +0200 Subject: [PATCH 3/3] Send empty status to xDrip when disabled. Send status immediately when enabling plugin. --- .../XDripStatusline/StatuslinePlugin.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index 7e999d742d..3cd1f8fe27 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -45,8 +45,9 @@ public class StatuslinePlugin implements PluginBase { this.ctx = ctx; this.mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx); - if (fragmentEnabled) + if (fragmentEnabled) { MainApp.bus().register(this); + } } @Override @@ -105,10 +106,14 @@ public class StatuslinePlugin implements PluginBase { if (type == GENERAL) { this.fragmentEnabled = fragmentEnabled; - if (fragmentEnabled) + if (fragmentEnabled) { MainApp.bus().register(this); - else + sendStatus(); + } + else{ MainApp.bus().unregister(this); + sendStatus(); + } } } @@ -120,7 +125,13 @@ public class StatuslinePlugin implements PluginBase { private void sendStatus() { - String status = buildStatusString(); + + String status = ""; // sent once on disable + + if(fragmentEnabled) { + status = buildStatusString(); + } + //sendData final Bundle bundle = new Bundle();