pluginsInCategory;
+ pluginsInCategory = MainApp.getSpecificPluginsList(pluginType);
+
+ return this.determineActivePlugin(pluginsInCategory, pluginType);
+ }
+
+ /**
+ * disables the visibility for all fragments of Plugins in the given pluginsInCategory
+ * with the given PluginType which are not equally named to the Plugin implementing the
+ * given Plugin Interface.
+ *
+ * TODO we are casting an interface to PluginBase, which seems to be rather odd, since
+ * TODO the interface is not implementing PluginBase (this is just avoiding errors through
+ * TODO conventions.
+ *
+ * @param pluginsInCategory
+ * @param pluginType
+ * @param
+ * @return
+ */
+ private T determineActivePlugin(ArrayList pluginsInCategory,
+ int pluginType) {
+ T activePlugin = (T) getTheOneEnabledInArray(pluginsInCategory, pluginType);
+
+ if (activePlugin != null) {
+ this.setFragmentVisiblities(((PluginBase) activePlugin).getName(),
+ pluginsInCategory, pluginType);
+ }
+
+ return activePlugin;
+ }
+
+ private void setFragmentVisiblities(String activePluginName, ArrayList pluginsInCategory,
+ int pluginType) {
if (Config.logConfigBuilder)
- log.debug("Selected treatment interface: " + ((PluginBase) activeTreatments).getName());
+ log.debug("Selected interface: " + activePluginName);
for (PluginBase p : pluginsInCategory) {
- if (!p.getName().equals(((PluginBase) activeTreatments).getName())) {
- p.setFragmentVisible(PluginBase.TREATMENT, false);
+ if (!p.getName().equals(activePluginName)) {
+ p.setFragmentVisible(pluginType, false);
}
}
}
@@ -749,14 +744,17 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr
}
public String getProfileName(long time, boolean customized) {
- ProfileSwitch profileSwitch = getProfileSwitchFromHistory(time);
- if (profileSwitch != null) {
- if (profileSwitch.profileJson != null) {
- return customized ? profileSwitch.getCustomizedName() : profileSwitch.profileName;
- } else {
- Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName);
- if (profile != null)
- return profileSwitch.profileName;
+ boolean ignoreProfileSwitchEvents = SP.getBoolean(R.string.key_do_not_track_profile_switch, false);
+ if (!ignoreProfileSwitchEvents) {
+ ProfileSwitch profileSwitch = getProfileSwitchFromHistory(time);
+ if (profileSwitch != null) {
+ if (profileSwitch.profileJson != null) {
+ return customized ? profileSwitch.getCustomizedName() : profileSwitch.profileName;
+ } else {
+ Profile profile = activeProfile.getProfile().getSpecificProfile(profileSwitch.profileName);
+ if (profile != null)
+ return profileSwitch.profileName;
+ }
}
}
// Unable to determine profile, failover to default
@@ -817,4 +815,40 @@ public class ConfigBuilderPlugin implements PluginBase, ConstraintsInterface, Tr
}
return null;
}
+
+ public void disconnectPump(int durationInMinutes) {
+ getActiveLoop().disconnectTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000L);
+ getCommandQueue().tempBasalPercent(0, durationInMinutes, true, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+ }
+ }
+ });
+ if (getActivePump().getPumpDescription().isExtendedBolusCapable && isInHistoryExtendedBoluslInProgress()) {
+ getCommandQueue().cancelExtended(new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.extendedbolusdeliveryerror));
+ }
+ }
+ });
+ }
+ NSUpload.uploadOpenAPSOffline(durationInMinutes);
+ }
+
+ public void suspendLoop(int durationInMinutes) {
+ getActiveLoop().suspendTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000);
+ getCommandQueue().cancelTempBasal(true, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+ }
+ }
+ });
+ NSUpload.uploadOpenAPSOffline(durationInMinutes);
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java
index e4eef9ff2f..14255a28e1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java
@@ -15,7 +15,6 @@ import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -25,6 +24,7 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.utils.FabricPrivacy;
public class ObjectivesFragment extends Fragment {
private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class);
@@ -208,7 +208,7 @@ public class ObjectivesFragment extends Fragment {
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java
index 42f50d52dd..ef30a0ebb9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsSafety/SafetyPlugin.java
@@ -130,7 +130,7 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
if (profile == null) return absoluteRate;
if (absoluteRate < 0) absoluteRate = 0d;
- Integer maxBasalMult = SP.getInt("openapsama_current_basal_safety_multiplier", 4);
+ Double maxBasalMult = SP.getDouble("openapsama_current_basal_safety_multiplier", 4d);
Integer maxBasalFromDaily = SP.getInt("openapsama_max_daily_safety_multiplier", 3);
// Check percentRate but absolute rate too, because we know real current basal in pump
Double origRate = absoluteRate;
@@ -168,7 +168,7 @@ public class SafetyPlugin implements PluginBase, ConstraintsInterface {
if (absoluteRate < 0) absoluteRate = 0d;
- Integer maxBasalMult = SP.getInt("openapsama_current_basal_safety_multiplier", 4);
+ Double maxBasalMult = SP.getDouble("openapsama_current_basal_safety_multiplier", 4d);
Integer maxBasalFromDaily = SP.getInt("openapsama_max_daily_safety_multiplier", 3);
// Check percentRate but absolute rate too, because we know real current basal in pump
Double origRate = absoluteRate;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java
index a5c00aab7f..8a253af7c2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java
@@ -18,7 +18,6 @@ import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -33,6 +32,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.db.Food;
import info.nightscout.androidaps.events.EventFoodDatabaseChanged;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SpinnerHelper;
@@ -130,7 +130,7 @@ public class FoodFragment extends SubscriberFragment {
filterData();
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinFragment.java
index f9a9ce38fc..a171d646e9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinFragment.java
@@ -7,11 +7,11 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.utils.FabricPrivacy;
/**
* Created by mike on 17.04.2017.
@@ -37,7 +37,7 @@ public class InsulinFragment extends Fragment {
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java
index c891f60d49..83f71c2430 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java
@@ -41,19 +41,19 @@ import info.nightscout.utils.DateUtil;
public class IobCobCalculatorPlugin implements PluginBase {
private static Logger log = LoggerFactory.getLogger(IobCobCalculatorPlugin.class);
- private static LongSparseArray iobTable = new LongSparseArray<>(); // oldest at index 0
- private static LongSparseArray autosensDataTable = new LongSparseArray<>(); // oldest at index 0
- private static LongSparseArray basalDataTable = new LongSparseArray<>(); // oldest at index 0
+ private LongSparseArray iobTable = new LongSparseArray<>(); // oldest at index 0
+ private LongSparseArray autosensDataTable = new LongSparseArray<>(); // oldest at index 0
+ private LongSparseArray basalDataTable = new LongSparseArray<>(); // oldest at index 0
- private static volatile List bgReadings = null; // newest at index 0
- private static volatile List bucketed_data = null;
+ private volatile List bgReadings = null; // newest at index 0
+ private volatile List bucketed_data = null;
- private static double dia = Constants.defaultDIA;
+ private double dia = Constants.defaultDIA;
- static final Object dataLock = new Object();
+ final Object dataLock = new Object();
boolean stopCalculationTrigger = false;
- IobCobThread thread = null;
+ private IobCobThread thread = null;
private static IobCobCalculatorPlugin plugin = null;
@@ -63,11 +63,11 @@ public class IobCobCalculatorPlugin implements PluginBase {
return plugin;
}
- public static LongSparseArray getAutosensDataTable() {
+ public LongSparseArray getAutosensDataTable() {
return autosensDataTable;
}
- public static List getBucketedData() {
+ public List getBucketedData() {
return bucketed_data;
}
@@ -131,12 +131,12 @@ public class IobCobCalculatorPlugin implements PluginBase {
return -1;
}
- private IobCobCalculatorPlugin() {
+ public IobCobCalculatorPlugin() {
MainApp.bus().register(this);
}
@Nullable
- public static List getBucketedData(long fromTime) {
+ public List getBucketedData(long fromTime) {
//log.debug("Locking getBucketedData");
synchronized (dataLock) {
if (bucketed_data == null) {
@@ -154,7 +154,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
return null;
}
- private static int indexNewerThan(long time) {
+ private int indexNewerThan(long time) {
for (int index = 0; index < bucketed_data.size(); index++) {
if (bucketed_data.get(index).date < time)
return index - 1;
@@ -169,9 +169,9 @@ public class IobCobCalculatorPlugin implements PluginBase {
return rouded;
}
- void loadBgData() {
- bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (System.currentTimeMillis() - 60 * 60 * 1000L * (24 + dia)), false);
- log.debug("BG data loaded. Size: " + bgReadings.size());
+ void loadBgData(long start) {
+ bgReadings = MainApp.getDbHelper().getBgreadingsDataFromTime((long) (start - 60 * 60 * 1000L * (24 + dia)), false);
+ log.debug("BG data loaded. Size: " + bgReadings.size() + " Start date: " + DateUtil.dateAndTimeString(start));
}
private boolean isAbout5minData() {
@@ -332,13 +332,13 @@ public class IobCobCalculatorPlugin implements PluginBase {
return getBGDataFrom;
}
- public static IobTotal calculateFromTreatmentsAndTempsSynchronized(long time) {
+ public IobTotal calculateFromTreatmentsAndTempsSynchronized(long time) {
synchronized (dataLock) {
return calculateFromTreatmentsAndTemps(time);
}
}
- public static IobTotal calculateFromTreatmentsAndTemps(long time) {
+ public IobTotal calculateFromTreatmentsAndTemps(long time) {
long now = System.currentTimeMillis();
time = roundUpTime(time);
if (time < now && iobTable.get(time) != null) {
@@ -373,7 +373,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
}
@Nullable
- private static Long findPreviousTimeFromBucketedData(long time) {
+ private Long findPreviousTimeFromBucketedData(long time) {
if (bucketed_data == null)
return null;
for (int index = 0; index < bucketed_data.size(); index++) {
@@ -383,7 +383,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
return null;
}
- public static BasalData getBasalData(long time) {
+ public BasalData getBasalData(long time) {
long now = System.currentTimeMillis();
time = roundUpTime(time);
BasalData retval = basalDataTable.get(time);
@@ -409,7 +409,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
}
@Nullable
- public static AutosensData getAutosensData(long time) {
+ public AutosensData getAutosensData(long time) {
synchronized (dataLock) {
long now = System.currentTimeMillis();
if (time > now)
@@ -434,7 +434,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
}
@Nullable
- public static AutosensData getLastAutosensDataSynchronized(String reason) {
+ public AutosensData getLastAutosensDataSynchronized(String reason) {
synchronized (dataLock) {
return getLastAutosensData(reason);
}
@@ -442,7 +442,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
@Nullable
- public static AutosensData getLastAutosensData(String reason) {
+ public AutosensData getLastAutosensData(String reason) {
if (autosensDataTable.size() < 1) {
log.debug("AUTOSENSDATA null: autosensDataTable empty (" + reason + ")");
return null;
@@ -467,7 +467,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
}
}
- public static IobTotal[] calculateIobArrayInDia() {
+ public IobTotal[] calculateIobArrayInDia() {
Profile profile = MainApp.getConfigBuilder().getProfile();
// predict IOB out to DIA plus 30m
long time = System.currentTimeMillis();
@@ -484,7 +484,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
return array;
}
- public static IobTotal[] calculateIobArrayForSMB() {
+ public IobTotal[] calculateIobArrayForSMB() {
Profile profile = MainApp.getConfigBuilder().getProfile();
// predict IOB out to DIA plus 30m
long time = System.currentTimeMillis();
@@ -501,7 +501,7 @@ public class IobCobCalculatorPlugin implements PluginBase {
return array;
}
- public static AutosensResult detectSensitivityWithLock(long fromTime, long toTime) {
+ public AutosensResult detectSensitivityWithLock(long fromTime, long toTime) {
synchronized (dataLock) {
return detectSensitivity(fromTime, toTime);
}
@@ -521,13 +521,21 @@ public class IobCobCalculatorPlugin implements PluginBase {
@Subscribe
public void onEventAppInitialized(EventAppInitialized ev) {
- runCalculation("onEventAppInitialized", true, ev);
+ if (this != getPlugin()) {
+ log.debug("Ignoring event for non default instance");
+ return;
+ }
+ runCalculation("onEventAppInitialized", System.currentTimeMillis(), true, ev);
}
@Subscribe
public void onEventNewBG(EventNewBG ev) {
+ if (this != getPlugin()) {
+ log.debug("Ignoring event for non default instance");
+ return;
+ }
stopCalculation("onEventNewBG");
- runCalculation("onEventNewBG", true, ev);
+ runCalculation("onEventNewBG", System.currentTimeMillis(), true, ev);
}
private void stopCalculation(String from) {
@@ -541,16 +549,20 @@ public class IobCobCalculatorPlugin implements PluginBase {
}
}
- private void runCalculation(String from, boolean bgDataReload, Event cause) {
+ public void runCalculation(String from, long start, boolean bgDataReload, Event cause) {
log.debug("Starting calculation thread: " + from);
if (thread == null || thread.getState() == Thread.State.TERMINATED) {
- thread = new IobCobThread(this, from, bgDataReload, cause);
+ thread = new IobCobThread(this, from, start, bgDataReload, cause);
thread.start();
}
}
@Subscribe
public void onNewProfile(EventNewBasalProfile ev) {
+ if (this != getPlugin()) {
+ log.debug("Ignoring event for non default instance");
+ return;
+ }
if (MainApp.getConfigBuilder() == null)
return; // app still initializing
Profile profile = MainApp.getConfigBuilder().getProfile();
@@ -566,11 +578,15 @@ public class IobCobCalculatorPlugin implements PluginBase {
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
- runCalculation("onNewProfile", false, ev);
+ runCalculation("onNewProfile", System.currentTimeMillis(), false, ev);
}
@Subscribe
public void onEventPreferenceChange(EventPreferenceChange ev) {
+ if (this != getPlugin()) {
+ log.debug("Ignoring event for non default instance");
+ return;
+ }
if (ev.isChanged(R.string.key_openapsama_autosens_period) ||
ev.isChanged(R.string.key_age) ||
ev.isChanged(R.string.key_absorption_maxtime)
@@ -581,24 +597,32 @@ public class IobCobCalculatorPlugin implements PluginBase {
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
- runCalculation("onEventPreferenceChange", false, ev);
+ runCalculation("onEventPreferenceChange", System.currentTimeMillis(), false, ev);
}
}
@Subscribe
public void onEventConfigBuilderChange(EventConfigBuilderChange ev) {
+ if (this != getPlugin()) {
+ log.debug("Ignoring event for non default instance");
+ return;
+ }
stopCalculation("onEventConfigBuilderChange");
synchronized (dataLock) {
log.debug("Invalidating cached data because of configuration change. IOB: " + iobTable.size() + " Autosens: " + autosensDataTable.size() + " records");
iobTable = new LongSparseArray<>();
autosensDataTable = new LongSparseArray<>();
}
- runCalculation("onEventConfigBuilderChange", false, ev);
+ runCalculation("onEventConfigBuilderChange", System.currentTimeMillis(), false, ev);
}
// When historical data is changed (comming from NS etc) finished calculations after this date must be invalidated
@Subscribe
public void onEventNewHistoryData(EventNewHistoryData ev) {
+ if (this != getPlugin()) {
+ log.debug("Ignoring event for non default instance");
+ return;
+ }
//log.debug("Locking onNewHistoryData");
stopCalculation("onEventNewHistoryData");
synchronized (dataLock) {
@@ -633,10 +657,18 @@ public class IobCobCalculatorPlugin implements PluginBase {
}
}
}
- runCalculation("onEventNewHistoryData", false, ev);
+ runCalculation("onEventNewHistoryData", System.currentTimeMillis(), false, ev);
//log.debug("Releasing onNewHistoryData");
}
+ public void clearCache() {
+ synchronized (dataLock) {
+ log.debug("Clearing cached data.");
+ iobTable = new LongSparseArray<>();
+ autosensDataTable = new LongSparseArray<>();
+ }
+ }
+
// From https://gist.github.com/IceCreamYou/6ffa1b18c4c8f6aeaad2
// Returns the value at a given percentile in a sorted numeric array.
// "Linear interpolation between closest ranks" method
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java
index 4f63cacf62..ba0475a26f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java
@@ -21,10 +21,7 @@ import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.events.Event;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.queue.QueueThread;
-
-import static info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin.getBucketedData;
-import static info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin.oldestDataAvailable;
-import static info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin.roundUpTime;
+import info.nightscout.utils.DateUtil;
/**
* Created by mike on 23.01.2018.
@@ -37,16 +34,18 @@ public class IobCobThread extends Thread {
private IobCobCalculatorPlugin iobCobCalculatorPlugin;
private boolean bgDataReload;
private String from;
+ private long start;
private PowerManager.WakeLock mWakeLock;
- public IobCobThread(IobCobCalculatorPlugin plugin, String from, boolean bgDataReload, Event cause) {
+ public IobCobThread(IobCobCalculatorPlugin plugin, String from, long start, boolean bgDataReload, Event cause) {
super();
this.iobCobCalculatorPlugin = plugin;
this.bgDataReload = bgDataReload;
this.from = from;
this.cause = cause;
+ this.start = start;
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "iobCobThread");
@@ -68,14 +67,14 @@ public class IobCobThread extends Thread {
Object dataLock = iobCobCalculatorPlugin.dataLock;
- long oldestTimeWithData = oldestDataAvailable();
+ long oldestTimeWithData = iobCobCalculatorPlugin.oldestDataAvailable();
synchronized (dataLock) {
if (bgDataReload) {
- iobCobCalculatorPlugin.loadBgData();
+ iobCobCalculatorPlugin.loadBgData(start);
iobCobCalculatorPlugin.createBucketedData();
}
- List bucketed_data = getBucketedData();
+ List bucketed_data = iobCobCalculatorPlugin.getBucketedData();
LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable();
if (bucketed_data == null || bucketed_data.size() < 3) {
@@ -83,7 +82,7 @@ public class IobCobThread extends Thread {
return;
}
- long prevDataTime = roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
+ long prevDataTime = iobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date);
log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString());
AutosensData previous = autosensDataTable.get(prevDataTime);
// start from oldest to be able sub cob
@@ -95,7 +94,7 @@ public class IobCobThread extends Thread {
}
// check if data already exists
long bgTime = bucketed_data.get(i).date;
- bgTime = roundUpTime(bgTime);
+ bgTime = iobCobCalculatorPlugin.roundUpTime(bgTime);
if (bgTime > System.currentTimeMillis())
continue;
Profile profile = MainApp.getConfigBuilder().getProfile(bgTime);
@@ -233,6 +232,7 @@ public class IobCobThread extends Thread {
previous = autosensData;
autosensDataTable.put(bgTime, autosensData);
+ log.debug("Running detectSensitivity from: " + DateUtil.dateAndTimeString(oldestTimeWithData) + " to: " + DateUtil.dateAndTimeString(bgTime));
autosensData.autosensRatio = iobCobCalculatorPlugin.detectSensitivity(oldestTimeWithData, bgTime).ratio;
if (Config.logAutosensData)
log.debug(autosensData.log(bgTime));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java
index 1550edd192..8050aa7769 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java
@@ -184,7 +184,7 @@ public class APSResult {
public long getLatestPredictionsTime() {
long latest = 0;
try {
- long startTime = date.getTime();
+ long startTime = date != null ? date.getTime() : 0;
if (json.has("predBGs")) {
JSONObject predBGs = json.getJSONObject("predBGs");
if (predBGs.has("IOB")) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java
index 1b696988b2..55038520a4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java
@@ -9,8 +9,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -22,6 +20,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.Loop.events.EventLoopSetLastRunGui;
import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
+import info.nightscout.utils.FabricPrivacy;
public class LoopFragment extends SubscriberFragment implements View.OnClickListener {
private static Logger log = LoggerFactory.getLogger(LoopFragment.class);
@@ -53,7 +52,7 @@ public class LoopFragment extends SubscriberFragment implements View.OnClickList
updateGUI();
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
@@ -71,7 +70,7 @@ public class LoopFragment extends SubscriberFragment implements View.OnClickList
}
});
thread.start();
- Answers.getInstance().logCustom(new CustomEvent("Loop_Run"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run"));
break;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java
index 2debfa34c5..2fff17a9e7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java
@@ -8,7 +8,6 @@ import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -37,6 +36,7 @@ import info.nightscout.androidaps.plugins.Loop.events.EventLoopUpdateGui;
import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
@@ -332,7 +332,7 @@ public class LoopPlugin implements PluginBase {
MainApp.getConfigBuilder().applyAPSRequest(resultAfterConstraints, new Callback() {
@Override
public void run() {
- Answers.getInstance().logCustom(new CustomEvent("APSRequest"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("APSRequest"));
if (result.enacted || result.success) {
lastRun.setByPump = result;
lastRun.lastEnact = lastRun.lastAPSRun;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java
index 8cd9432f81..a06850e1b1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java
@@ -18,8 +18,6 @@ import android.widget.CompoundButton;
import android.widget.ScrollView;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -33,6 +31,7 @@ import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientNewLog;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientRestart;
import info.nightscout.androidaps.plugins.NSClientInternal.events.EventNSClientUpdateGUI;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SP;
public class NSClientInternalFragment extends SubscriberFragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener {
@@ -88,7 +87,7 @@ public class NSClientInternalFragment extends SubscriberFragment implements View
updateGUI();
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
@@ -99,11 +98,11 @@ public class NSClientInternalFragment extends SubscriberFragment implements View
switch (view.getId()) {
case R.id.nsclientinternal_restart:
MainApp.bus().post(new EventNSClientRestart());
- Answers.getInstance().logCustom(new CustomEvent("NSClientRestart"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientRestart"));
break;
case R.id.nsclientinternal_delivernow:
NSClientInternalPlugin.getPlugin().resend("GUI");
- Answers.getInstance().logCustom(new CustomEvent("NSClientDeliverNow"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientDeliverNow"));
break;
case R.id.nsclientinternal_clearlog:
NSClientInternalPlugin.getPlugin().clearLog();
@@ -118,7 +117,7 @@ public class NSClientInternalFragment extends SubscriberFragment implements View
public void onClick(DialogInterface dialog, int id) {
UploadQueue.clearQueue();
updateGUI();
- Answers.getInstance().logCustom(new CustomEvent("NSClientClearQueue"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientClearQueue"));
}
});
builder.setNegativeButton(getString(R.string.cancel), null);
@@ -126,7 +125,7 @@ public class NSClientInternalFragment extends SubscriberFragment implements View
break;
case R.id.nsclientinternal_showqueue:
MainApp.bus().post(new EventNSClientNewLog("QUEUE", NSClientInternalPlugin.getPlugin().queue().textList()));
- Answers.getInstance().logCustom(new CustomEvent("NSClientShowQueue"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientShowQueue"));
break;
}
}
@@ -139,7 +138,7 @@ public class NSClientInternalFragment extends SubscriberFragment implements View
NSClientInternalPlugin.getPlugin().paused = isChecked;
MainApp.bus().post(new EventPreferenceChange(R.string.key_nsclientinternal_paused));
updateGUI();
- Answers.getInstance().logCustom(new CustomEvent("NSClientPause"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientPause"));
break;
case R.id.nsclientinternal_autoscroll:
SP.putBoolean(R.string.key_nsclientinternal_autoscroll, isChecked);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
index 1ef71c2f75..4085849675 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java
@@ -9,7 +9,7 @@ import android.os.HandlerThread;
import android.os.IBinder;
import android.os.PowerManager;
-import com.crashlytics.android.Crashlytics;
+
import com.google.common.base.Charsets;
import com.google.common.hash.Hashing;
import com.j256.ormlite.dao.CloseableIterator;
@@ -62,6 +62,7 @@ import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotificati
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SP;
import io.socket.client.IO;
import io.socket.client.Socket;
@@ -123,7 +124,7 @@ public class NSClientService extends Service {
@Override
public void onDestroy() {
super.onDestroy();
- mWakeLock.release();
+ if (mWakeLock.isHeld()) mWakeLock.release();
}
public class LocalBinder extends Binder {
@@ -345,14 +346,14 @@ public class NSClientService extends Service {
try {
data = (JSONObject) args[0];
} catch (Exception e) {
- Crashlytics.log("Wrong Announcement from NS: " + args[0]);
+ FabricPrivacy.log("Wrong Announcement from NS: " + args[0]);
return;
}
if (Config.detailedLog)
try {
MainApp.bus().post(new EventNSClientNewLog("ANNOUNCEMENT", data.has("message") ? data.getString("message") : "received"));
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
BroadcastAnnouncement.handleAnnouncement(data, getApplicationContext());
log.debug(data.toString());
@@ -381,7 +382,7 @@ public class NSClientService extends Service {
try {
data = (JSONObject) args[0];
} catch (Exception e) {
- Crashlytics.log("Wrong alarm from NS: " + args[0]);
+ FabricPrivacy.log("Wrong alarm from NS: " + args[0]);
return;
}
BroadcastAlarm.handleAlarm(data, getApplicationContext());
@@ -409,7 +410,7 @@ public class NSClientService extends Service {
try {
data = (JSONObject) args[0];
} catch (Exception e) {
- Crashlytics.log("Wrong Urgent alarm from NS: " + args[0]);
+ FabricPrivacy.log("Wrong Urgent alarm from NS: " + args[0]);
return;
}
if (Config.detailedLog)
@@ -434,7 +435,7 @@ public class NSClientService extends Service {
try {
data = (JSONObject) args[0];
} catch (Exception e) {
- Crashlytics.log("Wrong Urgent alarm from NS: " + args[0]);
+ FabricPrivacy.log("Wrong Urgent alarm from NS: " + args[0]);
return;
}
if (Config.detailedLog)
@@ -665,7 +666,7 @@ public class NSClientService extends Service {
}
//MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "onDataUpdate end");
} finally {
- wakeLock.release();
+ if (wakeLock.isHeld()) wakeLock.release();
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java
index 66d3ab2b96..7f6df8466d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java
@@ -206,12 +206,13 @@ public class DetermineBasalAdapterAMAJS {
mProfile.put("carb_ratio", profile.getIc());
mProfile.put("sens", Profile.toMgdl(profile.getIsf().doubleValue(), units));
mProfile.put("max_daily_safety_multiplier", SP.getInt("openapsama_max_daily_safety_multiplier", 3));
- mProfile.put("current_basal_safety_multiplier", SP.getInt("openapsama_current_basal_safety_multiplier", 4));
+ mProfile.put("current_basal_safety_multiplier", SP.getDouble("openapsama_current_basal_safety_multiplier", 4d));
mProfile.put("skip_neutral_temps", true);
mProfile.put("current_basal", basalrate);
mProfile.put("temptargetSet", tempTargetSet);
mProfile.put("autosens_adjust_targets", SP.getBoolean("openapsama_autosens_adjusttargets", true));
- mProfile.put("min_5m_carbimpact", SP.getInt("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact));
+ //TODO: align with max-absorption model in AMA sensitivity
+ mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact));
if (units.equals(Constants.MMOL)) {
mProfile.put("out_units", "mmol/L");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java
index b35ebe25a6..9c9ad7d222 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java
@@ -9,8 +9,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -24,6 +22,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JSONFormatter;
public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnClickListener {
@@ -63,7 +62,7 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli
updateGUI();
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
@@ -74,7 +73,7 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli
switch (view.getId()) {
case R.id.openapsma_run:
OpenAPSAMAPlugin.getPlugin().invoke("OpenAPSAMA button");
- Answers.getInstance().logCustom(new CustomEvent("OpenAPS_AMA_Run"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_AMA_Run"));
break;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java
index 14d5396817..bfe4fedf1f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java
@@ -8,7 +8,6 @@ import java.io.IOException;
import java.util.Date;
import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -18,6 +17,7 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
+import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensResult;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
@@ -26,11 +26,10 @@ import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
import info.nightscout.utils.DateUtil;
-import info.nightscout.utils.NSUpload;
+import info.nightscout.utils.HardLimits;
import info.nightscout.utils.Profiler;
import info.nightscout.utils.Round;
import info.nightscout.utils.SP;
-import info.nightscout.utils.ToastUtils;
/**
* Created by mike on 05.08.2016.
@@ -148,6 +147,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface {
GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData();
Profile profile = MainApp.getConfigBuilder().getProfile();
+ PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (profile == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected)));
@@ -183,7 +183,7 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface {
Date start = new Date();
Date startPart = new Date();
- IobTotal[] iobArray = IobCobCalculatorPlugin.calculateIobArrayInDia();
+ IobTotal[] iobArray = IobCobCalculatorPlugin.getPlugin().calculateIobArrayInDia();
Profiler.log(log, "calculateIobArrayInDia()", startPart);
startPart = new Date();
@@ -192,35 +192,37 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface {
maxIob = MainApp.getConfigBuilder().applyMaxIOBConstraints(maxIob);
- minBg = verifyHardLimits(minBg, "minBg", Constants.VERY_HARD_LIMIT_MIN_BG[0], Constants.VERY_HARD_LIMIT_MIN_BG[1]);
- maxBg = verifyHardLimits(maxBg, "maxBg", Constants.VERY_HARD_LIMIT_MAX_BG[0], Constants.VERY_HARD_LIMIT_MAX_BG[1]);
- targetBg = verifyHardLimits(targetBg, "targetBg", Constants.VERY_HARD_LIMIT_TARGET_BG[0], Constants.VERY_HARD_LIMIT_TARGET_BG[1]);
+ minBg = HardLimits.verifyHardLimits(minBg, "minBg", HardLimits.VERY_HARD_LIMIT_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_MIN_BG[1]);
+ maxBg = HardLimits.verifyHardLimits(maxBg, "maxBg", HardLimits.VERY_HARD_LIMIT_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_MAX_BG[1]);
+ targetBg = HardLimits.verifyHardLimits(targetBg, "targetBg", HardLimits.VERY_HARD_LIMIT_TARGET_BG[0], HardLimits.VERY_HARD_LIMIT_TARGET_BG[1]);
boolean isTempTarget = false;
TempTarget tempTarget = MainApp.getConfigBuilder().getTempTargetFromHistory(System.currentTimeMillis());
if (tempTarget != null) {
isTempTarget = true;
- minBg = verifyHardLimits(tempTarget.low, "minBg", Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[0], Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[1]);
- maxBg = verifyHardLimits(tempTarget.high, "maxBg", Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[0], Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[1]);
- targetBg = verifyHardLimits((tempTarget.low + tempTarget.high) / 2, "targetBg", Constants.VERY_HARD_LIMIT_TEMP_TARGET_BG[0], Constants.VERY_HARD_LIMIT_TEMP_TARGET_BG[1]);
+ minBg = HardLimits.verifyHardLimits(tempTarget.low, "minBg", HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[1]);
+ maxBg = HardLimits.verifyHardLimits(tempTarget.high, "maxBg", HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[1]);
+ targetBg = HardLimits.verifyHardLimits((tempTarget.low + tempTarget.high) / 2, "targetBg", HardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[1]);
}
- maxIob = verifyHardLimits(maxIob, "maxIob", 0, 7);
- maxBasal = verifyHardLimits(maxBasal, "max_basal", 0.1, 10);
+ maxIob = HardLimits.verifyHardLimits(maxIob, "maxIob", 0, HardLimits.maxIobAMA());
+ maxBasal = HardLimits.verifyHardLimits(maxBasal, "max_basal", 0.1, HardLimits.maxBasal());
- if (!checkOnlyHardLimits(profile.getDia(), "dia", 2, 7)) return;
- if (!checkOnlyHardLimits(profile.getIc(Profile.secondsFromMidnight()), "carbratio", 2, 100))
+ if (!HardLimits.checkOnlyHardLimits(profile.getDia(), "dia", HardLimits.MINDIA, HardLimits.MAXDIA))
return;
- if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", 2, 900))
+ if (!HardLimits.checkOnlyHardLimits(profile.getIc(profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
return;
- if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, 10)) return;
- if (!checkOnlyHardLimits(ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), "current_basal", 0.01, 5))
+ if (!HardLimits.checkOnlyHardLimits(Profile.toMgdl(profile.getIsf().doubleValue(), units), "sens", HardLimits.MINISF, HardLimits.MAXISF))
+ return;
+ if (!HardLimits.checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, HardLimits.maxBasal()))
+ return;
+ if (!HardLimits.checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, HardLimits.maxBasal()))
return;
startPart = new Date();
if (MainApp.getConfigBuilder().isAMAModeEnabled()) {
- lastAutosensResult = IobCobCalculatorPlugin.detectSensitivityWithLock(IobCobCalculatorPlugin.oldestDataAvailable(), System.currentTimeMillis());
+ lastAutosensResult = IobCobCalculatorPlugin.getPlugin().detectSensitivityWithLock(IobCobCalculatorPlugin.oldestDataAvailable(), System.currentTimeMillis());
} else {
lastAutosensResult = new AutosensResult();
}
@@ -272,24 +274,4 @@ public class OpenAPSAMAPlugin implements PluginBase, APSInterface {
//deviceStatus.suggested = determineBasalResultAMA.json;
}
- // safety checks
- public static boolean checkOnlyHardLimits(Double value, String valueName, double lowLimit, double highLimit) {
- return value.equals(verifyHardLimits(value, valueName, lowLimit, highLimit));
- }
-
- public static Double verifyHardLimits(Double value, String valueName, double lowLimit, double highLimit) {
- Double newvalue = value;
- if (newvalue < lowLimit || newvalue > highLimit) {
- newvalue = Math.max(newvalue, lowLimit);
- newvalue = Math.min(newvalue, highLimit);
- String msg = String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), valueName);
- msg += ".\n";
- msg += String.format(MainApp.sResources.getString(R.string.openapsma_valuelimitedto), value, newvalue);
- log.error(msg);
- NSUpload.uploadError(msg);
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), msg, R.raw.error);
- }
- return newvalue;
- }
-
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java
index 1183a99e67..6b8cb9d0aa 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java
@@ -9,8 +9,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -22,6 +20,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JSONFormatter;
public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClickListener {
@@ -57,7 +56,7 @@ public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClic
updateGUI();
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
@@ -68,7 +67,7 @@ public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClic
switch (view.getId()) {
case R.id.openapsma_run:
OpenAPSMAPlugin.getPlugin().invoke("OpenAPSMA button");
- Answers.getInstance().logCustom(new CustomEvent("OpenAPS_MA_Run"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_MA_Run"));
break;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java
index 3119a17a96..adb18491a4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java
@@ -8,7 +8,6 @@ import java.io.IOException;
import java.util.Date;
import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -18,19 +17,21 @@ import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.interfaces.APSInterface;
import info.nightscout.androidaps.interfaces.PluginBase;
+import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Loop.APSResult;
import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.HardLimits;
import info.nightscout.utils.Profiler;
import info.nightscout.utils.Round;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
-import static info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin.checkOnlyHardLimits;
-import static info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin.verifyHardLimits;
+import static info.nightscout.utils.HardLimits.checkOnlyHardLimits;
+import static info.nightscout.utils.HardLimits.verifyHardLimits;
/**
* Created by mike on 05.08.2016.
@@ -147,6 +148,7 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface {
GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData();
Profile profile = MainApp.getConfigBuilder().getProfile();
+ PumpInterface pump = ConfigBuilderPlugin.getActivePump();
if (profile == null) {
MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected)));
@@ -195,26 +197,29 @@ public class OpenAPSMAPlugin implements PluginBase, APSInterface {
maxIob = MainApp.getConfigBuilder().applyMaxIOBConstraints(maxIob);
Profiler.log(log, "MA data gathering", start);
- minBg = verifyHardLimits(minBg, "minBg", Constants.VERY_HARD_LIMIT_MIN_BG[0], Constants.VERY_HARD_LIMIT_MIN_BG[1]);
- maxBg = verifyHardLimits(maxBg, "maxBg", Constants.VERY_HARD_LIMIT_MAX_BG[0], Constants.VERY_HARD_LIMIT_MAX_BG[1]);
- targetBg = verifyHardLimits(targetBg, "targetBg", Constants.VERY_HARD_LIMIT_TARGET_BG[0], Constants.VERY_HARD_LIMIT_TARGET_BG[1]);
+ minBg = verifyHardLimits(minBg, "minBg", HardLimits.VERY_HARD_LIMIT_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_MIN_BG[1]);
+ maxBg = verifyHardLimits(maxBg, "maxBg", HardLimits.VERY_HARD_LIMIT_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_MAX_BG[1]);
+ targetBg = verifyHardLimits(targetBg, "targetBg", HardLimits.VERY_HARD_LIMIT_TARGET_BG[0], HardLimits.VERY_HARD_LIMIT_TARGET_BG[1]);
TempTarget tempTarget = MainApp.getConfigBuilder().getTempTargetFromHistory(System.currentTimeMillis());
if (tempTarget != null) {
- minBg = verifyHardLimits(tempTarget.low, "minBg", Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[0], Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[1]);
- maxBg = verifyHardLimits(tempTarget.high, "maxBg", Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[0], Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[1]);
- targetBg = verifyHardLimits((tempTarget.low + tempTarget.high) / 2, "targetBg", Constants.VERY_HARD_LIMIT_TEMP_TARGET_BG[0], Constants.VERY_HARD_LIMIT_TEMP_TARGET_BG[1]);
+ minBg = verifyHardLimits(tempTarget.low, "minBg", HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[1]);
+ maxBg = verifyHardLimits(tempTarget.high, "maxBg", HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[1]);
+ targetBg = verifyHardLimits((tempTarget.low + tempTarget.high) / 2, "targetBg", HardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[1]);
}
- maxIob = verifyHardLimits(maxIob, "maxIob", 0, 7);
- maxBasal = verifyHardLimits(maxBasal, "max_basal", 0.1, 10);
+ maxIob = verifyHardLimits(maxIob, "maxIob", 0, HardLimits.maxIobAMA());
+ maxBasal = verifyHardLimits(maxBasal, "max_basal", 0.1, HardLimits.maxBasal());
- if (!checkOnlyHardLimits(profile.getDia(), "dia", 2, 7)) return;
- if (!checkOnlyHardLimits(profile.getIc(), "carbratio", 2, 100)) return;
- if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf(), units), "sens", 2, 900))
+ if (!checkOnlyHardLimits(profile.getDia(), "dia", HardLimits.MINDIA, HardLimits.MAXDIA))
return;
- if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, 10)) return;
- if (!checkOnlyHardLimits(ConfigBuilderPlugin.getActivePump().getBaseBasalRate(), "current_basal", 0.01, 5))
+ if (!checkOnlyHardLimits(profile.getIc(profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
+ return;
+ if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf().doubleValue(), units), "sens", HardLimits.MINISF, HardLimits.MAXISF))
+ return;
+ if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, HardLimits.maxBasal()))
+ return;
+ if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, HardLimits.maxBasal()))
return;
start = new Date();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java
index 57c879a5cd..5ec19adfe8 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java
@@ -230,7 +230,7 @@ public class DetermineBasalAdapterSMBJS {
mProfile.put("carb_ratio", profile.getIc());
mProfile.put("sens", Profile.toMgdl(profile.getIsf().doubleValue(), units));
mProfile.put("max_daily_safety_multiplier", SP.getInt("openapsama_max_daily_safety_multiplier", 3));
- mProfile.put("current_basal_safety_multiplier", SP.getInt("openapsama_current_basal_safety_multiplier", 4));
+ mProfile.put("current_basal_safety_multiplier", SP.getDouble("openapsama_current_basal_safety_multiplier", 4d));
mProfile.put("high_temptarget_raises_sensitivity", SMBDefaults.high_temptarget_raises_sensitivity);
mProfile.put("low_temptarget_lowers_sensitivity", SMBDefaults.low_temptarget_lowers_sensitivity);
@@ -241,7 +241,8 @@ public class DetermineBasalAdapterSMBJS {
mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target);
mProfile.put("maxCOB", SMBDefaults.maxCOB);
mProfile.put("skip_neutral_temps", SMBDefaults.skip_neutral_temps);
- mProfile.put("min_5m_carbimpact", SP.getInt("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact));;
+ //TODO: align with max-absorption model in AMA sensitivity
+ mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact));;
mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap);
mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false));
mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java
index ef515c68f2..6c720adc48 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java
@@ -8,7 +8,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -22,6 +21,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.JSONFormatter;
public class OpenAPSSMBFragment extends SubscriberFragment implements View.OnClickListener {
@@ -66,7 +66,7 @@ public class OpenAPSSMBFragment extends SubscriberFragment implements View.OnCli
switch (view.getId()) {
case R.id.openapsma_run:
OpenAPSSMBPlugin.getPlugin().invoke("OpenAPSSMB button");
- Answers.getInstance().logCustom(new CustomEvent("OpenAPS_SMB_Run"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_SMB_Run"));
break;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java
index f056a9c607..c992f0e739 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java
@@ -8,7 +8,6 @@ import java.io.IOException;
import java.util.Date;
import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
@@ -27,6 +26,7 @@ import info.nightscout.androidaps.plugins.Loop.ScriptReader;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateResultGui;
import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.HardLimits;
import info.nightscout.utils.NSUpload;
import info.nightscout.utils.Profiler;
import info.nightscout.utils.Round;
@@ -188,7 +188,7 @@ public class OpenAPSSMBPlugin implements PluginBase, APSInterface {
Date start = new Date();
Date startPart = new Date();
- IobTotal[] iobArray = IobCobCalculatorPlugin.calculateIobArrayForSMB();
+ IobTotal[] iobArray = IobCobCalculatorPlugin.getPlugin().calculateIobArrayForSMB();
Profiler.log(log, "calculateIobArrayInDia()", startPart);
startPart = new Date();
@@ -197,34 +197,34 @@ public class OpenAPSSMBPlugin implements PluginBase, APSInterface {
maxIob = MainApp.getConfigBuilder().applyMaxIOBConstraints(maxIob);
- minBg = verifyHardLimits(minBg, "minBg", Constants.VERY_HARD_LIMIT_MIN_BG[0], Constants.VERY_HARD_LIMIT_MIN_BG[1]);
- maxBg = verifyHardLimits(maxBg, "maxBg", Constants.VERY_HARD_LIMIT_MAX_BG[0], Constants.VERY_HARD_LIMIT_MAX_BG[1]);
- targetBg = verifyHardLimits(targetBg, "targetBg", Constants.VERY_HARD_LIMIT_TARGET_BG[0], Constants.VERY_HARD_LIMIT_TARGET_BG[1]);
+ minBg = verifyHardLimits(minBg, "minBg", HardLimits.VERY_HARD_LIMIT_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_MIN_BG[1]);
+ maxBg = verifyHardLimits(maxBg, "maxBg", HardLimits.VERY_HARD_LIMIT_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_MAX_BG[1]);
+ targetBg = verifyHardLimits(targetBg, "targetBg", HardLimits.VERY_HARD_LIMIT_TARGET_BG[0], HardLimits.VERY_HARD_LIMIT_TARGET_BG[1]);
boolean isTempTarget = false;
TempTarget tempTarget = MainApp.getConfigBuilder().getTempTargetFromHistory(System.currentTimeMillis());
if (tempTarget != null) {
isTempTarget = true;
- minBg = verifyHardLimits(tempTarget.low, "minBg", Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[0], Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[1]);
- maxBg = verifyHardLimits(tempTarget.high, "maxBg", Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[0], Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[1]);
- targetBg = verifyHardLimits((tempTarget.low + tempTarget.high) / 2, "targetBg", Constants.VERY_HARD_LIMIT_TEMP_TARGET_BG[0], Constants.VERY_HARD_LIMIT_TEMP_TARGET_BG[1]);
+ minBg = verifyHardLimits(tempTarget.low, "minBg", HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[1]);
+ maxBg = verifyHardLimits(tempTarget.high, "maxBg", HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[1]);
+ targetBg = verifyHardLimits((tempTarget.low + tempTarget.high) / 2, "targetBg", HardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[0], HardLimits.VERY_HARD_LIMIT_TEMP_TARGET_BG[1]);
}
- maxIob = verifyHardLimits(maxIob, "maxIob", 0, 7);
- maxBasal = verifyHardLimits(maxBasal, "max_basal", 0.1, 10);
+ maxIob = verifyHardLimits(maxIob, "maxIob", 0, HardLimits.maxIobSMB());
+ maxBasal = verifyHardLimits(maxBasal, "max_basal", 0.1, HardLimits.maxBasal());
- if (!checkOnlyHardLimits(profile.getDia(), "dia", 2, 7)) return;
- if (!checkOnlyHardLimits(profile.getIc(profile.secondsFromMidnight()), "carbratio", 2, 100))
+ if (!checkOnlyHardLimits(profile.getDia(), "dia", HardLimits.MINDIA, HardLimits.MAXDIA)) return;
+ if (!checkOnlyHardLimits(profile.getIc(profile.secondsFromMidnight()), "carbratio", HardLimits.MINIC, HardLimits.MAXIC))
return;
- if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf().doubleValue(), units), "sens", 2, 900))
+ if (!checkOnlyHardLimits(Profile.toMgdl(profile.getIsf().doubleValue(), units), "sens", HardLimits.MINISF, HardLimits.MAXISF))
return;
- if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, 10)) return;
- if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, 5)) return;
+ if (!checkOnlyHardLimits(profile.getMaxDailyBasal(), "max_daily_basal", 0.1, HardLimits.maxBasal())) return;
+ if (!checkOnlyHardLimits(pump.getBaseBasalRate(), "current_basal", 0.01, HardLimits.maxBasal())) return;
startPart = new Date();
if (MainApp.getConfigBuilder().isAMAModeEnabled()) {
- lastAutosensResult = IobCobCalculatorPlugin.detectSensitivityWithLock(IobCobCalculatorPlugin.oldestDataAvailable(), System.currentTimeMillis());
+ lastAutosensResult = IobCobCalculatorPlugin.getPlugin().detectSensitivityWithLock(IobCobCalculatorPlugin.oldestDataAvailable(), System.currentTimeMillis());
} else {
lastAutosensResult = new AutosensResult();
}
@@ -288,9 +288,9 @@ public class OpenAPSSMBPlugin implements PluginBase, APSInterface {
if (newvalue < lowLimit || newvalue > highLimit) {
newvalue = Math.max(newvalue, lowLimit);
newvalue = Math.min(newvalue, highLimit);
- String msg = String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), valueName);
+ String msg = String.format(MainApp.sResources.getString(R.string.valueoutofrange), valueName);
msg += ".\n";
- msg += String.format(MainApp.sResources.getString(R.string.openapsma_valuelimitedto), value, newvalue);
+ msg += String.format(MainApp.sResources.getString(R.string.valuelimitedto), value, newvalue);
log.error(msg);
NSUpload.uploadError(msg);
ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), msg, R.raw.error);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/SMBDefaults.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/SMBDefaults.java
index a7e690ce79..0ce8d2bb94 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/SMBDefaults.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/SMBDefaults.java
@@ -40,7 +40,7 @@ public class SMBDefaults {
public final static boolean skip_neutral_temps = true; // ***** default false in oref1 ***** if true, don't set neutral temps
// unsuspend_if_no_temp:false // if true, pump will un-suspend after a zero temp finishes
// bolussnooze_dia_divisor:2 // bolus snooze decays after 1/2 of DIA
- public final static int min_5m_carbimpact = 8; // mg/dL per 5m (8 mg/dL/5m corresponds to 24g/hr at a CSF of 4 mg/dL/g (x/5*60/4))
+ public final static double min_5m_carbimpact = 8d; // mg/dL per 5m (8 mg/dL/5m corresponds to 24g/hr at a CSF of 4 mg/dL/g (x/5*60/4))
public final static int remainingCarbsCap = 90; // max carbs we'll assume will absorb over 4h if we don't yet see carb absorption
// WARNING: use SMB with caution: it can and will automatically bolus up to max_iob worth of extra insulin
// enableUAM:true // enable detection of unannounced meal carb absorption
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java
index d5053c9317..f0ccdd9809 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/CalibrationDialog.java
@@ -11,7 +11,6 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import org.slf4j.Logger;
@@ -24,6 +23,7 @@ import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.GlucoseStatus;
import info.nightscout.androidaps.data.Profile;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SafeParse;
import info.nightscout.utils.XdripCalibrations;
@@ -88,7 +88,7 @@ public class CalibrationDialog extends DialogFragment implements View.OnClickLis
final Double bg = SafeParse.stringToDouble(bgNumber.getText());
XdripCalibrations.confirmAndSendCalibration(bg, context);
dismiss();
- Answers.getInstance().logCustom(new CustomEvent("Calibration"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("Calibration"));
break;
case R.id.cancel:
dismiss();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java
index f11283c029..7d45c35792 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorDialog.java
@@ -19,6 +19,7 @@ import info.nightscout.androidaps.Services.AlarmSoundService;
public class ErrorDialog extends DialogFragment implements View.OnClickListener {
private static Logger log = LoggerFactory.getLogger(ErrorDialog.class);
+ Button muteButton;
Button okButton;
TextView statusView;
ErrorHelperActivity helperActivity;
@@ -52,14 +53,14 @@ public class ErrorDialog extends DialogFragment implements View.OnClickListener
Bundle savedInstanceState) {
getDialog().setTitle(title);
View view = inflater.inflate(R.layout.overview_error_dialog, container, false);
+ muteButton = (Button) view.findViewById(R.id.overview_error_mute);
okButton = (Button) view.findViewById(R.id.overview_error_ok);
statusView = (TextView) view.findViewById(R.id.overview_error_status);
+ muteButton.setOnClickListener(this);
okButton.setOnClickListener(this);
setCancelable(false);
- Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class);
- alarm.putExtra("soundid", soundId);
- MainApp.instance().startService(alarm);
+ startAlarm();
return view;
}
@@ -77,13 +78,16 @@ public class ErrorDialog extends DialogFragment implements View.OnClickListener
if (helperActivity != null) {
helperActivity.finish();
}
- Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class);
- MainApp.instance().stopService(alarm);
+ stopAlarm();
}
@Override
public void onClick(View view) {
switch (view.getId()) {
+ case R.id.overview_error_mute:
+ log.debug("Error dialog mute button pressed");
+ stopAlarm();
+ break;
case R.id.overview_error_ok:
log.debug("Error dialog ok button pressed");
dismiss();
@@ -91,4 +95,14 @@ public class ErrorDialog extends DialogFragment implements View.OnClickListener
}
}
+ private void startAlarm() {
+ Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class);
+ alarm.putExtra("soundid", soundId);
+ MainApp.instance().startService(alarm);
+ }
+
+ private void stopAlarm() {
+ Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class);
+ MainApp.instance().stopService(alarm);
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java
index 259c9c76eb..90cf9aecd5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/ErrorHelperActivity.java
@@ -3,6 +3,10 @@ package info.nightscout.androidaps.plugins.Overview.Dialogs;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
+import info.nightscout.androidaps.R;
+import info.nightscout.utils.NSUpload;
+import info.nightscout.utils.SP;
+
public class ErrorHelperActivity extends AppCompatActivity {
public ErrorHelperActivity() {
super();
@@ -17,5 +21,9 @@ public class ErrorHelperActivity extends AppCompatActivity {
errorDialog.setSound(getIntent().getIntExtra("soundid", 0));
errorDialog.setTitle(getIntent().getStringExtra("title"));
errorDialog.show(this.getSupportFragmentManager(), "Error");
+
+ if (SP.getBoolean(R.string.key_ns_create_announcements_from_errors, true)) {
+ NSUpload.uploadError(getIntent().getStringExtra("status"));
+ }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java
new file mode 100644
index 0000000000..15e93816bd
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java
@@ -0,0 +1,329 @@
+package info.nightscout.androidaps.plugins.Overview.Dialogs;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.os.HandlerThread;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.text.Editable;
+import android.text.Html;
+import android.text.TextWatcher;
+import android.text.format.DateFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.TextView;
+
+import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
+import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout;
+import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.DecimalFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+import info.nightscout.androidaps.Constants;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.DetailedBolusInfo;
+import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.db.Source;
+import info.nightscout.androidaps.db.TempTarget;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.Loop.APSResult;
+import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
+import info.nightscout.androidaps.plugins.OpenAPSSMB.DetermineBasalResultSMB;
+import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.NumberPicker;
+import info.nightscout.utils.SP;
+import info.nightscout.utils.SafeParse;
+import info.nightscout.utils.ToastUtils;
+
+public class NewCarbsDialog extends DialogFragment implements OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {
+ private static Logger log = LoggerFactory.getLogger(NewCarbsDialog.class);
+
+ private EditText foodText;
+ private NumberPicker editCarbs;
+
+ private TextView dateButton;
+ private TextView timeButton;
+
+ private Date initialEventTime;
+ private Date eventTime;
+
+ private Button fav1Button;
+ private Button fav2Button;
+ private Button fav3Button;
+
+ private static final double FAV1_DEFAULT = 5;
+ private static final double FAV2_DEFAULT = 10;
+ private static final double FAV3_DEFAULT = 20;
+
+ private CheckBox suspendLoopCheckbox;
+ private CheckBox startActivityTTCheckbox;
+
+ private Integer maxCarbs;
+
+ //one shot guards
+ private boolean accepted;
+ private boolean okClicked;
+
+ public NewCarbsDialog() {
+ HandlerThread mHandlerThread = new HandlerThread(NewCarbsDialog.class.getSimpleName());
+ mHandlerThread.start();
+ }
+
+ final private TextWatcher textWatcher = new TextWatcher() {
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ validateInputs();
+ }
+ };
+
+ private void validateInputs() {
+ Integer carbs = SafeParse.stringToInt(editCarbs.getText());
+ if (carbs > maxCarbs) {
+ editCarbs.setValue(0d);
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.carbsconstraintapplied));
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.overview_newcarbs_dialog, container, false);
+
+ view.findViewById(R.id.ok).setOnClickListener(this);
+ view.findViewById(R.id.cancel).setOnClickListener(this);
+
+ getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
+
+ maxCarbs = MainApp.getConfigBuilder().applyCarbsConstraints(Constants.carbsOnlyForCheckLimit);
+
+ foodText = view.findViewById(R.id.newcarb_food);
+
+ editCarbs = view.findViewById(R.id.newcarb_carbsamount);
+
+ editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, textWatcher);
+
+ startActivityTTCheckbox = view.findViewById(R.id.newcarbs_activity_tt);
+
+ dateButton = view.findViewById(R.id.newcarbs_eventdate);
+ timeButton = view.findViewById(R.id.newcarb_eventtime);
+
+ initialEventTime = new Date();
+ eventTime = new Date(initialEventTime.getTime());
+ dateButton.setText(DateUtil.dateString(eventTime));
+ timeButton.setText(DateUtil.timeString(eventTime));
+ dateButton.setOnClickListener(this);
+ timeButton.setOnClickListener(this);
+
+// TODO prefilling carbs, maybe
+// TODO maybe update suggested carbs to target TT when checked
+// APSResult lastAPSResult = ConfigBuilderPlugin.getActiveAPS().getLastAPSResult();
+// if (lastAPSResult != null && lastAPSResult instanceof DetermineBasalResultSMB && ((DetermineBasalResultSMB) lastAPSResult).carbsReq > 0) {
+// editCarbs.setValue(((DetermineBasalResultSMB) lastAPSResult).carbsReq);
+// }
+
+ fav1Button = view.findViewById(R.id.newcarbs_plus1);
+ fav1Button.setOnClickListener(this);
+ fav1Button.setText("+" + SP.getString(MainApp.gs(R.string.key_carbs_button_increment_1), String.valueOf(FAV1_DEFAULT)));
+ fav2Button = view.findViewById(R.id.newcarbs_plus2);
+ fav2Button.setOnClickListener(this);
+ fav2Button.setText("+" + SP.getString(MainApp.gs(R.string.key_carbs_button_increment_2), String.valueOf(FAV2_DEFAULT)));
+ fav3Button = view.findViewById(R.id.newcarbs_plus3);
+ fav3Button.setOnClickListener(this);
+ fav3Button.setText("+" + SP.getString(MainApp.gs(R.string.key_carbs_button_increment_3), String.valueOf(FAV3_DEFAULT)));
+
+ suspendLoopCheckbox = view.findViewById(R.id.newcarbs_suspend_loop);
+
+ setCancelable(true);
+ getDialog().setCanceledOnTouchOutside(false);
+ return view;
+ }
+
+ @Override
+ public synchronized void onClick(View view) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(eventTime);
+ switch (view.getId()) {
+ case R.id.ok:
+ submit();
+ break;
+ case R.id.cancel:
+ dismiss();
+ break;
+ case R.id.newcarbs_eventdate:
+ DatePickerDialog dpd = DatePickerDialog.newInstance(
+ this,
+ calendar.get(Calendar.YEAR),
+ calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH)
+ );
+ dpd.setThemeDark(true);
+ dpd.dismissOnPause(true);
+ dpd.show(getActivity().getFragmentManager(), "Datepickerdialog");
+ break;
+ case R.id.newcarb_eventtime:
+ TimePickerDialog tpd = TimePickerDialog.newInstance(
+ this,
+ calendar.get(Calendar.HOUR_OF_DAY),
+ calendar.get(Calendar.MINUTE),
+ DateFormat.is24HourFormat(getActivity())
+ );
+ tpd.setThemeDark(true);
+ tpd.dismissOnPause(true);
+ tpd.show(getActivity().getFragmentManager(), "Timepickerdialog");
+ break;
+ case R.id.newcarbs_plus1:
+ editCarbs.setValue(editCarbs.getValue()
+ + SP.getDouble(MainApp.gs(R.string.key_carbs_button_increment_1), FAV1_DEFAULT));
+ validateInputs();
+ break;
+ case R.id.newcarbs_plus2:
+ editCarbs.setValue(editCarbs.getValue()
+ + SP.getDouble(MainApp.gs(R.string.key_carbs_button_increment_2), FAV2_DEFAULT));
+ validateInputs();
+ break;
+ case R.id.newcarbs_plus3:
+ editCarbs.setValue(editCarbs.getValue()
+ + SP.getDouble(MainApp.gs(R.string.key_carbs_button_increment_3), FAV3_DEFAULT));
+ validateInputs();
+ break;
+ }
+ }
+
+ private void submit() {
+ if (okClicked) {
+ log.debug("guarding: ok already clicked");
+ dismiss();
+ return;
+ }
+ okClicked = true;
+ try {
+ final String food = StringUtils.trimToNull(foodText.getText().toString());
+ final Integer carbs = SafeParse.stringToInt(editCarbs.getText());
+ Integer carbsAfterConstraints = MainApp.getConfigBuilder().applyCarbsConstraints(carbs);
+
+ String confirmMessage = "";
+ if (carbs > 0)
+ confirmMessage += getString(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + "";
+ if (!carbsAfterConstraints.equals(carbs))
+ confirmMessage += "
" + getString(R.string.carbsconstraintapplied) + "";
+ if (suspendLoopCheckbox.isChecked()) {
+ confirmMessage += "
" + "Loop: " + "" + "Suspend for 30 min";
+ }
+
+ double prefTTDuration = SP.getDouble(R.string.key_activity_duration, 90d);
+ double ttDuration = prefTTDuration > 0 ? prefTTDuration : 90d;
+ double prefTT = SP.getDouble(R.string.key_activity_target, 140d);
+ double tt = prefTT > 0 ? prefTT : 140d;
+ if (startActivityTTCheckbox.isChecked()) {
+ confirmMessage += "
" + "TT: " + "" + ((int) tt) + "mg/dl for " + ((int) ttDuration) + " min ";
+ }
+
+ if (StringUtils.isNoneEmpty(food)) {
+ confirmMessage += "
" + "Food: " + food;
+ }
+
+ if (!initialEventTime.equals(eventTime)) {
+ confirmMessage += "
Time: " + DateUtil.dateAndTimeString(eventTime);
+ }
+
+ final int finalCarbsAfterConstraints = carbsAfterConstraints;
+
+ final Context context = getContext();
+ final AlertDialog.Builder builder = new AlertDialog.Builder(context);
+
+ builder.setTitle(this.getContext().getString(R.string.confirmation));
+ if (confirmMessage.startsWith("
"))
+ confirmMessage = confirmMessage.substring("
".length());
+ builder.setMessage(Html.fromHtml(confirmMessage));
+ builder.setPositiveButton(getString(R.string.ok), (dialog, id) -> {
+ synchronized (builder) {
+ if (accepted) {
+ log.debug("guarding: already accepted");
+ return;
+ }
+ accepted = true;
+
+ if (suspendLoopCheckbox.isChecked()) {
+ final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop();
+ activeloop.suspendTo(System.currentTimeMillis() + 30L * 60 * 1000);
+ ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
+ }
+ }
+ });
+ }
+
+ if (startActivityTTCheckbox.isChecked()) {
+ TempTarget tempTarget = new TempTarget();
+ tempTarget.date = System.currentTimeMillis();
+ tempTarget.durationInMinutes = (int) ttDuration;
+ tempTarget.reason = "Activity";
+ tempTarget.source = Source.USER;
+ tempTarget.low = (int) tt;
+ tempTarget.high = (int) tt;
+ MainApp.getDbHelper().createOrUpdate(tempTarget);
+ }
+
+ if (finalCarbsAfterConstraints > 0 || food != null) {
+ DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
+ detailedBolusInfo.date = eventTime.getTime();
+ detailedBolusInfo.eventType = CareportalEvent.CARBCORRECTION;
+ detailedBolusInfo.carbs = finalCarbsAfterConstraints;
+// detailedBolusInfo.food = food;
+ detailedBolusInfo.context = context;
+ detailedBolusInfo.source = Source.USER;
+ MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
+ }
+ }
+ });
+ builder.setNegativeButton(getString(R.string.cancel), null);
+ builder.show();
+ dismiss();
+ } catch (Exception e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ @Override
+ public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
+ eventTime.setYear(year - 1900);
+ eventTime.setMonth(monthOfYear);
+ eventTime.setDate(dayOfMonth);
+ dateButton.setText(DateUtil.dateString(eventTime));
+ }
+
+ @Override
+ public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {
+ eventTime.setHours(hourOfDay);
+ eventTime.setMinutes(minute);
+ eventTime.setSeconds(second);
+ timeButton.setText(DateUtil.timeString(eventTime));
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java
new file mode 100644
index 0000000000..7c86cde764
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewInsulinDialog.java
@@ -0,0 +1,342 @@
+package info.nightscout.androidaps.plugins.Overview.Dialogs;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.HandlerThread;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.text.Editable;
+import android.text.Html;
+import android.text.TextWatcher;
+import android.text.format.DateFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import com.crashlytics.android.answers.Answers;
+import com.crashlytics.android.answers.CustomEvent;
+import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
+import com.wdullaer.materialdatetimepicker.time.RadialPickerLayout;
+import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.DecimalFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+import info.nightscout.androidaps.Constants;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.DetailedBolusInfo;
+import info.nightscout.androidaps.data.Profile;
+import info.nightscout.androidaps.db.CareportalEvent;
+import info.nightscout.androidaps.db.Source;
+import info.nightscout.androidaps.db.TempTarget;
+import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.androidaps.plugins.Loop.APSResult;
+import info.nightscout.androidaps.plugins.OpenAPSSMB.DetermineBasalResultSMB;
+import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.NumberPicker;
+import info.nightscout.utils.SP;
+import info.nightscout.utils.SafeParse;
+import info.nightscout.utils.ToastUtils;
+
+public class NewInsulinDialog extends DialogFragment implements OnClickListener, DatePickerDialog.OnDateSetListener, TimePickerDialog.OnTimeSetListener {
+ private static Logger log = LoggerFactory.getLogger(NewInsulinDialog.class);
+
+ private NumberPicker editInsulin;
+
+ private TextView dateButton;
+ private TextView timeButton;
+
+ private Date initialEventTime;
+ private Date eventTime;
+
+ private Button plus1Button;
+ private Button plus2Button;
+ private Button plus3Button;
+
+ public static final double PLUS1_DEFAULT = 0.5d;
+ public static final double PLUS2_DEFAULT = 1d;
+ public static final double PLUS3_DEFAULT = 2d;
+
+ private CheckBox startESMCheckbox;
+ private CheckBox recordOnlyCheckbox;
+
+ private Double maxInsulin;
+
+ //one shot guards
+ private boolean accepted;
+ private boolean okClicked;
+
+ public NewInsulinDialog() {
+ HandlerThread mHandlerThread = new HandlerThread(NewInsulinDialog.class.getSimpleName());
+ mHandlerThread.start();
+ }
+
+ final private TextWatcher textWatcher = new TextWatcher() {
+ @Override
+ public void afterTextChanged(Editable s) {
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ validateInputs();
+ }
+ };
+
+ private void validateInputs() {
+ Double insulin = SafeParse.stringToDouble(editInsulin.getText());
+ if (insulin > maxInsulin) {
+ editInsulin.setValue(0d);
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.bolusconstraintapplied));
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.overview_newinsulin_dialog, container, false);
+
+ view.findViewById(R.id.ok).setOnClickListener(this);
+ view.findViewById(R.id.cancel).setOnClickListener(this);
+
+ getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
+ getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
+
+ maxInsulin = MainApp.getConfigBuilder().applyBolusConstraints(Constants.bolusOnlyForCheckLimit);
+
+ editInsulin = (NumberPicker) view.findViewById(R.id.treatments_newinsulin_amount);
+
+ editInsulin.setParams(0d, 0d, maxInsulin, ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep, new DecimalFormat("0.00"), false, textWatcher);
+
+ dateButton = (TextView) view.findViewById(R.id.newinsulin_eventdate);
+ timeButton = (TextView) view.findViewById(R.id.newinsulin_eventtime);
+
+ initialEventTime = new Date();
+ eventTime = new Date(initialEventTime.getTime());
+ dateButton.setText(DateUtil.dateString(eventTime));
+ timeButton.setText(DateUtil.timeString(eventTime));
+ dateButton.setOnClickListener(this);
+ timeButton.setOnClickListener(this);
+
+/*
+ // This makes it to easy to just bolus insulinReq, which is almost always too much
+ APSResult lastAPSResult = ConfigBuilderPlugin.getActiveAPS().getLastAPSResult();
+ if (lastAPSResult != null && lastAPSResult instanceof DetermineBasalResultSMB && ((DetermineBasalResultSMB) lastAPSResult).insulinReq > 0) {
+ editInsulin.setValue(((DetermineBasalResultSMB )lastAPSResult).insulinReq);
+ }
+*/
+
+ plus1Button = (Button) view.findViewById(R.id.newinsulin_plus05);
+ plus1Button.setOnClickListener(this);
+ plus1Button.setText("+" + SP.getString(MainApp.gs(R.string.key_insulin_button_increment_1), String.valueOf(PLUS1_DEFAULT)));
+ plus2Button = (Button) view.findViewById(R.id.newinsulin_plus10);
+ plus2Button.setOnClickListener(this);
+ plus2Button.setText("+" + SP.getString(MainApp.gs(R.string.key_insulin_button_increment_2), String.valueOf(PLUS2_DEFAULT)));
+ plus3Button = (Button) view.findViewById(R.id.newinsulin_plus20);
+ plus3Button.setOnClickListener(this);
+ plus3Button.setText("+" + SP.getString(MainApp.gs(R.string.key_insulin_button_increment_3), String.valueOf(PLUS3_DEFAULT)));
+
+ startESMCheckbox = (CheckBox) view.findViewById(R.id.newinsulin_start_eating_soon_tt);
+ recordOnlyCheckbox = (CheckBox) view.findViewById(R.id.newinsulin_record_only);
+ recordOnlyCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ if (dateButton != null) dateButton.setEnabled(isChecked);
+ if (timeButton != null) timeButton.setEnabled(isChecked);
+ });
+
+ setCancelable(true);
+ getDialog().setCanceledOnTouchOutside(false);
+ return view;
+ }
+
+ @Override
+ public synchronized void onClick(View view) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(eventTime);
+ switch (view.getId()) {
+ case R.id.ok:
+ submit();
+ break;
+ case R.id.cancel:
+ dismiss();
+ break;
+ case R.id.newinsulin_eventdate:
+ DatePickerDialog dpd = DatePickerDialog.newInstance(
+ this,
+ calendar.get(Calendar.YEAR),
+ calendar.get(Calendar.MONTH),
+ calendar.get(Calendar.DAY_OF_MONTH)
+ );
+ dpd.setThemeDark(true);
+ dpd.dismissOnPause(true);
+ dpd.show(getActivity().getFragmentManager(), "Datepickerdialog");
+ break;
+ case R.id.newinsulin_eventtime:
+ TimePickerDialog tpd = TimePickerDialog.newInstance(
+ this,
+ calendar.get(Calendar.HOUR_OF_DAY),
+ calendar.get(Calendar.MINUTE),
+ DateFormat.is24HourFormat(getActivity())
+ );
+ tpd.setThemeDark(true);
+ tpd.dismissOnPause(true);
+ tpd.show(getActivity().getFragmentManager(), "Timepickerdialog");
+ break;
+ case R.id.newinsulin_start_eating_soon_tt:
+ final Profile profile = MainApp.getConfigBuilder().getProfile();
+ double tt = SP.getDouble(R.string.key_eatingsoon_target, 0d);
+ double ttBgAdd = (tt - profile.getTargetLow()) / profile.getIsf();
+ editInsulin.setValue(editInsulin.getValue() + (startESMCheckbox.isChecked() ? ttBgAdd : -ttBgAdd));
+ break;
+ case R.id.newinsulin_plus05:
+ editInsulin.setValue(editInsulin.getValue()
+ + SP.getDouble(MainApp.gs(R.string.key_insulin_button_increment_1), PLUS1_DEFAULT));
+ validateInputs();
+ break;
+ case R.id.newinsulin_plus10:
+ editInsulin.setValue(editInsulin.getValue()
+ + SP.getDouble(MainApp.gs(R.string.key_insulin_button_increment_2), PLUS2_DEFAULT));
+ validateInputs();
+ break;
+ case R.id.newinsulin_plus20:
+ editInsulin.setValue(editInsulin.getValue()
+ + SP.getDouble(MainApp.gs(R.string.key_insulin_button_increment_3), PLUS3_DEFAULT));
+ validateInputs();
+ break;
+ }
+ }
+
+ private void submit() {
+ if (okClicked){
+ log.debug("guarding: ok already clicked");
+ dismiss();
+ return;
+ }
+ okClicked = true;
+ try {
+ Double insulin = SafeParse.stringToDouble(editInsulin.getText());
+ Double insulinAfterConstraints = MainApp.getConfigBuilder().applyBolusConstraints(insulin);
+
+ String confirmMessage = "";
+ if (insulin > 0) {
+ confirmMessage += getString(R.string.bolus) + ": " + "" + insulinAfterConstraints + "U" + "";
+ if (recordOnlyCheckbox.isChecked()) {
+ confirmMessage += "
" + "Bolus will be recorded only";
+ }
+ }
+
+ if (!insulinAfterConstraints.equals(insulin))
+ confirmMessage += "
" + getString(R.string.bolusconstraintapplied) + "";
+ double prefTTDuration = SP.getDouble(R.string.key_eatingsoon_duration, 45d);
+ double ttDuration = prefTTDuration > 0 ? prefTTDuration : 45d;
+ double prefTT = SP.getDouble(R.string.key_eatingsoon_target, 80d);
+ double tt = prefTT > 0 ? prefTT : 80d;
+ if (startESMCheckbox.isChecked()) {
+ confirmMessage += "
" + "TT: " + "" + ((int) tt) + "mg/dl for " + ((int) ttDuration) + " min ";
+ }
+
+ if (!initialEventTime.equals(eventTime)) {
+ confirmMessage += "
Time: " + DateUtil.dateAndTimeString(eventTime);
+ }
+
+ final double finalInsulinAfterConstraints = insulinAfterConstraints;
+
+ final Context context = getContext();
+ final AlertDialog.Builder builder = new AlertDialog.Builder(context);
+
+ builder.setTitle(this.getContext().getString(R.string.confirmation));
+ if (confirmMessage.startsWith("
"))
+ confirmMessage = confirmMessage.substring("
".length());
+ builder.setMessage(Html.fromHtml(confirmMessage));
+ builder.setPositiveButton(getString(R.string.ok), (dialog, id) -> {
+ synchronized (builder) {
+ if (accepted) {
+ log.debug("guarding: already accepted");
+ return;
+ }
+ accepted = true;
+
+ if (startESMCheckbox.isChecked()) {
+ TempTarget tempTarget = new TempTarget();
+ tempTarget.date = System.currentTimeMillis();
+ tempTarget.durationInMinutes = (int) ttDuration;
+ tempTarget.reason = "Eating soon";
+ tempTarget.source = Source.USER;
+ tempTarget.low = (int) tt;
+ tempTarget.high = (int) tt;
+ MainApp.getDbHelper().createOrUpdate(tempTarget);
+ }
+
+ if (finalInsulinAfterConstraints <= 0.01) {
+ return;
+ }
+
+ if (recordOnlyCheckbox.isChecked()) {
+ DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
+ detailedBolusInfo.source = Source.USER;
+ detailedBolusInfo.date = eventTime.getTime();
+ detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS;
+ detailedBolusInfo.insulin = finalInsulinAfterConstraints;
+ MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
+ } else {
+ DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
+ detailedBolusInfo.eventType = CareportalEvent.CORRECTIONBOLUS;
+ detailedBolusInfo.insulin = finalInsulinAfterConstraints;
+ detailedBolusInfo.context = context;
+ detailedBolusInfo.source = Source.USER;
+ ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class);
+ i.putExtra("soundid", R.raw.boluserror);
+ i.putExtra("status", result.comment);
+ i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror));
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ MainApp.instance().startActivity(i);
+ }
+ }
+ });
+ Answers.getInstance().logCustom(new CustomEvent("Bolus"));
+ }
+ }
+ });
+ builder.setNegativeButton(getString(R.string.cancel), null);
+ builder.show();
+ dismiss();
+ } catch (Exception e) {
+ log.error("Unhandled exception", e);
+ }
+ }
+
+ @Override
+ public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
+ eventTime.setYear(year - 1900);
+ eventTime.setMonth(monthOfYear);
+ eventTime.setDate(dayOfMonth);
+ dateButton.setText(DateUtil.dateString(eventTime));
+ }
+
+ @Override
+ public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {
+ eventTime.setHours(hourOfDay);
+ eventTime.setMinutes(minute);
+ eventTime.setSeconds(second);
+ timeButton.setText(DateUtil.timeString(eventTime));
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java
index 69fbfdc149..2fd897b3aa 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java
@@ -16,7 +16,6 @@ import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import org.slf4j.Logger;
@@ -31,9 +30,9 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.data.DetailedBolusInfo;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.Source;
-import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SafeParse;
import info.nightscout.utils.ToastUtils;
@@ -176,7 +175,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
} else {
MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
}
- Answers.getInstance().logCustom(new CustomEvent("Bolus"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("Bolus"));
}
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java
index d74c9caadf..29d23050de 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java
@@ -25,7 +25,6 @@ import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -50,6 +49,7 @@ import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.DatabaseHelper;
import info.nightscout.androidaps.db.Source;
import info.nightscout.androidaps.db.TempTarget;
+import info.nightscout.androidaps.events.EventFeatureRunning;
import info.nightscout.androidaps.events.EventNewBG;
import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
@@ -57,9 +57,8 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
-import info.nightscout.androidaps.plugins.OpenAPSAMA.OpenAPSAMAPlugin;
-import info.nightscout.androidaps.plugins.OpenAPSMA.events.EventOpenAPSUpdateGui;
import info.nightscout.androidaps.queue.Callback;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.BolusWizard;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
@@ -132,6 +131,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
public void onResume() {
super.onResume();
MainApp.bus().register(this);
+ MainApp.bus().post(new EventFeatureRunning(EventFeatureRunning.Feature.WIZARD));
}
@Override
@@ -382,7 +382,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
} else {
MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
}
- Answers.getInstance().logCustom(new CustomEvent("Wizard"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("Wizard"));
}
}
}
@@ -476,7 +476,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
// COB
Double c_cob = 0d;
if (cobCheckbox.isChecked()) {
- AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData("Wizard COB");
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Wizard COB");
if(autosensData != null) {
c_cob = autosensData.cob;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
index 13b81fe8be..773482c20e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java
@@ -3,9 +3,11 @@ package info.nightscout.androidaps.plugins.Overview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.NotificationManager;
+import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
@@ -32,8 +34,6 @@ import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.jjoe64.graphview.GraphView;
import com.squareup.otto.Subscribe;
@@ -95,6 +95,8 @@ import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastA
import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus;
import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity;
+import info.nightscout.androidaps.plugins.Overview.Dialogs.NewCarbsDialog;
+import info.nightscout.androidaps.plugins.Overview.Dialogs.NewInsulinDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialog;
import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialog;
import info.nightscout.androidaps.plugins.Overview.activities.QuickWizardListActivity;
@@ -103,12 +105,14 @@ import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock;
import info.nightscout.androidaps.plugins.Overview.graphData.GraphData;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
import info.nightscout.androidaps.plugins.Overview.notifications.NotificationStore;
+import info.nightscout.androidaps.plugins.SourceDexcomG5.SourceDexcomG5Plugin;
import info.nightscout.androidaps.plugins.SourceXdrip.SourceXdripPlugin;
import info.nightscout.androidaps.plugins.Treatments.fragments.ProfileViewerDialog;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.BolusWizard;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
import info.nightscout.utils.OKDialog;
import info.nightscout.utils.Profiler;
@@ -163,10 +167,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
LinearLayoutManager llm;
LinearLayout acceptTempLayout;
+ SingleClickButton acceptTempButton;
+
SingleClickButton treatmentButton;
SingleClickButton wizardButton;
SingleClickButton calibrationButton;
- SingleClickButton acceptTempButton;
+ SingleClickButton insulinButton;
+ SingleClickButton carbsButton;
+ SingleClickButton cgmButton;
SingleClickButton quickWizardButton;
CheckBox lockScreen;
@@ -257,6 +265,12 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
treatmentButton.setOnClickListener(this);
wizardButton = (SingleClickButton) view.findViewById(R.id.overview_wizardbutton);
wizardButton.setOnClickListener(this);
+ insulinButton = (SingleClickButton) view.findViewById(R.id.overview_insulinbutton);
+ if (insulinButton != null)
+ insulinButton.setOnClickListener(this);
+ carbsButton = (SingleClickButton) view.findViewById(R.id.overview_carbsbutton);
+ if (carbsButton != null)
+ carbsButton.setOnClickListener(this);
acceptTempButton = (SingleClickButton) view.findViewById(R.id.overview_accepttempbutton);
if (acceptTempButton != null)
acceptTempButton.setOnClickListener(this);
@@ -266,6 +280,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
calibrationButton = (SingleClickButton) view.findViewById(R.id.overview_calibrationbutton);
if (calibrationButton != null)
calibrationButton.setOnClickListener(this);
+ cgmButton = (SingleClickButton) view.findViewById(R.id.overview_cgmbutton);
+ if (cgmButton != null)
+ cgmButton.setOnClickListener(this);
acceptTempLayout = (LinearLayout) view.findViewById(R.id.overview_accepttemplayout);
@@ -342,7 +359,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
log.debug("Runtime Exception", e);
}
@@ -366,7 +383,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
menu.add(MainApp.sResources.getString(R.string.suspendloopfor2h));
menu.add(MainApp.sResources.getString(R.string.suspendloopfor3h));
menu.add(MainApp.sResources.getString(R.string.suspendloopfor10h));
- if (pumpDescription.tempDurationStep <= 30)
+ if (pumpDescription.tempDurationStep15mAllowed)
+ menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor15m));
+ if (pumpDescription.tempDurationStep30mAllowed)
menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor30m));
menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor1h));
menu.add(MainApp.sResources.getString(R.string.disconnectpumpfor2h));
@@ -421,7 +440,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
activeloop.setFragmentVisible(PluginBase.LOOP, false);
MainApp.getConfigBuilder().storeSettings();
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
+ MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(true, new Callback() {
@Override
public void run() {
if (!result.success) {
@@ -429,7 +448,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
}
}
});
- NSUpload.uploadOpenAPSOffline(60); // upload 60 min, we don;t know real duration
+ NSUpload.uploadOpenAPSOffline(24 * 60); // upload 24h, we don't know real duration
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.enableloop))) {
activeloop.setFragmentEnabled(PluginBase.LOOP, true);
@@ -441,7 +460,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.resume))) {
activeloop.suspendTo(0L);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
+ MainApp.getConfigBuilder().getCommandQueue().cancelTempBasal(true, new Callback() {
@Override
public void run() {
if (!result.success) {
@@ -452,148 +471,40 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
NSUpload.uploadOpenAPSOffline(0);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor1h))) {
- activeloop.suspendTo(System.currentTimeMillis() + 60L * 60 * 1000);
+ MainApp.getConfigBuilder().suspendLoop(60);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- NSUpload.uploadOpenAPSOffline(60);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor2h))) {
- activeloop.suspendTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000);
+ MainApp.getConfigBuilder().suspendLoop(120);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- NSUpload.uploadOpenAPSOffline(120);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor3h))) {
- activeloop.suspendTo(System.currentTimeMillis() + 3 * 60L * 60 * 1000);
+ MainApp.getConfigBuilder().suspendLoop(180);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- NSUpload.uploadOpenAPSOffline(180);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.suspendloopfor10h))) {
- activeloop.suspendTo(System.currentTimeMillis() + 10 * 60L * 60 * 1000);
+ MainApp.getConfigBuilder().suspendLoop(600);
+ updateGUI("suspendmenu");
+ return true;
+ } else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor15m))) {
+ MainApp.getConfigBuilder().disconnectPump(15);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().cancelTempBasal(true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- NSUpload.uploadOpenAPSOffline(600);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor30m))) {
- activeloop.disconnectTo(System.currentTimeMillis() + 30L * 60 * 1000);
+ MainApp.getConfigBuilder().disconnectPump(30);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().tempBasalPercent(0, 30, true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- if (MainApp.getConfigBuilder().getActivePump().getPumpDescription().isExtendedBolusCapable && MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- ConfigBuilderPlugin.getCommandQueue().cancelExtended( new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.extendedbolusdeliveryerror));
- }
- }
- });
- }
- NSUpload.uploadOpenAPSOffline(30);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor1h))) {
- activeloop.disconnectTo(System.currentTimeMillis() + 1 * 60L * 60 * 1000);
+ MainApp.getConfigBuilder().disconnectPump(60);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().tempBasalPercent(0, 60, true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- if (MainApp.getConfigBuilder().getActivePump().getPumpDescription().isExtendedBolusCapable && MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- ConfigBuilderPlugin.getCommandQueue().cancelExtended( new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.extendedbolusdeliveryerror));
- }
- }
- });
- }
- NSUpload.uploadOpenAPSOffline(60);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor2h))) {
- activeloop.disconnectTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000);
+ MainApp.getConfigBuilder().disconnectPump(120);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().tempBasalPercent(0, 2 * 60, true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- if (MainApp.getConfigBuilder().getActivePump().getPumpDescription().isExtendedBolusCapable && MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- ConfigBuilderPlugin.getCommandQueue().cancelExtended( new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.extendedbolusdeliveryerror));
- }
- }
- });
- }
- NSUpload.uploadOpenAPSOffline(120);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.disconnectpumpfor3h))) {
- activeloop.disconnectTo(System.currentTimeMillis() + 3 * 60L * 60 * 1000);
+ MainApp.getConfigBuilder().disconnectPump(180);
updateGUI("suspendmenu");
- ConfigBuilderPlugin.getCommandQueue().tempBasalPercent(0, 3 * 60, true, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.tempbasaldeliveryerror));
- }
- }
- });
- if (MainApp.getConfigBuilder().getActivePump().getPumpDescription().isExtendedBolusCapable && MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- ConfigBuilderPlugin.getCommandQueue().cancelExtended( new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.extendedbolusdeliveryerror));
- }
- }
- });
- }
- NSUpload.uploadOpenAPSOffline(180);
return true;
} else if (item.getTitle().equals(MainApp.sResources.getString(R.string.careportal_profileswitch))) {
NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
@@ -612,6 +523,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
@Override
public void onClick(View v) {
+ boolean xdrip = MainApp.getSpecificPlugin(SourceXdripPlugin.class) != null && MainApp.getSpecificPlugin(SourceXdripPlugin.class).isEnabled(PluginBase.BGSOURCE);
+ boolean g5 = MainApp.getSpecificPlugin(SourceDexcomG5Plugin.class) != null && MainApp.getSpecificPlugin(SourceDexcomG5Plugin.class).isEnabled(PluginBase.BGSOURCE);
+ String units = MainApp.getConfigBuilder().getProfileUnits();
+
FragmentManager manager = getFragmentManager();
switch (v.getId()) {
case R.id.overview_accepttempbutton:
@@ -625,13 +540,36 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
wizardDialog.show(manager, "WizardDialog");
break;
case R.id.overview_calibrationbutton:
- CalibrationDialog calibrationDialog = new CalibrationDialog();
- calibrationDialog.show(manager, "CalibrationDialog");
+ if (xdrip) {
+ CalibrationDialog calibrationDialog = new CalibrationDialog();
+ calibrationDialog.show(manager, "CalibrationDialog");
+ } else if (g5) {
+ try {
+ Intent i = new Intent("com.dexcom.cgm.activities.MeterEntryActivity");
+ startActivity(i);
+ } catch (ActivityNotFoundException e) {
+ ToastUtils.showToastInUiThread(getActivity(), MainApp.gs(R.string.g5appnotdetected));
+ }
+ }
+ break;
+ case R.id.overview_cgmbutton:
+ if (xdrip)
+ openCgmApp("com.eveningoutpost.dexdrip");
+ else if (g5 && units.equals(Constants.MGDL))
+ openCgmApp("com.dexcom.cgm.region5.mgdl");
+ else if (g5 && units.equals(Constants.MMOL))
+ openCgmApp("com.dexcom.cgm.region5.mmol");
break;
case R.id.overview_treatmentbutton:
NewTreatmentDialog treatmentDialogFragment = new NewTreatmentDialog();
treatmentDialogFragment.show(manager, "TreatmentDialog");
break;
+ case R.id.overview_insulinbutton:
+ new NewInsulinDialog().show(manager, "InsulinDialog");
+ break;
+ case R.id.overview_carbsbutton:
+ new NewCarbsDialog().show(manager, "CarbsDialog");
+ break;
case R.id.overview_pumpstatus:
if (ConfigBuilderPlugin.getActivePump().isSuspended() || !ConfigBuilderPlugin.getActivePump().isInitialized())
ConfigBuilderPlugin.getCommandQueue().readStatus("RefreshClicked", null);
@@ -658,6 +596,25 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
}
+ public boolean openCgmApp(String packageName) {
+ PackageManager packageManager = getContext().getPackageManager();
+ try {
+ Intent intent = packageManager.getLaunchIntentForPackage(packageName);
+ if (intent == null) {
+ throw new ActivityNotFoundException();
+ }
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ getContext().startActivity(intent);
+ return true;
+ } catch (ActivityNotFoundException e) {
+ new AlertDialog.Builder(getContext())
+ .setMessage(R.string.error_starting_cgm)
+ .setPositiveButton("OK", null)
+ .show();
+ return false;
+ }
+ }
+
@Override
public boolean onLongClick(View v) {
switch (v.getId()) {
@@ -698,7 +655,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
scheduleUpdateGUI("onClickAcceptTemp");
}
});
- Answers.getInstance().logCustom(new CustomEvent("AcceptTemp"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("AcceptTemp"));
}
});
builder.setNegativeButton(getContext().getString(R.string.cancel), null);
@@ -814,7 +771,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
}
}
});
- Answers.getInstance().logCustom(new CustomEvent("QuickWizard"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("QuickWizard"));
}
}
}
@@ -1015,16 +972,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
return;
}
- double lowLineSetting = SP.getDouble("low_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units));
- double highLineSetting = SP.getDouble("high_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units));
-
- if (lowLineSetting < 1)
- lowLineSetting = Profile.fromMgdlToUnits(76d, units);
- if (highLineSetting < 1)
- highLineSetting = Profile.fromMgdlToUnits(180d, units);
-
- final double lowLine = lowLineSetting;
- final double highLine = highLineSetting;
+ final double lowLine = OverviewPlugin.getPlugin().determineLowLine(units);
+ final double highLine = OverviewPlugin.getPlugin().determineHighLine(units);
//Start with updating the BG as it is unaffected by loop.
// **** BG value ****
@@ -1114,14 +1063,26 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
}
}
- // **** Calibration button ****
+ // **** Calibration & CGM buttons ****
+ boolean xDripIsBgSource = MainApp.getSpecificPlugin(SourceXdripPlugin.class) != null && MainApp.getSpecificPlugin(SourceXdripPlugin.class).isEnabled(PluginBase.BGSOURCE);
+ boolean g5IsBgSource = MainApp.getSpecificPlugin(SourceDexcomG5Plugin.class) != null && MainApp.getSpecificPlugin(SourceDexcomG5Plugin.class).isEnabled(PluginBase.BGSOURCE);
+ boolean bgAvailable = DatabaseHelper.actualBg() != null;
if (calibrationButton != null) {
- if (MainApp.getSpecificPlugin(SourceXdripPlugin.class) != null && MainApp.getSpecificPlugin(SourceXdripPlugin.class).isEnabled(PluginBase.BGSOURCE) && profile != null && DatabaseHelper.actualBg() != null) {
+ if ((xDripIsBgSource || g5IsBgSource) && bgAvailable && SP.getBoolean(R.string.key_show_calibration_button, true)) {
calibrationButton.setVisibility(View.VISIBLE);
} else {
calibrationButton.setVisibility(View.GONE);
}
}
+ if (cgmButton != null) {
+ if (xDripIsBgSource && SP.getBoolean(R.string.key_show_cgm_button, false)) {
+ cgmButton.setVisibility(View.VISIBLE);
+ } else if (g5IsBgSource && SP.getBoolean(R.string.key_show_cgm_button, false)) {
+ cgmButton.setVisibility(View.VISIBLE);
+ } else {
+ cgmButton.setVisibility(View.GONE);
+ }
+ }
final TemporaryBasal activeTemp = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis());
String basalText = "";
@@ -1218,15 +1179,40 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
} else
quickWizardButton.setVisibility(View.GONE);
- // Bolus and calc button
- if (pump.isInitialized() && !pump.isSuspended()) {
- wizardButton.setVisibility(View.VISIBLE);
- treatmentButton.setVisibility(View.VISIBLE);
- } else {
- wizardButton.setVisibility(View.GONE);
- treatmentButton.setVisibility(View.GONE);
+ // **** Various treatment buttons ****
+ if (carbsButton != null) {
+ if (SP.getBoolean(R.string.key_show_carbs_button, true)
+ && !ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo ||
+ (pump.isInitialized() && !pump.isSuspended())) {
+ carbsButton.setVisibility(View.VISIBLE);
+ } else {
+ carbsButton.setVisibility(View.GONE);
+ }
}
+ if (pump.isInitialized() && !pump.isSuspended()) {
+ if (treatmentButton != null) {
+ if (SP.getBoolean(R.string.key_show_treatment_button, false)) {
+ treatmentButton.setVisibility(View.VISIBLE);
+ } else {
+ treatmentButton.setVisibility(View.GONE);
+ }
+ }
+ if (wizardButton != null) {
+ if (SP.getBoolean(R.string.key_show_wizard_button, true)) {
+ wizardButton.setVisibility(View.VISIBLE);
+ } else {
+ wizardButton.setVisibility(View.GONE);
+ }
+ }
+ if (insulinButton != null) {
+ if (SP.getBoolean(R.string.key_show_insulin_button, true)) {
+ insulinButton.setVisibility(View.VISIBLE);
+ } else {
+ insulinButton.setVisibility(View.GONE);
+ }
+ }
+ }
// **** BG value ****
if (lastBG == null) { //left this here as it seems you want to exit at this point if it is null...
@@ -1276,7 +1262,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
// cob
if (cobView != null) { // view must not exists
String cobText = "";
- AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData("Overview COB");
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Overview COB");
if (autosensData != null)
cobText = (int) autosensData.cob + " g";
cobView.setText(cobText);
@@ -1362,7 +1348,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
// ------------------ 1st graph
Profiler.log(log, from + " - 1st graph - START", updateGUIStart);
- final GraphData graphData = new GraphData(bgGraph);
+ final GraphData graphData = new GraphData(bgGraph, IobCobCalculatorPlugin.getPlugin());
// **** In range Area ****
graphData.addInRangeArea(fromTime, endTime, lowLine, highLine);
@@ -1384,13 +1370,16 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
graphData.addBasals(fromTime, now, lowLine / graphData.maxY / 1.2d);
}
+ // add target line
+ graphData.addTargetLine(fromTime, toTime);
+
// **** NOW line ****
graphData.addNowLine(now);
// ------------------ 2nd graph
Profiler.log(log, from + " - 2nd graph - START", updateGUIStart);
- final GraphData secondGraphData = new GraphData(iobGraph);
+ final GraphData secondGraphData = new GraphData(iobGraph, IobCobCalculatorPlugin.getPlugin());
boolean useIobForScale = false;
boolean useCobForScale = false;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java
index eb31ae66ed..8b276f937d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewPlugin.java
@@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.QuickWizard;
import info.nightscout.androidaps.events.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.PluginBase;
@@ -26,7 +27,6 @@ public class OverviewPlugin implements PluginBase {
private static OverviewPlugin overviewPlugin = new OverviewPlugin();
public static OverviewPlugin getPlugin() {
-
if (overviewPlugin == null)
overviewPlugin = new OverviewPlugin();
return overviewPlugin;
@@ -92,7 +92,7 @@ public class OverviewPlugin implements PluginBase {
@Override
public boolean showInList(int type) {
- return false;
+ return true;
}
@Override
@@ -107,7 +107,7 @@ public class OverviewPlugin implements PluginBase {
@Override
public int getPreferencesId() {
- return -1;
+ return R.xml.pref_overview;
}
@Override
@@ -128,4 +128,34 @@ public class OverviewPlugin implements PluginBase {
MainApp.bus().post(new EventRefreshOverview("EventDismissNotification"));
}
+ public double determineHighLine() {
+ Profile profile = MainApp.getConfigBuilder().getProfile();
+ if (profile == null) {
+ return bgTargetHigh;
+ }
+ return determineHighLine(profile.getUnits());
+ }
+
+ public double determineHighLine(String units) {
+ double highLineSetting = SP.getDouble("high_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetHigh, units));
+ if (highLineSetting < 1)
+ highLineSetting = Profile.fromMgdlToUnits(180d, units);
+ return highLineSetting;
+ }
+
+ public double determineLowLine() {
+ Profile profile = MainApp.getConfigBuilder().getProfile();
+ if (profile == null) {
+ return bgTargetLow;
+ }
+ return determineLowLine(profile.getUnits());
+ }
+
+ public double determineLowLine(String units) {
+ double lowLineSetting = SP.getDouble("low_mark", Profile.fromMgdlToUnits(OverviewPlugin.bgTargetLow, units));
+ if (lowLineSetting < 1)
+ lowLineSetting = Profile.fromMgdlToUnits(76d, units);
+ return lowLineSetting;
+ }
+
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java
index e0fd53a1fd..080dec4bd2 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/events/EventOverviewBolusProgress.java
@@ -16,6 +16,10 @@ public class EventOverviewBolusProgress extends Event {
public EventOverviewBolusProgress() {
}
+ public boolean isSMB(){
+ return (t != null) && t.isSMB;
+ }
+
public static EventOverviewBolusProgress getInstance() {
if(eventOverviewBolusProgress == null) {
eventOverviewBolusProgress = new EventOverviewBolusProgress();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java
index f6cd2eecdc..02bb1a7b3d 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java
@@ -22,12 +22,14 @@ import info.nightscout.androidaps.db.BgReading;
import info.nightscout.androidaps.db.CareportalEvent;
import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.db.ProfileSwitch;
+import info.nightscout.androidaps.db.TempTarget;
import info.nightscout.androidaps.db.Treatment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData;
import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.IobCobCalculator.BasalData;
import info.nightscout.androidaps.plugins.Loop.APSResult;
+import info.nightscout.androidaps.plugins.Loop.LoopPlugin;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.AreaGraphSeries;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.DoubleDataPoint;
@@ -36,6 +38,7 @@ import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLab
import info.nightscout.androidaps.plugins.Overview.graphExtensions.Scale;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.ScaledDataPoint;
import info.nightscout.androidaps.plugins.Overview.graphExtensions.TimeAsXAxisLabelFormatter;
+import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
import info.nightscout.utils.Round;
/**
@@ -50,9 +53,12 @@ public class GraphData {
private String units;
private List series = new ArrayList<>();
- public GraphData(GraphView graph) {
+ private IobCobCalculatorPlugin iobCobCalculatorPlugin;
+
+ public GraphData(GraphView graph, IobCobCalculatorPlugin iobCobCalculatorPlugin) {
units = MainApp.getConfigBuilder().getProfileUnits();
this.graph = graph;
+ this.iobCobCalculatorPlugin = iobCobCalculatorPlugin;
}
public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, APSResult apsResult) {
@@ -126,7 +132,7 @@ public class GraphData {
double lastBaseBasal = 0;
double lastTempBasal = 0;
for (long time = fromTime; time < toTime; time += 60 * 1000L) {
- BasalData basalData = IobCobCalculatorPlugin.getBasalData(time);
+ BasalData basalData = IobCobCalculatorPlugin.getPlugin().getBasalData(time);
double baseBasalValue = basalData.basal;
double absoluteLineValue = baseBasalValue;
double tempBasalValue = 0;
@@ -215,6 +221,54 @@ public class GraphData {
addSeries(absoluteBasalsLineSeries);
}
+ public void addTargetLine(long fromTime, long toTime) {
+ Profile profile = MainApp.getConfigBuilder().getProfile();
+ if (profile == null) {
+ return;
+ }
+
+ LineGraphSeries targetsSeries;
+
+ Scale targetsScale = new Scale();
+ targetsScale.setMultiplier(1);
+
+ List targetsSeriesArray = new ArrayList<>();
+ double lastTarget = 0;
+
+ if (LoopPlugin.lastRun != null && LoopPlugin.lastRun.constraintsProcessed != null) {
+ APSResult apsResult = LoopPlugin.lastRun.constraintsProcessed;
+ long latestPredictionsTime = apsResult.getLatestPredictionsTime();
+ if (latestPredictionsTime > toTime) {
+ toTime = latestPredictionsTime;
+ }
+ }
+
+ for (long time = fromTime; time < toTime; time += 60 * 1000L) {
+ TempTarget tt = TreatmentsPlugin.getPlugin().getTempTargetFromHistory(time);
+ double value;
+ if (tt == null) {
+ value = (profile.getTargetLow(time) + profile.getTargetHigh(time)) / 2;
+ } else {
+ value = (tt.low + tt.high) / 2;
+ }
+ if (lastTarget > 0 && lastTarget != value) {
+ targetsSeriesArray.add(new DataPoint(time, lastTarget));
+ }
+ lastTarget = value;
+
+ targetsSeriesArray.add(new DataPoint(time, value));
+ }
+
+ DataPoint[] targets = new DataPoint[targetsSeriesArray.size()];
+ targets = targetsSeriesArray.toArray(targets);
+ targetsSeries = new LineGraphSeries<>(targets);
+ targetsSeries.setDrawBackground(false);
+ targetsSeries.setColor(MainApp.sResources.getColor(R.color.tempTargetBackground));
+ targetsSeries.setThickness(2);
+
+ addSeries(targetsSeries);
+ }
+
public void addTreatments(long fromTime, long endTime) {
List filteredTreatments = new ArrayList<>();
@@ -284,7 +338,7 @@ public class GraphData {
Scale iobScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- double iob = IobCobCalculatorPlugin.calculateFromTreatmentsAndTempsSynchronized(time).iob;
+ double iob = IobCobCalculatorPlugin.getPlugin().calculateFromTreatmentsAndTempsSynchronized(time).iob;
if (Math.abs(lastIob - iob) > 0.02) {
if (Math.abs(lastIob - iob) > 0.2)
iobArray.add(new ScaledDataPoint(time, lastIob, iobScale));
@@ -319,7 +373,7 @@ public class GraphData {
Scale cobScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
if (autosensData != null) {
int cob = (int) autosensData.cob;
if (cob != lastCob) {
@@ -366,7 +420,7 @@ public class GraphData {
Scale devScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
if (autosensData != null) {
int color = Color.BLACK; // "="
if (autosensData.pastSensitivity.equals("C")) color = Color.GRAY;
@@ -404,7 +458,7 @@ public class GraphData {
Scale ratioScale = new Scale(-1d);
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
if (autosensData != null) {
ratioArray.add(new ScaledDataPoint(time, autosensData.autosensRatio, ratioScale));
maxRatioValueFound = Math.max(maxRatioValueFound, Math.abs(autosensData.autosensRatio));
@@ -438,7 +492,7 @@ public class GraphData {
Scale dsMinScale = new Scale();
for (long time = fromTime; time <= toTime; time += 5 * 60 * 1000L) {
- AutosensData autosensData = IobCobCalculatorPlugin.getAutosensData(time);
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getAutosensData(time);
if (autosensData != null) {
dsMaxArray.add(new ScaledDataPoint(time, autosensData.slopeFromMaxDeviation, dsMaxScale));
dsMinArray.add(new ScaledDataPoint(time, autosensData.slopeFromMinDeviation, dsMinScale));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java
index 1ce92249f7..aa61b48097 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationStore.java
@@ -21,8 +21,6 @@ import java.util.List;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.Services.AlarmSoundService;
-import info.nightscout.androidaps.plugins.Wear.WearPlugin;
-//Added by Rumen for snooze time
import info.nightscout.utils.SP;
/**
@@ -44,16 +42,12 @@ public class NotificationStore {
}
}
- public Notification get(int index) {
- return store.get(index);
- }
-
- public void add(Notification n) {
+ public synchronized void add(Notification n) {
log.info("Notification received: " + n.text);
- for (int i = 0; i < store.size(); i++) {
- if (get(i).id == n.id) {
- get(i).date = n.date;
- get(i).validTo = n.validTo;
+ for (Notification storeNotification : store) {
+ if (storeNotification.id == n.id) {
+ storeNotification.date = n.date;
+ storeNotification.validTo = n.validTo;
return;
}
}
@@ -72,6 +66,44 @@ public class NotificationStore {
Collections.sort(store, new NotificationComparator());
}
+ public synchronized boolean remove(int id) {
+ for (int i = 0; i < store.size(); i++) {
+ if (store.get(i).id == id) {
+ if (store.get(i).soundId != null) {
+ Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class);
+ MainApp.instance().stopService(alarm);
+ }
+ store.remove(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public synchronized void removeExpired() {
+ for (int i = 0; i < store.size(); i++) {
+ Notification n = store.get(i);
+ if (n.validTo.getTime() != 0 && n.validTo.getTime() < System.currentTimeMillis()) {
+ store.remove(i);
+ i--;
+ }
+ }
+ }
+
+ public void snoozeTo(long timeToSnooze) {
+ log.debug("Snoozing alarm until: " + timeToSnooze);
+ SP.putLong("snoozedTo", timeToSnooze);
+ }
+
+ public void unSnooze() {
+ if (Notification.isAlarmForStaleData()) {
+ Notification notification = new Notification(Notification.NSALARM, MainApp.sResources.getString(R.string.nsalarm_staledata), Notification.URGENT);
+ SP.putLong("snoozedTo", System.currentTimeMillis());
+ add(notification);
+ log.debug("Snoozed to current time and added back notification!");
+ }
+ }
+
private void raiseSystemNotification(Notification n) {
Context context = MainApp.instance().getApplicationContext();
NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
@@ -95,42 +127,4 @@ public class NotificationStore {
}
mgr.notify(n.id, notificationBuilder.build());
}
-
- public boolean remove(int id) {
- for (int i = 0; i < store.size(); i++) {
- if (get(i).id == id) {
- if (get(i).soundId != null) {
- Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class);
- MainApp.instance().stopService(alarm);
- }
- store.remove(i);
- return true;
- }
- }
- return false;
- }
-
- public void removeExpired() {
- for (int i = 0; i < store.size(); i++) {
- Notification n = get(i);
- if (n.validTo.getTime() != 0 && n.validTo.getTime() < System.currentTimeMillis()) {
- store.remove(i);
- i--;
- }
- }
- }
-
- public void snoozeTo(long timeToSnooze) {
- log.debug("Snoozing alarm until: " + timeToSnooze);
- SP.putLong("snoozedTo", timeToSnooze);
- }
-
- public void unSnooze() {
- if (Notification.isAlarmForStaleData()) {
- Notification notification = new Notification(Notification.NSALARM, MainApp.sResources.getString(R.string.nsalarm_staledata), Notification.URGENT);
- SP.putLong("snoozedTo", System.currentTimeMillis());
- add(notification);
- log.debug("Snoozed to current time and added back notification!");
- }
- }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java
deleted file mode 100644
index 74b400e1af..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfileFragment.java
+++ /dev/null
@@ -1,546 +0,0 @@
-package info.nightscout.androidaps.plugins.ProfileCircadianPercentage;
-
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.design.widget.Snackbar;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.content.ContextCompat;
-import android.text.Editable;
-import android.text.Html;
-import android.text.TextWatcher;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.RadioButton;
-import android.widget.TextView;
-
-import com.andreabaccega.widget.FormEditText;
-import com.squareup.otto.Subscribe;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.events.EventInitializationChanged;
-import info.nightscout.androidaps.events.EventProfileSwitchChange;
-import info.nightscout.androidaps.plugins.Careportal.CareportalFragment;
-import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
-import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
-import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
-import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
-import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.SafeParse;
-
-public class CircadianPercentageProfileFragment extends SubscriberFragment {
- private static Logger log = LoggerFactory.getLogger(CircadianPercentageProfileFragment.class);
-
- private static CircadianPercentageProfilePlugin circadianPercentageProfilePlugin = new CircadianPercentageProfilePlugin();
- private Object snackbarCaller;
-
- public static CircadianPercentageProfilePlugin getPlugin() {
- return circadianPercentageProfilePlugin;
- }
-
- FormEditText diaView;
- RadioButton mgdlView;
- RadioButton mmolView;
- FormEditText targetlowView;
- FormEditText targethighView;
- FormEditText percentageView;
- FormEditText timeshiftView;
- TextView profileView;
- TextView baseprofileIC;
- TextView baseprofileBasal;
- LinearLayout baseprofileBasalLayout;
- TextView baseprofileISF;
- Button profileswitchButton;
- ImageView percentageIcon;
- ImageView timeIcon;
- ImageView basaleditIcon;
- ImageView iceditIcon;
- ImageView isfeditIcon;
- BasalEditDialog basalEditDialog;
- FrameLayout fl;
- Snackbar mSnackBar;
-
- static Boolean percentageViewHint = true;
- static Boolean timeshiftViewHint = true;
-
- TextWatcher textWatch = new TextWatcher() {
-
- @Override
- public void afterTextChanged(Editable s) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
-
- if (percentageView.testValidity()) {
- if (SafeParse.stringToInt(percentageView.getText().toString()) == 0) {
- circadianPercentageProfilePlugin.percentage = 100;
- } else {
- circadianPercentageProfilePlugin.percentage = SafeParse.stringToInt(percentageView.getText().toString());
- }
- updateProfileInfo();
- }
- if (timeshiftView.testValidity()) {
- circadianPercentageProfilePlugin.timeshift = SafeParse.stringToInt(timeshiftView.getText().toString());
- updateProfileInfo();
- }
- if (diaView.testValidity()) {
- circadianPercentageProfilePlugin.dia = SafeParse.stringToDouble(diaView.getText().toString());
- updateProfileInfo();
- }
- if (targethighView.testValidity()) {
- circadianPercentageProfilePlugin.targetLow = SafeParse.stringToDouble(targetlowView.getText().toString());
- updateProfileInfo();
- }
- if (targetlowView.testValidity()) {
- circadianPercentageProfilePlugin.targetHigh = SafeParse.stringToDouble(targethighView.getText().toString());
- updateProfileInfo();
- }
- circadianPercentageProfilePlugin.storeSettings();
- updateProfileInfo();
- }
- };
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- showDeprecatedDialog();
-
- View layout = inflater.inflate(R.layout.circadianpercentageprofile_fragment, container, false);
- fl = (FrameLayout) layout.findViewById(R.id.circadianpercentageprofile_framelayout);
- fl.requestFocusFromTouch();
- diaView = (FormEditText) layout.findViewById(R.id.circadianpercentageprofile_dia);
- mgdlView = (RadioButton) layout.findViewById(R.id.circadianpercentageprofile_mgdl);
- mmolView = (RadioButton) layout.findViewById(R.id.circadianpercentageprofile_mmol);
- targetlowView = (FormEditText) layout.findViewById(R.id.circadianpercentageprofile_targetlow);
- targethighView = (FormEditText) layout.findViewById(R.id.circadianpercentageprofile_targethigh);
- percentageView = (FormEditText) layout.findViewById(R.id.circadianpercentageprofile_percentage);
- timeshiftView = (FormEditText) layout.findViewById(R.id.circadianpercentageprofile_timeshift);
- profileView = (TextView) layout.findViewById(R.id.circadianpercentageprofile_profileview);
- baseprofileBasal = (TextView) layout.findViewById(R.id.circadianpercentageprofile_baseprofilebasal);
- baseprofileBasalLayout = (LinearLayout) layout.findViewById(R.id.circadianpercentageprofile_baseprofilebasal_layout);
- baseprofileIC = (TextView) layout.findViewById(R.id.circadianpercentageprofile_baseprofileic);
- baseprofileISF = (TextView) layout.findViewById(R.id.circadianpercentageprofile_baseprofileisf);
- percentageIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_percentageicon);
- timeIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_timeicon);
- profileswitchButton = (Button) layout.findViewById(R.id.circadianpercentageprofile_profileswitch);
-
- basaleditIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_basaledit);
- iceditIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_icedit);
- isfeditIcon = (ImageView) layout.findViewById(R.id.circadianpercentageprofile_isfedit);
-
- if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().isTempBasalCapable) {
- layout.findViewById(R.id.circadianpercentageprofile_baseprofilebasal_layout).setVisibility(View.GONE);
- }
-
- mgdlView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- circadianPercentageProfilePlugin.mgdl = mgdlView.isChecked();
- circadianPercentageProfilePlugin.mmol = !circadianPercentageProfilePlugin.mgdl;
- mmolView.setChecked(circadianPercentageProfilePlugin.mmol);
- circadianPercentageProfilePlugin.storeSettings();
- updateProfileInfo();
- }
- });
- mmolView.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- circadianPercentageProfilePlugin.mmol = mmolView.isChecked();
- circadianPercentageProfilePlugin.mgdl = !circadianPercentageProfilePlugin.mmol;
- mgdlView.setChecked(circadianPercentageProfilePlugin.mgdl);
- circadianPercentageProfilePlugin.storeSettings();
- updateProfileInfo();
- }
- });
-
- profileswitchButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- NewNSTreatmentDialog newDialog = new NewNSTreatmentDialog();
- final OptionsToShow profileswitch = CareportalFragment.PROFILESWITCHDIRECT;
- profileswitch.executeProfileSwitch = true;
- newDialog.setOptions(profileswitch, R.string.careportal_profileswitch);
- newDialog.show(getFragmentManager(), "NewNSTreatmentDialog");
- }
- });
-
- timeIcon.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- timeshiftView.requestFocusFromTouch();
- timeshiftView.setSelection(timeshiftView.getText().length());
- ((InputMethodManager) getContext()
- .getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(timeshiftView, InputMethodManager.SHOW_IMPLICIT);
- }
- });
-
- percentageIcon.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- percentageView.requestFocusFromTouch();
- percentageView.setSelection(percentageView.getText().length());
- ((InputMethodManager) getContext()
- .getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(percentageView, InputMethodManager.SHOW_IMPLICIT);
- }
- });
-
- basaleditIcon.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- basalEditDialog = new BasalEditDialog();
- basalEditDialog.setup(getPlugin().basebasal, getString(R.string.edit_base_basal), CircadianPercentageProfileFragment.this);
- basalEditDialog.show(getFragmentManager(), getString(R.string.edit_base_basal));
- }
- });
-
- isfeditIcon.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- basalEditDialog = new BasalEditDialog();
- basalEditDialog.setup(getPlugin().baseisf, getString(R.string.edit_base_isf), CircadianPercentageProfileFragment.this);
- basalEditDialog.show(getFragmentManager(), getString(R.string.edit_base_isf));
- }
- });
-
- iceditIcon.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- basalEditDialog = new BasalEditDialog();
- basalEditDialog.setup(getPlugin().baseic, getString(R.string.edit_base_ic), CircadianPercentageProfileFragment.this);
- basalEditDialog.show(getFragmentManager(), getString(R.string.edit_base_ic));
- }
- });
-
- /*timeshiftView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- if (!hasFocus) {
- if(mSnackBar!=null && snackbarCaller == timeshiftView){
- mSnackBar.dismiss();
- }
- timeshiftView.clearFocus();
- fl.requestFocusFromTouch();
- }
- else {
- if (timeshiftViewHint) {
- customSnackbar(view, getString(R.string.timeshift_hint), timeshiftView);
- }
- }
- }
- });
-
- percentageView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- if (!hasFocus) {
- if(mSnackBar!=null && snackbarCaller == percentageView){
- mSnackBar.dismiss();
- }
- percentageView.clearFocus();
- fl.requestFocusFromTouch();
- }
- else {
- if (percentageViewHint) {
- customSnackbar(view, getString(R.string.percentagefactor_hint), percentageView);
- }
- }
- }
- });*/
-
- diaView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- if (!hasFocus) {
- diaView.clearFocus();
- fl.requestFocusFromTouch();
- }
- }
- });
-
- targethighView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- if (!hasFocus) {
- targethighView.clearFocus();
- fl.requestFocusFromTouch();
- }
- }
- });
-
- targetlowView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
-
- @Override
- public void onFocusChange(View view, boolean hasFocus) {
- if (!hasFocus) {
- targetlowView.clearFocus();
- fl.requestFocusFromTouch();
- }
- }
- });
-
-
- diaView.addTextChangedListener(textWatch);
- targetlowView.addTextChangedListener(textWatch);
- targethighView.addTextChangedListener(textWatch);
- percentageView.addTextChangedListener(textWatch);
- timeshiftView.addTextChangedListener(textWatch);
-
- updateGUI();
-
- onStatusEvent(new EventInitializationChanged());
-
- return layout;
- }
-
- private void showDeprecatedDialog() {
- AlertDialog.Builder adb = new AlertDialog.Builder(getContext());
- adb.setTitle("DEPRECATED! Please migrate!");
- adb.setMessage("CircadianPercentageProfile has been deprecated. " +
- "It is recommended to migrate to LocalProfile.\n\n" +
- "Good news: You won't lose any functionality! Percentage and Timeshift have been ported to the ProfileSwitch :) \n\n " +
- "How to migrate:\n" +
- "1) Press MIGRATE, the system will automatically fill the LocalProfile for you.\n" +
- "2) Switch to LocalProfile in the ConfigBuilder\n" +
- "3) CHECK that all settings are correct in the LocalProfile!!!");
- adb.setIcon(android.R.drawable.ic_dialog_alert);
- adb.setPositiveButton("MIGRATE", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- CircadianPercentageProfilePlugin.migrateToLP();
- }
- });
- adb.setNegativeButton("Cancel", null);
- adb.show();
- }
-
- public void updateGUI() {
- updateProfileInfo();
-
- diaView.removeTextChangedListener(textWatch);
- targetlowView.removeTextChangedListener(textWatch);
- targethighView.removeTextChangedListener(textWatch);
- percentageView.removeTextChangedListener(textWatch);
- timeshiftView.removeTextChangedListener(textWatch);
-
- mgdlView.setChecked(circadianPercentageProfilePlugin.mgdl);
- mmolView.setChecked(circadianPercentageProfilePlugin.mmol);
- diaView.setText(circadianPercentageProfilePlugin.dia.toString());
- targetlowView.setText(circadianPercentageProfilePlugin.targetLow.toString());
- targethighView.setText(circadianPercentageProfilePlugin.targetHigh.toString());
- percentageView.setText("" + circadianPercentageProfilePlugin.percentage);
- timeshiftView.setText("" + circadianPercentageProfilePlugin.timeshift);
-
-
- diaView.addTextChangedListener(textWatch);
- targetlowView.addTextChangedListener(textWatch);
- targethighView.addTextChangedListener(textWatch);
- percentageView.addTextChangedListener(textWatch);
- timeshiftView.addTextChangedListener(textWatch);
-
- }
-
- private void customSnackbar(View view, final String Msg, Object snackbarCaller) {
- if (mSnackBar != null) mSnackBar.dismiss();
-
- this.snackbarCaller = snackbarCaller;
- if (timeshiftViewHint || percentageViewHint) {
- //noinspection WrongConstant
- mSnackBar = Snackbar.make(view, Msg, 7000)
- .setActionTextColor(ContextCompat.getColor(MainApp.instance(), R.color.notificationInfo))
- .setAction(getString(R.string.dont_show_again), new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (Msg.equals(getString(R.string.percentagefactor_hint))) {
- percentageViewHint = false;
- } else if (Msg.equals(getString(R.string.timeshift_hint))) {
- timeshiftViewHint = false;
- }
- }
- });
- view = mSnackBar.getView();
- FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams();
- params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
- view.setLayoutParams(params);
- view.setBackgroundColor(ContextCompat.getColor(MainApp.instance(), R.color.cardview_dark_background));
- TextView mainTextView = (TextView) (view).findViewById(android.support.design.R.id.snackbar_text);
- mainTextView.setTextColor(ContextCompat.getColor(MainApp.instance(), R.color.mdtp_white));
- mSnackBar.show();
- }
- }
-
- private void updateProfileInfo() {
- StringBuilder sb = new StringBuilder();
- sb.append("");
- sb.append(getString(R.string.nsprofileview_activeprofile_label));
- sb.append("
");
- sb.append("");
- sb.append(getString(R.string.nsprofileview_basal_label));
- sb.append(" ( ∑");
- sb.append(DecimalFormatter.to2Decimal(circadianPercentageProfilePlugin.percentageBasalSum()));
- sb.append("U )");
- sb.append("
" + circadianPercentageProfilePlugin.basalString());
- sb.append("");
- sb.append(getString(R.string.nsprofileview_ic_label));
- sb.append("
" + circadianPercentageProfilePlugin.icString());
- sb.append("");
- sb.append(getString(R.string.nsprofileview_isf_label));
- sb.append("
" + circadianPercentageProfilePlugin.isfString());
- profileView.setText(Html.fromHtml(sb.toString()));
-
- baseprofileBasal.setText(Html.fromHtml("" + getString(R.string.base_profile_label) + " ( ∑" + DecimalFormatter.to2Decimal(circadianPercentageProfilePlugin.baseBasalSum()) + "U )
" +
- "" + getString(R.string.nsprofileview_basal_label) + "
" + circadianPercentageProfilePlugin.baseBasalString()));
- baseprofileIC.setText(Html.fromHtml("" + getString(R.string.nsprofileview_ic_label) + "
" + circadianPercentageProfilePlugin.baseIcString()));
- baseprofileISF.setText(Html.fromHtml("" + getString(R.string.nsprofileview_isf_label) + "
" + circadianPercentageProfilePlugin.baseIsfString()));
- }
-
- @Override
- public void onStop() {
- super.onStop();
- if (basalEditDialog != null && basalEditDialog.isVisible()) {
- basalEditDialog.dismiss();
- }
- basalEditDialog = null;
- fl.requestFocusFromTouch();
- }
-
- public static class BasalEditDialog extends DialogFragment {
-
- private double[] values;
- private String title;
- private CircadianPercentageProfileFragment fragment;
-
- public void setup(double[] values, String title, CircadianPercentageProfileFragment fragment) {
- this.values = values;
- this.title = title;
- this.fragment = fragment;
- }
-
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- getDialog().setTitle(title);
- View view = inflater.inflate(R.layout.circadianpercentageprofile_editbasal_dialog, container, false);
- LinearLayout list = (LinearLayout) view.findViewById(R.id.circadianpp_editbasal_listlayout);
- final EditText[] editTexts = new EditText[24];
- for (int i = 0; i < 24; i++) {
- View childview = inflater.inflate(R.layout.circadianpercentageprofile_listelement, container, false);
- ((TextView) childview.findViewById(R.id.basal_time_elem)).setText((i < 10 ? "0" : "") + i + ":00: ");
-
- ImageView copyprevbutton = (ImageView) childview.findViewById(R.id.basal_copyprev_elem);
-
- if (i == 0) {
- copyprevbutton.setVisibility(View.INVISIBLE);
- } else {
- final int j = i; //needs to be final to be passed to inner class.
- copyprevbutton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- editTexts[j].setText(editTexts[j - 1].getText());
- }
- });
- }
-
- editTexts[i] = ((EditText) childview.findViewById(R.id.basal_edittext_elem));
- editTexts[i].setText(DecimalFormatter.to2Decimal(values[i]));
- list.addView(childview);
- }
- getDialog().setCancelable(true);
-
- view.findViewById(R.id.ok_button).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- for (int i = 0; i < 24; i++) {
- if (editTexts[i].getText().length() != 0) {
- values[i] = SafeParse.stringToDouble(editTexts[i].getText().toString());
- }
- }
- fragment.updateProfileInfo();
- getPlugin().storeSettings();
- dismiss();
- }
- });
-
- view.findViewById(R.id.cancel_action).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- dismiss();
- }
- });
-
- return view;
- }
- }
-
- @Override
- public void onPause() {
- super.onPause();
-
- if (basalEditDialog != null && basalEditDialog.isVisible()) {
- basalEditDialog.dismiss();
- }
- basalEditDialog = null;
-
- fl.requestFocusFromTouch();
- }
-
- @Override
- public void onResume() {
- super.onResume();
- onStatusEvent(new EventInitializationChanged());
- fl.requestFocusFromTouch();
- }
-
- @Subscribe
- public void onStatusEvent(final EventInitializationChanged e) {
- Activity activity = getActivity();
- if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (!ConfigBuilderPlugin.getActivePump().isInitialized() || ConfigBuilderPlugin.getActivePump().isSuspended()) {
- profileswitchButton.setVisibility(View.GONE);
- } else {
- profileswitchButton.setVisibility(View.VISIBLE);
- }
- }
- });
- }
-
- @Subscribe
- public void onStatusEvent(final EventProfileSwitchChange e) {
- Activity activity = getActivity();
- if (activity != null)
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- updateGUI();
- }
- });
- }
-
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java
deleted file mode 100644
index ec9c6d1e40..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileCircadianPercentage/CircadianPercentageProfilePlugin.java
+++ /dev/null
@@ -1,455 +0,0 @@
-package info.nightscout.androidaps.plugins.ProfileCircadianPercentage;
-
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.text.DecimalFormat;
-
-import info.nightscout.androidaps.Config;
-import info.nightscout.androidaps.Constants;
-import info.nightscout.androidaps.MainApp;
-import info.nightscout.androidaps.R;
-import info.nightscout.androidaps.data.Profile;
-import info.nightscout.androidaps.data.ProfileStore;
-import info.nightscout.androidaps.interfaces.PluginBase;
-import info.nightscout.androidaps.interfaces.ProfileInterface;
-import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog;
-import info.nightscout.androidaps.plugins.ProfileLocal.LocalProfilePlugin;
-import info.nightscout.utils.DecimalFormatter;
-import info.nightscout.utils.NSUpload;
-import info.nightscout.utils.SP;
-import info.nightscout.utils.SafeParse;
-import info.nightscout.utils.ToastUtils;
-
-/**
- * Created by Adrian on 12.11.2016.
- * Based on SimpleProfile created by mike on 05.08.2016.
- */
-public class CircadianPercentageProfilePlugin implements PluginBase, ProfileInterface {
- public static final String SETTINGS_PREFIX = "CircadianPercentageProfile";
- private static Logger log = LoggerFactory.getLogger(CircadianPercentageProfilePlugin.class);
-
- private boolean fragmentEnabled = false;
- private boolean fragmentVisible = false;
-
- private static ProfileStore convertedProfile = null;
- private static String convertedProfileName = null;
-
- boolean mgdl;
- boolean mmol;
- Double dia;
- Double targetLow;
- Double targetHigh;
- public int percentage;
- public int timeshift;
- double[] basebasal = new double[]{1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d, 1d};
- double[] baseisf = new double[]{35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d, 35d};
- double[] baseic = new double[]{4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d, 4d};
-
- public CircadianPercentageProfilePlugin() {
- loadSettings();
- }
-
- @Override
- public String getFragmentClass() {
- return CircadianPercentageProfileFragment.class.getName();
- }
-
- @Override
- public int getType() {
- return PluginBase.PROFILE;
- }
-
- @Override
- public String getName() {
- return MainApp.instance().getString(R.string.circadian_percentage_profile);
- }
-
- @Override
- public String getNameShort() {
- String name = MainApp.sResources.getString(R.string.circadian_percentage_profile_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 == PROFILE && fragmentEnabled;
- }
-
- @Override
- public boolean isVisibleInTabs(int type) {
- return type == PROFILE && fragmentVisible;
- }
-
- @Override
- public boolean canBeHidden(int type) {
- return true;
- }
-
- @Override
- public boolean hasFragment() {
- return true;
- }
-
- @Override
- public boolean showInList(int type) {
- return true;
- }
-
- @Override
- public void setFragmentEnabled(int type, boolean fragmentEnabled) {
- if (type == PROFILE) this.fragmentEnabled = fragmentEnabled;
- }
-
- @Override
- public void setFragmentVisible(int type, boolean fragmentVisible) {
- if (type == PROFILE) this.fragmentVisible = fragmentVisible;
- }
-
- @Override
- public int getPreferencesId() {
- return -1;
- }
-
- void storeSettings() {
- if (Config.logPrefsChange)
- log.debug("Storing settings");
- SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
- SharedPreferences.Editor editor = settings.edit();
- editor.putBoolean(SETTINGS_PREFIX + "mmol", mmol);
- editor.putBoolean(SETTINGS_PREFIX + "mgdl", mgdl);
- editor.putString(SETTINGS_PREFIX + "dia", dia.toString());
- editor.putString(SETTINGS_PREFIX + "targetlow", targetLow.toString());
- editor.putString(SETTINGS_PREFIX + "targethigh", targetHigh.toString());
- editor.putString(SETTINGS_PREFIX + "timeshift", timeshift + "");
- editor.putString(SETTINGS_PREFIX + "percentage", percentage + "");
-
-
- for (int i = 0; i < 24; i++) {
- editor.putString(SETTINGS_PREFIX + "basebasal" + i, DecimalFormatter.to2Decimal(basebasal[i]));
- editor.putString(SETTINGS_PREFIX + "baseisf" + i, DecimalFormatter.to2Decimal(baseisf[i]));
- editor.putString(SETTINGS_PREFIX + "baseic" + i, DecimalFormatter.to2Decimal(baseic[i]));
- }
- editor.commit();
- createConvertedProfile();
- }
-
- void loadSettings() {
- if (Config.logPrefsChange)
- log.debug("Loading stored settings");
-
- mgdl = SP.getBoolean(SETTINGS_PREFIX + "mgdl", true);
- mmol = SP.getBoolean(SETTINGS_PREFIX + "mmol", false);
- dia = SP.getDouble(SETTINGS_PREFIX + "dia", Constants.defaultDIA);
- targetLow = SP.getDouble(SETTINGS_PREFIX + "targetlow", 80d);
- targetHigh = SP.getDouble(SETTINGS_PREFIX + "targethigh", 120d);
- percentage = SP.getInt(SETTINGS_PREFIX + "percentage", 100);
- timeshift = SP.getInt(SETTINGS_PREFIX + "timeshift", 0);
-
- for (int i = 0; i < 24; i++) {
- basebasal[i] = SP.getDouble(SETTINGS_PREFIX + "basebasal" + i, basebasal[i]);
- baseic[i] = SP.getDouble(SETTINGS_PREFIX + "baseic" + i, baseic[i]);
- baseisf[i] = SP.getDouble(SETTINGS_PREFIX + "baseisf" + i, baseisf[i]);
- }
- }
-
- public String externallySetParameters(int timeshift, int percentage) {
-
- String msg = "";
-
- if (!fragmentEnabled) {
- msg += "NO CPP!" + "\n";
- }
-
- //check for validity
- if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) {
- msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage") + "\n";
- }
- if (timeshift < 0 || timeshift > 23) {
- msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Timeshift") + "\n";
- }
- final Profile profile = MainApp.getConfigBuilder().getProfile();
-
- if (profile == null || profile.getBasal() == null) {
- msg += MainApp.sResources.getString(R.string.cpp_notloadedplugins) + "\n";
- }
- if (!"".equals(msg)) {
- msg += MainApp.sResources.getString(R.string.cpp_valuesnotstored);
- return msg;
- }
-
- //store profile
- this.timeshift = timeshift;
- this.percentage = percentage;
- storeSettings();
-
-
- //send profile to pumpe
- new NewNSTreatmentDialog(); //init
- NewNSTreatmentDialog.doProfileSwitch(this.getProfile(), this.getProfileName(), 0, percentage, timeshift);
-
- //return formatted string
- /*msg += "%: " + this.percentage + " h: +" + this.timeshift;
- msg += "\n";
- msg += "\nBasal:\n" + basalString() + "\n";
- msg += "\nISF:\n" + isfString() + "\n";
- msg += "\nIC:\n" + isfString() + "\n";*/
-
- return msg;
- }
-
- public static void migrateToLP() {
- SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
- SharedPreferences.Editor editor = settings.edit();
- editor.putBoolean("LocalProfile" + "mmol", SP.getBoolean(SETTINGS_PREFIX + "mmol", false));
- editor.putBoolean("LocalProfile" + "mgdl", SP.getBoolean(SETTINGS_PREFIX + "mgdl", true));
- editor.putString("LocalProfile" + "dia", "" + SP.getDouble(SETTINGS_PREFIX + "dia", Constants.defaultDIA));
- editor.putString("LocalProfile" + "ic", getLPic());
- editor.putString("LocalProfile" + "isf", getLPisf());
- editor.putString("LocalProfile" + "basal", getLPbasal());
- try {
- JSONArray targetLow = new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", SP.getDouble(SETTINGS_PREFIX + "targetlow", 120d)));
- JSONArray targetHigh = new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", SP.getDouble(SETTINGS_PREFIX + "targethigh", 120d)));
- editor.putString("LocalProfile" + "targetlow", targetLow.toString());
- editor.putString("LocalProfile" + "targethigh", targetHigh.toString());
- } catch (JSONException e) {
- e.printStackTrace();
- }
- editor.commit();
- LocalProfilePlugin lp = MainApp.getSpecificPlugin(LocalProfilePlugin.class);
- lp.loadSettings();
-
- /* TODO: remove Settings and switch to LP later on
- * For now only nag the user every time (s)he opens the CPP fragment and offer to migrate.
- * Keep settings for now in order to allow the user to check that the migration went well.
- */
- //removeSettings();
-
- }
-
- public static String getLPisf() {
- return getLPConversion("baseisf", 35d);
- }
-
- public static String getLPic() {
- return getLPConversion("baseic", 4);
- }
-
- public static String getLPbasal() {
- return getLPConversion("basebasal", 1);
- }
-
- public static String getLPConversion(String type, double defaultValue) {
- try {
- JSONArray jsonArray = new JSONArray();
- double last = -1d;
-
- for (int i = 0; i < 24; i++) {
- double value = SP.getDouble(SETTINGS_PREFIX + type + i, defaultValue);
- String time;
- DecimalFormat df = new DecimalFormat("00");
- time = df.format(i) + ":00";
- if (last != value) {
- jsonArray.put(new JSONObject().put("time", time).put("timeAsSeconds", i * 60 * 60).put("value", value));
- }
- last = value;
- }
- return jsonArray.toString();
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- return LocalProfilePlugin.DEFAULTARRAY;
- }
-
- static void removeSettings() {
- if (Config.logPrefsChange)
- log.debug("Removing settings");
- SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(MainApp.instance().getApplicationContext());
- SharedPreferences.Editor editor = settings.edit();
- editor.remove(SETTINGS_PREFIX + "mmol");
- editor.remove(SETTINGS_PREFIX + "mgdl");
- editor.remove(SETTINGS_PREFIX + "dia");
- editor.remove(SETTINGS_PREFIX + "targetlow");
- editor.remove(SETTINGS_PREFIX + "targethigh");
- editor.remove(SETTINGS_PREFIX + "timeshift");
- editor.remove(SETTINGS_PREFIX + "percentage");
-
-
- for (int i = 0; i < 24; i++) {
- editor.remove(SETTINGS_PREFIX + "basebasal");
- editor.remove(SETTINGS_PREFIX + "baseisf" + i);
- editor.remove(SETTINGS_PREFIX + "baseic" + i);
- }
- editor.commit();
- }
-
- private void createConvertedProfile() {
- JSONObject json = new JSONObject();
- JSONObject store = new JSONObject();
- JSONObject profile = new JSONObject();
-
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append(DecimalFormatter.to2Decimal(sum(basebasal)));
- stringBuilder.append("U@");
- stringBuilder.append(percentage);
- stringBuilder.append("%>");
- stringBuilder.append(timeshift);
- stringBuilder.append("h");
- String profileName = stringBuilder.toString();
-
- try {
- json.put("defaultProfile", profileName);
- json.put("store", store);
- profile.put("dia", dia);
-
- int offset = -(timeshift % 24) + 24;
-
- JSONArray icArray = new JSONArray();
- JSONArray isfArray = new JSONArray();
- JSONArray basalArray = new JSONArray();
- for (int i = 0; i < 24; i++) {
- String time;
- DecimalFormat df = new DecimalFormat("00");
- time = df.format(i) + ":00";
- icArray.put(new JSONObject().put("time", time).put("timeAsSeconds", i * 60 * 60).put("value", baseic[(offset + i) % 24] * 100d / percentage));
- isfArray.put(new JSONObject().put("time", time).put("timeAsSeconds", i * 60 * 60).put("value", baseisf[(offset + i) % 24] * 100d / percentage));
- basalArray.put(new JSONObject().put("time", time).put("timeAsSeconds", i * 60 * 60).put("value", basebasal[(offset + i) % 24] * percentage / 100d));
- }
- profile.put("carbratio", icArray);
- profile.put("sens", isfArray);
- profile.put("basal", basalArray);
-
-
- profile.put("target_low", new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", targetLow)));
- profile.put("target_high", new JSONArray().put(new JSONObject().put("time", "00:00").put("timeAsSeconds", 0).put("value", targetHigh)));
- profile.put("units", mgdl ? Constants.MGDL : Constants.MMOL);
- store.put(profileName, profile);
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- convertedProfile = new ProfileStore(json);
- convertedProfileName = profileName;
- }
-
- @Override
- public ProfileStore getProfile() {
- if (convertedProfile == null)
- createConvertedProfile();
-
- performLimitCheck();
- return convertedProfile;
- }
-
- @Override
- public String getUnits() {
- return mgdl ? Constants.MGDL : Constants.MMOL;
- }
-
- @Override
- public String getProfileName() {
- if (convertedProfile == null)
- createConvertedProfile();
-
- performLimitCheck();
- return convertedProfileName;
- }
-
- private void performLimitCheck() {
- if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) {
- String msg = String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage");
- log.error(msg);
- NSUpload.uploadError(msg);
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), msg, R.raw.error);
- percentage = Math.max(percentage, Constants.CPP_MIN_PERCENTAGE);
- percentage = Math.min(percentage, Constants.CPP_MAX_PERCENTAGE);
- }
- }
-
- String basalString() {
- return profileString(basebasal, timeshift, percentage, true);
- }
-
- String icString() {
- return profileString(baseic, timeshift, percentage, false);
- }
-
- String isfString() {
- return profileString(baseisf, timeshift, percentage, false);
- }
-
- String baseIcString() {
- return profileString(baseic, 0, 100, false);
- }
-
- String baseIsfString() {
- return profileString(baseisf, 0, 100, false);
- }
-
- String baseBasalString() {
- return profileString(basebasal, 0, 100, true);
- }
-
- public double baseBasalSum() {
- return sum(basebasal);
- }
-
- public double percentageBasalSum() {
- double result = 0;
- for (int i = 0; i < basebasal.length; i++) {
- result += SafeParse.stringToDouble(DecimalFormatter.to2Decimal(basebasal[i] * percentage / 100d));
- }
- return result;
- }
-
-
- public static double sum(double values[]) {
- double result = 0;
- for (int i = 0; i < values.length; i++) {
- result += values[i];
- }
- return result;
- }
-
-
- private static String profileString(double[] values, int timeshift, int percentage, boolean inc) {
- timeshift = -(timeshift % 24) + 24;
- StringBuilder sb = new StringBuilder();
- sb.append("");
- sb.append(0);
- sb.append("h: ");
- sb.append("");
- sb.append(DecimalFormatter.to2Decimal(values[(timeshift + 0) % 24] * (inc ? percentage / 100d : 100d / percentage)));
- double prevVal = values[(timeshift + 0) % 24];
- for (int i = 1; i < 24; i++) {
- if (prevVal != values[(timeshift + i) % 24]) {
- sb.append(", ");
- sb.append("");
- sb.append(i);
- sb.append("h: ");
- sb.append("");
- sb.append(DecimalFormatter.to2Decimal(values[(timeshift + i) % 24] * (inc ? percentage / 100d : 100d / percentage)));
- prevVal = values[(timeshift + i) % 24];
- }
- }
- return sb.toString();
- }
-
- public int getPercentage() {
- return percentage;
- }
-
- public int getTimeshift() {
- return timeshift;
- }
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java
index 364484aff8..fb8e2166e0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java
@@ -13,7 +13,6 @@ import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -33,6 +32,7 @@ import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NumberPicker;
import info.nightscout.utils.SafeParse;
import info.nightscout.utils.TimeListEdit;
@@ -140,7 +140,7 @@ public class LocalProfileFragment extends SubscriberFragment {
return layout;
} catch (Exception e) {
log.error("Unhandled exception: ", e);
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java
index c7d5d8edbf..84a1dd3a87 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileNS/NSProfileFragment.java
@@ -10,7 +10,6 @@ import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Subscribe;
import java.util.ArrayList;
@@ -22,6 +21,7 @@ import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ProfileNS.events.EventNSProfileUpdateGUI;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
public class NSProfileFragment extends SubscriberFragment implements AdapterView.OnItemSelectedListener {
@@ -56,7 +56,7 @@ public class NSProfileFragment extends SubscriberFragment implements AdapterView
updateGUI();
return layout;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java
index 9a0b64f6d1..b3b2226705 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileSimple/SimpleProfileFragment.java
@@ -13,7 +13,6 @@ import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -27,6 +26,7 @@ import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialo
import info.nightscout.androidaps.plugins.Careportal.OptionsToShow;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SafeParse;
public class SimpleProfileFragment extends SubscriberFragment {
@@ -137,7 +137,7 @@ public class SimpleProfileFragment extends SubscriberFragment {
return layout;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java
index ea47303fb6..fb04b0e105 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java
@@ -34,6 +34,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.services.AbstractDanaRExecut
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.Round;
+import info.nightscout.utils.SP;
/**
* Created by mike on 28.01.2018.
@@ -293,7 +294,7 @@ public abstract class AbstractDanaRPlugin implements PluginBase, PumpInterface,
result.isTempCancel = false;
result.duration = pump.extendedBolusRemainingMinutes;
result.absolute = pump.extendedBolusAbsoluteRate;
- result.bolusDelivered = pump.extendedBolusAmount;
+ if (! SP.getBoolean("danar_useextended", false)) result.bolusDelivered = pump.extendedBolusAmount;
result.isPercent = false;
if (Config.logPumpActions)
log.debug("setExtendedBolus: OK");
@@ -538,11 +539,13 @@ public abstract class AbstractDanaRPlugin implements PluginBase, PumpInterface,
if (pump.lastBolusTime.getTime() != 0) {
ret += "LastBolus: " + DecimalFormatter.to2Decimal(pump.lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", pump.lastBolusTime) + "\n";
}
- if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) {
- ret += "Temp: " + MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis()).toStringFull() + "\n";
+ TemporaryBasal activeTemp = MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis());
+ if (activeTemp != null) {
+ ret += "Temp: " + activeTemp.toStringFull() + "\n";
}
- if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- ret += "Extended: " + MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()).toString() + "\n";
+ ExtendedBolus activeExtendedBolus = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis());
+ if (activeExtendedBolus != null) {
+ ret += "Extended: " + activeExtendedBolus.toString() + "\n";
}
if (!veryShort) {
ret += "TDD: " + DecimalFormatter.to0Decimal(pump.dailyTotalUnits) + " / " + pump.maxDailyTotalUnits + " U\n";
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java
index 1ca54a7eb6..06ec42fadc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java
@@ -15,7 +15,7 @@ import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
+
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -29,6 +29,7 @@ import butterknife.OnClick;
import butterknife.Unbinder;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.ExtendedBolus;
import info.nightscout.androidaps.events.EventExtendedBolusChange;
import info.nightscout.androidaps.events.EventPumpStatusChanged;
import info.nightscout.androidaps.events.EventTempBasalChange;
@@ -41,6 +42,7 @@ import info.nightscout.androidaps.plugins.PumpDanaR.events.EventDanaRNewStatus;
import info.nightscout.androidaps.queue.events.EventQueueChanged;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.SetWarnColor;
public class DanaRFragment extends SubscriberFragment {
@@ -100,7 +102,7 @@ public class DanaRFragment extends SubscriberFragment {
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
@@ -216,8 +218,9 @@ public class DanaRFragment extends SubscriberFragment {
tempBasalView.setText("");
}
}
- if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- extendedBolusView.setText(MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()).toString());
+ ExtendedBolus activeExtendedBolus = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis());
+ if (activeExtendedBolus != null) {
+ extendedBolusView.setText(activeExtendedBolus.toString());
} else {
extendedBolusView.setText("");
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java
index 9a0be55897..289e10c518 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java
@@ -134,6 +134,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
detailedBolusInfo.insulin = configBuilderPlugin.applyBolusConstraints(detailedBolusInfo.insulin);
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) {
Treatment t = new Treatment();
+ t.isSMB = detailedBolusInfo.isSMB;
boolean connectionOK = false;
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, detailedBolusInfo.carbTime, t);
PumpEnactResult result = new PumpEnactResult();
@@ -315,8 +316,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin {
if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress())
return cancelRealTempBasal();
if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress() && useExtendedBoluses) {
- PumpEnactResult cancelEx = cancelExtendedBolus();
- return cancelEx;
+ return cancelExtendedBolus();
}
PumpEnactResult result = new PumpEnactResult();
result.success = true;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java
index 943d4ee502..2e6c02458e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MessageBase.java
@@ -23,7 +23,7 @@ import info.nightscout.utils.CRC;
public class MessageBase {
private static Logger log = LoggerFactory.getLogger(MessageBase.class);
- private byte[] buffer = new byte[512];
+ protected byte[] buffer = new byte[512];
private int position = 6;
public boolean received = false;
@@ -34,6 +34,10 @@ public class MessageBase {
this.buffer[5] = (byte) (cmd & 0xFF);
}
+ public void resetBuffer() {
+ position = 6;
+ }
+
public void AddParamByte(byte data) {
this.buffer[this.position++] = data;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java
index 256ccc18da..c97340f44b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgStatusBolusExtended.java
@@ -69,8 +69,8 @@ public class MsgStatusBolusExtended extends MessageBase {
DanaRPump pump = DanaRPump.getInstance();
long now = System.currentTimeMillis();
- if (treatmentsInterface.isInHistoryExtendedBoluslInProgress()) {
- ExtendedBolus extendedBolus = treatmentsInterface.getExtendedBolusFromHistory(System.currentTimeMillis());
+ ExtendedBolus extendedBolus = treatmentsInterface.getExtendedBolusFromHistory(System.currentTimeMillis());
+ if (extendedBolus != null) {
if (pump.isExtendedInProgress) {
if (extendedBolus.absoluteRate() != pump.extendedBolusAbsoluteRate) {
// Close current extended
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java
index d853c9abf1..4727e2650f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java
@@ -78,6 +78,8 @@ public abstract class AbstractDanaRExecutionService extends Service {
public abstract boolean highTempBasal(int percent); // Rv2 only
+ public abstract boolean tempBasalShortDuration(int percent, int durationInMinutes); // Rv2 only
+
public abstract boolean tempBasal(int percent, int durationInHours);
public abstract boolean tempBasalStop();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java
index 63215464a8..4bf080f3fb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java
@@ -354,6 +354,11 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{
return false;
}
+ @Override
+ public boolean tempBasalShortDuration(int percent, int durationInMinutes) {
+ return false;
+ }
+
public boolean updateBasalsInPump(final Profile profile) {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates)));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java
index 58392e65f9..81e8aad052 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java
@@ -135,6 +135,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
detailedBolusInfo.insulin = configBuilderPlugin.applyBolusConstraints(detailedBolusInfo.insulin);
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) {
Treatment t = new Treatment();
+ t.isSMB = detailedBolusInfo.isSMB;
boolean connectionOK = false;
if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, detailedBolusInfo.carbTime, t);
PumpEnactResult result = new PumpEnactResult();
@@ -316,8 +317,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin {
if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress())
return cancelRealTempBasal();
if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress() && useExtendedBoluses) {
- PumpEnactResult cancelEx = cancelExtendedBolus();
- return cancelEx;
+ return cancelExtendedBolus();
}
PumpEnactResult result = new PumpEnactResult();
result.success = true;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java
index 6d1ccc132d..12d7590a59 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java
@@ -301,6 +301,11 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService {
return false;
}
+ @Override
+ public boolean tempBasalShortDuration(int percent, int durationInMinutes) {
+ return false;
+ }
+
public boolean updateBasalsInPump(final Profile profile) {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates)));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java
index 9978880e08..20e17af20e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java
@@ -181,6 +181,8 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
pumpDescription.tempPercentStep = 10;
pumpDescription.tempDurationStep = 60;
+ pumpDescription.tempDurationStep15mAllowed = true;
+ pumpDescription.tempDurationStep30mAllowed = true;
pumpDescription.tempMaxDuration = 24 * 60;
@@ -367,7 +369,7 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
@Override
public boolean isInitialized() {
- return pump.lastConnection > 0 && pump.maxBasal > 0;
+ return pump.lastConnection > 0 && pump.maxBasal > 0;
}
@Override
@@ -477,9 +479,10 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
DetailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
Treatment t = new Treatment();
+ t.isSMB = detailedBolusInfo.isSMB;
boolean connectionOK = false;
if (detailedBolusInfo.insulin > 0 || carbs > 0)
- connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000 + 30000, t); // +30s to make the record different
+ connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000, t);
PumpEnactResult result = new PumpEnactResult();
result.success = connectionOK;
result.bolusDelivered = t.insulin;
@@ -617,8 +620,13 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
log.debug("setTempBasalPercent: Correct value already set");
return result;
}
- int durationInHours = Math.max(durationInMinutes / 60, 1);
- boolean connectionOK = danaRSService.tempBasal(percent, durationInHours);
+ boolean connectionOK;
+ if (durationInMinutes == 15 || durationInMinutes == 30) {
+ connectionOK = danaRSService.tempBasalShortDuration(percent, durationInMinutes);
+ } else {
+ int durationInHours = Math.max(durationInMinutes / 60, 1);
+ connectionOK = danaRSService.tempBasal(percent, durationInHours);
+ }
if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) {
result.enacted = true;
result.success = true;
@@ -820,11 +828,13 @@ public class DanaRSPlugin implements PluginBase, PumpInterface, DanaRInterface,
if (pump.lastBolusTime.getTime() != 0) {
ret += "LastBolus: " + DecimalFormatter.to2Decimal(pump.lastBolusAmount) + "U @" + android.text.format.DateFormat.format("HH:mm", pump.lastBolusTime) + "\n";
}
- if (MainApp.getConfigBuilder().isInHistoryRealTempBasalInProgress()) {
- ret += "Temp: " + MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis()).toStringFull() + "\n";
+ TemporaryBasal activeTemp = MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis());
+ if (activeTemp != null) {
+ ret += "Temp: " + activeTemp.toStringFull() + "\n";
}
- if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- ret += "Extended: " + MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()).toString() + "\n";
+ ExtendedBolus activeExtendedBolus = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis());
+ if (activeExtendedBolus != null) {
+ ret += "Extended: " + activeExtendedBolus.toString() + "\n";
}
if (!veryShort) {
ret += "TDD: " + DecimalFormatter.to0Decimal(pump.dailyTotalUnits) + " / " + pump.maxDailyTotalUnits + " U\n";
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java
index 06608b5a74..5da3655ceb 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_Basal.java
@@ -10,33 +10,60 @@ import info.nightscout.androidaps.Config;
public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_APS_Basal_Set_Temporary_Basal.class);
- private int temporaryBasalRatio;
- private int temporaryBasalDuration;
+ int temporaryBasalRatio;
+ int temporaryBasalDuration;
public int error;
- public DanaRS_Packet_APS_Basal_Set_Temporary_Basal() {
+ final int PARAM30MIN = 160;
+ final int PARAM15MIN = 150;
+
+ DanaRS_Packet_APS_Basal_Set_Temporary_Basal() {
super();
opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BASAL__APS_SET_TEMPORARY_BASAL;
}
public DanaRS_Packet_APS_Basal_Set_Temporary_Basal(int percent) {
this();
+ setParams(percent);
+ }
+ protected void setParams(int percent) {
//HARDCODED LIMITS
if (percent < 0) percent = 0;
if (percent > 500) percent = 500;
temporaryBasalRatio = percent;
if (percent < 100) {
- temporaryBasalDuration = 160;
+ temporaryBasalDuration = PARAM30MIN;
if (Config.logDanaMessageDetail)
log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
} else {
- temporaryBasalDuration = 150;
+ temporaryBasalDuration = PARAM15MIN;
if (Config.logDanaMessageDetail)
log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
}
+ }
+ public DanaRS_Packet_APS_Basal_Set_Temporary_Basal(int percent, boolean fifteenMinutes, boolean thirtyMinutes ) {
+ this();
+ setParams(percent, fifteenMinutes, thirtyMinutes);
+ }
+
+ protected void setParams(int percent, boolean fifteenMinutes, boolean thirtyMinutes) {
+ //HARDCODED LIMITS
+ if (percent < 0) percent = 0;
+ if (percent > 500) percent = 500;
+
+ temporaryBasalRatio = percent;
+ if (thirtyMinutes && percent <= 200) { // 30 min is allowed up to 200%
+ temporaryBasalDuration = PARAM30MIN;
+ if (Config.logDanaMessageDetail)
+ log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
+ } else {
+ temporaryBasalDuration = PARAM15MIN;
+ if (Config.logDanaMessageDetail)
+ log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
+ }
}
@Override
@@ -55,6 +82,7 @@ public class DanaRS_Packet_APS_Basal_Set_Temporary_Basal extends DanaRS_Packet {
failed = true;
log.error("Set APS temp basal start result: " + result + " FAILED!!!");
} else {
+ failed = false;
if (Config.logDanaMessageDetail)
log.debug("Set APS temp basal start result: " + result);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java
index 1a1f74b645..489864ebd1 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java
@@ -156,7 +156,6 @@ public class DanaRSService extends Service {
loadEvents();
- danaRPump.lastConnection = now;
MainApp.bus().post(new EventDanaRNewStatus());
MainApp.bus().post(new EventInitializationChanged());
NSUpload.uploadDeviceStatus();
@@ -190,6 +189,7 @@ public class DanaRSService extends Service {
else
lastHistoryFetched = 0;
log.debug("Events loaded");
+ danaRPump.lastConnection = System.currentTimeMillis();
return new PumpEnactResult().success(true);
}
@@ -318,6 +318,25 @@ public class DanaRSService extends Service {
return true;
}
+ public boolean tempBasalShortDuration(Integer percent, int durationInMinutes) {
+ if (durationInMinutes != 15 && durationInMinutes != 30) {
+ log.error("Wrong duration param");
+ return false;
+ }
+
+ if (danaRPump.isTempBasalInProgress) {
+ MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal)));
+ bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal());
+ SystemClock.sleep(500);
+ }
+ MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal)));
+ bleComm.sendMessage(new DanaRS_Packet_APS_Basal_Set_Temporary_Basal(percent, durationInMinutes == 15, durationInMinutes == 30));
+ bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State());
+ loadEvents();
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING));
+ return true;
+ }
+
public boolean tempBasalStop() {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal)));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java
index 34a5b2381b..817df68855 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java
@@ -63,6 +63,8 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
pumpDescription.tempPercentStep = 10;
pumpDescription.tempDurationStep = 60;
+ pumpDescription.tempDurationStep15mAllowed = true;
+ pumpDescription.tempDurationStep30mAllowed = true;
pumpDescription.tempMaxDuration = 24 * 60;
@@ -148,9 +150,10 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
DetailedBolusInfoStorage.add(detailedBolusInfo); // will be picked up on reading history
Treatment t = new Treatment();
+ t.isSMB = detailedBolusInfo.isSMB;
boolean connectionOK = false;
if (detailedBolusInfo.insulin > 0 || carbs > 0)
- connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000 + 30000, t); // +30s to make the record different
+ connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) carbs, System.currentTimeMillis() + carbTime * 60 * 1000, t);
PumpEnactResult result = new PumpEnactResult();
result.success = connectionOK;
result.bolusDelivered = t.insulin;
@@ -274,7 +277,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
}
if (percent > getPumpDescription().maxTempPercent)
percent = getPumpDescription().maxTempPercent;
- TemporaryBasal runningTB = MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis());
+ TemporaryBasal runningTB = MainApp.getConfigBuilder().getRealTempBasalFromHistory(System.currentTimeMillis());
if (runningTB != null && runningTB.percentRate == percent && !enforceNew) {
result.enacted = false;
result.success = true;
@@ -288,8 +291,13 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
log.debug("setTempBasalPercent: Correct value already set");
return result;
}
- int durationInHours = Math.max(durationInMinutes / 60, 1);
- boolean connectionOK = sExecutionService.tempBasal(percent, durationInHours);
+ boolean connectionOK;
+ if (durationInMinutes == 15 || durationInMinutes == 30) {
+ connectionOK = sExecutionService.tempBasalShortDuration(percent, durationInMinutes);
+ } else {
+ int durationInHours = Math.max(durationInMinutes / 60, 1);
+ connectionOK = sExecutionService.tempBasal(percent, durationInHours);
+ }
if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) {
result.enacted = true;
result.success = true;
@@ -335,7 +343,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin {
@Override
public PumpEnactResult cancelTempBasal(boolean force) {
PumpEnactResult result = new PumpEnactResult();
- TemporaryBasal runningTB = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis());
+ TemporaryBasal runningTB = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis());
if (runningTB != null) {
sExecutionService.tempBasalStop();
result.enacted = true;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java
index da4db61362..6b6e3045de 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgSetAPSTempBasalStart_v2.java
@@ -9,28 +9,55 @@ import info.nightscout.androidaps.plugins.PumpDanaR.comm.MessageBase;
public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
private static Logger log = LoggerFactory.getLogger(MsgSetAPSTempBasalStart_v2.class);
+ protected final int PARAM30MIN = 160;
+ protected final int PARAM15MIN = 150;
+
public MsgSetAPSTempBasalStart_v2() {
SetCommand(0xE002);
}
public MsgSetAPSTempBasalStart_v2(int percent) {
this();
+ setParams(percent);
+ }
+ protected void setParams(int percent) {
//HARDCODED LIMITS
if (percent < 0) percent = 0;
if (percent > 500) percent = 500;
AddParamInt(percent);
if (percent < 100) {
- AddParamByte((byte) 0xA0); // 160
+ AddParamByte((byte) PARAM30MIN);
if (Config.logDanaMessageDetail)
log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
} else {
- AddParamByte((byte) 0x96); // 150
+ AddParamByte((byte) PARAM15MIN);
if (Config.logDanaMessageDetail)
log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
}
+ }
+ public MsgSetAPSTempBasalStart_v2(int percent, boolean fifteenMinutes, boolean thirtyMinutes) {
+ this();
+ setParams(percent, fifteenMinutes, thirtyMinutes);
+ }
+
+ protected void setParams(int percent, boolean fifteenMinutes, boolean thirtyMinutes) {
+ //HARDCODED LIMITS
+ if (percent < 0) percent = 0;
+ if (percent > 500) percent = 500;
+
+ AddParamInt(percent);
+ if (thirtyMinutes && percent <= 200) { // 30 min is allowed up to 200%
+ AddParamByte((byte) PARAM30MIN);
+ if (Config.logDanaMessageDetail)
+ log.debug("APS Temp basal start percent: " + percent + " duration 30 min");
+ } else {
+ AddParamByte((byte) PARAM15MIN);
+ if (Config.logDanaMessageDetail)
+ log.debug("APS Temp basal start percent: " + percent + " duration 15 min");
+ }
}
public void handleMessage(byte[] bytes) {
@@ -39,6 +66,7 @@ public class MsgSetAPSTempBasalStart_v2 extends MessageBase {
failed = true;
log.debug("Set APS temp basal start result: " + result + " FAILED!!!");
} else {
+ failed = false;
if (Config.logDanaMessageDetail)
log.debug("Set APS temp basal start result: " + result);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java
index 81b5837511..1eb73a500a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java
@@ -209,7 +209,6 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
loadEvents();
- mDanaRPump.lastConnection = now;
MainApp.bus().post(new EventDanaRNewStatus());
MainApp.bus().post(new EventInitializationChanged());
NSUpload.uploadDeviceStatus();
@@ -255,6 +254,26 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
return true;
}
+ public boolean tempBasalShortDuration(int percent, int durationInMinutes) {
+ if (durationInMinutes != 15 && durationInMinutes != 30) {
+ log.error("Wrong duration param");
+ return false;
+ }
+
+ if (!isConnected()) return false;
+ if (mDanaRPump.isTempBasalInProgress) {
+ MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal)));
+ mSerialIOThread.sendMessage(new MsgSetTempBasalStop());
+ SystemClock.sleep(500);
+ }
+ MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal)));
+ mSerialIOThread.sendMessage(new MsgSetAPSTempBasalStart_v2(percent, durationInMinutes == 15, durationInMinutes == 30));
+ mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2());
+ loadEvents();
+ MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING));
+ return true;
+ }
+
public boolean tempBasalStop() {
if (!isConnected()) return false;
MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal)));
@@ -413,6 +432,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService {
lastHistoryFetched = MsgHistoryEvents_v2.lastEventTimeLoaded - 45 * 60 * 1000L; //always load last 45 min;
else
lastHistoryFetched = 0;
+ mDanaRPump.lastConnection = System.currentTimeMillis();
return new PumpEnactResult().success(true);
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpFragment.java
index 2d9cb0b202..3dfcb9b0a3 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpFragment.java
@@ -9,7 +9,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
-import com.crashlytics.android.Crashlytics;
+
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -22,6 +22,7 @@ import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightPumpUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.utils.StatusItem;
import info.nightscout.androidaps.plugins.PumpInsight.utils.ui.StatusItemViewAdapter;
+import info.nightscout.utils.FabricPrivacy;
public class InsightPumpFragment extends SubscriberFragment {
@@ -64,7 +65,7 @@ public class InsightPumpFragment extends SubscriberFragment {
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java
index 3759597ab8..fe5f84d66f 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPumpPlugin.java
@@ -70,6 +70,7 @@ import static info.nightscout.androidaps.plugins.PumpInsight.utils.Helpers.round
*
*/
+@SuppressWarnings("AccessStaticViaInstance")
public class InsightPumpPlugin implements PluginBase, PumpInterface, ConstraintsInterface {
private static final long BUSY_WAIT_TIME = 20000;
@@ -91,6 +92,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
private PumpDescription pumpDescription = new PumpDescription();
private double basalRate = 0;
private Connector connector;
+ private volatile boolean connector_enabled = false;
private final TaskRunner.ResultCallback statusResultHandler = new TaskRunner.ResultCallback() {
@Override
@@ -119,7 +121,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
};
private InsightPumpPlugin() {
- log("InsightPumpPlugin");
+ log("InsightPumpPlugin instantiated");
pumpDescription.isBolusCapable = true;
pumpDescription.bolusStep = 0.05d; // specification says 0.05U up to 2U then 0.1U @ 2-5U 0.2U @ 10-20U 0.5U 10-20U (are these just UI restrictions?)
@@ -136,6 +138,8 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
pumpDescription.tempPercentStep = 10;
pumpDescription.tempDurationStep = 15; // 15 minutes up to 24 hours
+ pumpDescription.tempDurationStep15mAllowed = true;
+ pumpDescription.tempDurationStep30mAllowed = true;
pumpDescription.tempMaxDuration = 24 * 60;
pumpDescription.isSetBasalProfileCapable = false; // leave this for now
@@ -143,12 +147,8 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
pumpDescription.basalMinimumRate = 0.02d;
pumpDescription.isRefillingCapable = true;
- //pumpDescription.storesCarbInfo = false; // uncomment when PumpDescription updated to include this
+ //pumpDescription.storesCarbInfo = false;
- this.connector = Connector.get();
- this.connector.init();
-
- log("back from init");
}
@@ -180,6 +180,31 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
MainApp.bus().post(e);
}
+ private void enableConnector() {
+ if (!connector_enabled) {
+ synchronized (this) {
+ if (!connector_enabled) {
+ log("Instantiating connector");
+ connector_enabled = true;
+ this.connector = Connector.get();
+ this.connector.init();
+ }
+ }
+ }
+ }
+
+ private void disableConnector() {
+ if (connector_enabled) {
+ synchronized (this) {
+ if (connector_enabled) {
+ log("Shutting down connector");
+ Connector.get().shutdown();
+ connector_enabled = false;
+ }
+ }
+ }
+ }
+
@Override
public String getFragmentClass() {
return InsightPumpFragment.class.getName();
@@ -225,12 +250,19 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
@Override
public boolean showInList(int type) {
- return true;
+ return type == PUMP;
}
@Override
public void setFragmentEnabled(int type, boolean fragmentEnabled) {
- if (type == PUMP) this.fragmentEnabled = fragmentEnabled;
+ if (type == PUMP) {
+ if (fragmentEnabled) {
+ enableConnector();
+ } else {
+ disableConnector();
+ }
+ this.fragmentEnabled = fragmentEnabled;
+ }
}
@Override
@@ -285,7 +317,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
if (!connector.isPumpConnected()) {
if (Helpers.ratelimit("insight-connect-timer", 40)) {
log("Actually requesting a connect");
- connector.getServiceConnector().connect();
+ connector.connectToPump();
}
} else {
log("Already connected");
@@ -306,7 +338,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
try {
if (!SP.getBoolean("insight_always_connected", false)) {
log("Requesting disconnect");
- connector.getServiceConnector().disconnect();
+ connector.disconnectFromPump();
} else {
log("Not disconnecting due to preference");
}
@@ -322,7 +354,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
if (isConnecting()) {
if (!SP.getBoolean("insight_always_connected", false)) {
log("Requesting disconnect");
- connector.getServiceConnector().disconnect();
+ connector.disconnectFromPump();
} else {
log("Not disconnecting due to preference");
}
@@ -470,6 +502,8 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
if (percent_amount > 250) percent_amount = 250;
+
+
final SetTBRTaskRunner task = new SetTBRTaskRunner(connector.getServiceConnector(), percent_amount, durationInMinutes);
final UUID cmd = aSyncTaskRunner(task, "Set TBR abs: " + absoluteRate + " " + durationInMinutes + "m");
@@ -616,7 +650,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
final UUID cmd;
if (fauxTBRcancel) {
- cmd = aSyncTaskRunner(new SetTBRTaskRunner(connector.getServiceConnector(), 100, 1), "Faux Cancel TBR - setting " + "90%" + " 1m");
+ cmd = aSyncTaskRunner(new SetTBRTaskRunner(connector.getServiceConnector(), 100, 1), "Faux Cancel TBR - setting " + "90%" + " 1m");
} else {
cmd = aSyncSingleCommand(new CancelTBRMessage(), "Cancel Temp Basal");
}
@@ -893,6 +927,16 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
l.add(new StatusItem(gs(R.string.insight_last_completed_action), LiveHistory.getStatus()));
}
+ final String keep_alive_status = Connector.getKeepAliveString();
+ if (keep_alive_status != null) {
+ l.add(new StatusItem(gs(R.string.insight_keep_alive_status), keep_alive_status));
+ }
+
+ final List status_statistics = connector.getStatusStatistics();
+ if (status_statistics.size() > 0) {
+ l.addAll(status_statistics);
+ }
+
if (Helpers.ratelimit("insight-status-ui-refresh", 10)) {
connector.tryToGetPumpStatusAgain();
}
@@ -910,7 +954,7 @@ public class InsightPumpPlugin implements PluginBase, PumpInterface, Constraints
public void run() {
updateGui();
}
- }, 500);
+ }, 1000);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
index fea7895a27..454795e8d4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java
@@ -3,12 +3,23 @@ package info.nightscout.androidaps.plugins.PumpInsight.connector;
import android.content.Intent;
import android.os.PowerManager;
+import com.squareup.otto.Subscribe;
+
+import java.util.ArrayList;
+import java.util.Formatter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.events.EventFeatureRunning;
import info.nightscout.androidaps.plugins.PumpInsight.events.EventInsightPumpUpdateGui;
import info.nightscout.androidaps.plugins.PumpInsight.history.HistoryReceiver;
import info.nightscout.androidaps.plugins.PumpInsight.history.LiveHistory;
import info.nightscout.androidaps.plugins.PumpInsight.utils.Helpers;
+import info.nightscout.androidaps.plugins.PumpInsight.utils.StatusItem;
+import info.nightscout.utils.SP;
import sugar.free.sightparser.handling.ServiceConnectionCallback;
import sugar.free.sightparser.handling.SightServiceConnector;
import sugar.free.sightparser.handling.StatusCallback;
@@ -31,11 +42,17 @@ import static sugar.free.sightparser.handling.SightService.COMPATIBILITY_VERSION
public class Connector {
+ // TODO connection statistics
+
private static final String TAG = "InsightConnector";
private static final String COMPANION_APP_PACKAGE = "sugar.free.sightremote";
private final static long FRESH_MS = 70000;
+ private static final Map statistics = new HashMap<>();
private static volatile Connector instance;
private static volatile HistoryReceiver historyReceiver;
+ private static volatile long stayConnectedTill = -1;
+ private static volatile long stayConnectedTime = 0;
+ private static volatile boolean disconnect_thread_running = false;
private volatile SightServiceConnector serviceConnector;
private volatile Status lastStatus = null;
private String compatabilityMessage = null;
@@ -47,14 +64,22 @@ public class Connector {
@Override
public synchronized void onStatusChange(Status status) {
- log("Status change: " + status);
- lastStatus = status;
- lastStatusTime = Helpers.tsl();
- if (status == Status.CONNECTED) {
- lastContactTime = lastStatusTime;
- }
+ if ((status != lastStatus) || (Helpers.msSince(lastStatusTime) > 2000)) {
+ log("Status change: " + status);
- MainApp.bus().post(new EventInsightPumpUpdateGui());
+ updateStatusStatistics(lastStatus, lastStatusTime);
+ lastStatus = status;
+ lastStatusTime = Helpers.tsl();
+
+ if (status == Status.CONNECTED) {
+ lastContactTime = lastStatusTime;
+ extendKeepAliveIfActive();
+ }
+
+ MainApp.bus().post(new EventInsightPumpUpdateGui());
+ } else {
+ log("Same status as before: " + status);
+ }
}
};
@@ -97,6 +122,7 @@ public class Connector {
private Connector() {
initializeHistoryReceiver();
+ MainApp.bus().register(this);
}
public static Connector get() {
@@ -117,10 +143,30 @@ public class Connector {
}
public static void connectToPump() {
- log("Attempting to connect to pump");
+ connectToPump(0);
+ }
+
+ public synchronized static void connectToPump(long keep_alive) {
+ log("Attempting to connect to pump.");
+ if (keep_alive > 0) {
+ stayConnectedTime = keep_alive;
+ stayConnectedTill = Helpers.tsl() + keep_alive;
+ log("Staying connected till: " + Helpers.dateTimeText(stayConnectedTill));
+ delayedDisconnectionThread();
+ }
get().getServiceConnector().connect();
}
+ public static void disconnectFromPump() {
+ if (Helpers.tsl() >= stayConnectedTill) {
+ log("Requesting real pump disconnect");
+ get().getServiceConnector().disconnect();
+ } else {
+ log("Cannot disconnect as due to keep alive till: " + Helpers.dateTimeText(stayConnectedTill));
+ // TODO set a disconnection timer?
+ }
+ }
+
static void log(String msg) {
android.util.Log.e("INSIGHTPUMP", msg);
}
@@ -160,6 +206,104 @@ public class Connector {
return MainApp.instance().getString(id);
}
+ private static synchronized void extendKeepAliveIfActive() {
+ if (keepAliveActive()) {
+ if (Helpers.ratelimit("extend-insight-keepalive", 10)) {
+ stayConnectedTill = Helpers.tsl() + stayConnectedTime;
+ log("Keep-alive extended until: " + Helpers.dateTimeText(stayConnectedTill));
+ }
+ }
+ }
+
+ private static boolean keepAliveActive() {
+ return Helpers.tsl() <= stayConnectedTill;
+ }
+
+ public static String getKeepAliveString() {
+ if (keepAliveActive()) {
+ return MainApp.instance().getString(R.string.insight_keepalive_format_string,
+ stayConnectedTime / 1000, Helpers.hourMinuteSecondString(stayConnectedTill));
+
+ } else {
+ return null;
+ }
+ }
+
+ private static synchronized void delayedDisconnectionThread() {
+ if (keepAliveActive()) {
+ if (!disconnect_thread_running) {
+ disconnect_thread_running = true;
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ final PowerManager.WakeLock wl = Helpers.getWakeLock("insight-disconnection-timer", 600000);
+ try {
+ while (disconnect_thread_running && keepAliveActive()) {
+ if (Helpers.ratelimit("insight-expiry-notice", 5)) {
+ log("Staying connected thread expires: " + Helpers.dateTimeText(stayConnectedTill));
+ }
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ //
+ }
+ }
+
+ if (disconnect_thread_running) {
+ log("Sending the real delayed disconnect");
+ get().getServiceConnector().disconnect();
+ } else {
+ log("Disconnect thread already terminating");
+ }
+ } finally {
+ Helpers.releaseWakeLock(wl);
+ disconnect_thread_running = false;
+ }
+ }
+ }).start();
+ } else {
+ log("Disconnect thread already running");
+ }
+ }
+ }
+
+ private static long percentage(long t, long total) {
+ return (long) (Helpers.roundDouble(((double) t * 100) / total, 0));
+ }
+
+ public synchronized void shutdown() {
+ if (instance != null) {
+ log("Attempting to shut down connector");
+ try {
+ disconnect_thread_running = false;
+ try {
+ instance.serviceConnector.setConnectionCallback(null);
+ } catch (Exception e) {
+ //
+ }
+ try {
+ instance.serviceConnector.removeStatusCallback(statusCallback);
+ } catch (Exception e) {
+ //
+ }
+ try {
+ instance.serviceConnector.disconnect();
+ } catch (Exception e) {
+ log("Exception disconnecting: " + e);
+ }
+ try {
+ instance.serviceConnector.disconnectFromService();
+ } catch (Exception e) {
+ log("Excpetion disconnecting service: " + e);
+ }
+ instance.serviceConnector = null;
+ instance = null;
+ } catch (Exception e) {
+ log("Exception shutting down: " + e);
+ }
+ }
+ }
+
@SuppressWarnings("AccessStaticViaInstance")
private synchronized void initializeHistoryReceiver() {
if (historyReceiver == null) {
@@ -354,4 +498,57 @@ public class Connector {
return true; // TODO evaluate whether current
}
+ private void updateStatusStatistics(Status last, long since) {
+ if ((last != null) && (since > 0)) {
+ Long total = statistics.get(last);
+ if (total == null) total = 0L;
+ statistics.put(last, total + Helpers.msSince(since));
+ log("Updated statistics for: " + last + " total: " + Helpers.niceTimeScalar(statistics.get(last)));
+ // TODO persist data
+ }
+ }
+
+ public List getStatusStatistics() {
+ final List l = new ArrayList<>();
+ long total = 0;
+ for (Map.Entry entry : statistics.entrySet()) {
+ total += getEntryTime(entry);
+ }
+ for (Map.Entry entry : statistics.entrySet()) {
+ if ((long) entry.getValue() > 1000) {
+ l.add(new StatusItem(gs(R.string.statistics) + " " + Helpers.capitalize(entry.getKey().toString()),
+ new Formatter().format("%4s %12s",
+ percentage(getEntryTime(entry), total) + "%",
+ Helpers.niceTimeScalar(getEntryTime(entry))).toString()));
+ }
+ }
+ return l;
+ }
+
+ private long getEntryTime(Map.Entry entry) {
+ return (long) entry.getValue() + (entry.getKey().equals(lastStatus) ? Helpers.msSince(lastStatusTime) : 0);
+ }
+
+ @Subscribe
+ public void onStatusEvent(final EventFeatureRunning ev) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ if (isConnected()) {
+ if (SP.getBoolean("insight_preemptive_connect", true)) {
+ switch (ev.getFeature()) {
+ case WIZARD:
+ log("Wizard feature detected, preconnecting to pump");
+ connectToPump(120 * 1000);
+ break;
+ case MAIN:
+ log("Main feature detected, preconnecting to pump");
+ connectToPump(30 * 1000);
+ break;
+ }
+ }
+ }
+ }
+ }).start();
+ }
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java
index 5375d88b7b..b4618ae3b5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java
@@ -36,7 +36,10 @@ class HistoryIntentAdapter {
final int pump_tbr_duration = intent.getIntExtra(HistoryBroadcast.EXTRA_DURATION, -1);
final int pump_tbr_percent = intent.getIntExtra(HistoryBroadcast.EXTRA_TBR_AMOUNT, -1);
- final int pump_record_id = intent.getIntExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
+ long pump_record_id = intent.getLongExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
+ if (pump_record_id == -1) {
+ pump_record_id = intent.getIntExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
+ }
final long pump_serial_number = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER));
final Date event_time = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
final Date start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
@@ -60,8 +63,11 @@ class HistoryIntentAdapter {
void processDeliveredBolusIntent(Intent intent) {
final String bolus_type = intent.getStringExtra(HistoryBroadcast.EXTRA_BOLUS_TYPE);
- final int bolus_id = intent.getIntExtra(HistoryBroadcast.EXTRA_BOLUS_ID,-1);
- final int pump_record_id = intent.getIntExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
+ final int bolus_id = intent.getIntExtra(HistoryBroadcast.EXTRA_BOLUS_ID, -1);
+ long pump_record_id = intent.getLongExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
+ if (pump_record_id == -1) {
+ pump_record_id = intent.getIntExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1);
+ }
final long pump_serial_number = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER));
final Date event_time = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME);
final Date start_time = getDateExtra(intent, HistoryBroadcast.EXTRA_START_TIME);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java
index ce4f7522a7..588074b0c4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryLogAdapter.java
@@ -17,7 +17,7 @@ import info.nightscout.androidaps.db.TemporaryBasal;
class HistoryLogAdapter {
- private static final long MAX_TIME_DIFFERENCE = 5000;
+ private static final long MAX_TIME_DIFFERENCE = 61000;
private static void log(String msg) {
android.util.Log.e("HISTORYLOG", msg);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
index ce86f33e16..a2abda40d7 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java
@@ -162,6 +162,31 @@ public class Helpers {
return niceTimeScalar(t).replaceFirst("^1 ", "");
}
+ public static String niceTimeScalarBrief(long t) {
+ // TODO i18n wont work for non-latin characterset
+ return niceTimeScalar(t).replaceFirst("([a-z])[a-z]*", "$1").replace(" ","");
+ }
+
+ public static String hourMinuteString(long timestamp) {
+ return android.text.format.DateFormat.format("kk:mm", timestamp).toString();
+ }
+
+ public static String hourMinuteSecondString(long timestamp) {
+ return android.text.format.DateFormat.format("kk:mm:ss", timestamp).toString();
+ }
+
+ public static String dateTimeText(long timestamp) {
+ return android.text.format.DateFormat.format("yyyy-MM-dd kk:mm:ss", timestamp).toString();
+ }
+
+ public static String dateText(long timestamp) {
+ return android.text.format.DateFormat.format("yyyy-MM-dd", timestamp).toString();
+ }
+
+ public static String capitalize(String text) {
+ return text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase();
+ }
+
public static double roundDouble(double value, int places) {
if (places < 0) throw new IllegalArgumentException("Invalid decimal places");
BigDecimal bd = new BigDecimal(value);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java
index ebaf2b19dd..f367e8917e 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpFragment.java
@@ -10,7 +10,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
+
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -18,8 +18,11 @@ import org.slf4j.LoggerFactory;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
+import info.nightscout.androidaps.db.ExtendedBolus;
+import info.nightscout.androidaps.db.TemporaryBasal;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.PumpVirtual.events.EventVirtualPumpUpdateGui;
+import info.nightscout.utils.FabricPrivacy;
public class VirtualPumpFragment extends SubscriberFragment {
private static Logger log = LoggerFactory.getLogger(VirtualPumpFragment.class);
@@ -61,7 +64,7 @@ public class VirtualPumpFragment extends SubscriberFragment {
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
@@ -81,13 +84,15 @@ public class VirtualPumpFragment extends SubscriberFragment {
public void run() {
VirtualPumpPlugin virtualPump = VirtualPumpPlugin.getPlugin();
basaBasalRateView.setText(virtualPump.getBaseBasalRate() + "U");
- if (MainApp.getConfigBuilder().isTempBasalInProgress()) {
- tempBasalView.setText(MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis()).toStringFull());
+ TemporaryBasal activeTemp = MainApp.getConfigBuilder().getTempBasalFromHistory(System.currentTimeMillis());
+ if (activeTemp != null) {
+ tempBasalView.setText(activeTemp.toStringFull());
} else {
tempBasalView.setText("");
}
- if (MainApp.getConfigBuilder().isInHistoryExtendedBoluslInProgress()) {
- extendedBolusView.setText(MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis()).toString());
+ ExtendedBolus activeExtendedBolus = MainApp.getConfigBuilder().getExtendedBolusFromHistory(System.currentTimeMillis());
+ if (activeExtendedBolus != null) {
+ extendedBolusView.setText(activeExtendedBolus.toString());
} else {
extendedBolusView.setText("");
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java
index 1c9fdaaaf7..346750fa0a 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java
@@ -89,6 +89,8 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface {
pumpDescription.tempPercentStep = 10;
pumpDescription.tempDurationStep = 30;
+ pumpDescription.tempDurationStep15mAllowed = true;
+ pumpDescription.tempDurationStep30mAllowed = true;
pumpDescription.tempMaxDuration = 24 * 60;
@@ -97,6 +99,8 @@ public class VirtualPumpPlugin implements PluginBase, PumpInterface {
pumpDescription.basalMinimumRate = 0.01d;
pumpDescription.isRefillingCapable = false;
+
+ pumpDescription.storesCarbInfo = false;
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java
index f45d6cec40..ebe8ddfe31 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java
@@ -105,7 +105,7 @@ public class SensitivityAAPSPlugin implements PluginBase, SensitivityInterface{
@Override
public AutosensResult detectSensitivity(long fromTime, long toTime) {
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getAutosensDataTable();
+ LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
String age = SP.getString(R.string.key_age, "");
int defaultHours = 24;
@@ -119,7 +119,7 @@ public class SensitivityAAPSPlugin implements PluginBase, SensitivityInterface{
return new AutosensResult();
}
- AutosensData current = IobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
if (current == null) {
log.debug("No autosens data available");
return new AutosensResult();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java
index bf7d6ce8f5..eaabb4ecc9 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java
@@ -104,7 +104,7 @@ public class SensitivityOref0Plugin implements PluginBase, SensitivityInterface
@Override
public AutosensResult detectSensitivity(long fromTime, long toTime) {
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getAutosensDataTable();
+ LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
String age = SP.getString(R.string.key_age, "");
int defaultHours = 24;
@@ -120,7 +120,7 @@ public class SensitivityOref0Plugin implements PluginBase, SensitivityInterface
return new AutosensResult();
}
- AutosensData current = IobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
if (current == null) {
log.debug("No current autosens data available");
return new AutosensResult();
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java
index 5f9e996a8a..91053e2654 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java
@@ -101,7 +101,7 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
@Override
public AutosensResult detectSensitivity(long fromTime, long toTime) {
- LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getAutosensDataTable();
+ LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable();
String age = SP.getString(R.string.key_age, "");
int defaultHours = 24;
@@ -116,7 +116,7 @@ public class SensitivityWeightedAveragePlugin implements PluginBase, Sensitivity
return new AutosensResult();
}
- AutosensData current = IobCobCalculatorPlugin.getAutosensData(toTime); // this is running inside lock already
+ AutosensData current = IobCobCalculatorPlugin.getPlugin().getAutosensData(toTime); // this is running inside lock already
if (current == null) {
if (Config.logAutosensData)
log.debug("No autosens data available");
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java
index b64049c098..d10786f8e5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java
@@ -10,7 +10,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -23,6 +22,7 @@ import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui;
import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.FabricPrivacy;
/**
* A simple {@link Fragment} subclass.
@@ -47,7 +47,7 @@ public class SmsCommunicatorFragment extends SubscriberFragment {
updateGUI();
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java
index b7b9d879b1..01f883e6d6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java
@@ -5,7 +5,6 @@ import android.content.pm.ResolveInfo;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -41,6 +40,7 @@ import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventNewSMS;
import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui;
import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
@@ -276,7 +276,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Bg"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bg"));
break;
case "LOOP":
if (splited.length > 1)
@@ -297,7 +297,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
});
}
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Stop"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Stop"));
break;
case "ENABLE":
case "START":
@@ -309,7 +309,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_START"));
}
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Start"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Start"));
break;
case "STATUS":
loopPlugin = MainApp.getSpecificPlugin(LoopPlugin.class);
@@ -325,7 +325,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
}
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Status"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Status"));
break;
case "RESUME":
final LoopPlugin activeloop = ConfigBuilderPlugin.getActiveLoop();
@@ -334,7 +334,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
NSUpload.uploadOpenAPSOffline(0);
reply = MainApp.sResources.getString(R.string.smscommunicator_loopresumed);
sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date()));
- Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume"));
break;
case "SUSPEND":
if (splited.length >= 3)
@@ -351,7 +351,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
resetWaitingMessages();
sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
suspendWaitingForConfirmation.duration = duration;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend"));
} else {
reply = MainApp.sResources.getString(R.string.smscommunicator_remotecommandnotallowed);
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
@@ -370,7 +370,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
reply = "TERATMENTS REFRESH " + q.size() + " receivers";
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Treatments_Refresh"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Treatments_Refresh"));
break;
}
break;
@@ -384,7 +384,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
reply = "NSCLIENT RESTART " + q.size() + " receivers";
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Nsclient_Restart"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Nsclient_Restart"));
break;
}
break;
@@ -400,7 +400,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
}
receivedSms.processed = true;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Danar"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Danar"));
break;
case "BASAL":
if (splited.length > 1) {
@@ -411,7 +411,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
receivedSms.processed = true;
resetWaitingMessages();
sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
- Answers.getInstance().logCustom(new CustomEvent("SMS_Basal"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal"));
} else {
reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed);
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
@@ -426,7 +426,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
resetWaitingMessages();
sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
tempBasalWaitingForConfirmation.tempBasal = tempBasal;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Basal"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal"));
} else {
reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed);
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
@@ -451,7 +451,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
resetWaitingMessages();
sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
bolusWaitingForConfirmation.bolusRequested = amount;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Bolus"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bolus"));
} else {
reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed);
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
@@ -468,7 +468,7 @@ public class SmsCommunicatorPlugin implements PluginBase {
resetWaitingMessages();
sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode));
calibrationWaitingForConfirmation.calibrationRequested = amount;
- Answers.getInstance().logCustom(new CustomEvent("SMS_Cal"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Cal"));
} else {
reply = MainApp.sResources.getString(R.string.smscommunicator_remotecalibrationnotallowed);
sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date()));
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java
index 0b001b8b80..4b3208a2bf 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/BGSourceFragment.java
@@ -12,7 +12,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -29,6 +28,7 @@ import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.utils.DateUtil;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
/**
@@ -63,7 +63,7 @@ public class BGSourceFragment extends SubscriberFragment {
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/SourceDexcomG5Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/SourceDexcomG5Plugin.java
index 193801ac28..8b9734cb79 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/SourceDexcomG5Plugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/SourceDexcomG5/SourceDexcomG5Plugin.java
@@ -39,8 +39,7 @@ public class SourceDexcomG5Plugin implements PluginBase, BgSourceInterface {
@Override
public String getNameShort() {
- // use long name as fallback (no tabs)
- return getName();
+ return MainApp.gs(R.string.dexcomG5_shortname);
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
index b10ad96697..dc01656992 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsFragment.java
@@ -8,7 +8,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
+
import com.squareup.otto.Subscribe;
import org.slf4j.Logger;
@@ -25,6 +25,7 @@ import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsExtende
import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsProfileSwitchFragment;
import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTempTargetFragment;
import info.nightscout.androidaps.plugins.Treatments.fragments.TreatmentsTemporaryBasalsFragment;
+import info.nightscout.utils.FabricPrivacy;
public class TreatmentsFragment extends SubscriberFragment implements View.OnClickListener {
private static Logger log = LoggerFactory.getLogger(TreatmentsFragment.class);
@@ -60,7 +61,7 @@ public class TreatmentsFragment extends SubscriberFragment implements View.OnCli
return view;
} catch (Exception e) {
- Crashlytics.logException(e);
+ FabricPrivacy.logException(e);
}
return null;
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 dad53a0560..1842d3b504 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
@@ -252,7 +252,7 @@ public class TreatmentsPlugin implements PluginBase, TreatmentsInterface {
}
}
- AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensDataSynchronized("getMealData()");
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensDataSynchronized("getMealData()");
if (autosensData != null) {
result.mealCOB = autosensData.cob;
result.slopeFromMinDeviation = autosensData.slopeFromMinDeviation;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java
index 99c89f0706..baf1e43d55 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java
@@ -17,7 +17,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -38,6 +37,7 @@ import info.nightscout.androidaps.events.EventTreatmentChange;
import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
import info.nightscout.utils.NSUpload;
@@ -155,7 +155,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View.
MainApp.getDbHelper().delete(treatment);
}
updateGUI();
- Answers.getInstance().logCustom(new CustomEvent("RemoveTreatment"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveTreatment"));
}
});
builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null);
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 4e21259dae..1cb6d04614 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
@@ -16,7 +16,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -34,6 +33,7 @@ import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
import info.nightscout.androidaps.data.Intervals;
@@ -155,7 +155,7 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment {
UploadQueue.removeID("dbAdd", _id);
}
MainApp.getDbHelper().delete(extendedBolus);
- Answers.getInstance().logCustom(new CustomEvent("RemoveExtendedBolus"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveExtendedBolus"));
}
});
builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null);
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 bd6269e871..c883bc8757 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
@@ -16,7 +16,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
-import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.squareup.otto.Subscribe;
@@ -34,6 +33,7 @@ import info.nightscout.androidaps.plugins.Common.SubscriberFragment;
import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.FabricPrivacy;
import info.nightscout.utils.NSUpload;
import info.nightscout.androidaps.data.Intervals;
@@ -172,7 +172,7 @@ public class TreatmentsTemporaryBasalsFragment extends SubscriberFragment {
UploadQueue.removeID("dbAdd", _id);
}
MainApp.getDbHelper().delete(tempBasal);
- Answers.getInstance().logCustom(new CustomEvent("RemoveTempBasal"));
+ FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveTempBasal"));
}
});
builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null);
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 fbec0a2308..636a935787 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
@@ -1,5 +1,6 @@
package info.nightscout.androidaps.plugins.Wear;
+import android.Manifest;
import android.os.HandlerThread;
import android.support.annotation.NonNull;
@@ -44,6 +45,7 @@ import info.nightscout.androidaps.queue.Callback;
import info.nightscout.utils.BolusWizard;
import info.nightscout.utils.DateUtil;
import info.nightscout.utils.DecimalFormatter;
+import info.nightscout.utils.HardLimits;
import info.nightscout.utils.SP;
import info.nightscout.utils.SafeParse;
import info.nightscout.utils.ToastUtils;
@@ -149,11 +151,11 @@ public class ActionStringHandler {
low *= Constants.MMOLL_TO_MGDL;
high *= Constants.MMOLL_TO_MGDL;
}
- if (low < Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[0] || low > Constants.VERY_HARD_LIMIT_TEMP_MIN_BG[1]) {
+ if (low < HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[0] || low > HardLimits.VERY_HARD_LIMIT_TEMP_MIN_BG[1]) {
sendError("Min-BG out of range!");
return;
}
- if (high < Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[0] || high > Constants.VERY_HARD_LIMIT_TEMP_MAX_BG[1]) {
+ if (high < HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[0] || high > HardLimits.VERY_HARD_LIMIT_TEMP_MAX_BG[1]) {
sendError("Max-BG out of range!");
return;
}
@@ -577,18 +579,18 @@ public class ActionStringHandler {
//check for validity
if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) {
- msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Percentage") + "\n";
+ msg += String.format(MainApp.sResources.getString(R.string.valueoutofrange), "Profile-Percentage") + "\n";
}
if (timeshift < 0 || timeshift > 23) {
- msg += String.format(MainApp.sResources.getString(R.string.openapsma_valueoutofrange), "Profile-Timeshift") + "\n";
+ msg += String.format(MainApp.sResources.getString(R.string.valueoutofrange), "Profile-Timeshift") + "\n";
}
final Profile profile = MainApp.getConfigBuilder().getProfile();
if (profile == null || profile.getBasal() == null) {
- msg += MainApp.sResources.getString(R.string.cpp_notloadedplugins) + "\n";
+ msg += MainApp.sResources.getString(R.string.notloadedplugins) + "\n";
}
if (!"".equals(msg)) {
- msg += MainApp.sResources.getString(R.string.cpp_valuesnotstored);
+ msg += MainApp.sResources.getString(R.string.valuesnotstored);
String rTitle = "STATUS";
String rAction = "statusmessage";
WearPlugin.getPlugin().requestActionConfirmation(rTitle, msg, rAction);
@@ -643,16 +645,20 @@ public class ActionStringHandler {
detailedBolusInfo.insulin = amount;
detailedBolusInfo.carbs = carbs;
detailedBolusInfo.source = Source.USER;
- ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) +
- "\n" +
- result.comment);
+ if (detailedBolusInfo.insulin > 0 || ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo) {
+ ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) +
+ "\n" +
+ result.comment);
+ }
}
- }
- });
+ });
+ } else {
+ MainApp.getConfigBuilder().addToHistoryTreatment(detailedBolusInfo);
+ }
}
private synchronized static void sendError(String errormessage) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java
index 3316d68d12..b72a767278 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java
@@ -197,10 +197,12 @@ public class WearPlugin implements PluginBase {
@Subscribe
public void onStatusEvent(final EventOverviewBolusProgress ev) {
- Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_BOLUSPROGRESS);
- intent.putExtra("progresspercent", ev.percent);
- intent.putExtra("progressstatus", ev.status);
- ctx.startService(intent);
+ if(!ev.isSMB()||SP.getBoolean("wear_notifySMB", false)) {
+ Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_BOLUSPROGRESS);
+ intent.putExtra("progresspercent", ev.percent);
+ intent.putExtra("progressstatus", ev.status);
+ ctx.startService(intent);
+ }
}
@Subscribe
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java
index 4adec23560..74423fe7ac 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java
@@ -663,7 +663,7 @@ public class WatchUpdaterService extends WearableListenerService implements
private String generateCOBString() {
String cobStringResult = "--";
- AutosensData autosensData = IobCobCalculatorPlugin.getLastAutosensData("WatcherUpdaterService");
+ AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("WatcherUpdaterService");
if (autosensData != null) {
cobStringResult = (int) autosensData.cob + "g";
}
diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java
index c5fb9821bc..f241ab74cf 100644
--- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java
+++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java
@@ -41,7 +41,7 @@ public class QueueThread extends Thread {
this.queue = queue;
PowerManager powerManager = (PowerManager) MainApp.instance().getApplicationContext().getSystemService(Context.POWER_SERVICE);
- mWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "QueueThread");
+ mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "QueueThread");
}
@Override
diff --git a/app/src/main/java/info/nightscout/utils/FabricPrivacy.java b/app/src/main/java/info/nightscout/utils/FabricPrivacy.java
new file mode 100644
index 0000000000..bd117ed5c3
--- /dev/null
+++ b/app/src/main/java/info/nightscout/utils/FabricPrivacy.java
@@ -0,0 +1,83 @@
+package info.nightscout.utils;
+
+import com.crashlytics.android.Crashlytics;
+import com.crashlytics.android.answers.Answers;
+import com.crashlytics.android.answers.CustomEvent;
+
+/**
+ * Created by jamorham on 21/02/2018.
+ *
+ * Some users do not wish to be tracked, Fabric Answers and Crashlytics do not provide an easy way
+ * to disable them and make calls from a potentially invalid singleton reference. This wrapper
+ * emulates the methods but ignores the request if the instance is null or invalid.
+ *
+ */
+
+public class FabricPrivacy {
+
+ private static final String TAG = "FabricPrivacy";
+ private static volatile FabricPrivacy instance;
+
+
+ public static FabricPrivacy getInstance() {
+ if (instance == null) {
+ initSelf();
+ }
+ return instance;
+ }
+
+ private static synchronized void initSelf() {
+ if (instance == null) {
+ instance = new FabricPrivacy();
+ }
+ }
+
+ // Crashlytics logException
+ public static void logException(Throwable throwable) {
+ try {
+ final Crashlytics crashlytics = Crashlytics.getInstance();
+ crashlytics.core.logException(throwable);
+ } catch (NullPointerException | IllegalStateException e) {
+ android.util.Log.d(TAG, "Ignoring opted out non-initialized log: " + throwable);
+ }
+ }
+
+ // Crashlytics log
+ public static void log(String msg) {
+ try {
+ final Crashlytics crashlytics = Crashlytics.getInstance();
+ crashlytics.core.log(msg);
+ } catch (NullPointerException | IllegalStateException e) {
+ android.util.Log.d(TAG, "Ignoring opted out non-initialized log: " + msg);
+ }
+ }
+
+ // Crashlytics log
+ public static void log(int priority, String tag, String msg) {
+ try {
+ final Crashlytics crashlytics = Crashlytics.getInstance();
+ crashlytics.core.log(priority, tag, msg);
+ } catch (NullPointerException | IllegalStateException e) {
+ android.util.Log.d(TAG, "Ignoring opted out non-initialized log: " + msg);
+ }
+ }
+
+ public static boolean fabricEnabled() {
+ return SP.getBoolean("enable_fabric", true);
+ }
+
+ // Answers logCustom
+ public void logCustom(CustomEvent event) {
+ try {
+ final Answers answers = Answers.getInstance();
+ if (fabricEnabled()) {
+ answers.logCustom(event);
+ } else {
+ android.util.Log.d(TAG, "Ignoring recently opted-out event: " + event.toString());
+ }
+ } catch (NullPointerException | IllegalStateException e) {
+ android.util.Log.d(TAG, "Ignoring opted-out non-initialized event: " + event.toString());
+ }
+ }
+
+}
diff --git a/app/src/main/java/info/nightscout/utils/HardLimits.java b/app/src/main/java/info/nightscout/utils/HardLimits.java
index ff92cf2e87..1b39951b85 100644
--- a/app/src/main/java/info/nightscout/utils/HardLimits.java
+++ b/app/src/main/java/info/nightscout/utils/HardLimits.java
@@ -1,5 +1,8 @@
package info.nightscout.utils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
@@ -8,17 +11,90 @@ import info.nightscout.androidaps.R;
*/
public class HardLimits {
- final static double MAXBOLUS_ADULT = 17d;
- final static double MAXBOLUS_TEENAGE = 10d;
- final static double MAXBOLUS_CHILD = 5d;
+ private static Logger log = LoggerFactory.getLogger(HardLimits.class);
- public static double maxBolus() {
- String age = SP.getString(R.string.key_age, "");
+ final static int CHILD = 0;
+ final static int TEENAGE = 1;
+ final static int ADULT = 2;
+ final static int RESISTANTADULT = 3;
- if (age.equals(MainApp.sResources.getString(R.string.key_adult))) return MAXBOLUS_ADULT;
- if (age.equals(MainApp.sResources.getString(R.string.key_teenage))) return MAXBOLUS_TEENAGE;
- if (age.equals(MainApp.sResources.getString(R.string.key_child))) return MAXBOLUS_CHILD;
- return MAXBOLUS_ADULT;
+ final static double[] MAXBOLUS = {5d, 10d, 17d, 21d};
+
+ // Very Hard Limits Ranges
+ // First value is the Lowest and second value is the Highest a Limit can define
+ public static final int[] VERY_HARD_LIMIT_MIN_BG = {72, 180};
+ public static final int[] VERY_HARD_LIMIT_MAX_BG = {90, 270};
+ public static final int[] VERY_HARD_LIMIT_TARGET_BG = {80, 200};
+ // Very Hard Limits Ranges for Temp Targets
+ public static final int[] VERY_HARD_LIMIT_TEMP_MIN_BG = {72, 180};
+ public static final int[] VERY_HARD_LIMIT_TEMP_MAX_BG = {72, 270};
+ public static final int[] VERY_HARD_LIMIT_TEMP_TARGET_BG = {72, 200};
+
+ public static final double MINDIA = 2;
+ public static final double MAXDIA = 7;
+
+ public static final double MINIC = 2;
+ public static final double MAXIC = 100;
+
+ public static final double MINISF = 2; // mgdl
+ public static final double MAXISF = 720; // mgdl
+
+ public static final double[] MAXIOB_AMA = {3, 5, 7, 7};
+ public static final double[] MAXIOB_SMB = {3, 6, 10, 12};
+
+ public static final double[] MAXBASAL = {2, 5, 10, 12};
+
+
+ private static int loadAge() {
+ String sp_age = SP.getString(R.string.key_age, "");
+ int age;
+
+ if (sp_age.equals(MainApp.sResources.getString(R.string.key_child)))
+ age = CHILD;
+ else if (sp_age.equals(MainApp.sResources.getString(R.string.key_teenage)))
+ age = TEENAGE;
+ else if (sp_age.equals(MainApp.sResources.getString(R.string.key_adult)))
+ age = ADULT;
+ else if (sp_age.equals(MainApp.sResources.getString(R.string.key_resistantadult)))
+ age = RESISTANTADULT;
+ else age = ADULT;
+
+ return age;
}
+ public static double maxBolus() {
+ return MAXBOLUS[loadAge()];
+ }
+
+ public static double maxIobAMA() {
+ return MAXIOB_AMA[loadAge()];
+ }
+
+ public static double maxIobSMB() {
+ return MAXIOB_SMB[loadAge()];
+ }
+
+ public static double maxBasal() {
+ return MAXBASAL[loadAge()];
+ }
+
+ // safety checks
+ public static boolean checkOnlyHardLimits(Double value, String valueName, double lowLimit, double highLimit) {
+ return value.equals(verifyHardLimits(value, valueName, lowLimit, highLimit));
+ }
+
+ public static Double verifyHardLimits(Double value, String valueName, double lowLimit, double highLimit) {
+ Double newvalue = value;
+ if (newvalue < lowLimit || newvalue > highLimit) {
+ newvalue = Math.max(newvalue, lowLimit);
+ newvalue = Math.min(newvalue, highLimit);
+ String msg = String.format(MainApp.sResources.getString(R.string.valueoutofrange), valueName);
+ msg += ".\n";
+ msg += String.format(MainApp.sResources.getString(R.string.valuelimitedto), value, newvalue);
+ log.error(msg);
+ NSUpload.uploadError(msg);
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), msg, R.raw.error);
+ }
+ return newvalue;
+ }
}
diff --git a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java
index e74818d447..915d8bfb27 100644
--- a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java
+++ b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java
@@ -1,9 +1,7 @@
package info.nightscout.utils;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Date;
@@ -17,13 +15,14 @@ import info.nightscout.androidaps.interfaces.PumpInterface;
import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.Overview.notifications.Notification;
-import info.nightscout.androidaps.receivers.KeepAliveReceiver;
/**
* Created by adrian on 17/12/17.
*/
public class LocalAlertUtils {
+ private static Logger log = LoggerFactory.getLogger(LocalAlertUtils.class);
+
public static int missedReadingsThreshold() {
return SP.getInt(MainApp.sResources.getString(R.string.key_missed_bg_readings_threshold), 30) * 60 * 1000;
}
@@ -34,14 +33,18 @@ public class LocalAlertUtils {
public static void checkPumpUnreachableAlarm(Date lastConnection, boolean isStatusOutdated) {
boolean alarmTimeoutExpired = lastConnection.getTime() + pumpUnreachableThreshold() < System.currentTimeMillis();
- boolean nextAlarmOccurrenceReached = SP.getLong("nextPumpDisconnectedAlarm", 0l) < System.currentTimeMillis();
+ boolean nextAlarmOccurrenceReached = SP.getLong("nextPumpDisconnectedAlarm", 0L) < System.currentTimeMillis();
if (Config.APS && SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_pump_unreachable_alert), true)
&& isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !ConfigBuilderPlugin.getActiveLoop().isDisconnected()) {
+ log.debug("Generating pump unreachable alarm. lastConnection: " + DateUtil.dateAndTimeString(lastConnection) + " isStatusOutdated: " + isStatusOutdated);
Notification n = new Notification(Notification.PUMP_UNREACHABLE, MainApp.sResources.getString(R.string.pump_unreachable), Notification.URGENT);
n.soundId = R.raw.alarm;
SP.putLong("nextPumpDisconnectedAlarm", System.currentTimeMillis() + pumpUnreachableThreshold());
MainApp.bus().post(new EventNewNotification(n));
+ if (SP.getBoolean(R.string.key_ns_create_announcements_from_errors, true)) {
+ NSUpload.uploadError(n.text);
+ }
}
}
@@ -91,6 +94,9 @@ public class LocalAlertUtils {
n.soundId = R.raw.alarm;
SP.putLong("nextMissedReadingsAlarm", System.currentTimeMillis() + missedReadingsThreshold());
MainApp.bus().post(new EventNewNotification(n));
+ if (SP.getBoolean(R.string.key_ns_create_announcements_from_errors, true)) {
+ NSUpload.uploadError(n.text);
+ }
}
}
}
diff --git a/app/src/main/java/info/nightscout/utils/LogDialog.java b/app/src/main/java/info/nightscout/utils/LogDialog.java
index 0bd4216163..b98582c05f 100644
--- a/app/src/main/java/info/nightscout/utils/LogDialog.java
+++ b/app/src/main/java/info/nightscout/utils/LogDialog.java
@@ -7,7 +7,6 @@ import android.content.DialogInterface;
import android.content.ClipboardManager;
import android.widget.TextView;
-import com.crashlytics.android.Crashlytics;
import java.io.BufferedReader;
import java.io.IOException;
diff --git a/app/src/main/java/info/nightscout/utils/NSUpload.java b/app/src/main/java/info/nightscout/utils/NSUpload.java
index 2f8893aa7b..690b239128 100644
--- a/app/src/main/java/info/nightscout/utils/NSUpload.java
+++ b/app/src/main/java/info/nightscout/utils/NSUpload.java
@@ -399,6 +399,7 @@ public class NSUpload {
try {
data.put("eventType", "Announcement");
data.put("created_at", DateUtil.toISOString(new Date()));
+ data.put("enteredBy", SP.getString("careportal_enteredby", MainApp.gs(R.string.app_name)));
data.put("notes", error);
data.put("isAnnouncement", true);
} catch (JSONException e) {
diff --git a/app/src/main/jniLibs/arm64-v8a/libBleCommandUtil.so b/app/src/main/jniLibs/arm64-v8a/libBleCommandUtil.so
deleted file mode 100644
index 69e283b5fe..0000000000
Binary files a/app/src/main/jniLibs/arm64-v8a/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/jniLibs/armeabi-v7a/libBleCommandUtil.so b/app/src/main/jniLibs/armeabi-v7a/libBleCommandUtil.so
deleted file mode 100644
index 0c717bc3e8..0000000000
Binary files a/app/src/main/jniLibs/armeabi-v7a/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/jniLibs/armeabi/libBleCommandUtil.so b/app/src/main/jniLibs/armeabi/libBleCommandUtil.so
deleted file mode 100644
index a51a8c7d9a..0000000000
Binary files a/app/src/main/jniLibs/armeabi/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/jniLibs/mips/libBleCommandUtil.so b/app/src/main/jniLibs/mips/libBleCommandUtil.so
deleted file mode 100644
index fcff5eb6b2..0000000000
Binary files a/app/src/main/jniLibs/mips/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/jniLibs/mips64/libBleCommandUtil.so b/app/src/main/jniLibs/mips64/libBleCommandUtil.so
deleted file mode 100644
index a8a292ea13..0000000000
Binary files a/app/src/main/jniLibs/mips64/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/jniLibs/x86/libBleCommandUtil.so b/app/src/main/jniLibs/x86/libBleCommandUtil.so
deleted file mode 100644
index 638a9def95..0000000000
Binary files a/app/src/main/jniLibs/x86/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/jniLibs/x86_64/libBleCommandUtil.so b/app/src/main/jniLibs/x86_64/libBleCommandUtil.so
deleted file mode 100644
index 94873d3732..0000000000
Binary files a/app/src/main/jniLibs/x86_64/libBleCommandUtil.so and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/icon_xdrip.png b/app/src/main/res/drawable-hdpi/icon_xdrip.png
new file mode 100644
index 0000000000..bda51738e7
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_xdrip.png differ
diff --git a/app/src/main/res/drawable-mdpi/icon_xdrip.png b/app/src/main/res/drawable-mdpi/icon_xdrip.png
new file mode 100644
index 0000000000..700e274f5b
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/icon_xdrip.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_xdrip.png b/app/src/main/res/drawable-xhdpi/icon_xdrip.png
new file mode 100644
index 0000000000..ae4c77b1a8
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_xdrip.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_xdrip.png b/app/src/main/res/drawable-xxhdpi/icon_xdrip.png
new file mode 100644
index 0000000000..c375417b1c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_xdrip.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/icon_xdrip.png b/app/src/main/res/drawable-xxxhdpi/icon_xdrip.png
new file mode 100644
index 0000000000..2b4b8323b8
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_xdrip.png differ
diff --git a/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml b/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml
new file mode 100644
index 0000000000..e6bb3ca920
--- /dev/null
+++ b/app/src/main/res/drawable/ic_chevron_left_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml
new file mode 100644
index 0000000000..24835127dd
--- /dev/null
+++ b/app/src/main/res/drawable/ic_chevron_right_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_first_page_black_24dp.xml b/app/src/main/res/drawable/ic_first_page_black_24dp.xml
new file mode 100644
index 0000000000..483f56c7c2
--- /dev/null
+++ b/app/src/main/res/drawable/ic_first_page_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_last_page_black_24dp.xml b/app/src/main/res/drawable/ic_last_page_black_24dp.xml
new file mode 100644
index 0000000000..0d04354c14
--- /dev/null
+++ b/app/src/main/res/drawable/ic_last_page_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/icon_insulin_carbs.xml b/app/src/main/res/drawable/icon_insulin_carbs.xml
new file mode 100644
index 0000000000..6dcd511598
--- /dev/null
+++ b/app/src/main/res/drawable/icon_insulin_carbs.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml
new file mode 100644
index 0000000000..a4959eb3f7
--- /dev/null
+++ b/app/src/main/res/layout/activity_historybrowse.xml
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/circadianpercentageprofile_editbasal_dialog.xml b/app/src/main/res/layout/circadianpercentageprofile_editbasal_dialog.xml
deleted file mode 100644
index ac703d6536..0000000000
--- a/app/src/main/res/layout/circadianpercentageprofile_editbasal_dialog.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/circadianpercentageprofile_fragment.xml b/app/src/main/res/layout/circadianpercentageprofile_fragment.xml
deleted file mode 100644
index 3e712004ff..0000000000
--- a/app/src/main/res/layout/circadianpercentageprofile_fragment.xml
+++ /dev/null
@@ -1,307 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/circadianpercentageprofile_listelement.xml b/app/src/main/res/layout/circadianpercentageprofile_listelement.xml
deleted file mode 100644
index 28d72b2a09..0000000000
--- a/app/src/main/res/layout/circadianpercentageprofile_listelement.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/overview_error_dialog.xml b/app/src/main/res/layout/overview_error_dialog.xml
index e32007ad68..0a8fa5483b 100644
--- a/app/src/main/res/layout/overview_error_dialog.xml
+++ b/app/src/main/res/layout/overview_error_dialog.xml
@@ -13,12 +13,20 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
+
+
diff --git a/app/src/main/res/layout/overview_fragment.xml b/app/src/main/res/layout/overview_fragment.xml
index 10c89254e9..64fccac3af 100644
--- a/app/src/main/res/layout/overview_fragment.xml
+++ b/app/src/main/res/layout/overview_fragment.xml
@@ -347,26 +347,17 @@
-
+ android:layout_weight="1" />
-
-
-
-
-
+
@@ -410,11 +401,41 @@
android:layout_height="fill_parent"
android:layout_marginRight="-4dp"
android:layout_weight="0.5"
+ android:drawableTop="@drawable/icon_insulin_carbs"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp"
+ android:text="@string/overview_treatment_label"
+ android:textColor="@color/colorTreatmentButton"
+ android:textSize="10sp"
+ android:visibility="gone" />
+
+
+
+
@@ -448,6 +469,21 @@
android:textSize="10sp"
android:visibility="gone" />
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml b/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml
index 0b66f79ab2..83d2cbabdb 100644
--- a/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml
+++ b/app/src/main/res/layout/overview_fragment_nsclient_tablet.xml
@@ -704,12 +704,42 @@
android:layout_height="fill_parent"
android:layout_marginRight="-4dp"
android:layout_weight="0.5"
+ android:drawableTop="@drawable/icon_insulin_carbs"
+ android:paddingLeft="0dp"
+ android:paddingRight="0dp"
+ android:text="@string/overview_treatment_label"
+ android:textColor="@color/colorTreatmentButton"
+ android:textSize="10sp" />
+
+
+ android:text="@string/overview_insulin_label"
+ android:textColor="@color/colorInsulinButton"
+ android:textSize="10sp"
+ android:visibility="gone" />
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/overview_newinsulin_dialog.xml b/app/src/main/res/layout/overview_newinsulin_dialog.xml
new file mode 100644
index 0000000000..b761933cea
--- /dev/null
+++ b/app/src/main/res/layout/overview_newinsulin_dialog.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/overview_newtreatment_dialog.xml b/app/src/main/res/layout/overview_newtreatment_dialog.xml
index cc7557ab80..0321d6409c 100644
--- a/app/src/main/res/layout/overview_newtreatment_dialog.xml
+++ b/app/src/main/res/layout/overview_newtreatment_dialog.xml
@@ -22,7 +22,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
- android:text="@string/bolus"
+ android:text="@string/overview_treatment_label"
android:textAppearance="?android:attr/textAppearanceLarge" />
+
diff --git a/app/src/main/res/raw/boluserror.mp3 b/app/src/main/res/raw/boluserror.mp3
index 5a1f3ea1c9..be2eb9b5b1 100644
Binary files a/app/src/main/res/raw/boluserror.mp3 and b/app/src/main/res/raw/boluserror.mp3 differ
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 5839ae79ce..ab2b55cb1a 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -111,7 +111,7 @@
Стойност на базал [%]
% (100% = текущ)
Приложи нов временен базал:
- Болус
+ Болус
Калкулатор
Приложено ограничение!
Потвърждение
@@ -310,8 +310,8 @@
Loop has been enabled
Loop is disabled
Loop is enabled
- %.2f ограничен до %.2f
- Стойността %s е извън границите
+ %.2f ограничен до %.2f
+ Стойността %s е извън границите
Remote basal setting is not allowed
Remote command is not allowed
To start basal %.2fU/h reply with code %s
@@ -357,7 +357,6 @@
Редактирай Инс. чувствителност
Редактирай Инс./ВХ
Базов профил:
- Процентен профил
Диапазон за визуализация
Стойност на линиите за ниска и висока КЗ (mmol/l) за телефона и часовника
Ниска КЗ под
@@ -420,7 +419,6 @@
Вцел
ЛПр
DANA
- ППр
ВБ
ОСН
ВП
@@ -515,6 +513,7 @@
Изключи Loop за 2ч
Изключи Loop за 3ч
Изключи Loop за 10 ч
+ Изключи помпата за 15 мин.
Изключи помпата за 30 мин.
Изключи помпата за 1 ч
Изключи помпата за 2 ч
@@ -612,9 +611,8 @@
чрез Среднопретеглената стойност
OK
Откажи
- трябва да е активно за да изпрати стойностите към помпата!
- Не всички профили са заредени!
- Стойностите не са запазени!
+ Не всички профили са заредени!
+ Стойностите не са запазени!
Изчисти лога
неуспешно - моля проверете телефона
Недостъпно
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 8e8d09f692..550da6e376 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -116,7 +116,7 @@
Kalkulačka
Hodnota bazálu [%]
% (100% = současný)
- Bolus
+ Bolus
NS profil
Stav pumpy dostupný v NS
Hodnota
@@ -285,7 +285,7 @@
Smyčka je povolena
Spanish
Není vybrán žádný profil
- Hodnota %s je mimo přednastavený rozsah
+ Hodnota %s je mimo přednastavený rozsah
Vzdálené posílání příkazů není povoleno
Na spuštění bazálu %.2fU/h odpověz SMS s kódem %s
Na ukončení bazálu odpověz SMS s kódem %s
@@ -313,7 +313,6 @@
Tlačítko 1
Tlačítko 2
Tlačítko 3
- Cirkadiánní procentuální profil
DIA:
Smyčka zakázána
Editovat základní bazál:
@@ -375,7 +374,7 @@
Používat autodetekci senzitivity
Data detekce senzitivity
Ladící informace
- %.2f omezeno na %.2f
+ %.2f omezeno na %.2f
Odstranit záznam:
Krátkodobý průměr
Obnovit události z NS
@@ -395,7 +394,6 @@
MPRF
DANA
KONF
- CPP
PÉČE
Rozšířené nastavení
Vždy používat krátkodobý průměrný rozdíl glykémií místo rozdílu posledních 2 hodnot
@@ -496,6 +494,7 @@
Odpojit pumpu na 10 h
Odpojit pumpu na 1 h
Odpojit pumpu na 2 h
+ Odpojit pumpu na 15 min
Odpojit pumpu na 30 min
Odpojit pumpu na 3 h
Povolit smyčku
@@ -550,9 +549,8 @@
SEN
COB
Detekce citlivosti
- Všechny profily nenačteny
- musí být aktivované, aby šly poslat hodnoty do pumpy!
- Hodnoty nejsou uloženy!
+ Všechny profily nenačteny
+ Hodnoty nejsou uloženy!
DanaRv2
ODCH
Zařízení
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 265c6c63ac..40a2412851 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -75,7 +75,7 @@
Eingabeparameter
IOB-Daten
Open Loop
- Bolus
+ Bolus
Rechner
TBR
Rate
@@ -311,7 +311,6 @@
LP
DANA
CONF
- CPP
CP
Bitte verwende nur Ziffern.
Pflichtfeld
@@ -394,9 +393,8 @@
Pumpenbatterie-Wechsel
SAGE
Insulin
- Es sind nicht alle Profile geladen!
- muss aktiviert werden, um Werte an die Pumpe zu senden!
- Werte nicht gespeichert!
+ Es sind nicht alle Profile geladen!
+ Werte nicht gespeichert!
Aktiviere verlängerten Bolus in der Pumpe
DanaR Stats
# Tage
@@ -415,6 +413,7 @@
Trenne Pumpe für 10 h
Trenne Pumpe für 1 h
Trenne Pumpe für 2 h
+ Trenne Pumpe für 15 Min.
Trenne Pumpe für 30 Min.
Trenne Pumpe für 3 h
Ignoriere Profilwechsel
@@ -481,7 +480,7 @@
OAPS
OpenAPS AMA
Skript Debug
- Wert %s ist außerhalb des festen Limits
+ Wert %s ist außerhalb des festen Limits
Kalibrierung
Kalibrierung
Button-Text:
@@ -579,7 +578,7 @@
Unbekannter Befehl oder falsche Antwort
Falsche Dauer
Einstellungen freischalten
- %.2f limitiert auf %.2f
+ %.2f limitiert auf %.2f
S-Bolus
Model: %02X Protokoll: %02X Code: %02X
Empfindlichkeitserkennung
@@ -620,7 +619,6 @@
Prozentsatz
Zeitverschiebung
BAT
- CircadianPercentage-Profil
Zeitüberschreitung der Verbindung
Füllen
DE-Bolus
@@ -723,7 +721,6 @@
Bolus (%.1f IE) wird abgegeben
Bitte starte dein Telefon neu oder starte AndroidAPS in den System-Einstellungen neu. Andernfalls wird AndroidAPS nicht protokolliert (wichtig zum Nachverfolgen und Verifizieren, dass der Algorithmus korrekt funktioniert)
TBR
- %.1f IE (%s, %s)
Ein gleich großer Bolus wurde in der letzten Minute angefordert. Dies ist nicht zulässig, um ungewollte Doppelboli zu verhindern und vor eventuellen Bugs zu schützen.
Historie wird gelesen
Basalratenprofil wird aktualisiert
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index b9fd9bff78..fd685edbea 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -113,7 +113,7 @@
Αξία Βασικού[%]
% (100% = τρέχον)
Αποδοχή νέου Προσ.Ρυθμ:
- Bolus
+ Bolus
Υπολογιστής
Εφαρμοσμένοι Περιορισμοί!
Αποδοχή
@@ -307,8 +307,8 @@
Το κύκλωμα ενεργοποιήθηκε
Κύκλωμα απενεργοποιημένο
Κύκλωμα ενεργοποιημένο
- %.2f limited to %.2f
- Τιμή %s είναι έξω από τα όρια
+ %.2f limited to %.2f
+ Τιμή %s είναι έξω από τα όρια
"Δεν επιτρέπεται η απομακρυσμένη ρύθμιση βασικού ρυθμού "
Δεν επιτρέπεται απομακρυσμένη εντολή
Για έναρξη βασικού %.2fU/h SMS με κωσικό %s
@@ -354,7 +354,6 @@
Ρύθμιση Βασικού-ISF:
Ρύθμιση Βασικού-IC:
Βασικό Προφίλ:
- Ποσοστό προφίλ κυκλώματος
Εύρος εμφάνισης
Υψηλό και Χαμηλό σημείο για την γραφική στην Επισκόπηση και Smartwatch
ΧΑΜΗΛΟ σημείο
@@ -417,7 +416,6 @@
TT
LP
DANA
- CPP
TB
HOME
VPUMP
@@ -512,6 +510,7 @@
Κύκλωμα σε παύση για 2h
Κύκλωμα σε παύση για 3h
Κύκλωμα σε παύση για 10h
+ Αποσύνδεση αντλίας για 15 λεπτά
Αποσύνδεση αντλίας για 30 λεπτά
Αποσύνδεση αντλίας για 1h
Αποσύνδεση αντλίας για 2h
@@ -611,9 +610,8 @@
Σταθμισμένος μέσος όρος ευαισθησίας
OK
Ακύρωση
- Χρειάζεται να ενεργοποιηθεί για να στείλει τιμές στην αντλία!
- Δεν έχουν φορτωθεί όλα τα προφίλ
- Οι τιμές δεν αποθηκεύτηκαν!
+ Δεν έχουν φορτωθεί όλα τα προφίλ
+ Οι τιμές δεν αποθηκεύτηκαν!
Επισκόπηση ειδοποιήσεων
Αποστολή ειδοποιήσεων ως ειδήσεων για τα ρολόγια
Ενεργοποιήστε την αποστολή σε άλλες εφαρμογές (όπως xDrip)
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 1b4f3aa944..8922713a96 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -104,7 +104,7 @@
Valor basal [%]
% (100% = actual)
Aceptar nueva basal temporal:
- Bolo
+ Bolo
Calculadora
Restricción aplicada!
Confirmación
@@ -287,7 +287,7 @@
Corr
Lazo Inactivo
Bolo Comida
- Valor %s fuera de limites
+ Valor %s fuera de limites
Botón Texto:
Carbohidratos:
Validar:
@@ -333,7 +333,6 @@
"PerfLoc"
"Dana"
"Conf"
- "CPP"
"CP"
Actividad
Por favor reinicia el teléfono o AndroidAPS desde ajustes de sistema, sino AndroidAPS no guardará registros (importantes para trazar y verificar que el algoritmo funcione correctamente)
@@ -392,7 +391,7 @@
Duración de acitividad de insulina
Errores
habilitar funciones adicionales para uso durante el día como SMB
- %.2f limitado a %.\"f
+ %.2f limitado a %.2f
no permitido el mando remoto
Para cancelar loop por %d minutos responde con código %s
Rellenar/Llenar
@@ -404,7 +403,6 @@
Editar Base-Basal:
Edidat Base-ISF:
Editar Base-IC:
- CircadianPercentageProfile
Reloj
Abrir ajustes en reloj
Batería de la bomba descargada
@@ -438,22 +436,14 @@
Ajustes avancados
Modelo: %02X Protocolo: %02X Codigo: %02X
Perfiles
- max_daily_safety_multiplier
"Valor por defecte: 3 Esto es valor de seguridad establecido pos OpenAPS. Limita tu base al máximo de x3 de tu base máxima. No necesitas cambiar esto, pero debes tener en cuenta, que esto se esta discutiento sobre „3 x max diario; 4x actual“ pro razones de seguridad. "
- current_basal_safety_multiplier
"Ajuste pro defecto: 4 Esto es la otra mitad de los ajustes de seguridad de OpenAPS y la otra mitad de \"3x max diario, 4x actual\". Esto significa, que tu base no puede ser mas alta que el numero que multiplica tu base. Esto es para evitar que las personas se encuentren en situaciones peligrosas por aumentar mucho la base sin entender el algoritmo del sistema. El ajuste por defecto es x4. La mayoría de las personas nunca tendra que cambiar estos ajustes, si no debe modificar otros ajustes en la terapia. "
- autosens_max
"Ajuste por defecto: 1.2\nEsto es un multilicador para autosens (y pronto autotune) para poner un 20% limite máximo a la cota de autosens ratio, la que determina cuantos ajustes autosens puede hacer a la base, a cuanto puede ajustar ISF y a cuanto puede bajar el objective de glucosa. "
- autosens_min
Ajuste pro defecto: 0.7\nEl otro lade de limitaciones de seguridad de autosens, limitando a cuanto puede bajar la base y a cuanto puede subir ISF y BG objectivos.
- autosens_adjust_targets
Ajuste pro defcto: true\nEsto se usa para permitir autosens a ajustar objectivos BG en addicion a ISF y bases.
- bolussnooze_dia_divisor
Ajuste pro defecto: 2 \nDormir bolo es iniciado después de proveder un bolo para comida, así el loop no interactuará con low temps cuando acabas de comer. El ajuste pro defecto es 2; quiere decir con el DIA de 3 h el bolo será dormido por fases por 1.5 h (3DIA/2).
- 5_min_carb_impact
"Ajustes pro defecto: 3.0\nEsto es un ajuste pro defecto para la absorcion de carbohidratos pro 5 minutos. Por defecto se espera 3mg/dl/5min. Esto afecta la velocidad de reduccion de COB y cuanta absorcion se usa para calcular el BG futuro previsto, si la glucosa diminua mas de lo previsto o aumenta mas de lo previsto. "
"Atención!\nNormalment no tienes que editar los valores a continuacion. Por favor PINCHA AQUI y LEE el texto y PROCURA ENTENDER antes de cambiar alguno de los valores. "
- http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html
numero de telefonp incorrecto
Copiar al Clipboard
Copiado al clipboard
@@ -527,6 +517,7 @@
Desactivar loop por 2h
Desactivar loop por 3h
Desactivar loop por 10 h
+ Desconectar bomba por 15 min
Desconectar bomba por 30 min
Desconectar bomba por 1 h
Desconectar bomba por 2 h
@@ -625,13 +616,10 @@
Sensitivity WeightedAverage
OK
Cancelar
- necesita ser activado para mandar valores a la bomba!
- Faltan perfiles!
- Valores no guardados!
+ Faltan perfiles!
+ Valores no guardados!
Resumen avisos
Mandar resumen de avisos como avisos de confirmacion por reloj.
- Accu-Chek Combo
- COMBO
Activar mensajes a otras aplicaciones (como xDrip).
Activar mensajes locales.
ACTIVITY Y FEEDBACK
@@ -742,7 +730,6 @@
Actividad
Ninguna coneccnion por %d min
%d%% (%d min restan)
- %.1f U (%s, %s)
Iniciando
Desconectado
Apagado por error
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 31cdf9b3b5..b83c59b50d 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -22,8 +22,8 @@
Unités
Durée d’Action
Profil actif
- "I:G (Ratio Insuline/Glucides) "
- "Facteur SI "
+ "I:G (Ratio Insuline/Glucides)"
+ "Facteur SI"
Basal
Cible
Insuline:
@@ -50,12 +50,8 @@
TOTAL
"Exécuter maintenant "
POMPE VIRTUELLE
- "Taux du Débit de Base "
- Basal Temporaire
Bolus étendu
- Niveau Batterie
- Niveau Réservoir
- Confirmer
+ OK
Erreur SQL
Dérnière exécution
Paramètres de saisie
@@ -81,7 +77,7 @@
OpenAPS MA
Aperçu
Profil NS
- Profile simple
+ Profil simple
Basal Tempo
Traitements
Pompe virtuelle
@@ -101,7 +97,7 @@
Après traitement des restrictions
"Défini par pompe "
Dérnière mise en marche
- Confirmer
+ OK
Annuler
Pas d\'APS séléctionné ou résultat fourni
Sécurité
@@ -112,7 +108,7 @@
Valeur Basal [%]
% (100% = current)
Acceptez nouveau basal temp
- Bolus
+ Bolus
Calculateur de Bolus
Restriction appliquée!
Confirmation
@@ -148,7 +144,7 @@
Contrôle de Glycémie
Notification
Remarque
- Question
+ Activité Physique
Changement Zone D\'insertion
Insertion Capteur CGM
Début Capteur CGM
@@ -194,18 +190,18 @@
Fichier introuvable
Exporter les paramètres
Importer les paramètres
- Dutch
- German
- Spanish
- Greek
- Italian
- Russian
- Swedish
+ Hollandais
+ Allemand
+ Espagnol
+ Grec
+ Italien
+ Russe
+ Suédois
"U/hr Max avec laquelle le débit temp pourra être programmé "
Cette valeur est appelée basal maximum dans le contexte OpenAPS
Le Basal IR maximum que l\'OpenAPS pourra délivrer [U]
Cette valeur est appelée Max IOB dans le contexte OpenAPS
- Bulgarian
+ Bulgare
DanaR
REJETER
Langue
@@ -223,7 +219,6 @@
Erreur connection pompe
IR affichée sur pompe
Unités Journalières
- Dernier Bolus
h passées
Données saisies invalides
Valeur n\'est pas reglée correctement
@@ -311,8 +306,8 @@
Loop a été désactivé
"Loop est désactivé "
Loop est activé
- %.2f limité à %.2f
- La valeur %s est hors limites strictes
+ %.2f limité à %.2f
+ La valeur %s est hors limites strictes
Le réglage du basal à distance n\'est pas autorisé
La commande à distance n\'est pas autorisée
Lancer le basal %.2fU/h retour avec un code %s
@@ -321,8 +316,8 @@
Démarage échoué pour basal tempo
Arrêter basal tempo retour avec un code %s
Basal tempo annulé
- Annuler basal tempo échoué
- "Commande inconnue ou réponse fausse "
+ Annulation basal tempo échouée
+ "Commande inconnue ou fausse réponse "
Assistant Bolus Rapide
Paramètres assistant bolus rapide
Titre sur la touche:
@@ -341,7 +336,7 @@
Pompe non initialisée!
Pompe non initialisée, profil non prédéfini
Amorcer/Remplir
- Veillez à ce que la quantité corresponde à la spécification de votre KT!
+ Veuillez à ce que la quantité corresponde à la spécification de votre KT!
Autres
Remplir/Amorcer des quantités standard d’insuline
Touche 1
@@ -352,13 +347,12 @@
Unités
mg/dl
mmol/l
- Durée d\'Action
+ Durée d\'Action d\'Insuline
Fourchette cible:
"Éditer Débit de Base: "
- "Éditer Facteur SI de Base: "
- "Éditer I:G de Base: "
+ "Éditer Facteur SI de Base: "
+ "Éditer I:G de Base: "
Profil de Base:
- Profil en Pourcentage Circadien
Écart de visualisation
Les repères hauts et bas sur les graphiques pour l’apercu et la montre
Repère BAS
@@ -379,14 +373,14 @@
"Modifier le mode U/d au U/h dans la pompe "
Le débit de base est en dessous du minimum. Profil non prédéfini!
G:
- Dernière G
- IQM
+ Dernière G:
+ MIQ (Multiples Injections Quotidiennes)
MM640g
Notification En Cours
- ANCIENNES DONNÉES
- %dmin passées
+ DONNÉES ANCIENNES
+ %d min passées
%dmin passées
- Profile Local
+ Profil Local
OpenAPS AMA
Courte moyenne delta
Longue moyenne delta
@@ -412,7 +406,7 @@
Pour les anciennes données appuyez sur Actualiser svp
Débit de Base Total
DBT*2
- En cours d\'initialisation
+ En cours d\'initialisation...
ACT
CONF
LOOP
@@ -421,11 +415,10 @@
TT
LP
DANA
- CPP
TB
HOME
POMPEV
- PROFILE NS
+ PROFIL NS
TRAITER
CP
OBJ
@@ -455,7 +448,7 @@
"Étalonnage envoyé. La récepetion doit être activée dans xDrip. "
xDrip ne reçoit pas les étalonnages
Ne plus montrer ce message
- Pompe suspendue.Cliquez pour actualiser le profile
+ Pompe suspendue. Cliquez pour actualiser le profile
Pompe suspendue
Obtenir l\'état de pompe
Définir basal tempo
@@ -491,7 +484,7 @@
File d\'attente:
État
Interrompu
- Effacer histo
+ Effacer l\'histo
NSCLIENT ne possède pas la permission d\'écriture. Mauvais API secret?
Paramètres Wear
Afficher l\'IR détaillée
@@ -515,6 +508,7 @@
Suspendre Loop pour 2h
Suspendre Loop pour 3h
Suspendre Loop pour 10h
+ Déconnecter la pompe 15min
Déconnecter la pompe 30min
Déconnecter la pompe 1h
Déconnecter la pompe 2h
@@ -543,8 +537,7 @@
"PRÉ "
BAS
Firmware
- Dernière Connexion
- état du Bluetooth
+ État Bluetooth
à propos de
Autorisation SMS manquante
DEV
@@ -608,20 +601,19 @@
UPLD
BAS
EXT
- écran verrouillé
+ Écran verrouillé
verrouiller
En activant la fonction Autosens, n’oubliez pas de rentrer tout les glucides consommés. Sinon les déviations de glucides seront incorrectement identifiées alors que la sensibilité change !!
Sensibilité avec moyenne pondérée
OK
Annuler
- Besoin d’être activé(e) pour que les valeurs soient envoyées à la pompe!
- Pas tous les profils sont téléchargés!
- Valeurs non enregistrées!
+ Pas tous les profils sont téléchargés!
+ Valeurs non enregistrées!
Notifications d\'aperçu
Transférez les notifications d’aperçu comme des messages de confirmation sur la montre.
Activer les transmissions de données sur d\'autres app. (ex. Xdrip)
Activer les transmissions locales.
- "ACTIVITÉ "
+ ACTIVITÉ et FEEDBACK
Question
Succès
Se connecter pour %d s
@@ -693,8 +685,8 @@
Afficher delta avec une décimale supplémentaire
"Firmware pompe incompatible "
Transmettre les données G sur xDrip+
- Dand xDrip+ veuillez séléctionner 640g/Eversense comme source de données
- "G NSClient "
+ Dans xDrip+ veuillez séléctionner 640g/Eversense comme source de données
+ "Glycémie NSClient"
"Valeur du basal remplacée par la valeur minimale supportée "
Calcul de G
Calcul IR du Bolus
@@ -704,4 +696,146 @@
Oui
Non
Caclcul GR
-
\ No newline at end of file
+ Dernière connexion
+ GLUCIDES et BOLUS
+ CGM et OPENAPS
+ Basal Tempo
+ Dernier bolus
+ INFO
+ Cible temporaire
+ Activer des fonctionalités suplémentaires pour l’usage diurne, telle que la fonction SMB
+ Normalement vous ne devez pas changer les valeurs mentionnées ci-dessous. CLIQUEZ ICI et LISEZ bien le texte et assurez-vous de bien le COMPRENDRE avant de changer n’importe quelle valeur
+ Valeur par Défaut : 3.0. Ceci est le réglage par défaut de l\'impact d\'absorption de glucides pendant 5 minutes. Le réglage par défaut représente 3mg/dl/5min. Ceci aura des répercussions sur quelle vitesse les GR (Glucides Restants) seront décomposés dans le sang, et combien d\'absorption de glucides sera prise en considération pour évaluer la prochaine glycémie envisagée, quand la glycémie sera en baisse plus que prévu, ou ne sera pas en hausse comme c\'était prévu
+ "Valeur par défaut : 3 Ceci est la clé de paramètre de limite de sécurité de l’OpenAPS. Ceci va limiter vos débits de base à une limite 3x, cela va être votre débit de base maximum (Pour ces personnes). Il est probable que vous n’auriez pas besoin de changer cela, mais vous devrez être conscient de ce qui a est évoqué pour le “3x max daily; 4x current” pour les limites de sécurité. "
+ Valeur par défaut : 4 Ceci est l’autre moitié de la clé de paramètre de limite de sécurité pour l’OpenAPS, et l’autre moitié de “3x max daily, 4x current” des paramètres limites de sécurité. Quel que soit le basal maximum prédéfini dans votre pompe, il ne pourra pas être plus haut que ce nombre multiplié par le taux de base actuel. Ceci est fait pour ne pas mettre l’utilisateur en danger en programmant excessivement des débits de base maximum trop élevés avant de comprendre comment l’algorithme fonctionne. Encore une fois, la valeur par défaut est 4x, la plupart des gens n’auront jamais besoin d’ajuster ce paramètre, plutôt ils auront tendance besoin d’ajuster d’autres paramètres s’ils voient qu’ils se retrouvent dans ce paramètre de limite de sécurité.
+ Valeur par défaut: 1.2 Ceci est la limite du multiplicateur pour autosens (ensuite autotune) pour être programmé à 20% en limite maximale, ceci dit va définir sur quel seuil maximum le ratio autosens pourra être programmé, à son tour va déterminer à partir de quelle valeur maximale autosens pourra ajuster les débits de base, et à partir de quelle valeur minimale va -t -il ajuster le Facteur SI (Facteur de sensibilité à l\'insuline), et à partir de quelle valeur minimale pourra t-il déterminer la cible glycémique
+ Valeur par défaut: 0.7 l’autre aspect pour les limites de sécurité pour autosens, choisir une limite qui détermine à partir de quelle valeur minimale autosens va -t -il ajuster le basal , et à partir de quelle valeur maximale pourra t-il (autosens) ajuster le Facteur SI (Facteur de sensibilité à l\'insuline) et cible glycémiques.
+ g
+ ]]>
+ kJ
+ En
+ Proteines
+ Gras (Lipides)
+ ]]>
+ "Alarme d'urgence "
+ Minutes maximales de basal pour limiter le SMB de
+ Seulement positif
+ Seulement négatif
+ Loop activé
+ APS Séléctionné
+ NSClient possède la permission d\'écriture
+ Le mode boucle fermée activé
+ "IR Maximale reglée correctement "
+ Glycémie dispo depuis la source selectionnée
+ Les valeurs du basal ne sont pas alignées sur la valeur heure : %s
+ Profile incorrect: %s
+ Programmer la pompe pour administrer un bolus
+ Actualiser
+ TDDS
+ État
+ Activité
+ Pas de connexion depuis %d min
+ %d%% (%d min restantes)
+ Initialisation
+ Déconnectée
+ Suspendu pour cause d\'erreur
+ Suspendu par l\'utilisateur
+ En cours d\'exécution
+ OpenAPS SMB
+ SMB
+ Activer UAM
+ Activer SMB
+ Utiliser les Super Micro Bolus au lieu des débits de base temporaires pour une action rapide
+ Détection des repas non annoncés
+ Annulation en cours du TBR
+ "Paramétrer TBR (%d%% / %d min) "
+ "Administration du bolus en cours (%.1f U) "
+ Actualisation en cours
+ Jamais
+ L\'opération demandée n\'est pas prise en charge par la pompe
+ Utilisation dangereuse : les bolus étendus ou carrés sont actifs. Le mode Loop a été programmé pour le low suspend seulement pour 6 heures. Uniquement les bolus normaux sont pris en charge par le mode Loop
+ Utilisation dangereuse : la pompe utilise un profile taux basal différent de celui du premier. Le Loop a été désactivé
+ Un bolus avec la même quantité d’insuline a été demandé au cours de la dernière minute. Pour prévenir l’administration accidentelle de deux bolus à la fois et pour protéger contre les bugs quand ceci (bolus) non autorisé
+ Maintenant
+ Lecture historique pompe
+ Alertes
+ Définir le profil basal
+ Niveau cartouche pompe bas
+ Niveau batterie pompe bas
+ La pompe affiche l’erreur E%d: %s
+ Pour lire l’historique des erreurs de pompe, Appuyez longuement sur le bouton ALERTES, WARNING : ceci peut provoquer un bug et ce dernier va ordonner la pompe à rejeter toutes les tentatives de connexion et qui va nécessiter d’appuyer un bouton sur la pompe pour restaurer et par conséquent le bug devrait être évité
+ Pour lire l’historique DTQ de la pompe, Appuyez longuement les boutons DTQS, WARNING : ceci peut provoquer un bug ce qui ordonne la pompe à rejeter toutes les tentatives de connexion et qui va nécessiter d’appuyer un bouton sur la pompe pour restaurer et par conséquent le bug devrait être évité
+ Minimum: %3.1f U
+ Moyen: %3.1f U
+ Maximum: %3.1f U
+ Bas
+ Vide
+ Normal
+ Mise à jour nécessaire pour l\'heure de la pompe
+ Historique
+ Warning
+ Ceci va lire l’historique et l’état complet de la pompe. Tout ce qui est dans les données et le taux du basal. Les bolus et les TBRs seront ajoutés aux traitements s’ils n’existent pas déjà. Cela peut provoquer une duplication des entrées parce que l’heure de la pompe est imprécise. Utilisant cette fonction quand la boucle normale est fortement déconseillée et réservée à des circonstances spéciales. Si vous voulez toujours essayer cela, appuyez longuement encore ce ce bouton. WARNING : ceci peut provoquer un bug ce qui ordonne la pompe à rejeter toutes les tentatives de connexion et qui va nécessiter d’appuyer un bouton sur la pompe pour restaurer et par conséquent le bug devrait être évité
+ Êtes-vous sur de bien vouloir lire toutes les données de la pompe et assumer les conséquences de cette action?
+ TBR ANNULÉ warning confirmé
+ Administration bolus échouée. Il semble qu’aucun bolus n’a été administré. Pour être sûr, Veuillez vérifier la pompe pour éviter un double bolus ensuite re bolusez une nouvelle fois
+ Seulement %.2f U de %.2f U du bolus demandé a été administré dû à une erreur. Veuillez svp vérifier la pompe pour contrôler cela et prendre les mesures appropriées
+ L’administration du bolus et la vérification de l’historique de la pompe ont échoué, Veuillez vérifier la pompe et créez un enregistrement bolus en utilisant Careportal tab si le bolus a été délivré
+ "Reconnexion après perte de connexion "
+ Pas assez d\'insuline restante dans le réservoir pour le bolus
+ Erreur administration bolus étendu
+ Insight
+ Pompe Insight
+ État
+ Modifié
+ POMPE ARRÊTÉE
+ L\'état du programme mis à jour
+ passé(e)s
+ avec
+ TBR actif
+ il vous reste min
+ Carnet
+ Dernière action completée
+ min
+ Restant supérieur
+ total
+ en amont avec
+ Rester toujours connectée
+ "Utiliser les vrais annulations TBR "
+ Annuler réellement TBR (creation d\'alarme pompe)au lieu de programmer 90% ou 110% du TBR pour 15 minutes
+ EN VEILLE
+ SYNCHRONISATION
+ CHARGÉ
+ SYNCHRONISÉ
+ STARTUP
+ besoins
+ Non connectée à l\'application compagnon
+ L\'application compagnon ne semble pas être installée
+ "Application compagnon incompatible, besoin de version "
+ Inconnue
+ Attente du code de confirmation
+ Code rejeté
+ Liaison avec app
+ Non authorisé
+ Incompatible
+ Deuxième
+ minute
+ heure
+ jour
+ semaine
+ s
+ Activer toujours SMB
+ Activer SMB avec les glucides
+ Activer SMB lorsque les GR sont actifs
+ Activer SMB avec les cibles tempo
+ "Activer SMB lorsqu'il y a une cible tempo active "
+ Activer SMB avec des cibles tempo hautes
+ Activer SMB lorsqu\'il y a une cible tempo active (exercice)
+ Activer SMB après les glucides
+ "Activer toujours SMB de manière autonome pour les bolus. Ceci est possible uniquement avec une source de glycémie ayant un filtrage de données parfait comme le G5 "
+ Activer SMB pour 6h après les glucides, même s’il y a 0 GR (Glucides Restants). Ceci est possible uniquement avec une source de glycémie ayant un filtrage de données parfait comme le G5
+ Français
+ "Seulement les chiffres numériques sont authorisés "
+ Niveau Batterie
+ Niveau Réservoir
+ Taux du Débit de Base
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 148b1aab2d..5f4d22246b 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -66,8 +66,6 @@
Cancellare Target Temporanea
Cambia il tuo imput
Ragazzi
- Percentuale del profilo circadiano
- CPP
Chiusura Loop
Commenti
Configurazione Strutturale
@@ -147,6 +145,7 @@
Sconnetti Micro per 10H
Sconnetti Micro per 1 H
Sconnetti Micro per 2 H
+ Sconnetti Micro per 15min
Sconnetti Micro per 30min
Sconnetti Micro per 3 H
Respingere
@@ -296,7 +295,7 @@
Avvia ora
Apertura Loop
Altro
- Boli
+ Boli
Stop
Calcolatore
Calibrazione
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 98471c491f..714dafaa92 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -111,7 +111,7 @@
기초주입 값 [%]
% (100% = 현재)
새 임시기초주입 적용:
- 식사주입
+ 식사주입
계산기
제한!
확인
@@ -312,8 +312,8 @@
Loop가 실행되었습니다.
Loop가 중지중입니다.
Loop가 실행중입니다.
- %.2f, %.2f으로 제한됨
- %s값이 하드리밋(Hard Limit)를 벗어났습니다
+ %.2f, %.2f으로 제한됨
+ %s값이 하드리밋(Hard Limit)를 벗어났습니다
원격 기초주입설정이 허가되지 않았습니다
원격 명령이 허가되지 않았습니다
기초주입 %.2fU/h 을 실행하려면 %s 를 입력하고 답장하세요
@@ -359,7 +359,6 @@
Edit Base-ISF:
Edit Base-IC:
Base Profile:
- CircadianPercentageProfile
차트 표시 범위
개요/스마트워치 차트 표시용 고/저혈당 선
저혈당 선
@@ -422,7 +421,6 @@
TT
LP
DANA
- CPP
TB
HOME
VPUMP
@@ -447,7 +445,6 @@
기본값: 2\n식사주입 후 Bolus snooze가 수행되게 되고, 따라서 식사주입 직후엔 loop가 low temp에 대응하지 않게 됩니다. 기본값이 2일때 예제는 다음과 같습니다; DIA가 3시간일 경우 bolus snooz는 점차적으로 1.5시간에 걸쳐 단계적으로 사라지게 됩니다.(3DIA/2).
기본값: 3\n이것은 5분당 기본 탄수화물 흡수량에 대한 설정입니다. 예상되는 기본값은 3mg/dl/5min입니다. 이는 혈당이 예상보다 빨리 떨어지거나 오를때, 얼마나 빨리 COB가 감쇠하는지와 혈당예측을 위한 계산시 탄수화물 흡수량이 얼마나 될것으로 예상되는지에 영향을 미치게 됩니다.
주의!\n보통의 경우 아래의 값을 변경하면 안됩니다. 이 값들을 변경하기 전에 반드시 이곳을 클릭하고 글을 정독해서 확실하게 이해를 하여야 합니다.
- http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html
숫자만 입력가능합니다.
이 범위(%1$s - %2$s)안에 해당하는 숫자만 입력가능합니다.
필수 입력 항목입니다.
@@ -524,6 +521,7 @@
2시간동안 Loop 일시중지
3시간동안 Loop 일시중지
10시간동안 Loop 일시중지
+ 15분동안 펌프 일시중지
30분동안 펌프 일시중지
1시간동안 펌프 일시중지
2시간동안 펌프 일시중지
@@ -623,9 +621,8 @@
민감도 가중평균
OK
Cancel
- needs to be activated to send values to the pump!
- Not all profiles loaded!
- Values not stored!
+ Not all profiles loaded!
+ Values not stored!
개요 알림
개요 알림을 웨어확인메세지로 전달합니다.
(xDrip 같은) 다른 앱으로의 브로드캐스트를 활성화합니다.
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 8a822898df..d625f6e204 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -159,9 +159,8 @@
Gekopieerd naar klembord
Kopieren naar klembord
Correctie
- Niet alle profielen zijn geladen!
- Moet geactiveerd worden om waardes naat de pomp te verzenden!
- Waarden niet opgeslagen!
+ Niet alle profielen zijn geladen!
+ Waarden niet opgeslagen!
Čeština
Alarm
Basaal uur
@@ -231,7 +230,6 @@
KH ratio ontbreekt in profieel. Standaard waarde toegepast
Importeer instellingen van
Initialisering
- http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html
Bulossen
Koolhydraten
Storing
@@ -251,6 +249,7 @@
Verbreek verbinding 10u met pomp
Verbreek verbinding 1u met pomp
Verbreek verbinding 2u met pomp
+ Verbreek verbinding 15min met pomp
Verbreek verbinding 30min met pomp
Verbreek verbinding 3u met pomp
NEGEER
@@ -308,7 +307,6 @@
Verkeerde ingave
Pomp IOB
Basaal:
- CPP
Dagtotaal insuline
Datum
Totaal basaal
@@ -411,7 +409,7 @@
Andere
Geen pomp beschikbaar
Overzicht
- Bolus
+ Bolus
Toegediend
Er worden %.2fE toegediend
Stop
@@ -451,7 +449,7 @@
Geen profiel beschikbaar
Maximaal basaal IOB OpenAPS kan toedienen [E]
Profiel
- Waarde %s is buiten de toegestane limieten
+ Waarde %s is buiten de toegestane limieten
Basis basale dosis
Laatse berekening
Laatste uitvoering
@@ -521,7 +519,6 @@
Basaal stap
Bolus limiet ingesteld
KH limiet ingesteld
- CircadianPercentageProfiel
S Bolus
DanaR Statistiek
Cumulative TDD
@@ -627,7 +624,7 @@
Model: %02X Protokoll: %02X Code: %02X
Verbonden gedurende %d s
Totaal %d gegevens geupload
- %.2f gelimitteerd tot %.2f
+ %.2f gelimitteerd tot %.2f
Om de loop te onderbreken voor %d minuten antwoord met de code %s
Tijdelijk basaal %.2fE/u voor %d minuten succesvol gestart
Gemiddelde gevoeligheid
@@ -738,8 +735,7 @@
Vernieuw
Status
Geen verbinding%d%% (%d min resterend)
- %.1f E (%s, %s)
- Initialiseren
+ Initialiseren
Verbinding verbroken
Herstel van verbroken verbindng
Waarschuwing
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index ab81436cc5..083c39e858 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -1,4 +1,590 @@
-
-
\ No newline at end of file
+ Setări siguranță tratament
+ Bolus maxim admis [U]
+ Carbohidrați admiși maxim [g]
+
+ Preferințe
+ Încarcă tratamentele din NS
+ Backup
+ Testează alarma
+ Resetează bazele de date
+ Sigur resetați bazele de date?
+ Ieșire
+ Folosiți bolusuri extinse pentru >200%
+ Dispozitive bluetooth DanaR
+ Folosesțe întotdeauna valori absolute ale bazalei
+ Restartați telefonul sau reporniți aplicația AndroidAPS din System Settings \naltfel AndroidAPS nu va putea face loguri (importante pentru verificarea corectitudinii funcționării algoritmului)!
+
+ Obiectiv:
+ Poartă:
+ Start
+ Verifică
+ Unități
+ DIA
+ Profil activ
+ IC
+ ISF
+ Bazală
+ Țintă
+ NICIUN PROFIL SETAT
+ Insulină:
+ Carbohidrați:
+ IOB:
+ IOB:
+ Activitate:
+ Total IOB:
+ Total IOB activitate:
+ Durată:
+ Rpt:
+ Ins:
+ IOB:
+ IOB totală:
+ Cantitatea de insulină
+ Cantitatea de carbohidrați
+ BG
+ Carbohidrați
+ Corecție
+ U
+ Bolus IOB
+ TOTAL
+ Fă acum
+ POMPĂ VIRTUALĂ
+ Rata bazală normală
+ Bazală temporară
+ Bolus extins
+ Baterie
+ Rezervor
+ OK
+ Eroare SQL
+ Ultima acțiune
+ Parametri de intrare
+ Stare glicemie
+ Temp curentă
+ Date IOB
+ Profil
+ Date despre masă
+ Rezultat
+ Nu există date despre glicemie
+ Niciun profil disponibil
+ Nicio pompă disponibilă
+ Nu este solicitată nicio schimbare
+ Solicită
+ Ținta de jos
+ Rată
+ Durată
+ Motiv
+ Glicemie
+ Diferență
+ Diferență:
+ Diferență medie
+
+ Constructor de configurație
+ Obiective
+ OpenAPS MA
+ Privire ansamblu
+ Profil NS
+ Profil simplu
+ Bazale temporare
+ Tratamente
+ Pompă virtuală
+ Careportal
+
+
+ Pompă
+ Tratamente
+ Bazale temporare
+ Profil
+ APS
+ General
+ zile
+ Durată minimă
+ Constrângeri
+
+ Loop
+ Loop
+ APS
+ Constrângeri după procesare
+ Setat de pompă
+ Ultima acțiune
+ Doriți reîncărcarea tratamentelor din Nightscout
+ Doriți reîncărcarea țintelor temporare din Nightscout
+ OK
+ Renunță
+ NICIUN ALGORITM SELECTAT SAU REZULTAT GENERAT
+ Siguranță
+ Modulul este dezactivat
+ Constrângere încălcată
+ Eroare injectare bolus
+ Eroare acțiune bazală temporară
+ Basal value
+ % (100% = curentă)
+ Acceptă noua bazală temporară:
+ Bolus
+ Calculator
+ Constrângere aplicată!
+ Confirmare
+ Introduceți noul tratament:
+ Bolus
+ Bolus:
+ Bazală
+ Bazală:
+ Carbohidrați
+ Schimbați textul!
+ Stabiliți un nou bolus extins:
+ Sursa glicemiei
+ xDrip
+ NSClient
+ Mod APS
+
+ Buclă închisă
+ Buclă deschisă
+ Buclă inactivă
+ Dezactivează bucla
+ Activează bucla
+
+ O nouă sugestie este disponibilă
+ Versiune incorectă de NSClient
+ NSClient nu este instalat. Înregistrare pierdută!
+ Glicemie disponibilă în NS
+ Starea pompei disponibilă în NS
+ Acțiuni manuale
+ BUCLĂ DEZACTIVATĂ DE CONSTRÂNGERI
+ Czech
+ English
+ IOB bazală
+ Constrângere de bolus aplicată
+ Constrângere de carbohidrați aplicată
+ Verificare glicemie
+ Anunț
+ Notă
+ Întrebare
+ Exercițiu
+ Schimbare loc pompă
+ Inserare senzor
+ Start senzor
+ Schimbare cartuș insulină
+ Schimbare profil
+ Gustare
+ Masă
+ Corecție
+ Bolus combo
+ Start bazală temporară
+ Sfârșit bazală temporară
+ Corecție carbohidrați
+ OpenAPS Offline
+
+ Tip eveniment
+ Altul
+ Glucometru
+ Senzor
+ Carbohidrați
+ Insulină
+ Ora carbohidrați
+ Împarte
+ Durată
+ Procent
+ Absolut
+ min
+ Note
+ Ora evenimentului
+ Profil
+ Înregistrat de
+ Tip glicemie
+ Nu am încărcat încă un profil din NS
+ Bazală temporară
+ Bolus extins
+ Versiune NSClient:
+ Versiune Nightscout:
+ TRIMITE
+ Lipsă
+ Activ
+ Vizibil
+ Sus
+ Am exportat preferințele
+ Exportă setările către
+ Import setările din
+ Setări importate
+ Nu am găsit fișierul
+ Exportă setările
+ Importă setările
+ German
+ Spanish
+ Greek
+ Italian
+ Russian
+ Valoarea minimă acceptată a glicemiei (țintă jos).
+ Valoarea maximă acceptată a glicemiei (țintă sus).
+ Maximul de unițăți de insulină pe oră (U/h) poate fi setat la
+ Această valoare este denumită bazală maximă în contextul OpenAPS
+ Maximul de bazală IOB pe care o poate da OpenAPS[U]
+ Această valoare este denumită Max IOB în contextul OpenAPS\nAceastă valoare este implicit nulă (0). După câteva zile sau săptămâni, în funcție de opțiunea dumneavoastră, puteți ajusta acest număr.
+ Bulgarian
+ RENUNȚĂ
+ Limba
+
+ DanaR
+ Se conectează
+ Conectat
+ Deconectat
+ Sincronizează profilul către pompă
+ Setări pompă DanaR
+ Nightscout
+ Licență utilizator final
+ NU TREBUIE SĂ FOLOSIȚI PENTRU LUAREA DE DECIZII MEDICALE. NU EXISTĂ RĂSPUNDERE LEGALĂ SAU GARANȚIE PENTRU ACEST PROGRAM, ÎN LIMITA APLICABILĂ A LEGII. CU EXCEPTIA CAZURILOR SPECIAL MENȚIONATE, AUTORUL ȘI/SAU ALTE PERSOANE IMPLICATE PUN LA DISPOZIȚIE ACEST PROGRAM FĂRĂ NICIO GARANȚIE, IMPLICITĂ SAU EXPLICITĂ, INCLUZÂND, DAR FĂRĂ A SE LIMITA LA, GARANȚIILE LEGATE DE VĂNZAREA SAU POTRIVIREA PENTRU UN ANUME SCOP. ÎNTREGUL RISC LEGAT DE CALITATEA ȘI PERFORMANȚA ACESTUI PROGRAM CAD ÎN RESPONSABILITATEA DUMNEAVOASTRĂ. DACĂ PROGRAMUL SE DOVEDEȘTE A FI DEFECT, DUMNEAVOASTRĂ VĂ ASUMAȚI ÎNTREAGA RĂSPUNDERE, PRECUM ȘI TOATE COSTURILE LEGATE DE SERVICE, REPARAȚII SAU CORECȚII.
+ ÎNȚELEG ȘI SUNT DE ACORD
+ Salvează
+ Nu s-a găsit niciun adaptor bluetooth
+ Dispozitivul selectat nu a fost găsit
+ Eroare de corecție a pompei
+ IOB din pompă
+ Unități zilnice
+ Ultimul bolus:
+ ore
+ Date de intrare incorecte
+ Valoare setată incorect
+ Reîncarcă profilul
+ Afișează profilul
+ Făcut
+ Comentariu
+ Succes
+ Procent
+ Absolut
+ Renunță la bazala temporară
+ SMS Communicator
+ Se așteaptă rezultatul
+ Numere de telefon permise
+ +XXXXXXXXXX;+YYYYYYYYYY
+ Pentru a livra un bolus de %.2fU răspundeți cu codul %s
+ Pentru a trimite calibrarea cu %.2f răspundeți cu codul %s
+ Bolus eșuat
+ Bolusul de %.2fU livrat cu succes
+ Se va livra un bolus de %.2fU
+ Bolusul de %.2fU a fost livrat cu succes
+ Se livrează %.2fU
+ Permite comenzi distante prin SMS
+ Bolusare prin comenzi de la distanță interzise
+ Deget
+ Senzor
+ Manual
+ Țintă temporară
+ Renunțare la ținta temporară
+ Setări de profil DanaR
+ DIA [h]
+ Durata de Acțiune a Insulinei (DIA)
+ Setarea profilului bazalei eșuată
+ Istoric
+ Reîncărcare
+ Se trimite
+ E bolus
+ DS bolus
+ DE bolus
+ eroare
+ reumplere
+ bazală pe oră
+ glicemie
+ carbohidrați
+ alarmă
+ S-au transmis %d înregistrări
+ S bolus
+ Alarme
+ Ore bazale
+ Bolusuri
+ Carbohidrați
+ Insulină zilnică
+ Erori
+ Glicemie
+ Reumplere
+ Suspendare
+ Conectare de %d s
+ Parola pompei
+ Parola pompei greșită!
+ Pompa face altă acțiune
+ Livrat
+ Oprit
+ Ocluzie
+ Stop
+ STOP APĂSAT
+ Se așteaptă pompa
+ Se așteaptă pompa. Apasă pentru reîncărcare.
+ Se vor livra %.2fU
+ Se stabilesc vizualizările și monitorizarea și se analizează bazalele și valorile ratelor
+ Verificați că vedeți glicemia în Nightscout și că datele despre insulină date de pompă sunt înregistrate în site
+ Pornire cu buclă deschisă
+ Rulați modul buclă deschisă pentru câteva zile și faceți manual bazalele temporare sugerate
+ Trebuie să se înțeleagă modalitatea de funcționare a buclei deschise, incluzând recomandările de bazală temporară
+ Pe baza acestei experiențe, decideți care va fi bazala maximă și setați această valoare în pompă și în preferințe
+ Se începe etapa de buclă închisă cu Suspendarea Insulinei la Valori Glicemie Mici (Low Glucose Suspend = LGS)
+ Folosiți sistemul în buclă închisă cu IOB maxim = 0 pentru câteva zile fără prea multe evenimente LGS
+ Acordați fin performanța buclei închise, prin mărirea valorii max IOB peste 0 și micșorarea graduală a țintelor glicemice
+ Folosiți pentru câteva zile și cel puțin o noapte fără a avea alarme de hipoglicemie înainte de scăderea glicemiei
+ Ajustați bazalele și ratele dacă este cazul și apoi activați auto-sens
+ O săptămână de folosire cu succes a sistemului cu buclă închisă cu introducerea normală de carbohidrați
+ Folosirea instrumentelor adiționale pentru timpul zilei, cum ar fi asistența avansată pentru mese
+ Ați atins limita permisă
+ Valoare țintă pentru calcule
+ Niciun profil selectat
+ Bucla a fost dezactivată
+ Bucla a fost activată
+ Bucla este dezactivată
+ Bucla este activată
+ %.2f limitat la %.2f
+ Valoarea %s este în afara limitelor
+ Setarea de la distanță a bazalei nu este permisă
+ Comanda de la distanță nu este permisă
+ Pentru pornirea bazalei de %.2fU/h trimiteți codul %s
+ Pentru suspendarea buclei pentru %d minute trimiteți codul %s
+ Bazala temporară %.2fU/h pentru %d minute a fost trimisă cu succes
+ Trimiterea bazalei temporare a eșuat
+ Pentru oprirea bazalei temporare trimiteți codul %s
+ Bazala temporară a fost anulată
+ Renunțarea la bazala temporară a eșuat
+ Comandă necunoscută sau răspuns greșit
+
+ AsistentRapid
+ Setări AsistentRapid
+ Text buton:
+ Carbohidrați:
+ Valid:
+ Adaugă
+ Editează
+ Șterge
+ Masă
+ Corecție
+ Korean
+ Acțiuni
+ AndroidAPS a pornit
+ Doar încărcare în NS (sincronizare dezactivată)
+ Please deactivate "NS upload only" to use this feature.
+ Doar încărcare în NS. Nu are efect asupra SGV decât în cazul selectării unei surse locale, precum xDrip. Nu acționează asupra Profilelor cât timp se folosesc profilele din Nightscout.
+ Pompa nu este inițializată!
+ Pompa nu este inițializată, profilul nu este setat!
+ Pregătire/umplere
+ Asigurați-vă că aveți cantitatea specificată de instrucțiunile setului de infuzie!
+ Alte
+ Button 1
+ Pregătire/umplere cu cantitățile standard de insulină.
+ Buton 2
+ Buton 3
+ Procentul factorului cu care profilul bazal va fi mărit.
+ Time in hours by which the profile will be shifted round robin.
+ Timpul în ore în care profilul va fi rotunjit prin metoda round-robin
+ TRIMITE CĂTRE POMPĂ
+ Unități:
+ mg/dl
+ mmol/l
+ DIA:
+ Intervalul țintă:
+ Editează bazala normală:
+ Editează ISF normal:
+ Editează IC normal:
+ Profilul de bază:
+ Sfârșit bazală temporară
+ Început bazală temporară
+ Intervalul pentru vizualizare
+ Valoarea maximă și minimă pentru graficele din vizualizare și pentru smartwatch
+ Pragul HIPO
+ Pragul HIPER
+ Wear
+ Retrimite toate datele
+ Deschide setările pe Wear
+ Eroare de pompă
+ Baterie aproape descărcată
+ Pompa se oprește
+ Bateria pompei este descărcată
+ DanaR Korean
+ Driver de pompă selectat greșit
+ Rată bazală:
+ Setarea profilului bazalei a eșuat
+ Profilul bazalei a fost modificat în pompă
+ Dezactivează modul EasyUI în pompă
+ Activează bolusuri extinse în pompă
+ Schimbă din modul U/d în U/h în pompă
+ Valoarea bazalei este sub minim. Profilul nu este setat!
+ Glicemie:
+ Ultima glicemie:
+ MDI
+ MM640g
+ Notificare activă
+ DATE VECHI
+ acum %dmin
+ acum %dmin
+ Profil local
+ OpenAPS AMA
+ Media scurtă a deviației
+ Media lungă a deviației
+ Matrice cu %d elemente.\nValorea efectivă:
+ Date Autosens
+ Script debug
+ Folosește opțiunea autosens AMA
+ Țintă temporară
+ Reîncarcă țintele temporare din NS
+ Masă în curând
+ Activitate
+ Șterge înregistrarea:
+ Statistici DanaR
+ TDD cumulat
+ TDD cântărit exponențial
+ Bazală
+ Bolus
+ TDD
+ Data
+ Rata
+ # Zile
+ Greutate
+ Posibil fără acuratețe bună în cazul folosirii de bolusuri pentru pornire/umplere!
+ Date vechi, apăsați "RELOAD"
+ Total bazală normală
+ TBB * 2
+ Inițializare...
+ ACT
+ CONF
+ BUCL
+ SP
+ OAPS
+ TT
+ LP
+ DANA
+ TB
+ ACASĂ
+ POMPĂV
+ PROFILNS
+ TRAT
+ CP
+ OBI
+ WEAR
+ SMS
+ Scurtează titlurile taburilor
+ Setări diferențe
+ Folosește întotdeauna media scurtă a diferenței în locul diferenței simple
+ Folositor când datele vin de la surse nefiltrate, ca atunci când xDrip are măsurători zgomotoase.
+ Setări avansate
+ Model: %02X Protocol: %02X Cod: %02X
+ Profil
+ Valoare implicită: 3\nAceasta este o setare de critică de securitate a OpenAPS. Asta înseamnă că se limitează bazala lade 3x valoarea maximă a bazalelor tale.Cel mai probabil nu veți schimba această valoare, dar trebuie să țineți cont de ce se discută despre “3x max zilnic; 4x curent” ca valori de siguranță.
+ Valoare implicită: 4\nAceasta este cealaltă jumătate a cheii de siguranță a OpenAPS și cealaltă jumătate a "3x max zilnic; 4x curent" al setărilor de siguranță.Aceasta înseamnă că bazala dumneavoastră, indiferent de bazala maximă configurată în pompă, nu poate fi mai mare de acest număr înmulțit cu nivelul curent al bazalei active. Această limitare este impusă pentru a evita posibilitatea de a intra pe un teritoriu periculos prin setarea unei bazale maxime excesiv de mari înainte de a înțelege funcționarea algoritmului. Din nou, valoarea implictă este 4x; majoritatea oamenilor nu vor trebui să ajusteze această valoare și vor modifica, mai degrabă, alte valori dacă vor simți că această valoare le stă în cale.
+ Valoare implicită: 1.2\nAceasta este valoarea limită de multiplicare pentru autosens (și pentru autotune, în curând) pentru a seta o limită maximă de 20% din cât de mare poate fi raportul autosens, care, la rândul ei, determină cât de mult poate autosens să modifice bazalele, cât de jos poate modifica ISF și cât de jos poate pune ținta glicemiei.
+ Valoare implicită: 0.7\nCealaltă parte a limitelor autosens, care limitează cât de jos poate ajusta bazalele și cât de mult poate mări ISF și țintele de glicemie.
+ Valoare implicită: adevărat\nAceasta se folosește pentru a permite autosens să ajusteze țintele de glicemie, pe lângă modificările asupra ISF și bazalelor.
+ Valoare implicită: 2\nAmânarea bolusului este aplicată după ce ați făcut un bolus de masă, astfel încât bucla să nu reacționeze cu ținte bazale temporare scăzute atunci când tocmai ați mâncat. Exemplul de față și valoarea implicită sunt 2; astfel o durată de acțiune a insulinei (DIA) de 3 ore duce la o eliminare treptată a întârzierii setării bazalelor temporare după 1.5 ore (3DIA/2).
+ Valoare implicită: 3.0\nAceasta este o setare ce privește impactul carbohidraților pe o durată de 5 minute. Valoarea implicită este de așteptat a fi 3mg/dl/5min. Aceasta afectează cât de mult se scade valoarea COB și cât de mare este presupusă a fi absorbția de carbohidrați în calcularea valorii prezise a glicemiei, atunci când glicemia scade cu mai mult decât s-a estimat sau când nu crește așa cum s-a așteptat.
+ Atenție!\nÎn mod normal nu este nevoie să modificați valorile de mai jos. Vă rog să APĂSAȚI AICI și să CITIȚI textul și să vă asigurați că l-ați ÎNȚELES înainte de a schimba valorile.
+ Se acceptă numai valori numerice.
+ Se acceptă numai valori numerice între %1s - %2s.
+ Acest câmp nu trebuie lăsat necompletat
+ Numărul de telefon este invalid
+ Număr de telefon SMS invalid
+ Copiază în clipboard
+ Copiat în clipboard
+ Afișează istoricul
+ Calibrare
+ Glicemie calibrare
+ Trimite calibrarea %.1f către xDrip?
+ xDrip+ nu este instalat.
+ Calibrare trimisă către xDrip
+ Calibrarea la distanță nu este permisă
+ Calibrare trimisă. Recepționarea trebuie să fie activată și în xDrip.
+ xDrip nu recepționează calibrări
+ Nu mai afișa din nou
+ Livrarea de insulină este suspendată. Apăsați pentru verificarea statusului
+ Livrare de insulină suspendată
+ Se primește starea pompei
+ Se setează bazala temporară
+ Se oprește bazala temporară
+ Se pornește bolusul extins
+ Se oprește bolusul extins
+ Se restabilesc ratele bazale
+ Se deconectează
+ Se execută
+ Setări pompă virtuală
+ Trimitere status către NS
+ Parolă greșită
+ Parola pentru setări
+ Deblochează setările
+ Se apropie limita zilnică de insulină
+ NSClient
+ NSCI
+ URL:
+ Autoscroll
+ Restart
+ NSClient
+ Adresa Nightscout
+ Introduceți adresa Nightscout
+ Cheia API NS
+ Cheia API NS
+ Introduceți cheia API NS (min 12 caractere)
+ Numele dispozitivului
+ Introduceți numele dispozitivului
+ Se va folosi pentru câmpul introdusDe
+ Livrează acum
+ Curăță coada de așteptare
+ Arată coada de așteptare
+ Coadă:
+ Status:
+ Suspendat
+ Șterge istoricul
+ NSCLIENT nu are permisiuni de scriere. Cheia API este corect scrisă?
+ Setări Wear
+ Arată IOB detaliat
+ Separă IOB în bolus și IOB bazal pe ceas
+ fără succes - verificați telefonul
+ Nu este disponibil
+ Vârsta pacientului
+ Copil
+ Adolescent
+ Adult
+ Vă rog să selectați vârsta pacientului în vederea stabilirii valorilor maxime admise de siguranță
+ Glimp
+ Se pare că dispozitivul nu suportă excluderea din lista de optimizare a bateriei!
+ Vă rog să activați permisiunea
+ %s necesită excluderea din lista de optimizare a bateriei pentru funcționare corespunzătoare
+ Buclă suspendată
+ Suspendată (%d m)
+ Superbolus (%d m)
+ Meniul pentru buclă
+ Suspendă bucla pentru 1h
+ Suspendă bucla pentru 2h
+ Suspendă bucla pentru 3h
+ Suspendă bucla pentru 10 h
+ Deconectează pompa pentru 15 min
+ Deconectează pompa pentru 30 min
+ Deconectează pompa pentru 1h
+ Deconectează pompa pentru 2h
+ Deconectează pompa pentru 3h
+ Deconectează pompa pentru 10h
+ Restabilește
+ Durată greșită
+ Buclă suspendată
+ Buclă restabilită
+ Tendință 15min
+ COB
+ Superbolus
+ Înregistrează pornirea aplicației în NS
+ Se iese din aplicație în vederea aplicării setărilor.
+ Insulină
+ Insulină rapidă
+ Novorapid, Novolog, Humalog
+ INS
+ Insulină rapidă cu efect prelungit
+ Activează superbolus în asistent
+ Activează funcționalitatea de superbolus în asistentul de buclă. Nu activați până nu înțelegeți ce face cu adevărat. DACĂ ESTE FOLOSIT ÎN NECUNOȘTINȚĂ DE CAUZĂ POATE DUCE LA SUPRADOZĂ DE INSULINĂ!
+ IOB
+ COB
+ PRE
+ BAS
+ Firmware
+ Ultima conectare
+ Status bluetooth
+ Despre
+ Lipsesc permisiunile de SMS
+ DEV
+ Status xDrip (ceas)
+ Linie de status xDrip (ceas)
+ xds
+ Arată BGI
+ Adaugă BGI în linia de status
+ Fără trimitere către NS
+ Toate trimiterile de date către NS sunt oprite. AAPS este conectat la NS dar nu se fac schimbări în NS
+ Pas bazală
+ Pas bolus
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 1535d82c26..bb77a9f2be 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -79,8 +79,6 @@
отмена времнной цели
измените введенные данные
ребенок
- суточный процентный профиль
- СПП
очистка очереди
очистка лога
замкнутый цикл
@@ -181,6 +179,7 @@
отсоединить помпу на 10 час
отсоединить помпу на 1 час
отсоединить помпу на 2 часа
+ отсоединить помпу на 15 мин
отсоединить помпу на 30 мин
отсоединить помпу на 3 часа
отклонить
@@ -335,7 +334,6 @@
по умолчанию:0.7 Еще один параметр безопасности autosens, определяющий как низко он может опускать базал и как высоко поднимать ISF (чувств к инс) и целевые СК
значение по умолчанию :2 bolus snoose активируется после введения болюса на еду чтобы цикл не взаимодействовал с временными низкими СК сразу после еды. так, трехчасовой DIA при величине 2 означает постыпенное затихание bolus snooze после 1.5 часов (3DIA/2)
значение по умолчанию: 4 . Это вторая половина обеспечения безопасности OpenAPS из дуэта \"максимум 3x ежедневное; 4x текущее\" Означает что ваша база независимо от установок помпы не может быть выше чем это число умноженное на текущее значение базала. Ограничение для того, чтобы предотвратить вторжение в опасную зону из-за высокого уровня установленных значений базы без понимания алгоритма работы приложения. Большинству людей никогда не потребуется изменять это значение, скорее всего нужно поменять другие настройки если вы чувствуете, что вам мешает это ограничение.
- http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html
Внимание! Обычно нет необходимости изменять приведенные ниже величины. Нажмите ЗДЕСЬ, ПРОЧТИТЕ и убедитесь что вы ПОНИМАЕТЕ изложенное прежде чем менять какую-либо из этих величин
значение по умолчанию:3 Это ключевой ограничитель безопасности OpenAPS. Он ограничивает величину вашего базала максимум до 3x максимума. Вам вероятно не понадобится менять эту величину но вам следует понимать, что она входит в формулу дуэта \"максимум 3x ежедневное; 4x текущее\"
значение по умолчанию :3 усвоение углеводов за 5 мин. то есть 3 мг/дл/ 5 мин. Влияет на расчет прогнозируемой гликемии, когда СК падает быстрее или не растет так как ожидается.
@@ -362,13 +360,13 @@
результат
выполнить сейчас
отладка скрипта
- %.2f ограничено до %.2f
- величина %s недопустима
+ %.2f ограничено до %.2f
+ величина %s недопустима
открытый цикл
есть новое предложение
другое
начало
- болюс
+ болюс
доставлено
будет доставлено %.2fU е инс
стоп
@@ -581,9 +579,8 @@
сенсор пропаботал
ВОЗРСенс
определение чувствительности
- не все профили загружены!
- требует активации для отправки данных на помпу!
- Данные не сохранены!
+ не все профили загружены!
+ Данные не сохранены!
Просмотреть расширенный болюс %
DanaRv2
дата
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index b27b70da43..5e83108bb3 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -80,8 +80,6 @@
Temp Mål BG Slut
Ändra inmatning
Barn
- Cirkadisk Profil Procent
- CPP
Ta bort kö
Rensa inmatningar
Closed Loop
@@ -167,6 +165,7 @@
Frånkopplar
Frånkoppla pump i 10 h
Frånkoppla pump i 2 h
+ Frånkoppla pump i 15 min
Frånkoppla pump i 30 min
Frånkoppla pump i 3 h
TA BORT
@@ -472,13 +471,13 @@
Stopp
Kommer tillföra %.2fU
Tillförd
- Bolus
+ Bolus
Översikt
Andra
Ny behandlingsrekommendation tillgänglig
Open Loop
- Värde %s är utanför gränserna
- %.2f begränsad till %.2f
+ Värde %s är utanför gränserna
+ %.2f begränsad till %.2f
Kör nu
Fråga
Profil
@@ -546,8 +545,7 @@
Batteribyte Pump
Sensor ålder
SAGE
- Måste vara aktiverad för att kunna skicka värden till pumpen
- Värden sparas inte
+ Värden sparas inte
Möjligen felvärde om man använder bolus för att priming/fyllning!
Ändra Base-IC:
Ändra Base-ISF:
@@ -563,7 +561,6 @@
MDI
NSClient
Autoscroll
- http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html
Basal typ
SENS
Genom att slå på Autosens funktionen, kom ihåg att skriva in alla KH. Annars kommer programmet göra fel i beräkningar av känslighet (ISF)!!
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 1fad149686..4f096c46a3 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -24,6 +24,7 @@
- @string/ro_lang
- @string/ru_lang
- @string/sv_lang
+ - @string/zh_lang
- en
@@ -39,17 +40,20 @@
- ro
- ru
- sv
+ - zh-rCN
- @string/child
- @string/teenage
- @string/adult
+ - @string/resistantadult
- @string/key_child
- @string/key_teenage
- @string/key_adult
+ - @string/key_resistantadult
@@ -102,5 +106,4 @@
- @string/yes
- French
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 67def00b04..59e641c7b7 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -41,6 +41,8 @@
#f4d700
#67dfe8
+ #67dfe8
+ #ffae01
#e93057
#67e86a
#ffae01
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e5d7a25a22..3e923bf821 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -117,7 +117,7 @@
Basal value [%]
% (100% = current)
Accept new temp basal:
- Bolus
+ Treatment
Calculator
Constraint applied!
Confirmation
@@ -212,6 +212,8 @@
Romanian
Russian
Swedish
+ French
+ Chinese
Max U/hr a Temp Basal can be set to
This value is called max basal in OpenAPS context
Maximum basal IOB OpenAPS can deliver [U]
@@ -323,8 +325,8 @@
Loop has been enabled
Loop is disabled
Loop is enabled
- %.2f limited to %.2f
- Value %s is out of hard limits
+ %.2f limited to %.2f
+ Value %s is out of hard limits
Remote basal setting is not allowed
Remote command is not allowed
To start basal %.2fU/h reply with code %s
@@ -334,7 +336,7 @@
To stop temp basal reply with code %s
Temp basal canceled
Canceling temp basal failed
- Uknonwn command or wrong reply
+ Uknown command or wrong reply
QuickWizard
QuickWizard settings
@@ -371,7 +373,6 @@
Edit Base-ISF:
Edit Base-IC:
Base Profile:
- CircadianPercentageProfile
Range for Visualization
High and low mark for the charts in Overview and Smartwatch
LOW mark
@@ -434,7 +435,6 @@
TT
LP
DANA
- CPP
TB
HOME
VPUMP
@@ -542,10 +542,12 @@
Child
Teenage
Adult
+ Insulin resistant adult
age
child
teenage
adult
+ resistantadult
Please select patient age to setup safety limits
I_understand
Glimp
@@ -560,6 +562,7 @@
Suspend loop for 2h
Suspend loop for 3h
Suspend loop for 10 h
+ Disconnect pump for 15 min
Disconnect pump for 30 min
Disconnect pump for 1 h
Disconnect pump for 2 h
@@ -592,7 +595,7 @@
BAS
Firmware
Last connection
- Bluetooh status
+ Bluetooth status
About
Missing SMS permission
DEV
@@ -677,13 +680,12 @@
Sensitivity WeightedAverage
OK
Cancel
- needs to be activated to send values to the pump!
- Not all profiles loaded!
- Values not stored!
+ Not all profiles loaded!
+ Values not stored!
Overview Notifications
Pass the Overview Notifications through as wear confirmation messages.
- Accu-Chek Combo
- COMBO
+ Accu-Chek Combo
+ COMBO
Enable broadcasts to other apps (like xDrip).
Enable local Broadcasts.
ACTIVITY & FEEDBACK
@@ -694,8 +696,8 @@
Duration [min]
OpenAPS SMB
SMB
- use_smb
- use_uam
+ use_smb
+ use_uam
Enable UAM
Enable SMB
Use Super Micro Boluses instead of temp basal for faster action
@@ -794,7 +796,7 @@
Customized APK for download
Show detailed delta
Show delta with one more decimal place
- 45 60 75 90 105 120
+ 45 60 75 90 105 120
Max minutes of basal to limit SMB to
smbmaxminutes
Unsupported pump firmware
@@ -890,7 +892,7 @@
upfront with
Stay always connected
Use Real TBR cancels
- Actually cancel a TBR (creates pump alarm) instead of setting 90% or 110% TBR for 15 minutes
+ Actually cancel a TBR (creates pump alarm) instead of setting 90% for 1 minute
IDLE
SYNCING
BUSY
@@ -912,6 +914,12 @@
day
week
s
+ %ds expires %s
+ Keep-alive status
+ Statistics
+ Connect preemptively
+ Automatically connect when AndroidAPS screens are opened, before any pump command is requested, to reduce connection delay
+ Not recommended due to battery drain
enableSMB_always
enableSMB_with_COB
enableSMB_with_temptarget
@@ -928,5 +936,38 @@
Enable SMB with high temp targets
Enable SMB when there is high temp target active (exercise)
Let current temp basal run
+ Mute
+ Insulin
+ Carbs
+ Buttons
+ show_calibration_button
+ show_cgm_button
+ show_carbs_button
+ show_wizard_button
+ show_insulin_button
+ show_treatment_button
+ Sends a calibration to xDrip+ or open G5 calibration dialog
+ Opens xDrip+, back buttons returns to AAPS
+ insulin_button_increment_1
+ insulin_button_increment_2
+ insulin_button_increment_3
+ carbs_button_increment_1
+ carbs_button_increment_2
+ carbs_button_increment_3
+ Number of carbs to add when button is pressed
+ Amount of insulin to add when button is pressed
+ Could not launch CGM application. Make sure it is installed.
+ CGM
+ History browser
+ Notify on SMB
+ Show SMB on the watch like a standard bolus.
+ ns_create_announcements_from_errors
+ Create announcements from errors
+ Create Nightscout announcement for error dialogs and local alerts (also viewable in Careportal under Treatments)
+ G5
+ Data Choices
+ Fabric Upload
+ Allow automated crash reporting and feature usage data to be sent to the developers via the fabric.io service.
+ Please update your G5 app to supported version
diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml
index e163f4cd47..b2c77c022a 100644
--- a/app/src/main/res/xml/pref_absorption_oref0.xml
+++ b/app/src/main/res/xml/pref_absorption_oref0.xml
@@ -7,7 +7,7 @@
+ validate:floatmaxNumber="10"
+ validate:floatminNumber="1"
+ validate:testType="floatNumericRange" />
+
+
+
+
diff --git a/app/src/main/res/xml/pref_insightpump.xml b/app/src/main/res/xml/pref_insightpump.xml
index 9dc3c24d91..93d51f1318 100644
--- a/app/src/main/res/xml/pref_insightpump.xml
+++ b/app/src/main/res/xml/pref_insightpump.xml
@@ -7,7 +7,13 @@
+ android:title="@string/insight_stay_always_connected"
+ android:summary="@string/not_recommended_due_to_battery_drain"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_wear.xml b/app/src/main/res/xml/pref_wear.xml
index 406e156ab3..9b51c4b17b 100644
--- a/app/src/main/res/xml/pref_wear.xml
+++ b/app/src/main/res/xml/pref_wear.xml
@@ -30,6 +30,12 @@
android:key="wear_showbgi"
android:summary="@string/wear_showbgi_summary"
android:title="@string/wear_showbgi_title" />
+
+
\ No newline at end of file
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java
new file mode 100644
index 0000000000..bbacbb485c
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest.java
@@ -0,0 +1,70 @@
+package info.nightscout.androidaps.plugins.PumpDanaRS.comm;
+
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by mike on 20.11.2017.
+ */
+
+public class DanaRS_Packet_APS_Basal_Set_Temporary_BasalTest extends DanaRS_Packet_APS_Basal_Set_Temporary_Basal {
+
+ @Test
+ public void runTest() throws Exception {
+ // under 100% should last 30 min
+ setParams(0);
+ assertEquals(0, temporaryBasalRatio);
+ assertEquals(PARAM30MIN, temporaryBasalDuration);
+ // over 100% should last 15 min
+ setParams(150);
+ assertEquals(150, temporaryBasalRatio);
+ assertEquals(PARAM15MIN, temporaryBasalDuration);
+ // test low hard limit
+ setParams(-1);
+ assertEquals(0, temporaryBasalRatio);
+ assertEquals(PARAM30MIN, temporaryBasalDuration);
+ // test high hard limit
+ setParams(550);
+ assertEquals(500, temporaryBasalRatio);
+ assertEquals(PARAM15MIN, temporaryBasalDuration);
+ // test setting 15 min
+ setParams(50, true, false);
+ assertEquals(50, temporaryBasalRatio);
+ assertEquals(PARAM15MIN, temporaryBasalDuration);
+ // test setting 30 min
+ setParams(50, false, true);
+ assertEquals(50, temporaryBasalRatio);
+ assertEquals(PARAM30MIN, temporaryBasalDuration);
+ // over 200% set always 15 min
+ setParams(250, false, true);
+ assertEquals(250, temporaryBasalRatio);
+ assertEquals(PARAM15MIN, temporaryBasalDuration);
+ // test low hard limit
+ setParams(-1, false, true);
+ assertEquals(0, temporaryBasalRatio);
+ assertEquals(PARAM30MIN, temporaryBasalDuration);
+ // test high hard limit
+ setParams(550, false,true);
+ assertEquals(500, temporaryBasalRatio);
+ assertEquals(PARAM15MIN, temporaryBasalDuration);
+
+ // test message generation
+ setParams(260, true, false);
+ byte[] generatedCode = getRequestParams();
+ assertEquals(3 , generatedCode.length);
+ assertEquals((byte)4 , generatedCode[0]);
+ assertEquals((byte)1 , generatedCode[1]);
+ assertEquals((byte)PARAM15MIN, generatedCode[2]);
+
+ // test message decoding
+ handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 0});
+ assertEquals(false, failed);
+ handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 1});
+ assertEquals(true, failed);
+
+ assertEquals("BASAL__APS_SET_TEMPORARY_BASAL", getFriendlyName());
+ }
+
+}
diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/PumpdanaRv2/comm/MsgSetAPSTempBasalStart_v2Test.java b/app/src/test/java/info/nightscout/androidaps/plugins/PumpdanaRv2/comm/MsgSetAPSTempBasalStart_v2Test.java
new file mode 100644
index 0000000000..e36c5a7c24
--- /dev/null
+++ b/app/src/test/java/info/nightscout/androidaps/plugins/PumpdanaRv2/comm/MsgSetAPSTempBasalStart_v2Test.java
@@ -0,0 +1,72 @@
+package info.nightscout.androidaps.plugins.PumpdanaRv2.comm;
+
+
+import org.junit.Test;
+
+import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_APS_Basal_Set_Temporary_Basal;
+import info.nightscout.androidaps.plugins.PumpDanaRv2.comm.MsgSetAPSTempBasalStart_v2;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by mike on 20.11.2017.
+ */
+
+public class MsgSetAPSTempBasalStart_v2Test extends MsgSetAPSTempBasalStart_v2 {
+
+ @Test
+ public void runTest() throws Exception {
+ // under 100% should last 30 min
+ setParams(0);
+ assertEquals(0, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM30MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // over 100% should last 15 min
+ setParams(150);
+ assertEquals(150, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM15MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // test low hard limit
+ setParams(-1);
+ assertEquals(0, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM30MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // test high hard limit
+ setParams(550);
+ assertEquals(500, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM15MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // test setting 15 min
+ setParams(50, true, false);
+ assertEquals(50, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM15MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // test setting 30 min
+ setParams(50, false, true);
+ assertEquals(50, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM30MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // over 200% set always 15 min
+ setParams(250, false, true);
+ assertEquals(250, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM15MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // test low hard limit
+ setParams(-1, false, true);
+ assertEquals(0, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM30MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+ // test high hard limit
+ setParams(550, false, true);
+ assertEquals(500, intFromBuff(buffer, 0, 2));
+ assertEquals(PARAM15MIN, intFromBuff(buffer, 2, 1));
+ resetBuffer();
+
+ // test message decoding
+ handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0});
+ assertEquals(true, failed);
+ handleMessage(new byte[]{(byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 1});
+ assertEquals(false, failed);
+ }
+
+}
diff --git a/build.gradle b/build.gradle
index e13cb27485..0bbe15c8a2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -18,9 +18,17 @@ buildscript {
allprojects {
repositories {
jcenter()
+ google()
+
maven {
url "https://maven.google.com"
}
+ ivy {
+ url 'https://github.com/'
+ layout 'pattern', {
+ artifact '/[organisation]/[module]/archive/[revision].[ext]'
+ }
+ }
}
}