diff --git a/app/src/main/java/info/nightscout/androidaps/data/Intervals.java b/app/src/main/java/info/nightscout/androidaps/data/Intervals.java new file mode 100644 index 0000000000..108b4060e0 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/data/Intervals.java @@ -0,0 +1,90 @@ +package info.nightscout.androidaps.data; + +import android.support.annotation.Nullable; +import android.support.v4.util.LongSparseArray; + +import java.util.ArrayList; +import java.util.List; + +import info.nightscout.androidaps.interfaces.Interval; + +/** + * Created by mike on 09.05.2017. + */ + +// Zero duration means end of interval + +public abstract class Intervals { + + LongSparseArray rawData = new LongSparseArray(); // oldest at index 0 + + public synchronized Intervals reset() { + rawData = new LongSparseArray(); + return this; + } + + protected abstract void merge(); + + /** + * The List must be sorted by `T.start()` in ascending order + * + * */ + public synchronized void add(List list) { + for (T interval : list) { + rawData.put(interval.start(), interval); + } + merge(); + } + + + + public synchronized List getList() { + List list = new ArrayList<>(); + for (int i = 0; i < rawData.size(); i++) + list.add(rawData.valueAt(i)); + return list; + } + + public synchronized List getReversedList() { + List list = new ArrayList<>(); + for (int i = rawData.size() -1; i>=0; i--) + list.add(rawData.valueAt(i)); + return list; + } + + protected synchronized int binarySearch(long value) { + int lo = 0; + int hi = rawData.size() - 1; + + while (lo <= hi) { + final int mid = (lo + hi) >>> 1; + final Interval midVal = rawData.valueAt(mid); + + if (midVal.before(value)) { + lo = mid + 1; + } else if (midVal.after(value)) { + hi = mid - 1; + } else if (midVal.match(value)) { + return mid; // value found + } + } + return ~lo; // value not present + } + + public abstract T getValueByInterval(long time); + + public synchronized int size() { + return rawData.size(); + } + + public synchronized T get(int index) { + return rawData.valueAt(index); + } + + public synchronized T getReversed(int index) { + return rawData.valueAt(size() - 1 - index); + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/data/NonOverlappingIntervals.java b/app/src/main/java/info/nightscout/androidaps/data/NonOverlappingIntervals.java new file mode 100644 index 0000000000..385eeb9594 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/data/NonOverlappingIntervals.java @@ -0,0 +1,30 @@ +package info.nightscout.androidaps.data; + + +import android.support.annotation.Nullable; + +import info.nightscout.androidaps.interfaces.Interval; + +/** + * Created by adrian on 15/07/17. + */ + +public class NonOverlappingIntervals extends Intervals { + + protected synchronized void merge() { + for (int index = 0; index < rawData.size() - 1; index++) { + Interval i = rawData.valueAt(index); + long startOfNewer = rawData.valueAt(index + 1).start(); + if (i.originalEnd() > startOfNewer) { + i.cutEndTo(startOfNewer); + } + } + } + + @Nullable + public synchronized T getValueByInterval(long time) { + int index = binarySearch(time); + if (index >= 0) return rawData.valueAt(index); + return null; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/data/OverlappingIntervals.java b/app/src/main/java/info/nightscout/androidaps/data/OverlappingIntervals.java index cc03936766..608fa8d328 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/OverlappingIntervals.java +++ b/app/src/main/java/info/nightscout/androidaps/data/OverlappingIntervals.java @@ -1,99 +1,43 @@ package info.nightscout.androidaps.data; -import android.support.annotation.Nullable; -import android.support.v4.util.LongSparseArray; -import java.util.ArrayList; -import java.util.List; +import android.support.annotation.Nullable; import info.nightscout.androidaps.interfaces.Interval; /** - * Created by mike on 09.05.2017. + * Created by adrian on 15/07/17. */ -// Zero duration means end of interval +public class OverlappingIntervals extends Intervals { -public class OverlappingIntervals { + protected synchronized void merge() { + boolean needToCut = false; + long cutTime = 0; - private LongSparseArray rawData = new LongSparseArray<>(); // oldest at index 0 - - public OverlappingIntervals reset() { - rawData = new LongSparseArray<>(); - return this; - } - - public void add(T newInterval) { - rawData.put(newInterval.start(), newInterval); - merge(); - } - - public void add(List list) { - for (T interval : list) { - rawData.put(interval.start(), interval); - } - merge(); - } - - private void merge() { - for (int index = 0; index < rawData.size() - 1; index++) { - Interval i = rawData.valueAt(index); - long startOfNewer = rawData.valueAt(index + 1).start(); - if (i.originalEnd() > startOfNewer) { - i.cutEndTo(startOfNewer); + for (int index = rawData.size()-1; index > 0; index--) { //begin with newest + Interval cur = rawData.valueAt(index); + if (cur.isEndingEvent()){ + needToCut = true; + cutTime = cur.start(); + } else { + //event that is no EndingEvent might need to be stopped by an ending event + if(needToCut&&cur.end() > cutTime){ + cur.cutEndTo(cutTime); + } } } } @Nullable - public Interval getValueByInterval(long time) { - int index = binarySearch(time); - if (index >= 0) return rawData.valueAt(index); + public synchronized T getValueByInterval(long time) { + for (int index = rawData.size()-1; index > 0; index--) { //begin with newest + T cur = rawData.valueAt(index); + if (cur.match(time)){ + return cur; + } + } return null; } - public List getList() { - List list = new ArrayList<>(); - for (int i = 0; i < rawData.size(); i++) - list.add(rawData.valueAt(i)); - return list; - } - - public List getReversedList() { - List list = new ArrayList<>(); - for (int i = rawData.size() -1; i>=0; i--) - list.add(rawData.valueAt(i)); - return list; - } - - private int binarySearch(long value) { - int lo = 0; - int hi = rawData.size() - 1; - - while (lo <= hi) { - final int mid = (lo + hi) >>> 1; - final Interval midVal = rawData.valueAt(mid); - - if (midVal.before(value)) { - lo = mid + 1; - } else if (midVal.after(value)) { - hi = mid - 1; - } else if (midVal.match(value)) { - return mid; // value found - } - } - return ~lo; // value not present - } - - public int size() { - return rawData.size(); - } - - public T get(int index) { - return rawData.valueAt(index); - } - - public T getReversed(int index) { - return rawData.valueAt(size() - 1 - index); - } -} \ No newline at end of file +} diff --git a/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java b/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java index ef255ed901..3633f1079e 100644 --- a/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java +++ b/app/src/main/java/info/nightscout/androidaps/data/ProfileIntervals.java @@ -19,24 +19,24 @@ public class ProfileIntervals { private LongSparseArray rawData = new LongSparseArray<>(); // oldest at index 0 - public ProfileIntervals reset() { + public synchronized ProfileIntervals reset() { rawData = new LongSparseArray<>(); return this; } - public void add(T newInterval) { + public synchronized void add(T newInterval) { rawData.put(newInterval.start(), newInterval); merge(); } - public void add(List list) { + public synchronized void add(List list) { for (T interval : list) { rawData.put(interval.start(), interval); } merge(); } - private void merge() { + private synchronized void merge() { for (int index = 0; index < rawData.size() - 1; index++) { Interval i = rawData.valueAt(index); long startOfNewer = rawData.valueAt(index + 1).start(); @@ -47,27 +47,27 @@ public class ProfileIntervals { } @Nullable - public Interval getValueToTime(long time) { + public synchronized Interval getValueToTime(long time) { int index = binarySearch(time); if (index >= 0) return rawData.valueAt(index); return null; } - public List getList() { + public synchronized List getList() { List list = new ArrayList<>(); for (int i = 0; i < rawData.size(); i++) list.add(rawData.valueAt(i)); return list; } - public List getReversedList() { + public synchronized List getReversedList() { List list = new ArrayList<>(); for (int i = rawData.size() -1; i>=0; i--) list.add(rawData.valueAt(i)); return list; } - private int binarySearch(long value) { + private synchronized int binarySearch(long value) { if (rawData.size() == 0) return -1; int lo = 0; @@ -95,15 +95,15 @@ public class ProfileIntervals { return -1; // value not present } - public int size() { + public synchronized int size() { return rawData.size(); } - public T get(int index) { + public synchronized T get(int index) { return rawData.valueAt(index); } - public T getReversed(int index) { + public synchronized T getReversed(int index) { return rawData.valueAt(size() - 1 - index); } } \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java index d9e3742c70..5e8b4e52e8 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/TreatmentsInterface.java @@ -10,7 +10,7 @@ import info.nightscout.androidaps.db.ProfileSwitch; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.db.Treatment; -import info.nightscout.androidaps.data.OverlappingIntervals; +import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.ProfileIntervals; /** @@ -42,18 +42,18 @@ public interface TreatmentsInterface { TemporaryBasal getTempBasalFromHistory(long time); double getTempBasalAbsoluteRateHistory(); double getTempBasalRemainingMinutesFromHistory(); - OverlappingIntervals getTemporaryBasalsFromHistory(); + Intervals getTemporaryBasalsFromHistory(); boolean isInHistoryExtendedBoluslInProgress(); ExtendedBolus getExtendedBolusFromHistory(long time); - OverlappingIntervals getExtendedBolusesFromHistory(); + Intervals getExtendedBolusesFromHistory(); boolean addToHistoryExtendedBolus(ExtendedBolus extendedBolus); boolean addToHistoryTreatment(DetailedBolusInfo detailedBolusInfo); TempTarget getTempTargetFromHistory(long time); - OverlappingIntervals getTempTargetsFromHistory(); + Intervals getTempTargetsFromHistory(); ProfileSwitch getProfileSwitchFromHistory(long time); ProfileIntervals getProfileSwitchesFromHistory(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java index 28821e0242..239318a6e4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java @@ -23,7 +23,7 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; -import info.nightscout.androidaps.data.OverlappingIntervals; +import info.nightscout.androidaps.data.Intervals; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileIntervals; import info.nightscout.androidaps.data.PumpEnactResult; @@ -827,7 +827,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public OverlappingIntervals getTemporaryBasalsFromHistory() { + public Intervals getTemporaryBasalsFromHistory() { return activeTreatments.getTemporaryBasalsFromHistory(); } @@ -874,7 +874,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public OverlappingIntervals getExtendedBolusesFromHistory() { + public Intervals getExtendedBolusesFromHistory() { return activeTreatments.getExtendedBolusesFromHistory(); } @@ -896,7 +896,7 @@ public class ConfigBuilderPlugin implements PluginBase, PumpInterface, Constrain } @Override - public OverlappingIntervals getTempTargetsFromHistory() { + public Intervals getTempTargetsFromHistory() { return activeTreatments.getTempTargetsFromHistory(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java index 4e6566e330..35789a426c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAckAlarm.java @@ -12,6 +12,7 @@ import java.util.List; import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSAlarm; +import info.nightscout.utils.SP; /** * Created by mike on 11.06.2017. @@ -21,6 +22,7 @@ public class BroadcastAckAlarm { private static Logger log = LoggerFactory.getLogger(BroadcastAckAlarm.class); public static void handleClearAlarm(NSAlarm originalAlarm, Context context, long silenceTimeInMsec) { + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; Bundle bundle = new Bundle(); bundle.putInt("level", originalAlarm.getLevel()); bundle.putString("group", originalAlarm.getGroup()); @@ -29,9 +31,6 @@ public class BroadcastAckAlarm { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("ACKALARM " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java index 46e2ef1e68..03fe04f8fe 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAlarm.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 26.06.2016. @@ -20,14 +21,14 @@ public class BroadcastAlarm { private static Logger log = LoggerFactory.getLogger(BroadcastAlarm.class); public static void handleAlarm(JSONObject alarm, Context context) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("data", alarm.toString()); Intent intent = new Intent(Intents.ACTION_ALARM); intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("ALARM " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java index bb4d3de726..3f9a43a14a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastAnnouncement.java @@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 26.06.2016. @@ -21,14 +22,14 @@ public class BroadcastAnnouncement { private static Logger log = LoggerFactory.getLogger(BroadcastAnnouncement.class); public static void handleAnnouncement(JSONObject announcement, Context context) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("data", announcement.toString()); Intent intent = new Intent(Intents.ACTION_ANNOUNCEMENT); intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("ANNOUNCEMENT " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java index 6601207851..7a7772357c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastCals.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 26.06.2016. @@ -20,6 +21,9 @@ public class BroadcastCals { private static Logger log = LoggerFactory.getLogger(BroadcastCals.class); public static void handleNewCal(JSONArray cals, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("cals", cals.toString()); bundle.putBoolean("delta", isDelta); @@ -27,8 +31,5 @@ public class BroadcastCals { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("CAL " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java index 7272a81d95..4f2716cf85 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastClearAlarm.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 26.06.2016. @@ -20,14 +21,14 @@ public class BroadcastClearAlarm { private static Logger log = LoggerFactory.getLogger(BroadcastClearAlarm.class); public static void handleClearAlarm(JSONObject clearalarm, Context context) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("data", clearalarm.toString()); Intent intent = new Intent(Intents.ACTION_CLEAR_ALARM); intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("CLEARALARM " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java index 15d8fe5b5d..9053c6becb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastDeviceStatus.java @@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; public class BroadcastDeviceStatus { @@ -26,11 +27,13 @@ public class BroadcastDeviceStatus { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("DEVICESTATUS " + x.size() + " receivers"); } public static void handleNewDeviceStatus(JSONArray statuses, Context context, boolean isDelta) { + + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + + List splitted = BroadcastTreatment.splitArray(statuses); for (JSONArray part: splitted) { Bundle bundle = new Bundle(); @@ -40,9 +43,6 @@ public class BroadcastDeviceStatus { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("DEVICESTATUS " + part.length() + " records " + x.size() + " receivers"); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java index 1430fbaf1a..f45ade6b32 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastMbgs.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 26.06.2016. @@ -20,6 +21,9 @@ public class BroadcastMbgs { private static Logger log = LoggerFactory.getLogger(BroadcastMbgs.class); public static void handleNewMbg(JSONArray mbgs, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("mbgs", mbgs.toString()); bundle.putBoolean("delta", isDelta); @@ -27,8 +31,5 @@ public class BroadcastMbgs { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("MBG " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java index 4edad5db33..ec62ccbf6f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastProfile.java @@ -12,6 +12,7 @@ import java.util.List; import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.data.ProfileStore; +import info.nightscout.utils.SP; /** @@ -21,6 +22,9 @@ public class BroadcastProfile { private static Logger log = LoggerFactory.getLogger(BroadcastProfile.class); public static void handleNewTreatment(ProfileStore profile, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("profile", profile.getData().toString()); bundle.putBoolean("delta", isDelta); @@ -28,9 +32,6 @@ public class BroadcastProfile { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("PROFILE " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java index fbcc1ed7a3..eedeb4574d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastQueueStatus.java @@ -6,12 +6,16 @@ import android.os.Bundle; import android.os.PowerManager; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 28.02.2016. */ public class BroadcastQueueStatus { public static void handleNewStatus(int size, Context context) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "sendQueue"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java index e846b8171b..29e2031869 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastSgvs.java @@ -13,6 +13,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 22.02.2016. @@ -21,6 +22,9 @@ public class BroadcastSgvs { private static Logger log = LoggerFactory.getLogger(BroadcastSgvs.class); public static void handleNewSgv(JSONObject sgv, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("sgv", sgv.toString()); bundle.putBoolean("delta", isDelta); @@ -28,9 +32,6 @@ public class BroadcastSgvs { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("SGV " + x.size() + " receivers"); } public static void handleNewSgv(JSONArray sgvs, Context context, boolean isDelta) { @@ -41,9 +42,6 @@ public class BroadcastSgvs { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("SGV " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java index 20055aa108..15432c8e79 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastStatus.java @@ -15,6 +15,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSettingsStatus; import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService; +import info.nightscout.utils.SP; /** * Created by mike on 24.02.2016. @@ -23,6 +24,9 @@ public class BroadcastStatus { private static Logger log = LoggerFactory.getLogger(BroadcastStatus.class); public static void handleNewStatus(NSSettingsStatus status, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); try { bundle.putString("nsclientversionname", MainApp.instance().getPackageManager().getPackageInfo(MainApp.instance().getPackageName(), 0).versionName); @@ -38,8 +42,5 @@ public class BroadcastStatus { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("STATUS: " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java index 382d8734dd..60540d7613 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastTreatment.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Bundle; +import android.os.TransactionTooLargeException; import org.json.JSONArray; import org.json.JSONException; @@ -16,6 +17,7 @@ import java.util.List; import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSTreatment; +import info.nightscout.utils.SP; /** * Created by mike on 20.02.2016. @@ -24,6 +26,9 @@ public class BroadcastTreatment { private static Logger log = LoggerFactory.getLogger(BroadcastTreatment.class); public static void handleNewTreatment(NSTreatment treatment, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("treatment", treatment.getData().toString()); bundle.putBoolean("delta", isDelta); @@ -31,12 +36,12 @@ public class BroadcastTreatment { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("TREAT_ADD " + treatment.getEventType() + " " + x.size() + " receivers"); } public static void handleNewTreatment(JSONArray treatments, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + List splitted = splitArray(treatments); for (JSONArray part: splitted) { Bundle bundle = new Bundle(); @@ -46,13 +51,13 @@ public class BroadcastTreatment { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("TREAT_ADD " + part.length() + " " + x.size() + " receivers"); } } public void handleChangedTreatment(JSONObject treatment, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("treatment", treatment.toString()); bundle.putBoolean("delta", isDelta); @@ -60,15 +65,12 @@ public class BroadcastTreatment { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - try { - log.debug("TREAT_CHANGE " + treatment.getString("_id") + " " + x.size() + " receivers"); - } catch (JSONException e) { - } } public static void handleChangedTreatment(JSONArray treatments, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + List splitted = splitArray(treatments); for (JSONArray part: splitted) { Bundle bundle = new Bundle(); @@ -78,13 +80,13 @@ public class BroadcastTreatment { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("TREAT_CHANGE " + part.length() + " " + x.size() + " receivers"); } } public static void handleRemovedTreatment(JSONObject treatment, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("treatment", treatment.toString()); bundle.putBoolean("delta", isDelta); @@ -92,15 +94,12 @@ public class BroadcastTreatment { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - try { - log.debug("TREAT_REMOVE " + treatment.getString("_id") + " " + x.size() + " receivers"); - } catch (JSONException e) { - } } public static void handleRemovedTreatment(JSONArray treatments, Context context, boolean isDelta) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("treatments", treatments.toString()); bundle.putBoolean("delta", isDelta); @@ -108,9 +107,6 @@ public class BroadcastTreatment { intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("TREAT_REMOVE " + treatments.length() + " treatments " + x.size() + " receivers"); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java index 10d0f068f5..442eb729c0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/broadcasts/BroadcastUrgentAlarm.java @@ -12,6 +12,7 @@ import org.slf4j.LoggerFactory; import java.util.List; import info.nightscout.androidaps.Services.Intents; +import info.nightscout.utils.SP; /** * Created by mike on 26.06.2016. @@ -20,14 +21,14 @@ public class BroadcastUrgentAlarm { private static Logger log = LoggerFactory.getLogger(BroadcastUrgentAlarm.class); public static void handleUrgentAlarm(JSONObject urgentalarm, Context context) { + + if(!SP.getBoolean("nsclient_localbroadcasts", true)) return; + Bundle bundle = new Bundle(); bundle.putString("data", urgentalarm.toString()); Intent intent = new Intent(Intents.ACTION_URGENT_ALARM); intent.putExtras(bundle); intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); context.sendBroadcast(intent); - List x = context.getPackageManager().queryBroadcastReceivers(intent, 0); - - log.debug("URGENTALARM " + x.size() + " receivers"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java index d7a2c26bc7..6a7f8c0873 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java @@ -8,7 +8,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; -import java.util.Date; import java.util.List; import info.nightscout.androidaps.Config; @@ -19,6 +18,8 @@ import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Iob; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; +import info.nightscout.androidaps.data.Intervals; +import info.nightscout.androidaps.data.NonOverlappingIntervals; import info.nightscout.androidaps.data.OverlappingIntervals; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.ProfileIntervals; @@ -48,9 +49,9 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { public static IobTotal lastTempBasalsCalculation; public static List treatments; - private static OverlappingIntervals tempBasals = new OverlappingIntervals<>(); - private static OverlappingIntervals extendedBoluses = new OverlappingIntervals<>(); - private static OverlappingIntervals tempTargets = new OverlappingIntervals<>(); + private static Intervals tempBasals = new NonOverlappingIntervals(); + private static Intervals extendedBoluses = new NonOverlappingIntervals(); + private static Intervals tempTargets = new OverlappingIntervals(); private static ProfileIntervals profiles = new ProfileIntervals<>(); private static boolean fragmentEnabled = true; @@ -347,7 +348,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { } @Override - public OverlappingIntervals getExtendedBolusesFromHistory() { + public Intervals getExtendedBolusesFromHistory() { return extendedBoluses; } @@ -380,7 +381,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { } @Override - public OverlappingIntervals getTemporaryBasalsFromHistory() { + public Intervals getTemporaryBasalsFromHistory() { return tempBasals; } @@ -442,7 +443,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface { } @Override - public OverlappingIntervals getTempTargetsFromHistory() { + public Intervals getTempTargetsFromHistory() { return tempTargets; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java index 0acbf4b2c5..ca1cb002f8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java @@ -23,8 +23,6 @@ import com.squareup.otto.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Date; - import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.IobTotal; @@ -35,7 +33,7 @@ import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NSUpload; -import info.nightscout.androidaps.data.OverlappingIntervals; +import info.nightscout.androidaps.data.Intervals; public class TreatmentsExtendedBolusesFragment extends Fragment { @@ -48,9 +46,9 @@ public class TreatmentsExtendedBolusesFragment extends Fragment { public class RecyclerViewAdapter extends RecyclerView.Adapter { - OverlappingIntervals extendedBolusList; + Intervals extendedBolusList; - RecyclerViewAdapter(OverlappingIntervals extendedBolusList) { + RecyclerViewAdapter(Intervals extendedBolusList) { this.extendedBolusList = extendedBolusList; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java index 7a74ca4a86..2b3f310b38 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java @@ -26,11 +26,10 @@ import info.nightscout.androidaps.Services.Intents; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.events.EventTempTargetChange; -import info.nightscout.androidaps.data.Profile; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NSUpload; -import info.nightscout.androidaps.data.OverlappingIntervals; +import info.nightscout.androidaps.data.Intervals; import info.nightscout.utils.SP; /** @@ -47,10 +46,12 @@ public class TreatmentsTempTargetFragment extends Fragment implements View.OnCli public class RecyclerViewAdapter extends RecyclerView.Adapter { - OverlappingIntervals tempTargetList; + Intervals tempTargetList; + TempTarget currentlyActiveTarget; - RecyclerViewAdapter(OverlappingIntervals TempTargetList) { + RecyclerViewAdapter(Intervals TempTargetList) { this.tempTargetList = TempTargetList; + currentlyActiveTarget = tempTargetList.getValueByInterval(System.currentTimeMillis()); } @Override @@ -81,10 +82,18 @@ public class TreatmentsTempTargetFragment extends Fragment implements View.OnCli holder.reasonLabel.setText(""); holder.reasonColon.setText(""); } - if (tempTarget.isInProgress()) - holder.date.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive)); - else + if (tempTarget.isInProgress()) { + if(tempTarget == currentlyActiveTarget){ + // active as newest + holder.date.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorInProgress)); + } else { + // other's that might become active again after the latest (overlapping) is over + holder.date.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.colorActive)); + } + } + else { holder.date.setTextColor(holder.reasonColon.getCurrentTextColor()); + } holder.remove.setTag(tempTarget); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java index 8db8a9c67b..219e421c49 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTemporaryBasalsFragment.java @@ -23,8 +23,6 @@ import com.squareup.otto.Subscribe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.Date; - import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.IobTotal; @@ -35,7 +33,7 @@ import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.NSUpload; -import info.nightscout.androidaps.data.OverlappingIntervals; +import info.nightscout.androidaps.data.Intervals; public class TreatmentsTemporaryBasalsFragment extends Fragment { @@ -50,9 +48,9 @@ public class TreatmentsTemporaryBasalsFragment extends Fragment { public class RecyclerViewAdapter extends RecyclerView.Adapter { - OverlappingIntervals tempBasalList; + Intervals tempBasalList; - RecyclerViewAdapter(OverlappingIntervals tempBasalList) { + RecyclerViewAdapter(Intervals tempBasalList) { this.tempBasalList = tempBasalList; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index a881464e82..f800d9d531 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -4,8 +4,14 @@ import android.os.Handler; import android.os.HandlerThread; import android.support.annotation.NonNull; +import java.text.DateFormat; import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; +import java.util.LinkedList; +import java.util.List; import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; @@ -15,17 +21,25 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.db.DanaRHistoryRecord; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TempTarget; import info.nightscout.androidaps.interfaces.APSInterface; +import info.nightscout.androidaps.interfaces.DanaRInterface; import info.nightscout.androidaps.interfaces.PluginBase; +import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.ProfileCircadianPercentage.CircadianPercentageProfilePlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.DanaRPump; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.RecordTypes; +import info.nightscout.androidaps.plugins.PumpDanaRKorean.DanaRKoreanPlugin; +import info.nightscout.androidaps.plugins.PumpDanaRv2.DanaRv2Plugin; import info.nightscout.utils.BolusWizard; import info.nightscout.utils.DateUtil; import info.nightscout.utils.DecimalFormatter; @@ -157,14 +171,9 @@ public class ActionStringHandler { rMessage = getPumpStatus(); } else if ("loop".equals(act[1])) { rTitle += " LOOP"; - rMessage = getLoopStatus(); - - } else if ("targets".equals(act[1])) { - rTitle += " TARGETS"; - rMessage = getTargetsStatus(); - } else if ("oapsresult".equals(act[1])) { - rTitle += " OAPS RESULT"; - rMessage = getOAPSResultStatus(); + rMessage = "TARGETS:\n" + getTargetsStatus(); + rMessage += "\n\n" + getLoopStatus(); + rMessage += "\n\nOAPS RESULT:\n" + getOAPSResultStatus();; } } else if ("wizard".equals(act[0])) { @@ -256,6 +265,58 @@ public class ActionStringHandler { rAction = actionstring; } + } else if("tddstats".equals(act[0])){ + Object activePump = MainApp.getConfigBuilder().getActivePump(); + PumpInterface dana = (PumpInterface) MainApp.getSpecificPlugin(DanaRPlugin.class); + PumpInterface danaV2 = (PumpInterface) MainApp.getSpecificPlugin(DanaRv2Plugin.class); + PumpInterface danaKorean = (PumpInterface) MainApp.getSpecificPlugin(DanaRKoreanPlugin.class); + + + if((dana == null || dana != activePump) && + (danaV2 == null || danaV2 != activePump) && + (danaKorean == null || danaKorean != activePump) + ){ + sendError("Pump does not support TDDs!"); + return; + } else { + // check if DB up to date + List dummies = new LinkedList(); + List historyList = getTDDList(dummies); + + if(isOldData(historyList)){ + rTitle = "TDD"; + rAction = "statusmessage"; + rMessage = "OLD DATA - "; + + //if pump is not busy: try to fetch data + final PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); + if (pump.isBusy()) { + rMessage += MainApp.instance().getString(R.string.pumpbusy); + } else { + rMessage += "trying to fetch data from pump."; + Handler handler = new Handler(handlerThread.getLooper()); + handler.post(new Runnable() { + @Override + public void run() { + ((DanaRInterface)pump).loadHistory(RecordTypes.RECORD_TYPE_DAILY); + List dummies = new LinkedList(); + List historyList = getTDDList(dummies); + if(isOldData(historyList)){ + sendStatusmessage("TDD", "TDD: Still old data! Cannot load from pump."); + } else { + sendStatusmessage("TDD", generateTDDMessage(historyList, dummies)); + } + } + }); + } + } else { + // if up to date: prepare, send (check if CPP is activated -> add CPP stats) + rTitle = "TDD"; + rAction = "statusmessage"; + rMessage = generateTDDMessage(historyList, dummies); + } + } + } else return; @@ -266,6 +327,98 @@ public class ActionStringHandler { lastConfirmActionString = rAction; } + private static String generateTDDMessage(List historyList, List dummies) { + + DateFormat df = new SimpleDateFormat("dd.MM."); + String message = ""; + + CircadianPercentageProfilePlugin cpp = (CircadianPercentageProfilePlugin) MainApp.getSpecificPlugin(CircadianPercentageProfilePlugin.class); + boolean isCPP = (cpp!= null && cpp.isEnabled(PluginBase.PROFILE)); + double refTDD = 100; + if(isCPP) refTDD = cpp.baseBasalSum()*2; + + int i = 0; + double sum = 0d; + double weighted03 = 0d; + double weighted05 = 0d; + double weighted07 = 0d; + + Collections.reverse(historyList); + for (DanaRHistoryRecord record : historyList) { + double tdd = record.recordDailyBolus + record.recordDailyBasal; + if (i == 0) { + weighted03 = tdd; + weighted05 = tdd; + weighted07 = tdd; + + } else { + weighted07 = (weighted07 * 0.3 + tdd * 0.7); + weighted05 = (weighted05 * 0.5 + tdd * 0.5); + weighted03 = (weighted03 * 0.7 + tdd * 0.3); + } + i++; + } + message += "weighted:\n"; + message += "0.3: " + DecimalFormatter.to2Decimal(weighted03) + "U " + (isCPP?(DecimalFormatter.to0Decimal(100*weighted03/refTDD) + "%"):"") + "\n"; + message += "0.5: " + DecimalFormatter.to2Decimal(weighted05) + "U " + (isCPP?(DecimalFormatter.to0Decimal(100*weighted05/refTDD) + "%"):"") + "\n"; + message += "0.7: " + DecimalFormatter.to2Decimal(weighted07) + "U " + (isCPP?(DecimalFormatter.to0Decimal(100*weighted07/refTDD) + "%"):"") + "\n"; + message += "\n"; + + PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); + if (pump != null && pump instanceof DanaRPlugin) { + double tdd = DanaRPump.getInstance().dailyTotalUnits; + message += "Today: " + DecimalFormatter.to2Decimal(tdd) + "U " + (isCPP?(DecimalFormatter.to0Decimal(100*tdd/refTDD) + "%"):"") + "\n"; + message += "\n"; + } + + //add TDDs: + Collections.reverse(historyList); + for (DanaRHistoryRecord record : historyList) { + double tdd = record.recordDailyBolus + record.recordDailyBasal; + message += df.format(new Date(record.recordDate)) + " " + DecimalFormatter.to2Decimal(tdd) +"U " + (isCPP?(DecimalFormatter.to0Decimal(100*tdd/refTDD) + "%"):"") + (dummies.contains(record)?"x":"") +"\n"; + } + return message; + } + + public static boolean isOldData(List historyList) { + DateFormat df = new SimpleDateFormat("dd.MM."); + return (historyList.size() < 3 || !(df.format(new Date(historyList.get(0).recordDate)).equals(df.format(new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24))))); + } + + @NonNull + public static List getTDDList(List returnDummies) { + List historyList = MainApp.getDbHelper().getDanaRHistoryRecordsByType(RecordTypes.RECORD_TYPE_DAILY); + + //only use newest 10 + historyList = historyList.subList(0, Math.min(10, historyList.size())); + + //fill single gaps + List dummies = (returnDummies!=null)?returnDummies:(new LinkedList()); + DateFormat df = new SimpleDateFormat("dd.MM."); + for(int i = 0; i < historyList.size()-1; i++){ + DanaRHistoryRecord elem1 = historyList.get(i); + DanaRHistoryRecord elem2 = historyList.get(i+1); + + if (!df.format(new Date(elem1.recordDate)).equals(df.format(new Date(elem2.recordDate + 25*60*60*1000)))){ + DanaRHistoryRecord dummy = new DanaRHistoryRecord(); + dummy.recordDate = elem1.recordDate - 24*60*60*1000; + dummy.recordDailyBasal = elem1.recordDailyBasal/2; + dummy.recordDailyBolus = elem1.recordDailyBolus/2; + dummies.add(dummy); + elem1.recordDailyBasal /= 2; + elem1.recordDailyBolus /= 2; + } + } + historyList.addAll(dummies); + Collections.sort(historyList, new Comparator() { + @Override + public int compare(DanaRHistoryRecord lhs, DanaRHistoryRecord rhs) { + return (int) (rhs.recordDate-lhs.recordDate); + } + }); + return historyList; + } + @NonNull private static String getPumpStatus() { return MainApp.getConfigBuilder().shortStatus(false); @@ -506,6 +659,13 @@ public class ActionStringHandler { lastBolusWizard = null; } + private synchronized static void sendStatusmessage(String title, String message) { + WearFragment.getPlugin(MainApp.instance()).requestActionConfirmation(title, message, "statusmessage"); + lastSentTimestamp = System.currentTimeMillis(); + lastConfirmActionString = null; + lastBolusWizard = null; + } + public synchronized static void expectNotificationAction(String message, int id) { String actionstring = "dismissoverviewnotification " + id; WearFragment.getPlugin(MainApp.instance()).requestActionConfirmation("DISMISS", message, actionstring); diff --git a/app/src/main/res/layout/loop_fragment.xml b/app/src/main/res/layout/loop_fragment.xml index 23a2f93d18..fb6038dcb3 100644 --- a/app/src/main/res/layout/loop_fragment.xml +++ b/app/src/main/res/layout/loop_fragment.xml @@ -5,7 +5,6 @@ tools:context="info.nightscout.androidaps.plugins.Loop.LoopFragment"> diff --git a/app/src/main/res/layout/openapsama_fragment.xml b/app/src/main/res/layout/openapsama_fragment.xml index f1f4f364ec..a471429567 100644 --- a/app/src/main/res/layout/openapsama_fragment.xml +++ b/app/src/main/res/layout/openapsama_fragment.xml @@ -6,12 +6,11 @@ + android:layout_height="match_parent"> + android:layout_height="match_parent"> - Closed Loop - Open Loop - APS режим - Ср. изменение - Базал - КЗ достъпна в NS - Болус - Приложено ограничение за болус - Откажи - Въглехидрати - Приложено ограничениe за въгл. - Careportal - Известие - Проверка на КЗ - Корекция с въглехидр. - Смяна на сензор - Рестарт на сензор - Комбиниран болус - Болус за корекция - Физ. активност - Смяна на резервоар - Болус за осн. хранене - Абсолютна - ВХ - ВХ след - Продължителност - min - Въведено от - Време - Инсулин - Глюкомер - Бележки - Друго - Процент - Профил - Сензор - Разделяне - Бележка - OpenAPS оффлайн - Смяна на профил - Смяна на сет - Въпрос - Болус за закуска - Край на временен базал - Начало на временен базал - Променете данните! - Конфигурация - APS - Източник на КЗ - Ограничения - Основен - Loop - Профил - Помпа - Временен базал - Treatments - Потвърждение - Приложено ограничение! - Нарушено ограничение - Czech - дни - Изменение: - Време - English - Enter new treatment: - КЗ - Loop - APS - След приложени ограничения - Зададено на помпата - Loop отказан от ограниченията - Manual enacts - Минимална продължителност - Архивиране - Изход + Сигурност на лечението + Максимален инсулин при болус [единици] + Максимални въглехидрати [гр] + Опции - Обнови treatments от NS + Обнови леченията от NS + Резервно копие + Тест на аларма Нулирай базата данни - Тест на аларми - Не е избран APS или изчислен резултат - Не се изискват промени - Не е зареден профил от NS - Използване на абсолютни стойности - NSClient - Активен профил - Базални стойности: - DIA (Време на действие на инсулина): - IC (Инсулин/въглехидр.): - НЕ Е ЗАДАДЕН ПРОФИЛ - Целeва КЗ: - Единици - Цели - Старт - Проверка - Действие: + Сигурни ли сте че искате да изтриете всички данни? + Изход + Използвай удължен болус за над 200% + DanaR Bluetooth устройство + Използване само на абсолютни стойности на базал + Рестартирайте телефона или AndroidAPS от системните натройки \nили Android APS няма да записва проблемите (което е важно за работата на алгоритъма)! Цел: - OK - Настоящ базал - Модулът е забранен - КЗ стастус - Входни параметри - IOB данни - Последно зададено - Последно изпълнение - Данни за хранене - Долна граница - Няма данни за КЗ - Няма данни за профил - Няма данни за помпа - Профил - Искане - Резултат - Старт сега - Достъпно е ново предложение - Преглед - Калкулатор - Базална стойност - % (100% = current) - Болус - NS профил - Статус на помпа в NS - Стойност - Основание - Безопасност - Задай нов удължен болусs: - Приложи нов временен базал: - Обикновен профил + Действие: + Стартирай + Провери + Единици + DIA (Време на действие на инсулина): + Active profile + IC (Инсулин/въглехидр.): + ISF (Инс.чувствителност): + Базал + Целeва КЗ: + НЕ Е ЗАДАДЕН ПРОФИЛ + Инсулин: + Вълехидрати: + IOB: + IOB: + Активен: + Общо IOB: + Общо активен IOB: + Време: + Съотношение: + Инс: IOB: Общо IOB: - Инс: - Скорост: - Време: - Грешка при болус - Treatments - Активен: - ВХ: - Инсулин: - IOB: - Общо активен IOB: - Общо IOB: Количество въглехидрати Количество инсулин - Базален IOB КЗ - Болус IOB ВХ Корекция - ОБЩО - Ед. - Макс. лимит на болус - Макс. лимит на въглехидрати - Tratments safety - Неподържана версия на NSClient - Виртуална помпа + Ед + IOB от болуси + ОБШО + Старт сега Базова базална стойност Батерия Удължен болус @@ -162,382 +56,586 @@ Грешка в базата данни Временен базал ВИРТУАЛНА ПОМПА - xDrip - Удължен болус - Временен базал - ISF (Инс.чувствителност): - NSClient не е инсталиран. Записът е загубен! - Тип събитие - КЗ тип + Последно изпълнение + Параметри на входа + КЗ стастус + Настоящ базал + IOB данни + Профил + Данни за хранене + Резултат + Няма данни за КЗ + Няма зададен профил + Няма избана помпа + Не се изисква промяна + Искане + Долна граница(КЗ) + Стойност + Срок + Основание + КЗ + Промяна + Delta: + Средна промяна + + Конфигурация + Цели OpenAPS MA + Общ + NS Профил + Обикновен профил + TempBasal + Treatments + Виртуална помпа + Careportal + + + Помпа + Treatments + Временен базал + Профил + APS + Общи + дни + Минимална продължителност + Ограничения + + Цикъл + Цикъл + APS + След ограничения + Зададено на помпата + Последно зададено + OK + Откажи + НЕ Е ИЗБРАН APS ИЛИ НЯМА РЕЗУЛТАТ ОТ НЕГО + Сигурност + Плъгина е изключен + Нарушено ограничение + Грешка при подаване на болус + Грешка при подаване на временен базал + Стойност на базал + % (100% = текущ) + Приложи нов временен базал: + Болус + Калкулатор + Приложено ограничение! + Потвърждение + Въведете ново лечение: + Болус + Bolus: + Базал + Basal: + Въглехидрати + Променете данните! + Задай нов удължен болус: + Източник на данни за КЗ + xDrip + NSClient + APS режим + + Затворен цикъл + Отворен режим + изключен + Изключи + Влючи + + Има ново предложение + Несъвместима версия на NSClient + Несъвместима версия на Nightscout + NSClient не е открит. Записът е загубен! + КЗ се вижда в NS + Статуса на помпа е достъпен в NS + Ръчно приложени + ЦИКЪЛА Е СПРЯН ОТ ОГРАНИЧЕНИЯТА + Czech + English + Базален IOB + Приложено ограничение на болус + Приложено ограничение на въглехидратите + Проверка на КЗ + Известие + Бележка + Въпрос + Физ. активност + Смяна на сет + Смяна на сензор + Старт на сензор + Смяна на резервоар + Смяна на профил + Болус за закуска + Болус за основно хранене + Болус корекция + Комбиниран болус + Старт на временен базал + Край на временен базал + Корекция с въглехидрати + OpenAPS спрян + + Тип събитие + Друго + Глюкомер + Сензор + ВХ + Инсулин + ВХ след + Разделяне + Продължителност + Процент + Абсолютна + мин + Бележки + Време на събитие + Профил + Въведен от + Тип КЗ + Още не е зареден профила от NS + Временен базал + Удължен болус Nightscout версия: ИЗПРАТИ Липсва - Разрешено - Видимо + Разрешен + Видим Нагоре Настройките са експортирани + Експортирай настройките в + Импорт на настройки от Настройките са импортирани - Импортирай настройки от: - Файлът не съществува - Експортирай настройки до + Файлът не е намерен Експорт настройки Импорт настройки German - Макс. стойност, която е в границите + Spanish + Greek + Italian + Russian Мин. стойност, която е в границите + Максималната стойност на КЗ за да бъде в границите. + Максимално позволен временен базал Е/ч Макс. лимит на временен базал [Е/ч] - Български - Макс. лимит на не болус IOB подаван от openAPS - Свързан - Избраното устройство не съществува - Прекъснат - Свързва се - Грешка при свързване с помпа - DanaR Bluetooth устройство - DanaR настройки - Използвай удължен болус за над 200% - DanaR - РАЗБИРАМ И СЕ СЪГЛАСЯВАМ - Език - Сигурност - Синхронизирай помпата с профила - Няма bluetooth адаптер - Nightscout + Максимален IOB + Този параметър се нарича макс IOB в OpenAPS\nПо подразбиране е 0. След няколко дни или седмици можете да го увеличите. + Bulgarian Разбрах + Език + + DanaR + Свързване + Свързана + Не е сврзана + Синхронизирай помпата с профила + DanaR настройки + Nightscout End User License Agreement MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - +XXXXXXXXXX;+YYYYYYYYYY - Болус %.2fU беше подаден успешно - Bolus failed - Откажи временен базал - Последно свързване - Изчаква резултат - SMS комуникатор - Позволени телефонни номера - Успех - To deliver bolus %.2fU reply with code %s - Отдалечен болус не е разрешен - Обнови профила + Разбирам и приемам + Съхрани + Не е открит Bluetooth адаптер + Избраното устройство не е открито + Грешка при свързване с помпата + IOB на помпата + Инсулин за деня + Последен болус: + ч по-рано + Грешни входящи данни + Неправилна стойност + Презареди профил + Виж профил + Приложено + Коментар + Успешен Процент + Абсолютна + Откажи временен базал + SMS комуникатор + Чакам резултат от помпата + Разрешени телефонни номера + +XXXXXXXXXX;+YYYYYYYYYY + За да пуснете болус от %.2fЕ отговорете с код %s + За да изпратите калибрация %.2f отговорете с код %s + Болус отказан + Болус %.2fЕд беше подаден успешно + Подавам болус %.2fЕ + Болус от %.2fЕ подаден успешно + Подавам %.2fЕ + Позволи отдалечени команди чрез SMS + Отдалечено подаване на болус - забранено! + Пръст Сензор Ръчно - Пръст - Неправилно зададени стойности - Виж профила + Времена цел + Откажи временна цел DanaR профил DIA (Време на действие на инсулина) ч.: - Последен болус: - Неправилни входни данни - Единици за деня - Временна цел - Отакажи временна цел - Коментар - Абсолютна - Запушване - Доставено - Подаване на %.2fU Е инсулин - Стоп - Спрян - НАТИСНАТ СТОП - КЗ цел за изчисления - Помпата е заета - Изчаква за помпа. Click to refresh. - Грешна парола за помпата! - Достигнахте лимита - аларма - базален по часове - въглехидрати - грешка - кръвна захар + Продължителност на инсулиновата активност + Неуспешно обноввяване на базалния профил История + Презареди + Качване + E болус + DS болус + DE болус + грешка + пълнене + базал по часове + КЗ + въглехидрати + аларма + Общо %d записа качени + S болус Аларми Базален по часове Болуси Въглехидрати - Свъзва се за %d сек. - Инсулин за деня + Дневен инсулин Грешки - Кръвна захар + КЗ Пълнене - Прекъсване - Презареждане - IOB на помпата - Парола за помпа - пълнене - Общо %d записа са изпратени - Приложено - S bolus - Не може да се обнови базалния профил - h ago - Потвърдете, че КЗ и данните от помпата са достъпни в Nightscout - DE bolus - DS bolus - E bolus + Спиране + Опитвам да се свържа през последните %d с + Парола за помпата + Грешна парола за помпата! + Помпата е заета + Доставен + Спрян + Запушване + Спри + Натиснат е СТОП! + Чакам помпата + Чакам резутат. Натисни за обновяване. + Ще доставя %.2fЕ Настройка на визуализацията и наблюдението, а също и анализиране на базалните нужди и коефициенти - Стартиране в Open loop режим за няколко дни и ръчно прилагане на много временни базали - Стартиране на Open Loop + Работете в Отворен режим няколко дни и ръчно прилагайте на много временни базали + Стартиране на Отворен режим Определяне на макс. лимит на базалния инсулин и настройване в помпата и програмата - Разбиране на вашият open loop режим, включително препоръчваните временни базали - Стартиране на Closed loop с макс. IOB=0 без твърде много събития тип Low suspend - Активиране на допълнителни функции за дневно използване, включително и advanced meal assist - Стартиране на Close loop в режим Low Suspend - Стартирайте за няколко дни и поне една нощ без аларми за ниска КЗ - Настройване на Closed Loop, повишаване на максималният IOB над 0 и понижаване на целевите нива на КЗ - Една седмица успешно дневно използване с редовно въвеждане на въглехидрати + Разбиране на вашият Отворен режим, включително препоръчваните временни базали + Стартиране на Затворен цикъл с изключване на базал при ниска КЗ + Стартиране на Затворен цикъл с макс. IOB=0 без твърде много събития тип ниска КЗ + Настройване на Затворения цикъл чрез повишаване на максималният IOB над 0 и понижаване на целевите нива на КЗ + Прекарайте няколко дни по този начин, като поне една нощ нямате аларма за ниска КЗ. Настройване на базалния инсулин и коефициенти ако е необходимо и активиране на auto-sens - Качване - Подава %.2fU - Spanish - Не е избран профил - Korean - %s е недопустима стойност - Текст на бутон: - Корекция - Loop забранен - Въглехидрати: - Валидно: - Добави - Редактирай - Премахни - Бърз болус - Настройки за бърз болус - Не са позволени отдалечени настройки - To start basal %.2fU/h reply with code %s - To stop temp basal reply with code %s + Една седмица успешно дневно използване с редовно въвеждане на въглехидрати + Активиране на допълнителни функции за дневно използване, включително и advanced meal assist + Достигнахте лимита + Целева стойност използвана в изчисленията + Няма избран профил Loop has been disabled Loop has been enabled Loop is disabled Loop is enabled - Позволи команди през SMS + %.2f ограничен до %.2f + Стойността %s е извън границите + Remote basal setting is not allowed + Remote command is not allowed + To start basal %.2fU/h reply with code %s + To suspend loop for %d minutes reply with code %s + Temp basal %.2fU/h for %d min started successfully + Temp basal start failed + To stop temp basal reply with code %s Temp basal canceled Canceling temp basal failed - Temp basal start failed - Temp basal %.2fU/h for %d min started successfully Uknonwn command or wrong reply - Болус за хранене - Действия + + Бърз болус + Настройки за бърз болус + Текст на бутона: + Въглехидрати: + Валиден от: + Добави + Редакция + Изтрий + Хранене + Корекция + Korean + Actions Стартиран AndroidAPS - Базов профил + NS upload only (изключва синхронизацията) + Само качване на данните в NS. Няма ефект върху данните за КЗ ако локален източник като xDrip е избран. Няма ефект върху профила освен ако не е избран NS-профил. + Помпата не е инициализирана! + Помпата не е инициализирана, профила не е зададен! + Prime/Fill + Моля, уверете се, че стойността съответсва на вашият сет! Този инсулин не се включва в IOB! + Други + Fill/Prime количества нсулин по подразбиране. Бутон 1 Бутон 2 Бутон 3 - Процентен профил - Изпрати към помпата - Редактирай базални стойности - DIA: - Редактирай Инс./ВХ - Редактирай Инс. чувствителност - Fill/Prime стандарта стойност - Моля, уверете се, че стойността съответсва на вашият сет! Този инсулин не се включва в IOB! - mg/dl - mmol/l - Друго: % с който базовият профил ще бъде променен. - Prime/Fill - Помпата не е инициализирана! - Наистина ли искате да нулиратe базата данни? + Точен брой часове, с които ще бъде преместен профила! + Изпрати в помпата + Единици: + мг/дл + ммол/л + DIA(продължителност на инсулиновото дейстие): Целеви диапазон: - Брой часове, с които ще бъде преместен профила! - Мерни единици: - NS upload only (изключва синхронизацията) - NS upload only. Not effective on SGV unless a local source like xDrip is selected. Not effective on Profiles while NS-Profiles is used. - Моля рестартирайте телефона или AndroidAPS, в противен случай информацията за грешки няма да се запише(важно за да се потвърди, че алгоритъмът работи правилно) - Край на временен базал + Редактирай базални стойности + Редактирай Инс. чувствителност + Редактирай Инс./ВХ + Базов профил: + Процентен профил + край на временен базал Старт на временен базал - Базал: - Базалните стойности са под минимума. Не е зададен профил! + Диапазон за визуализация + Стойност на линиите за ниска и висока КЗ (mmol/l) за телефона и часовника + Ниска КЗ под + Висока КЗ над + Часовник + Препрати всички дани + Отвори настройките на часовника + Грешка в промпата + Изтощена батерия + Помпа изключена Батерията на помпата е изтощена - КЗ: + DanaR Korean + Избран е грешен тип помпа + Базал: + Неуспешно задаване на базален профил + Профила на помпата е обновен Забрани EasyUI режим в помпата Разреши удължен болус в помпата Промени режима от U/d на U/h в помпата - DanaR за Корея - Горна линия - Последна КЗ: - Долна линия - Изтощена батерия - Отвори Опции на часовника - Стойност на линиите за ниска и висока КЗ (mmol/l) - Диапазон на визуализация - Неуспешно задаване на базален профил - Базалният профил е обновен - Помпата не е инициализирана, профила не е зададен! - Грешка на помпата - Помпата е изключена - Изпрати всички данни отново - Wear - Избран е грешен тип помпа - преди %d м. - ДЕЙСТВ - WEAR - ВП - TREAT - ВЦeл - ВБ - SMS - ОПРОФ - ПРОф - ОСН - ЦЕЛИ - OAPS - "Loop " - ЛПр - Dana - КОНФ - ППр - CaPr + Базалните стойности са под минимума. Не е зададен профил! + BG: + Last BG: + Писалки + MM640g + Текущи известия + ПЕКАЛЕНО СТАРИ ДАННИ + преди %d мин + %dmin ago + Локален профил + OpenAPS AMA + Краткоср. Δ: + Дългоср. Δ: + Масив от %d елемента. \nАктуална стойност: + Autosens данни + Script debug + Разреши AMA autosens + Обнови от NS + Преди хранене Физ.активност + Премахни запис: DanaR статистика + Комулативна TDD + Експоненциално претеглена TDD Базал Болус - Дата - Стари данни! Натиснете "Презареждане" - Коефициент - Общо базален инс. - Общо базален инс.² TDD - Възможна неточност, ако сте използвали болус за презареждане! - Преди хранене - Greek - Инициализиране ... - Локален профил - Дългоср. изменение - Писалки - OpenAPS AMA - Разреши AMA autosens - Autosens данни - СТАРИ ДАННИ - Текущи известия - Script debug - %.2f ограничено до %.2f - Премахни запис: - Краткоср. Δ: - Къси имена - Bolus %.2fU delivered successfully - Експоненциално претеглена TDD - Комулативна TDD + Дата + Коефициент + # дни Тегло - Дни - MM640g - Масив от %d елемента. Актуална стойност: - Basal: - Bolus: - Delta: - IOB: - %dmin ago - Изчаква за помпа + Възможна неточност, ако сте използвали болус за презареждане! + Стари данни - натиснете "ПРЕЗАРЕДИ" + Общо базален инсулин + ОБИ * 2 + Инициализация ... + ДЕЙСТВ + КОНФ + ЦИК + ОПр + OAPS + Вцел + ЛПр + DANA + ППр + ВБ + ОСН + ВП + NSП + Леч + CP + Цел + WEAR + SMS + Изполвай къси имена + Настройки на параметър Δ КЗ Използвай краткоср. Δ вместо разлика от последната КЗ Полезно при данни за КЗ с много шум - Приближава достигане на дневният лимит на иснулин - Стартира подаване на %.2fU - Изпратена калибрация до xDrip - Копирано в клипборд - Копирай в клипборд - Продължителност на инсулиновата активност - Прекъсване - Не показвай отново - Полето не може да бъде празно - Позволени са само числа - Позволени са числа между %1$s - %2$s - Телефонният номер не е валиден - Изпълнение - Получава статус на помпа - Покажи лог - Максимално позволен временен базал Е/ч - Максимален базален IOB - Калибрация - Помпата е спряна - xDrip+ не е инсталиран - Грешна парола - Изпраща статус в NS - Настройки на виртуална помпа - Качва базални стойности - Отключи настройки - Спиране на удължен болус - Спиране на временен базал - Не е разрешена отдалечена калибрация - Грешка при подаване на временен базал - Изпращане на калибрация %.1f към xDrip? - Настройки на удължен болус - Парола за настройки - Настройки на временен базал - Помпата е спряна. Натиснете за обновяване - Настройки на параметър Δ КЗ - Калибрация на КЗ - Възрастен Разширени настройки - Дете - Изчисти опашката - Изчисти log - - Изпрати сега - неуспешно - проверете телефона - Недостъпно - NSCLIENT няма достъп. Грешна API secret? - вътрешен NSClient - Autoscroll - Ще бъде използвано в поле въведено от - Въведи име на устройство - Име на устройство - Въведи API secret (мин. 12 символа) - Вътрешен NSClient - URL: - Въведи Nightscout URL - Nightscout URL - NS API secret - NS API secret - NSCL - Възраст на потребителя - Изберете възраст за определяне лимитите на безопасност - На пауза + Медел: %02X Протокол: %02X Код: %02X Профил + По подразбиране: 3\nТова е основен параметър в сигурността на OpenAPS. Той лимитира максималният базал да бъде 3 пъти най-голямата стойност от дневните базали. Не би трябвало да има нужа от промяна, но внимавайте, защото от опит сме проверили, че максимумите са “3x от най-високия дневен; 4x от текущия”. + По подразбиране: 4\nТова е другият основен параметър в сигурността на OpenAPS, и другата половина от "3x от най-високия дневен; 4x от текущия". Това означава, че независимо от макс базал настроен в помпата, стойността на базала не може да е по-висока от тази стойност умножена по стойността на базала за текущият час от денонощието. Това е с цел да предпази от прекалено високи стойности на максималния базал преди да разбират как работи алгоритъма. Повечето от Вас няма да имат нужда от смяна на тази стойност и могат да се справят с настойки на другите параметри. + По подразбиране: 1.2\nТова е максималният множител на autosens (а скоро autotune) за да позволи 20% максимален лимит на autosens коефициента, който от своя страна настройва базалите, колко може да намали ISF, и колко ниско може да свали целевата КЗ. + По подразбиране: 0.7\nДругата част от сигурността на autosens, слагайки ограничение на колко ниско може да ограничи базалите, колко да повиши чувствителността (ISF) и целевите КЗ. + По подразбиране: разрешено\nТова позволява на autosens да променя и целевите КЗ(освен чувствителност и базал). + По подразбиране: 2\nBolus snooze се активира след като поставите болус за основно хранене, така цикъла няма да пуснка/намаля базалите веднага след като сте се хранили. Примерът тук е с 2; така при 3 часа DIA това ще означава че bolus snooze ще бъде внимателно изместен 1.5 часа (3DIA/2). + По подразбиране: 3.0\nТова е настройка на количеството на покачване на КЗ при усвояване на въглехидратите за всеки 5 минути. По подразбиране 3мг/дл/5мин. Това се отразява на това колко бързо се усвояват COB според алгоритъма, и как това се отразява в предвиждането на КЗ, когато тя не се покачва или пада с различен темп от очакваното. + Attention!\nNormally you do not have to change these values below. Please CLICK HERE and READ the text and make sure you UNDERSTAND it before change any of these values. + http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html + Позволени са само числа + Позволени са числа между %1$s - %2$s + олето не може да бъде празно + Телефонният номер не е валиден + Грешен тел номер за SMS + Копирай + Копирано + Покажи лог + Калибрация + Калибрация + Изпрати калибрация %.1f на xDrip? + xDrip+ не е инсталиран + Калибрацията е изпратена към xDrip + Не е разрешена отдалечена калибрация + Неуспешно. Получаването трябва да е разрешено в xDrip. + xDrip не получава калибрации + Не показвай отново + Помпата е спряна. Натиснете за обновяване + Помпата е спряна + Получавам статус на помпата + Настройвам временен базал + Спирам временен базал + Настойвам удължен болус + Спирам удължен болус + Обновявам базалите + Спирам връзката + Изпълнявам + Настойки Виртуална Помпа + Качвам статуса в NS + Грешна парола + Парола за настройки + Отключи настройките + Близо до максмалния дневен инсулин + вътрешен NSClient + NSCI + URL: + Autoscroll Рестарт - Покажи опашката - xDrip не приема калибрация - Статус: - Тийнейджър - Раздели IOB на болус и базал IOB на часовника - Покажи подробен IOB - Настройки на часовник - To send calibration %.2f reply with code %s - Calibration sent. Receiving must be enabled in xDrip. - Invalid SMS phone number + Вътрешен NSClient + Nightscout адрес + Въведете Nightscout URL + NS API парола + NS API secret + Въведете NS API secret (мин 12 символа) + Име на устройството + Въведете името на телефона + Ще се използва за полето enteredBy + Изпрати сега + Изчисти опашка + Покажи опашка Опашка: - Firmware + Статус: + пауза + Възраст на пациента + Дете + Тийнейджър + Възрастен + Изберете възраст за определяне лимитите на безопасност Glimp - Устройството изглежда не подържа изключване на оптимизиране на батерията - COB - Инсулин - Bluetooh статус - DEV - Деактивиран Loop - Изключи помпата за 10 часа - Изключи помпата за 1 час - Изключи помпата за 2 часа - Изключи помпата за 30 мин. - Изключи помпата за 3 часа - Разреши Loop - Разреши суперболус - Разреши функцията суперболус в съветника. Не я разрешавайте докато не научите какво наистина прави. ТОВА МОЖЕ ДА СЪЗДАДЕ ОПАСНОСТ ОТ ПРЕДОЗИРАНЕ С ИНСУЛИН. - Бързодействащ инсулин - Бързодействащ инсулин с удължаване - ИНС - Loop меню - Loop спрян - Суперболус (%d м.) - За приложението - Спрян (%d м.) - %s трябва да изключите оптимизация на батерията за оптимална работа - Отбелязвай старт на програмата в NS + Устройството изглежда не подържа изключване на оптимизиране на батерията! Моля, позволете рарешение - - Изключи Loop за 10 ч. - Суперболус - "Изключи Loop за 1ч. " - Изключи Loop за 2ч. - Изключи Loop за 3ч. - 15min trend + %s се нуждае от зключване на оптимизиране на батерията за пълна функционалност + Цикъл изключен + Изключен (%d мин) + Суперболус (%d мин) + Меню Цикъл + Изключи цикъла за 1ч + Изключи цикъла за 2ч + Изключи цикъла за 3ч + Изключи цикъла за 10 ч + Изключи помпата за 30 мин. + Изключи помпата за 1 ч + Изключи помпата за 2 ч + Изключи помпата за 3 ч + Изключи помпата за 10 ч + Възстанови + Wrong duration + Loop suspended + Loop resumed + промяна за 15мин COB - Italian + Суперболус + Записвай всяко стартиране на AndroidAPS в NS + Рестартирам за да се приложат новите настройки. + DanaRv2 + Инсулин + Бързодействащ инсулин + Novorapid, Novolog, Humalog + ИНС + Бързодействащ инсулин с удължаване + Разреши използването на Суперболус + Разреши функцията суперболус в съветника. Не я разрешавайте докато не научите какво наистина прави. ТОВА МОЖЕ ДА СЪЗДАДЕ ОПАСНОСТ ОТ ПРЕДОЗИРАНЕ С ИНСУЛИН. + IOB + COB + PRE + BAS + Firmware + Последно свързване + Bluetooh статус + За приложението + Missing SMS permission + DEV + xDrip статус (часовник) + xDrip статус (часовник) + xds + Показвай BGI + Добави BGI към статуса + Без качване на данни в NS + Всички данни за NS се пропускат. AAPS е свързан с NS, но не прави промени в NS + Стъпка за базал + Стъпка за болус + Удължен болус + Вр. цел + Спри удължен болус + Възраст на сензора + Възраст на канюла + Възраст на инсулина + часа + Тип базал + ISF липсва в профила. По подразбиране. + IC липсва в профила. По подразбиране. + Базал липсва в профила. По подразбиране. + Целева КЗ липсва в профила. По подразбиране. + Грешен профил !!! + Смяна на профил + Възраст на батерията на помпата + Смяна на батерия + Опции за аларми + Много висока + Висока + Ниска + Много ниска + Текущата стойност е %f + Няма данни + Много стари данни + Когато няма данни повече от [мин] + Много стари данни при повече от [мин] + Интервал за autosens [ч] + Брой часове назад за определяне на чувствителността (приемът на въглехидрати е изключен) + RAT + do_not_track_profile_switch + Игнорирай събитията от тип Смяна на профил + Всички смени на профила се игнорират и винаги се използва текущия профил + Помпа + OpenAPS + Устройство + Uploader + Определяне на чувствителност + ЧУВСТВ + Алгоритъм на Oref0 + Алгоритъм на AAPS + Настройки за абсорбция + Максимално време за усвояване на храненето [ч] + Брой часове, за които се очаква храненето да бъде напълно усвоено в организма + Показвай удължените болуси като % + ВСенз + ВИнс + ВКан + ВБат + OAPS + UPLD + БАЗА + УД. + Заключен екран + Закл + Когато включите Autosense feature трябва да въвеждате ВСИЧКИ въглехидрати. В противен случай те ще се изчисляват грешно като повишена чувствителност!! + + Алгоритъм на Среднопретеглената стойност + OK + Откажи + трябва да е активно за да изпратя стойностите към помпата! + Не всички профили са заредени! + Стойностите не са запазени! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 84e3d3c928..436e54c4aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -580,6 +580,7 @@ Superbolus Log app start to NS ns_logappstartedevent + nsclient_localbroadcasts Exiting application to apply settings. DanaRv2 Insulin @@ -688,4 +689,6 @@ Accu-Chek Combo Accu-Chek Combo settings COMBO + Enable loacal broadcasts to other apps (like xDrip). + Enable local Broadcasts. diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml index 8c12efd5de..5f401d6c0e 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -27,6 +27,13 @@ android:key="@string/key_ns_logappstartedevent" android:title="@string/ns_logappstartedevent" /> + + + menuitems = new Vector(); + menuitems.add("TempT"); + menuitems.add("Bolus"); + if(showWizard) menuitems.add("Wizard"); + menuitems.add("Settings"); + menuitems.add("Status"); + if (showPrimeFill) menuitems.add("Prime/Fill"); + + return menuitems.toArray(new String[menuitems.size()]); } @Override - protected void doAction(int position) { + protected void doAction(String action) { Intent intent; - if(!BuildConfig.WEAR_CONTROL) { - switch (position) { - case 0: - intent = new Intent(this, AAPSPreferences.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 1: - ListenerService.requestData(this); - break; - } - return; + if ("Settings".equals(action)) { + intent = new Intent(this, AAPSPreferences.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); + } else if ("Re-Sync".equals(action)) { + ListenerService.requestData(this); + } else if ("TempT".equals(action)) { + intent = new Intent(this, TempTargetActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); + } else if ("Bolus".equals(action)) { + intent = new Intent(this, BolusActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); + } else if ("Wizard".equals(action)) { + intent = new Intent(this, WizardActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); + } else if ("Status".equals(action)) { + intent = new Intent(this, StatusMenuActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); + } else if ("Prime/Fill".equals(action)) { + intent = new Intent(this, FillMenuActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + this.startActivity(intent); } - - - switch (position) { - case 0: - intent = new Intent(this, TempTargetActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 1: - intent = new Intent(this, BolusActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 2: - intent = new Intent(this, WizardActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 3: - intent = new Intent(this, AAPSPreferences.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 4: - ListenerService.requestData(this); - break; - case 5: - intent = new Intent(this, StatusMenuActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 6: - boolean showPrimeFill = sp.getBoolean("primefill", false); - if(showPrimeFill) { - intent = new Intent(this, FillMenuActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - } - break; - } - } } diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuRestrictedActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuRestrictedActivity.java deleted file mode 100644 index 779e9611d2..0000000000 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuRestrictedActivity.java +++ /dev/null @@ -1,53 +0,0 @@ -package info.nightscout.androidaps.interaction.menus; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.os.Bundle; -import android.preference.PreferenceManager; - -import info.nightscout.androidaps.data.ListenerService; -import info.nightscout.androidaps.interaction.AAPSPreferences; -import info.nightscout.androidaps.interaction.actions.BolusActivity; -import info.nightscout.androidaps.interaction.actions.TempTargetActivity; -import info.nightscout.androidaps.interaction.actions.WizardActivity; -import info.nightscout.androidaps.interaction.utils.MenuListActivity; - -/** - * Created by adrian on 09/02/17. - */ - -public class MainMenuRestrictedActivity extends MenuListActivity { - - SharedPreferences sp; - - @Override - protected void onCreate(Bundle savedInstanceState) { - sp = PreferenceManager.getDefaultSharedPreferences(this); - super.onCreate(savedInstanceState); - ListenerService.requestData(this); - } - - @Override - protected String[] getElements() { - return new String[] { - "Settings", - "Re-Sync"}; - } - - @Override - protected void doAction(int position) { - - Intent intent; - switch (position) { - case 0: - intent = new Intent(this, AAPSPreferences.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - this.startActivity(intent); - break; - case 1: - ListenerService.requestData(this); - break; - } - - } -} diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/StatusMenuActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/StatusMenuActivity.java index a57bd17c8f..f17bc23e46 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/StatusMenuActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/StatusMenuActivity.java @@ -14,32 +14,22 @@ public class StatusMenuActivity extends MenuListActivity { return new String[] { "Pump", "Loop", - "Targets", "CPP", - "OAPS Result"}; + "TDD"}; + } @Override - protected void doAction(int position) { - switch (position) { - - case 0: - ListenerService.initiateAction(this, "status pump"); - break; - case 1: - ListenerService.initiateAction(this, "status loop"); - break; - case 2: - ListenerService.initiateAction(this, "status targets"); - break; - case 3: - ListenerService.initiateAction(this, "opencpp"); - break; - case 4: - ListenerService.initiateAction(this, "status oapsresult"); - break; + protected void doAction(String action) { + if ("Pump".equals(action)) { + ListenerService.initiateAction(this, "status pump"); + } else if ("Loop".equals(action)) { + ListenerService.initiateAction(this, "status loop"); + } else if ("CPP".equals(action)) { + ListenerService.initiateAction(this, "opencpp"); + } else if ("TDD".equals(action)) { + ListenerService.initiateAction(this, "tddstats"); } - } } diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java index d151196091..9d6fd51126 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/MenuListActivity.java @@ -22,7 +22,7 @@ public abstract class MenuListActivity extends Activity protected abstract String[] getElements(); - protected abstract void doAction(int position); + protected abstract void doAction(String position); @Override protected void onPause(){ @@ -50,7 +50,7 @@ public abstract class MenuListActivity extends Activity // WearableListView click listener @Override public void onClick(WearableListView.ViewHolder v) { - Integer tag = (Integer) v.itemView.getTag(); + String tag = (String) v.itemView.getTag(); doAction(tag); //ActionsDefinitions.doAction(v.getAdapterPosition(), this); finish(); @@ -105,7 +105,7 @@ public abstract class MenuListActivity extends Activity // replace text contents view.setText(mDataset[position]); // replace list item's metadata - holder.itemView.setTag(position); + holder.itemView.setTag(mDataset[position]); } // Return the size of your dataset diff --git a/wear/src/main/res/xml/preferences.xml b/wear/src/main/res/xml/preferences.xml index 57050ef0f5..b9c6307cac 100644 --- a/wear/src/main/res/xml/preferences.xml +++ b/wear/src/main/res/xml/preferences.xml @@ -121,6 +121,13 @@ app:wear_iconOff="@drawable/settings_off" app:wear_iconOn="@drawable/settings_on"/> +