diff --git a/app/build.gradle b/app/build.gradle
index 6b15175100..0c5ecb26e2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -222,8 +222,8 @@ dependencies {
wearApp project(':wear')
implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation 'com.google.android.gms:play-services-wearable:16.0.1'
- implementation 'com.google.firebase:firebase-core:16.0.9'
+ implementation 'com.google.android.gms:play-services-wearable:17.0.0'
+ implementation 'com.google.firebase:firebase-core:17.0.1'
implementation("com.crashlytics.sdk.android:crashlytics:2.9.9@aar") {
transitive = true;
}
diff --git a/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java b/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java
index 0bfcbb1002..062f6ae391 100644
--- a/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java
+++ b/app/src/main/java/info/nightscout/androidaps/data/QuickWizardEntry.java
@@ -50,7 +50,7 @@ public class QuickWizardEntry {
useTemptarget: 0
}
*/
- public QuickWizardEntry() {
+ QuickWizardEntry() {
String emptyData = "{\"buttonText\":\"\",\"carbs\":0,\"validFrom\":0,\"validTo\":86340}";
try {
storage = new JSONObject(emptyData);
@@ -60,18 +60,17 @@ public class QuickWizardEntry {
position = -1;
}
- public QuickWizardEntry(JSONObject entry, int position) {
+ QuickWizardEntry(JSONObject entry, int position) {
storage = entry;
this.position = position;
}
- public Boolean isActive() {
+ Boolean isActive() {
return Profile.secondsFromMidnight() >= validFrom() && Profile.secondsFromMidnight() <= validTo();
}
- public BolusWizard doCalc(Profile profile, TempTarget tempTarget, BgReading lastBG, boolean _synchronized) {
- BolusWizard wizard = new BolusWizard();
-
+ public BolusWizard doCalc(Profile profile, String profileName, BgReading lastBG, boolean _synchronized) {
+ final TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory();
//BG
double bg = 0;
if (lastBG != null && useBG() == YES) {
@@ -86,11 +85,6 @@ public class QuickWizardEntry {
cob = cobInfo.displayCob;
}
- // Temp target
- if (useTempTarget() == NO) {
- tempTarget = null;
- }
-
// Bolus IOB
boolean bolusIOB = false;
if (useBolusIOB() == YES) {
@@ -130,8 +124,7 @@ public class QuickWizardEntry {
trend = true;
}
- wizard.doCalc(profile, tempTarget, carbs(), cob, bg, 0d, bolusIOB, basalIOB, superBolus, trend);
- return wizard;
+ return new BolusWizard(profile, profileName, tempTarget, carbs(), cob, bg, 0d, 100, true, useCOB() == YES, bolusIOB, basalIOB, superBolus, useTempTarget() == YES, trend, "QuickWizard");
}
public String buttonText() {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java
index 0cbeae2e71..8569341ccd 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java
@@ -644,14 +644,27 @@ public class LoopPlugin extends PluginBase {
TreatmentsInterface activeTreatments = TreatmentsPlugin.getPlugin();
LoopPlugin.getPlugin().disconnectTo(System.currentTimeMillis() + durationInMinutes * 60 * 1000L);
- ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, durationInMinutes, true, profile, new Callback() {
- @Override
- public void run() {
- if (!result.success) {
- ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+
+ if (pump.getPumpDescription().tempBasalStyle == PumpDescription.ABSOLUTE) {
+ ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalAbsolute(0, durationInMinutes, true, profile, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+ }
}
- }
- });
+ });
+ } else {
+ ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, durationInMinutes, true, profile, new Callback() {
+ @Override
+ public void run() {
+ if (!result.success) {
+ ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.tempbasaldeliveryerror));
+ }
+ }
+ });
+ }
+
if (pump.getPumpDescription().isExtendedBolusCapable && activeTreatments.isInHistoryExtendedBoluslInProgress()) {
ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelExtended(new Callback() {
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/safety/SafetyPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/safety/SafetyPlugin.java
index 65dc119c6a..127752d8dc 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/safety/SafetyPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/safety/SafetyPlugin.java
@@ -13,10 +13,10 @@ import info.nightscout.androidaps.interfaces.PluginDescription;
import info.nightscout.androidaps.interfaces.PluginType;
import info.nightscout.androidaps.interfaces.PumpDescription;
import info.nightscout.androidaps.interfaces.PumpInterface;
-import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.aps.openAPSAMA.OpenAPSAMAPlugin;
import info.nightscout.androidaps.plugins.aps.openAPSMA.OpenAPSMAPlugin;
import info.nightscout.androidaps.plugins.aps.openAPSSMB.OpenAPSSMBPlugin;
+import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification;
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification;
import info.nightscout.androidaps.plugins.sensitivity.SensitivityOref1Plugin;
@@ -196,7 +196,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
if (pump != null) {
- double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulin.value()));
+ double rounded = pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulin.value());
insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
}
return insulin;
@@ -213,7 +213,7 @@ public class SafetyPlugin extends PluginBase implements ConstraintsInterface {
PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
if (pump != null) {
- double rounded = Round.roundTo(insulin.value(), pump.getPumpDescription().pumpType.determineCorrectExtendedBolusSize(insulin.value()));
+ double rounded = pump.getPumpDescription().pumpType.determineCorrectExtendedBolusSize(insulin.value());
insulin.setIfDifferent(rounded, MainApp.gs(R.string.pumplimit), this);
}
return insulin;
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java
index 3b8a0030ab..23d65e16e4 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/OverviewFragment.java
@@ -37,12 +37,9 @@ import android.widget.TextView;
import com.jjoe64.graphview.GraphView;
import com.squareup.otto.Subscribe;
-import org.json.JSONException;
-import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
@@ -55,7 +52,6 @@ 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.DetailedBolusInfo;
import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.QuickWizardEntry;
@@ -95,7 +91,6 @@ import info.nightscout.androidaps.plugins.general.nsclient.data.NSDeviceStatus;
import info.nightscout.androidaps.plugins.general.nsclient.data.NSSettingsStatus;
import info.nightscout.androidaps.plugins.general.overview.activities.QuickWizardListActivity;
import info.nightscout.androidaps.plugins.general.overview.dialogs.CalibrationDialog;
-import info.nightscout.androidaps.plugins.general.overview.dialogs.ErrorHelperActivity;
import info.nightscout.androidaps.plugins.general.overview.dialogs.NewCarbsDialog;
import info.nightscout.androidaps.plugins.general.overview.dialogs.NewInsulinDialog;
import info.nightscout.androidaps.plugins.general.overview.dialogs.NewTreatmentDialog;
@@ -785,122 +780,25 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
void onClickQuickwizard() {
final BgReading actualBg = DatabaseHelper.actualBg();
final Profile profile = ProfileFunctions.getInstance().getProfile();
- final TempTarget tempTarget = TreatmentsPlugin.getPlugin().getTempTargetFromHistory();
+ final String profileName = ProfileFunctions.getInstance().getProfileName();
+ final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
final QuickWizardEntry quickWizardEntry = OverviewPlugin.getPlugin().quickWizard.getActive();
- if (quickWizardEntry != null && actualBg != null && profile != null) {
+ if (quickWizardEntry != null && actualBg != null && profile != null && pump != null) {
quickWizardButton.setVisibility(View.VISIBLE);
- final BolusWizard wizard = quickWizardEntry.doCalc(profile, tempTarget, actualBg, true);
+ final BolusWizard wizard = quickWizardEntry.doCalc(profile, profileName, actualBg, true);
- final JSONObject boluscalcJSON = new JSONObject();
- try {
- boluscalcJSON.put("eventTime", DateUtil.toISOString(new Date()));
- boluscalcJSON.put("targetBGLow", wizard.targetBGLow);
- boluscalcJSON.put("targetBGHigh", wizard.targetBGHigh);
- boluscalcJSON.put("isf", wizard.sens);
- boluscalcJSON.put("ic", wizard.ic);
- boluscalcJSON.put("iob", -(wizard.insulingFromBolusIOB + wizard.insulingFromBasalsIOB));
- boluscalcJSON.put("bolusiobused", true);
- boluscalcJSON.put("basaliobused", true);
- boluscalcJSON.put("bg", actualBg.valueToUnits(profile.getUnits()));
- boluscalcJSON.put("insulinbg", wizard.insulinFromBG);
- boluscalcJSON.put("insulinbgused", true);
- boluscalcJSON.put("bgdiff", wizard.bgDiff);
- boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs);
- boluscalcJSON.put("carbs", quickWizardEntry.carbs());
- boluscalcJSON.put("othercorrection", 0d);
- boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
- boluscalcJSON.put("insulin", wizard.calculatedTotalInsulin);
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
- if (wizard.calculatedTotalInsulin > 0d && quickWizardEntry.carbs() > 0d) {
- DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00");
- String confirmMessage = MainApp.gs(R.string.entertreatmentquestion);
-
- Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(wizard.calculatedTotalInsulin)).value();
+ if (wizard.getCalculatedTotalInsulin() > 0d && quickWizardEntry.carbs() > 0d) {
Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(quickWizardEntry.carbs())).value();
- confirmMessage += "\n" + MainApp.gs(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U";
- confirmMessage += "\n" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g";
-
- if (Math.abs(insulinAfterConstraints - wizard.calculatedTotalInsulin) >= 0.01 || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) {
- AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
- builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror));
- builder.setMessage(MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput));
- builder.setPositiveButton(MainApp.gs(R.string.ok), null);
- builder.show();
+ if (Math.abs(wizard.getInsulinAfterConstraints() - wizard.getCalculatedTotalInsulin()) >= pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(wizard.getInsulinAfterConstraints()) || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) {
+ OKDialog.show(getContext(), MainApp.gs(R.string.treatmentdeliveryerror), MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput), null);
return;
}
- final Double finalInsulinAfterConstraints = insulinAfterConstraints;
- final Integer finalCarbsAfterConstraints = carbsAfterConstraints;
- final Context context = getContext();
- final AlertDialog.Builder builder = new AlertDialog.Builder(context);
- accepted = false;
- builder.setTitle(MainApp.gs(R.string.confirmation));
- builder.setMessage(confirmMessage);
- builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> {
- synchronized (builder) {
- if (accepted) {
- if (L.isEnabled(L.OVERVIEW))
- log.debug("guarding: already accepted");
- return;
- }
- accepted = true;
- if (Math.abs(insulinAfterConstraints - wizard.calculatedTotalInsulin) >= 0.01 || finalCarbsAfterConstraints > 0) {
- if (wizard.superBolus) {
- final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
- if (loopPlugin.isEnabled(PluginType.LOOP)) {
- loopPlugin.superBolusTo(System.currentTimeMillis() + T.hours(2).msecs());
- MainApp.bus().post(new EventRefreshOverview("WizardDialog"));
- }
- ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, 120, true, profile, 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.gs(R.string.tempbasaldeliveryerror));
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- MainApp.instance().startActivity(i);
- }
- }
- });
- }
- DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
- detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD;
- detailedBolusInfo.insulin = finalInsulinAfterConstraints;
- detailedBolusInfo.carbs = finalCarbsAfterConstraints;
- detailedBolusInfo.context = context;
- detailedBolusInfo.boluscalc = boluscalcJSON;
- detailedBolusInfo.source = Source.USER;
- if (finalInsulinAfterConstraints > 0 || ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo) {
- ConfigBuilderPlugin.getPlugin().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.gs(R.string.treatmentdeliveryerror));
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- MainApp.instance().startActivity(i);
- }
- }
- });
- } else {
- TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
- }
- }
- }
- });
- builder.setNegativeButton(MainApp.gs(R.string.cancel), null);
- builder.show();
+ wizard.confirmAndExecute(getContext());
}
}
-
}
@Override
@@ -1085,6 +983,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
final Profile profile = ProfileFunctions.getInstance().getProfile();
+ final String profileName = ProfileFunctions.getInstance().getProfileName();
final String units = profile.getUnits();
final double lowLine = OverviewPlugin.getPlugin().determineLowLine(units);
@@ -1282,10 +1181,10 @@ public class OverviewFragment extends Fragment implements View.OnClickListener,
if (quickWizardEntry != null && lastBG != null && pump.isInitialized() && !pump.isSuspended()) {
quickWizardButton.setVisibility(View.VISIBLE);
String text = quickWizardEntry.buttonText() + "\n" + DecimalFormatter.to0Decimal(quickWizardEntry.carbs()) + "g";
- BolusWizard wizard = quickWizardEntry.doCalc(profile, tempTarget, lastBG, false);
- text += " " + DecimalFormatter.toPumpSupportedBolus(wizard.calculatedTotalInsulin) + "U";
+ BolusWizard wizard = quickWizardEntry.doCalc(profile, profileName, lastBG, false);
+ text += " " + DecimalFormatter.toPumpSupportedBolus(wizard.getCalculatedTotalInsulin()) + "U";
quickWizardButton.setText(text);
- if (wizard.calculatedTotalInsulin <= 0)
+ if (wizard.getCalculatedTotalInsulin() <= 0)
quickWizardButton.setVisibility(View.GONE);
} else
quickWizardButton.setVisibility(View.GONE);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewInsulinDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewInsulinDialog.java
index 6344f29ec8..ab43e0b6f0 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewInsulinDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewInsulinDialog.java
@@ -225,7 +225,7 @@ public class NewInsulinDialog extends DialogFragment implements OnClickListener
}
}
- if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints))
+ if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(insulinAfterConstraints))
actions.add("" + MainApp.gs(R.string.bolusconstraintapplied) + "");
int eatingSoonTTDuration = SP.getInt(R.string.key_eatingsoon_duration, Constants.defaultEatingSoonTTDuration);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java
index b8034c7fba..c3a9d76fb5 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/NewTreatmentDialog.java
@@ -141,7 +141,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene
if (recordOnlyCheckbox.isChecked()) {
confirmMessage += "
" + MainApp.gs(R.string.bolusrecordedonly) + "";
}
- if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints) || !Objects.equals(carbsAfterConstraints, carbs))
+ if (Math.abs(insulinAfterConstraints - insulin) > pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(insulinAfterConstraints) || !Objects.equals(carbsAfterConstraints, carbs))
confirmMessage += "
" + MainApp.gs(R.string.bolusconstraintapplied) + "";
}
if (carbsAfterConstraints > 0)
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.java
index f9d54f9f9a..9638f3ef9b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/overview/dialogs/WizardDialog.java
@@ -2,13 +2,10 @@ package info.nightscout.androidaps.plugins.general.overview.dialogs;
import android.app.Activity;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AlertDialog;
import android.text.Editable;
-import android.text.Html;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
@@ -28,46 +25,35 @@ import android.widget.TextView;
import com.squareup.otto.Subscribe;
-import org.json.JSONException;
-import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.DecimalFormat;
import java.util.ArrayList;
-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.IobTotal;
import info.nightscout.androidaps.data.Profile;
import info.nightscout.androidaps.data.ProfileStore;
import info.nightscout.androidaps.db.BgReading;
-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.EventRefreshOverview;
import info.nightscout.androidaps.interfaces.Constraint;
-import info.nightscout.androidaps.interfaces.PluginType;
-import info.nightscout.androidaps.interfaces.PumpInterface;
-import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin;
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.events.EventAutosensCalculationFinished;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
-import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.utils.BolusWizard;
-import info.nightscout.androidaps.utils.DateUtil;
import info.nightscout.androidaps.utils.DecimalFormatter;
import info.nightscout.androidaps.utils.NumberPicker;
import info.nightscout.androidaps.utils.SP;
import info.nightscout.androidaps.utils.SafeParse;
+import info.nightscout.androidaps.utils.StringUtils;
import info.nightscout.androidaps.utils.ToastUtils;
public class WizardDialog extends DialogFragment implements OnClickListener, CompoundButton.OnCheckedChangeListener, Spinner.OnItemSelectedListener {
@@ -108,8 +94,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
EditText notesEdit;
Integer calculatedCarbs = 0;
- Double calculatedTotalInsulin = 0d;
- JSONObject boluscalcJSON;
+ BolusWizard wizard;
Context context;
@@ -311,99 +296,8 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
return;
}
okClicked = true;
- final Profile profile = ProfileFunctions.getInstance().getProfile();
- final PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump();
-
- if (pump != null && profile != null && (calculatedTotalInsulin > 0d || calculatedCarbs > 0d)) {
- String confirmMessage = MainApp.gs(R.string.entertreatmentquestion);
-
- Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(calculatedTotalInsulin)).value();
- Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(calculatedCarbs)).value();
-
- if (insulinAfterConstraints > 0)
- confirmMessage += "
" + MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + "";
- if (carbsAfterConstraints > 0)
- confirmMessage += "
" + MainApp.gs(R.string.carbs) + ": " + "" + carbsAfterConstraints + "g" + "";
-
- if (Math.abs(insulinAfterConstraints - calculatedTotalInsulin) > pump.getPumpDescription().pumpType.determineCorrectBolusSize(insulinAfterConstraints) || !carbsAfterConstraints.equals(calculatedCarbs)) {
- confirmMessage += "
" + MainApp.gs(R.string.bolusconstraintapplied) + "";
- }
-
- final Double finalInsulinAfterConstraints = insulinAfterConstraints;
- final Integer finalCarbsAfterConstraints = carbsAfterConstraints;
- final Double bg = SafeParse.stringToDouble(editBg.getText());
- final int carbTime = SafeParse.stringToInt(editCarbTime.getText());
- final boolean useSuperBolus = superbolusCheckbox.isChecked();
- final String finalNotes = notesEdit.getText().toString();
-
- final AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(MainApp.gs(R.string.confirmation));
- builder.setMessage(Html.fromHtml(confirmMessage));
- builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int id) {
- synchronized (builder) {
- if (accepted) {
- log.debug("guarding: already accepted");
- return;
- }
- accepted = true;
- if (finalInsulinAfterConstraints > 0 || finalCarbsAfterConstraints > 0) {
- if (useSuperBolus) {
- final LoopPlugin loopPlugin = LoopPlugin.getPlugin();
- if (loopPlugin.isEnabled(PluginType.LOOP)) {
- loopPlugin.superBolusTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000);
- MainApp.bus().post(new EventRefreshOverview("WizardDialog"));
- }
- ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalPercent(0, 120, true, profile, 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.gs(R.string.tempbasaldeliveryerror));
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- MainApp.instance().startActivity(i);
- }
- }
- });
- }
- DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo();
- detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD;
- detailedBolusInfo.insulin = finalInsulinAfterConstraints;
- detailedBolusInfo.carbs = finalCarbsAfterConstraints;
- detailedBolusInfo.context = context;
- detailedBolusInfo.glucose = bg;
- detailedBolusInfo.glucoseType = "Manual";
- detailedBolusInfo.carbTime = carbTime;
- detailedBolusInfo.boluscalc = boluscalcJSON;
- detailedBolusInfo.source = Source.USER;
- detailedBolusInfo.notes = finalNotes;
- if (detailedBolusInfo.insulin > 0 || ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().storesCarbInfo) {
- ConfigBuilderPlugin.getPlugin().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.gs(R.string.treatmentdeliveryerror));
- i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- MainApp.instance().startActivity(i);
- }
- }
- });
- } else {
- TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false);
- }
- }
- }
- }
- });
- builder.setNegativeButton(MainApp.gs(R.string.cancel), null);
- builder.show();
- dismiss();
- }
+ wizard.confirmAndExecute(context);
+ dismiss();
break;
case R.id.cancel:
dismiss();
@@ -450,8 +344,8 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
TreatmentsPlugin.getPlugin().updateTotalIOBTempBasals();
IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round();
- bolusIobInsulin.setText(DecimalFormatter.to2Decimal(-bolusIob.iob) + "U");
- basalIobInsulin.setText(DecimalFormatter.to2Decimal(-basalIob.basaliob) + "U");
+ bolusIobInsulin.setText(StringUtils.formatInsulin(-bolusIob.iob));
+ basalIobInsulin.setText(StringUtils.formatInsulin(-basalIob.basaliob));
calculateInsulin();
}
@@ -460,13 +354,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
ProfileStore profileStore = ConfigBuilderPlugin.getPlugin().getActiveProfileInterface().getProfile();
if (profileSpinner == null || profileSpinner.getSelectedItem() == null || profileStore == null)
return; // not initialized yet
- String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString();
+ String profileName = profileSpinner.getSelectedItem().toString();
Profile specificProfile;
- if (selectedAlternativeProfile.equals(MainApp.gs(R.string.active))) {
+ if (profileName.equals(MainApp.gs(R.string.active))) {
specificProfile = ProfileFunctions.getInstance().getProfile();
- selectedAlternativeProfile = ProfileFunctions.getInstance().getProfileName();
+ profileName = ProfileFunctions.getInstance().getProfileName();
} else
- specificProfile = profileStore.getSpecificProfile(selectedAlternativeProfile);
+ specificProfile = profileStore.getSpecificProfile(profileName);
// Entered values
Double c_bg = SafeParse.stringToDouble(editBg.getText());
@@ -494,104 +388,61 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com
Double c_cob = 0d;
if (cobCheckbox.isChecked()) {
CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard COB");
- if (cobInfo != null && cobInfo.displayCob != null)
+ if (cobInfo.displayCob != null)
c_cob = cobInfo.displayCob;
}
- BolusWizard wizard = new BolusWizard();
- wizard.doCalc(specificProfile, tempTarget, carbsAfterConstraint, c_cob, c_bg, corrAfterConstraint, bolusIobCheckbox.isChecked(), basalIobCheckbox.isChecked(), superbolusCheckbox.isChecked(), bgtrendCheckbox.isChecked());
+ wizard = new BolusWizard(specificProfile, profileName, tempTarget, carbsAfterConstraint, c_cob, c_bg, corrAfterConstraint, 100d, bgCheckbox.isChecked(), cobCheckbox.isChecked(), bolusIobCheckbox.isChecked(), basalIobCheckbox.isChecked(), superbolusCheckbox.isChecked(), ttCheckbox.isChecked(), bgtrendCheckbox.isChecked(), notesEdit.getText().toString(), SafeParse.stringToInt(editCarbTime.getText()));
- bg.setText(c_bg + " ISF: " + DecimalFormatter.to1Decimal(wizard.sens));
- bgInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromBG) + "U");
+ bg.setText(c_bg + " ISF: " + DecimalFormatter.to1Decimal(wizard.getSens()));
+ bgInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromBG()));
- carbs.setText(DecimalFormatter.to0Decimal(c_carbs) + "g IC: " + DecimalFormatter.to1Decimal(wizard.ic));
- carbsInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCarbs) + "U");
+ carbs.setText(DecimalFormatter.to0Decimal(c_carbs) + "g IC: " + DecimalFormatter.to1Decimal(wizard.getIc()));
+ carbsInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromCarbs()));
- bolusIobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulingFromBolusIOB) + "U");
- basalIobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulingFromBasalsIOB) + "U");
+ bolusIobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromBolusIOB()));
+ basalIobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromBasalsIOB()));
- correctionInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCorrection) + "U");
- calculatedTotalInsulin = wizard.calculatedTotalInsulin;
+ correctionInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromCorrection()));
calculatedCarbs = carbsAfterConstraint;
// Superbolus
- if (superbolusCheckbox.isChecked()) {
- superbolus.setText("2h");
- } else {
- superbolus.setText("");
- }
- superbolusInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromSuperBolus) + "U");
+ superbolus.setText(superbolusCheckbox.isChecked() ? MainApp.gs(R.string.twohours) : "");
+ superbolusInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromSuperBolus()));
// Trend
- if (bgtrendCheckbox.isChecked()) {
- if (wizard.glucoseStatus != null) {
- bgTrend.setText((wizard.glucoseStatus.avgdelta > 0 ? "+" : "") + Profile.toUnitsString(wizard.glucoseStatus.avgdelta * 3, wizard.glucoseStatus.avgdelta * 3 / 18, specificProfile.getUnits()) + " " + specificProfile.getUnits());
- } else {
- bgTrend.setText("");
- }
+ if (bgtrendCheckbox.isChecked() && wizard.getGlucoseStatus() != null) {
+ bgTrend.setText(
+ (wizard.getTrend() > 0 ? "+" : "")
+ + Profile.toUnitsString(wizard.getTrend() * 3, wizard.getTrend() * 3 / Constants.MMOLL_TO_MGDL, specificProfile.getUnits())
+ + " " + specificProfile.getUnits());
} else {
bgTrend.setText("");
}
- bgTrendInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromTrend) + "U");
+ bgTrendInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromTrend()));
// COB
if (cobCheckbox.isChecked()) {
- cob.setText(DecimalFormatter.to2Decimal(c_cob) + "g IC: " + DecimalFormatter.to1Decimal(wizard.ic));
- cobInsulin.setText(DecimalFormatter.to2Decimal(wizard.insulinFromCOB) + "U");
+ cob.setText(DecimalFormatter.to2Decimal(c_cob) + "g IC: " + DecimalFormatter.to1Decimal(wizard.getIc()));
+ cobInsulin.setText(StringUtils.formatInsulin(wizard.getInsulinFromCOB()));
} else {
cob.setText("");
cobInsulin.setText("");
}
- if (calculatedTotalInsulin > 0d || calculatedCarbs > 0d) {
- String insulinText = calculatedTotalInsulin > 0d ? (DecimalFormatter.toPumpSupportedBolus(calculatedTotalInsulin) + "U") : "";
+ if (wizard.getCalculatedTotalInsulin() > 0d || calculatedCarbs > 0d) {
+ String insulinText = wizard.getCalculatedTotalInsulin() > 0d ? (DecimalFormatter.toPumpSupportedBolus(wizard.getCalculatedTotalInsulin()) + "U") : "";
String carbsText = calculatedCarbs > 0d ? (DecimalFormatter.to0Decimal(calculatedCarbs) + "g") : "";
total.setText(MainApp.gs(R.string.result) + ": " + insulinText + " " + carbsText);
okButton.setVisibility(View.VISIBLE);
} else {
// TODO this should also be run when loading the dialog as the OK button is initially visible
// but does nothing if neither carbs nor insulin is > 0
- total.setText(MainApp.gs(R.string.missing) + " " + DecimalFormatter.to0Decimal(wizard.carbsEquivalent) + "g");
+ total.setText(MainApp.gs(R.string.missing) + " " + DecimalFormatter.to0Decimal(wizard.getCarbsEquivalent()) + "g");
okButton.setVisibility(View.INVISIBLE);
}
- boluscalcJSON = new JSONObject();
- try {
- boluscalcJSON.put("profile", selectedAlternativeProfile);
- boluscalcJSON.put("notes", notesEdit.getText());
- boluscalcJSON.put("eventTime", DateUtil.toISOString(new Date()));
- boluscalcJSON.put("targetBGLow", wizard.targetBGLow);
- boluscalcJSON.put("targetBGHigh", wizard.targetBGHigh);
- boluscalcJSON.put("isf", wizard.sens);
- boluscalcJSON.put("ic", wizard.ic);
- boluscalcJSON.put("iob", -(wizard.insulingFromBolusIOB + wizard.insulingFromBasalsIOB));
- boluscalcJSON.put("bolusiob", wizard.insulingFromBolusIOB);
- boluscalcJSON.put("basaliob", wizard.insulingFromBasalsIOB);
- boluscalcJSON.put("bolusiobused", bolusIobCheckbox.isChecked());
- boluscalcJSON.put("basaliobused", basalIobCheckbox.isChecked());
- boluscalcJSON.put("bg", c_bg);
- boluscalcJSON.put("insulinbg", wizard.insulinFromBG);
- boluscalcJSON.put("insulinbgused", bgCheckbox.isChecked());
- boluscalcJSON.put("bgdiff", wizard.bgDiff);
- boluscalcJSON.put("insulincarbs", wizard.insulinFromCarbs);
- boluscalcJSON.put("carbs", c_carbs);
- boluscalcJSON.put("cob", c_cob);
- boluscalcJSON.put("cobused", cobCheckbox.isChecked());
- boluscalcJSON.put("insulincob", wizard.insulinFromCOB);
- boluscalcJSON.put("othercorrection", corrAfterConstraint);
- boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus);
- boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
- boluscalcJSON.put("insulin", calculatedTotalInsulin);
- boluscalcJSON.put("superbolusused", superbolusCheckbox.isChecked());
- boluscalcJSON.put("insulinsuperbolus", wizard.insulinFromSuperBolus);
- boluscalcJSON.put("trendused", bgtrendCheckbox.isChecked());
- boluscalcJSON.put("insulintrend", wizard.insulinFromTrend);
- boluscalcJSON.put("trend", bgTrend.getText());
- boluscalcJSON.put("ttused", ttCheckbox.isChecked());
- } catch (JSONException e) {
- log.error("Unhandled exception", e);
- }
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/persistentNotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/persistentNotification/PersistentNotificationPlugin.java
index c302f71b38..9dcb800033 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/persistentNotification/PersistentNotificationPlugin.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/persistentNotification/PersistentNotificationPlugin.java
@@ -52,6 +52,7 @@ import info.nightscout.androidaps.utils.DecimalFormatter;
public class PersistentNotificationPlugin extends PluginBase {
private static PersistentNotificationPlugin plugin;
+ private Notification notification;
public static PersistentNotificationPlugin getPlugin() {
if (plugin == null) plugin = new PersistentNotificationPlugin(MainApp.instance());
@@ -250,6 +251,7 @@ public class PersistentNotificationPlugin extends PluginBase {
android.app.Notification notification = builder.build();
mNotificationManager.notify(ONGOING_NOTIFICATION_ID, notification);
+ this.notification = notification;
return notification;
}
@@ -269,6 +271,17 @@ public class PersistentNotificationPlugin extends PluginBase {
return deltastring;
}
+ /***
+ * returns the current ongoing notification.
+ *
+ * If it does not exist, return a dummy notification. This should only happen if onStart() wasn't called.
+ */
+
+ public Notification getLastNotification() {
+ if (notification != null) return notification;
+ else return new Notification();
+ }
+
@Subscribe
public void onStatusEvent(final EventPreferenceChange ev) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/ActionStringHandler.java
index e2ca7ac869..addc6517ec 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/ActionStringHandler.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/wear/ActionStringHandler.java
@@ -207,6 +207,7 @@ public class ActionStringHandler {
int percentage = Integer.parseInt(act[2]);
Profile profile = ProfileFunctions.getInstance().getProfile();
+ String profileName = ProfileFunctions.getInstance().getProfileName();
if (profile == null) {
sendError("No profile found!");
return;
@@ -226,45 +227,38 @@ public class ActionStringHandler {
DecimalFormat format = new DecimalFormat("0.00");
DecimalFormat formatInt = new DecimalFormat("0");
- BolusWizard bolusWizard = new BolusWizard();
- bolusWizard.doCalc(profile, useTT ? TreatmentsPlugin.getPlugin().getTempTargetFromHistory() : null,
- carbsAfterConstraints, useCOB?cobInfo.displayCob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d,
- 0d, percentage, useBolusIOB, useBasalIOB, false, useTrend);
+ BolusWizard bolusWizard = new BolusWizard(profile, profileName, TreatmentsPlugin.getPlugin().getTempTargetFromHistory(),
+ carbsAfterConstraints, cobInfo.displayCob, bgReading.valueToUnits(profile.getUnits()),
+ 0d, percentage, useBG, useCOB, useBolusIOB, useBasalIOB, false, useTT, useTrend);
- Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value();
- if (Math.abs(insulinAfterConstraints - bolusWizard.calculatedTotalInsulin) >= 0.01) {
+ if (Math.abs(bolusWizard.getInsulinAfterConstraints() - bolusWizard.getCalculatedTotalInsulin()) >= 0.01) {
sendError("Insulin constraint violation!" +
- "\nCannot deliver " + format.format(bolusWizard.calculatedTotalInsulin) + "!");
+ "\nCannot deliver " + format.format(bolusWizard.getCalculatedTotalInsulin()) + "!");
return;
}
-
- if (bolusWizard.calculatedTotalInsulin < 0) {
- bolusWizard.calculatedTotalInsulin = 0d;
- }
-
- if (bolusWizard.calculatedTotalInsulin <= 0 && bolusWizard.carbs <= 0) {
+ if (bolusWizard.getCalculatedTotalInsulin() <= 0 && bolusWizard.getCarbs() <= 0) {
rAction = "info";
rTitle = "INFO";
} else {
rAction = actionstring;
}
- rMessage += "Carbs: " + bolusWizard.carbs + "g";
- rMessage += "\nBolus: " + format.format(bolusWizard.calculatedTotalInsulin) + "U";
+ rMessage += "Carbs: " + bolusWizard.getCarbs() + "g";
+ rMessage += "\nBolus: " + format.format(bolusWizard.getCalculatedTotalInsulin()) + "U";
rMessage += "\n_____________";
- rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.ic) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.sens) + "): ";
- rMessage += "\nFrom Carbs: " + format.format(bolusWizard.insulinFromCarbs) + "U";
+ rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.getIc()) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.getSens()) + "): ";
+ rMessage += "\nFrom Carbs: " + format.format(bolusWizard.getInsulinFromCarbs()) + "U";
if (useCOB)
- rMessage += "\nFrom" + formatInt.format(cobInfo.displayCob) + "g COB : " + format.format(bolusWizard.insulinFromCOB) + "U";
- if (useBG) rMessage += "\nFrom BG: " + format.format(bolusWizard.insulinFromBG) + "U";
+ rMessage += "\nFrom" + formatInt.format(cobInfo.displayCob) + "g COB : " + format.format(bolusWizard.getInsulinFromCOB()) + "U";
+ if (useBG) rMessage += "\nFrom BG: " + format.format(bolusWizard.getInsulinFromBG()) + "U";
if (useBolusIOB)
- rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U";
+ rMessage += "\nBolus IOB: " + format.format(bolusWizard.getInsulinFromBolusIOB()) + "U";
if (useBasalIOB)
- rMessage += "\nBasal IOB: " + format.format(bolusWizard.insulingFromBasalsIOB) + "U";
+ rMessage += "\nBasal IOB: " + format.format(bolusWizard.getInsulinFromBasalsIOB()) + "U";
if (useTrend)
- rMessage += "\nFrom 15' trend: " + format.format(bolusWizard.insulinFromTrend) + "U";
+ rMessage += "\nFrom 15' trend: " + format.format(bolusWizard.getInsulinFromTrend()) + "U";
if (percentage != 100) {
- rMessage += "\nPercentage: " + format.format(bolusWizard.totalBeforePercentageAdjustment) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.calculatedTotalInsulin) + "U";
+ rMessage += "\nPercentage: " + format.format(bolusWizard.getTotalBeforePercentageAdjustment()) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.getCalculatedTotalInsulin()) + "U";
}
lastBolusWizard = bolusWizard;
@@ -628,7 +622,7 @@ public class ActionStringHandler {
if (lastBolusWizard != null) {
//use last calculation as confirmed string matches
- doBolus(lastBolusWizard.calculatedTotalInsulin, lastBolusWizard.carbs);
+ doBolus(lastBolusWizard.getCalculatedTotalInsulin(), lastBolusWizard.getCarbs());
lastBolusWizard = null;
}
} else if ("bolus".equals(act[0])) {
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ruffyscripter/RuffyScripter.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ruffyscripter/RuffyScripter.java
index 19603d99e6..c057b9244b 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ruffyscripter/RuffyScripter.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/combo/ruffyscripter/RuffyScripter.java
@@ -242,6 +242,7 @@ public class RuffyScripter implements RuffyCommands {
Thread cmdThread = null;
try {
activeCmd = cmd;
+ unparsableMenuEncountered = false;
long connectStart = System.currentTimeMillis();
ensureConnected();
log.debug("Connection ready to execute cmd " + cmd);
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java
index 876419a0c1..ecea843aa8 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/common/defs/PumpType.java
@@ -7,7 +7,7 @@ import java.util.Map;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.plugins.pump.common.data.DoseSettings;
-
+import info.nightscout.androidaps.utils.Round;
/**
@@ -19,71 +19,71 @@ import info.nightscout.androidaps.plugins.pump.common.data.DoseSettings;
public enum PumpType {
GenericAAPS("Generic AAPS", "AndroidAPS", "VirutalPump", 0.1d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Percent, //
- new DoseSettings(10,30, 24*60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(10, 30, 24 * 60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01d, 0.01d, null, PumpCapability.VirtualPumpCapabilities), //
// Cellnovo
Cellnovo1("Cellnovo", "Cellnovo", "Cellnovo", 0.05d, null, //
- new DoseSettings(0.05d, 30, 24*60, 1d, null),
+ new DoseSettings(0.05d, 30, 24 * 60, 1d, null),
PumpTempBasalType.Percent,
- new DoseSettings(5,30, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, //
+ new DoseSettings(5, 30, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration30minAllowed, //
0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), //
// Accu-Chek
AccuChekCombo("Accu-Chek Combo", "Roche", "Combo", 0.1d, null, //
- new DoseSettings(0.1d, 15, 12*60, 0.1d), //
+ new DoseSettings(0.1d, 15, 12 * 60, 0.1d), //
PumpTempBasalType.Percent,
- new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(10, 15, 12 * 60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01d, 0.01d, DoseStepSize.ComboBasal, PumpCapability.ComboCapabilities), //
AccuChekSpirit("Accu-Chek Spirit", "Roche", "Spirit", 0.1d, null, //
- new DoseSettings(0.1d, 15, 12*60, 0.1d), //
+ new DoseSettings(0.1d, 15, 12 * 60, 0.1d), //
PumpTempBasalType.Percent,
- new DoseSettings(10, 15, 12*60,0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(10, 15, 12 * 60, 0d, 500d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.01d, 0.1d, null, PumpCapability.VirtualPumpCapabilities), //
AccuChekInsight("Accu-Chek Insight", "Roche", "Insight", 0.05d, DoseStepSize.InsightBolus, //
- new DoseSettings(0.05d, 15, 24*60, 0.05d), //
+ new DoseSettings(0.05d, 15, 24 * 60, 0.05d), //
PumpTempBasalType.Percent,
- new DoseSettings(10, 15, 24*60,0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(10, 15, 24 * 60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.02d, 0.01d, null, PumpCapability.InsightCapabilities), //
AccuChekInsightBluetooth("Accu-Chek Insight", "Roche", "Insight", 0.01d, null, //
- new DoseSettings(0.01d, 15, 24*60, 0.05d), //
+ new DoseSettings(0.01d, 15, 24 * 60, 0.05d), //
PumpTempBasalType.Percent,
- new DoseSettings(10, 15, 24*60,0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(10, 15, 24 * 60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.02d, 0.01d, DoseStepSize.InsightBolus, PumpCapability.InsightCapabilities), //
// Animas
AnimasVibe("Animas Vibe","Animas", "Vibe", 0.05d, null, // AnimasBolus?
- new DoseSettings(0.05d, 30, 12*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 12 * 60, 0.05d), //
PumpTempBasalType.Percent, //
- new DoseSettings(10, 30, 24*60, 0d, 300d), PumpCapability.BasalRate_Duration30minAllowed, //
+ new DoseSettings(10, 30, 24 * 60, 0d, 300d), PumpCapability.BasalRate_Duration30minAllowed, //
0.025d, 5d, 0d, null, PumpCapability.VirtualPumpCapabilities), //
AnimasPing("Animas Ping", "Ping", AnimasVibe),
// Dana
DanaR("DanaR", "SOOIL", "DanaR", 0.05d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Percent, //
- new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
+ new DoseSettings(10d, 60, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
0.04d, 0.01d, null, PumpCapability.DanaCapabilities),
DanaRKorean("DanaR Korean", "SOOIL", "DanaRKorean", 0.05d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Percent, //
- new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
+ new DoseSettings(10d, 60, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minNotAllowed, //
0.1d, 0.01d, null, PumpCapability.DanaCapabilities),
DanaRS("DanaRS", "SOOIL", "DanaRS", 0.05d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Percent, //
- new DoseSettings(10d, 60, 24*60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(10d, 60, 24 * 60, 0d, 200d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.04d, 0.01d, null, PumpCapability.DanaWithHistoryCapabilities),
DanaRv2("DanaRv2", "DanaRv2", DanaRS),
@@ -91,40 +91,40 @@ public enum PumpType {
// Insulet
Insulet_Omnipod("Insulet Omnipod", "Insulet", "Omnipod", 0.05d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Absolute, //
- new DoseSettings(0.05d, 30, 12*60, 0d, 30.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr
+ new DoseSettings(0.05d, 30, 12 * 60, 0d, 30.0d), PumpCapability.BasalRate_Duration30minAllowed, // cannot exceed max basal rate 30u/hr
0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities),
// Medtronic
Medtronic_512_712("Medtronic 512/712", "Medtronic", "512/712", 0.05d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Absolute, //
- new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
+ new DoseSettings(0.05d, 30, 24 * 60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
0.05d, 0.05d, null, PumpCapability.VirtualPumpCapabilities), // TODO
Medtronic_515_715("Medtronic 515/715", "515/715", Medtronic_512_712),
Medtronic_522_722("Medtronic 522/722", "522/722", Medtronic_512_712),
Medtronic_523_723_Revel("Medtronic 523/723 (Revel)", "Medtronic", "523/723 (Revel)", 0.05d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Absolute, //
- new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
+ new DoseSettings(0.05d, 30, 24 * 60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
0.025d, 0.025d, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
Medtronic_554_754_Veo("Medtronic 554/754 (Veo)", "554/754 (Veo)", Medtronic_523_723_Revel), // TODO
Medtronic_640G("Medtronic 640G", "Medtronic", "640G", 0.025d, null, //
- new DoseSettings(0.05d, 30, 8*60, 0.05d), //
+ new DoseSettings(0.05d, 30, 8 * 60, 0.05d), //
PumpTempBasalType.Absolute, //
- new DoseSettings(0.05d, 30, 24*60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
+ new DoseSettings(0.05d, 30, 24 * 60, 0d, 35d), PumpCapability.BasalRate_Duration30minAllowed, //
0.025d, 0.025d, DoseStepSize.MedtronicVeoBasal, PumpCapability.VirtualPumpCapabilities), //
// Tandem
TandemTSlim("Tandem t:slim", "Tandem", "t:slim", 0.01d, null, //
- new DoseSettings(0.01d,15, 8*60, 0.4d),
+ new DoseSettings(0.01d, 15, 8 * 60, 0.4d),
PumpTempBasalType.Percent,
- new DoseSettings(1,15, 8*60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
+ new DoseSettings(1, 15, 8 * 60, 0d, 250d), PumpCapability.BasalRate_Duration15and30minAllowed, //
0.1d, 0.001d, null, PumpCapability.VirtualPumpCapabilities),
TandemTFlex("Tandem t:flex", "t:flex", TandemTSlim), //
@@ -148,10 +148,9 @@ public enum PumpType {
private PumpCapability pumpCapability;
private PumpType parent;
- private static Map mapByDescription;
+ private static Map mapByDescription;
- static
- {
+ static {
mapByDescription = new HashMap<>();
for (PumpType pumpType : values()) {
@@ -186,8 +185,7 @@ public enum PumpType {
PumpType(String description, String manufacter, String model, double bolusSize, DoseStepSize specialBolusSize, //
DoseSettings extendedBolusSettings, //
PumpTempBasalType pumpTempBasalType, DoseSettings tbrSettings, PumpCapability specialBasalDurations, //
- double baseBasalMinValue, Double baseBasalMaxValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability)
- {
+ double baseBasalMinValue, Double baseBasalMaxValue, double baseBasalStep, DoseStepSize baseBasalSpecialSteps, PumpCapability pumpCapability) {
this.description = description;
this.manufacter = manufacter;
this.model = model;
@@ -275,20 +273,15 @@ public enum PumpType {
}
- private boolean isParentSet()
- {
- return this.parent!=null;
+ private boolean isParentSet() {
+ return this.parent != null;
}
- public static PumpType getByDescription(String desc)
- {
- if (mapByDescription.containsKey(desc))
- {
+ public static PumpType getByDescription(String desc) {
+ if (mapByDescription.containsKey(desc)) {
return mapByDescription.get(desc);
- }
- else
- {
+ } else {
return PumpType.GenericAAPS;
}
}
@@ -296,7 +289,7 @@ public enum PumpType {
public String getFullDescription(String i18nTemplate, boolean hasExtendedBasals) {
- String unit = getPumpTempBasalType()==PumpTempBasalType.Percent ? "%" : "";
+ String unit = getPumpTempBasalType() == PumpTempBasalType.Percent ? "%" : "";
DoseSettings eb = getExtendedBolusSettings();
DoseSettings tbr = getTbrSettings();
@@ -305,24 +298,22 @@ public enum PumpType {
return String.format(i18nTemplate, //
getStep("" + getBolusSize(), getSpecialBolusSize()), //
- eb.getStep(), eb.getDurationStep(), eb.getMaxDuration()/60, //
+ eb.getStep(), eb.getDurationStep(), eb.getMaxDuration() / 60, //
getStep(getBaseBasalRange(), getBaseBasalSpecialSteps()), //
tbr.getMinDose() + unit + "-" + tbr.getMaxDose() + unit, tbr.getStep() + unit,
- tbr.getDurationStep(), tbr.getMaxDuration()/60, extendedNote);
+ tbr.getDurationStep(), tbr.getMaxDuration() / 60, extendedNote);
}
- private String getBaseBasalRange()
- {
+ private String getBaseBasalRange() {
Double maxValue = getBaseBasalMaxValue();
- return maxValue==null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
+ return maxValue == null ? "" + getBaseBasalMinValue() : getBaseBasalMinValue() + "-" + maxValue;
}
- private String getStep(String step, DoseStepSize stepSize)
- {
- if (stepSize!=null)
+ private String getStep(String step, DoseStepSize stepSize) {
+ if (stepSize != null)
return step + " [" + stepSize.getDescription() + "] *";
else
return "" + step;
@@ -330,18 +321,15 @@ public enum PumpType {
public boolean hasExtendedBasals() {
- return ((getBaseBasalSpecialSteps() !=null) || (getSpecialBolusSize() != null));
+ return ((getBaseBasalSpecialSteps() != null) || (getSpecialBolusSize() != null));
}
public PumpCapability getSpecialBasalDurations() {
- if (isParentSet())
- {
+ if (isParentSet()) {
return parent.getSpecialBasalDurations();
- }
- else
- {
+ } else {
return specialBasalDurations == null ? //
PumpCapability.BasalRate_Duration15and30minNotAllowed : specialBasalDurations;
}
@@ -352,20 +340,24 @@ public enum PumpType {
return bolusAmount;
}
- double bolusStepSize;
+ double bolusStepSize = getBolusSize();
- if (getSpecialBolusSize() == null) {
- bolusStepSize = getBolusSize();
- } else {
+ if (getSpecialBolusSize() != null) {
DoseStepSize specialBolusSize = getSpecialBolusSize();
-
- bolusStepSize = specialBolusSize.getStepSizeForAmount((double)bolusAmount);
+ bolusStepSize = specialBolusSize.getStepSizeForAmount(bolusAmount);
}
- return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
+ return Round.roundTo(bolusAmount, bolusStepSize);
}
+ public double determineCorrectBolusStepSize(double bolusAmount) {
+ DoseStepSize specialBolusSize = getSpecialBolusSize();
+ if (specialBolusSize != null)
+ return specialBolusSize.getStepSizeForAmount(bolusAmount);
+ return getBolusSize();
+ }
+
public double determineCorrectExtendedBolusSize(double bolusAmount) {
if (bolusAmount == 0.0d) {
return bolusAmount;
@@ -385,7 +377,7 @@ public enum PumpType {
bolusAmount = extendedBolusSettings.getMaxDose();
}
- return Math.round(bolusAmount / bolusStepSize) * bolusStepSize;
+ return Round.roundTo(bolusAmount, bolusStepSize);
}
@@ -407,7 +399,7 @@ public enum PumpType {
if (basalAmount > getTbrSettings().getMaxDose())
basalAmount = getTbrSettings().getMaxDose().doubleValue();
- return Math.round(basalAmount / basalStepSize) * basalStepSize;
+ return Round.roundTo(basalAmount, basalStepSize);
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java
index 46031d8666..b255be2dd6 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/activities/InsightAlertActivity.java
@@ -40,7 +40,7 @@ public class InsightAlertActivity extends AppCompatActivity {
alertService.setAlertActivity(InsightAlertActivity.this);
alert = alertService.getAlert();
if (alert == null) finish();
- update(alert);
+ else update(alert);
}
@Override
diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/source/SourceDexcomPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/source/SourceDexcomPlugin.kt
index 2131d5e321..6119c07c37 100644
--- a/app/src/main/java/info/nightscout/androidaps/plugins/source/SourceDexcomPlugin.kt
+++ b/app/src/main/java/info/nightscout/androidaps/plugins/source/SourceDexcomPlugin.kt
@@ -1,6 +1,5 @@
package info.nightscout.androidaps.plugins.source
-import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
@@ -33,9 +32,9 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
private val log = LoggerFactory.getLogger(L.BGSOURCE)
private val PACKAGE_NAMES = arrayOf("com.dexcom.cgm.region1.mgdl", "com.dexcom.cgm.region1.mmol",
- "com.dexcom.cgm.region2.mgdl", "com.dexcom.cgm.region2.mmol",
- "com.dexcom.g6.region1.mmol", "com.dexcom.g6.region2.mgdl",
- "com.dexcom.g6.region3.mgdl", "com.dexcom.g6.region3.mmol")
+ "com.dexcom.cgm.region2.mgdl", "com.dexcom.cgm.region2.mmol",
+ "com.dexcom.g6.region1.mmol", "com.dexcom.g6.region2.mgdl",
+ "com.dexcom.g6.region3.mgdl", "com.dexcom.g6.region3.mmol")
const val PERMISSION = "com.dexcom.cgm.EXTERNAL_PERMISSION"
@@ -83,7 +82,7 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
val meters = intent.getBundleExtra("meters")
for (i in 0 until meters.size()) {
val meter = meters.getBundle(i.toString())
- val timestamp = meter.getLong("timestamp") * 1000
+ val timestamp = meter!!.getLong("timestamp") * 1000
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(timestamp) != null) continue
val jsonObject = JSONObject()
jsonObject.put("enteredBy", "AndroidAPS-Dexcom")
@@ -95,7 +94,7 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
NSUpload.uploadCareportalEntryToNS(jsonObject)
}
if (SP.getBoolean(R.string.key_dexcom_lognssensorchange, false) && intent.hasExtra("sensorInsertionTime")) {
- val sensorInsertionTime = intent.extras.getLong("sensorInsertionTime") * 1000
+ val sensorInsertionTime = intent.extras!!.getLong("sensorInsertionTime") * 1000
if (MainApp.getDbHelper().getCareportalEventFromTimestamp(sensorInsertionTime) == null) {
val jsonObject = JSONObject()
jsonObject.put("enteredBy", "AndroidAPS-Dexcom")
@@ -104,7 +103,7 @@ object SourceDexcomPlugin : PluginBase(PluginDescription()
NSUpload.uploadCareportalEntryToNS(jsonObject)
}
}
- } catch (e : Exception) {
+ } catch (e: Exception) {
log.error("Error while processing intent from Dexcom App", e)
}
}
diff --git a/app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java b/app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java
index 4917789db1..a62f2c6fb7 100644
--- a/app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java
+++ b/app/src/main/java/info/nightscout/androidaps/services/AlarmSoundService.java
@@ -1,5 +1,6 @@
package info.nightscout.androidaps.services;
+import android.app.Notification;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
@@ -16,6 +17,7 @@ import java.io.IOException;
import info.nightscout.androidaps.MainApp;
import info.nightscout.androidaps.R;
import info.nightscout.androidaps.logging.L;
+import info.nightscout.androidaps.plugins.general.persistentNotification.PersistentNotificationPlugin;
public class AlarmSoundService extends Service {
private static Logger log = LoggerFactory.getLogger(L.CORE);
@@ -28,8 +30,7 @@ public class AlarmSoundService extends Service {
@Override
public IBinder onBind(Intent intent) {
- // TODO: Return the communication channel to the service.
- throw new UnsupportedOperationException("Not yet implemented");
+ return null;
}
@Override
@@ -40,6 +41,8 @@ public class AlarmSoundService extends Service {
}
public int onStartCommand(Intent intent, int flags, int startId) {
+ Notification notification = PersistentNotificationPlugin.getPlugin().getLastNotification();
+ startForeground(PersistentNotificationPlugin.ONGOING_NOTIFICATION_ID, notification);
if (player != null && player.isPlaying())
player.stop();
if (L.isEnabled(L.CORE))
diff --git a/app/src/main/java/info/nightscout/androidaps/utils/BolusWizard.java b/app/src/main/java/info/nightscout/androidaps/utils/BolusWizard.java
deleted file mode 100644
index cd789ee225..0000000000
--- a/app/src/main/java/info/nightscout/androidaps/utils/BolusWizard.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package info.nightscout.androidaps.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
-import info.nightscout.androidaps.data.IobTotal;
-import info.nightscout.androidaps.data.Profile;
-import info.nightscout.androidaps.db.TempTarget;
-import info.nightscout.androidaps.interfaces.TreatmentsInterface;
-import info.nightscout.androidaps.logging.L;
-import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
-import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
-
-/**
- * Created by mike on 11.10.2016.
- */
-
-public class BolusWizard {
- private Logger log = LoggerFactory.getLogger(L.CORE);
- // Inputs
- private Profile specificProfile = null;
- private TempTarget tempTarget;
- public Integer carbs = 0;
- private Double bg = 0d;
- private Double cob = 0d;
- private Double correction;
- private Double percentageCorrection;
- private Boolean includeBolusIOB = true;
- private Boolean includeBasalIOB = true;
- public Boolean superBolus = false;
- private Boolean trend = false;
-
- // Intermediate
- public double sens = 0d;
- public double ic = 0d;
-
- public GlucoseStatus glucoseStatus;
-
- public double targetBGLow = 0d;
- public double targetBGHigh = 0d;
- public double bgDiff = 0d;
-
- public double insulinFromBG = 0d;
- public double insulinFromCarbs = 0d;
- public double insulingFromBolusIOB = 0d;
- public double insulingFromBasalsIOB = 0d;
- public double insulinFromCorrection = 0d;
- public double insulinFromSuperBolus = 0d;
- public double insulinFromCOB = 0d;
- public double insulinFromTrend = 0d;
-
- // Result
- public Double calculatedTotalInsulin = 0d;
- public Double totalBeforePercentageAdjustment = 0d;
- public Double carbsEquivalent = 0d;
-
- public Double doCalc(Profile specificProfile, TempTarget tempTarget, Integer carbs, Double cob, Double bg, Double correction, Boolean includeBolusIOB, Boolean includeBasalIOB, Boolean superBolus, Boolean trend) {
- return doCalc(specificProfile, tempTarget, carbs, cob, bg, correction, 100d, includeBolusIOB, includeBasalIOB, superBolus, trend);
- }
-
- public Double doCalc(Profile specificProfile, TempTarget tempTarget, Integer carbs, Double cob, Double bg, Double correction, double percentageCorrection, Boolean includeBolusIOB, Boolean includeBasalIOB, Boolean superBolus, Boolean trend) {
- this.specificProfile = specificProfile;
- this.tempTarget = tempTarget;
- this.carbs = carbs;
- this.bg = bg;
- this.cob = cob;
- this.correction = correction;
- this.percentageCorrection = percentageCorrection;
- this.includeBolusIOB = includeBolusIOB;
- this.includeBasalIOB = includeBasalIOB;
- this.superBolus = superBolus;
- this.trend = trend;
-
- // Insulin from BG
- sens = specificProfile.getIsf();
- targetBGLow = specificProfile.getTargetLow();
- targetBGHigh = specificProfile.getTargetHigh();
- if (tempTarget != null) {
- targetBGLow = Profile.fromMgdlToUnits(tempTarget.low, specificProfile.getUnits());
- targetBGHigh = Profile.fromMgdlToUnits(tempTarget.high, specificProfile.getUnits());
- }
- if (bg >= targetBGLow && bg <= targetBGHigh) {
- bgDiff = 0d;
- } else if (bg <= targetBGLow) {
- bgDiff = bg - targetBGLow;
- } else {
- bgDiff = bg - targetBGHigh;
- }
- insulinFromBG = bg != 0d ? bgDiff / sens : 0d;
-
- // Insulin from 15 min trend
- glucoseStatus = GlucoseStatus.getGlucoseStatusData();
- if (glucoseStatus != null && trend) {
- insulinFromTrend = (Profile.fromMgdlToUnits(glucoseStatus.short_avgdelta, specificProfile.getUnits()) * 3) / sens;
- }
-
- // Insuling from carbs
- ic = specificProfile.getIc();
- insulinFromCarbs = carbs / ic;
- insulinFromCOB = cob / ic;
-
- // Insulin from IOB
- // IOB calculation
- TreatmentsInterface treatments = TreatmentsPlugin.getPlugin();
- treatments.updateTotalIOBTreatments();
- IobTotal bolusIob = treatments.getLastCalculationTreatments().round();
- treatments.updateTotalIOBTempBasals();
- IobTotal basalIob = treatments.getLastCalculationTempBasals().round();
-
- insulingFromBolusIOB = includeBolusIOB ? -bolusIob.iob : 0d;
- insulingFromBasalsIOB = includeBasalIOB ? -basalIob.basaliob : 0d;
-
- // Insulin from correction
- insulinFromCorrection = correction;
-
- // Insulin from superbolus for 2h. Get basal rate now and after 1h
- if (superBolus) {
- insulinFromSuperBolus = specificProfile.getBasal();
- long timeAfter1h = System.currentTimeMillis();
- timeAfter1h += T.hours(1).msecs();
- insulinFromSuperBolus += specificProfile.getBasal(timeAfter1h);
- }
-
- // Total
- calculatedTotalInsulin = insulinFromBG + insulinFromTrend + insulinFromCarbs + insulingFromBolusIOB + insulingFromBasalsIOB + insulinFromCorrection + insulinFromSuperBolus + insulinFromCOB;
-
- // Percentage adjustment
- totalBeforePercentageAdjustment = calculatedTotalInsulin;
- if (calculatedTotalInsulin > 0) {
- calculatedTotalInsulin = calculatedTotalInsulin * percentageCorrection / 100d;
- }
-
- if (calculatedTotalInsulin < 0) {
- carbsEquivalent = -calculatedTotalInsulin * ic;
- calculatedTotalInsulin = 0d;
- }
-
- double bolusStep = ConfigBuilderPlugin.getPlugin().getActivePump().getPumpDescription().bolusStep;
- calculatedTotalInsulin = Round.roundTo(calculatedTotalInsulin, bolusStep);
-
- log.debug(log());
-
- return calculatedTotalInsulin;
- }
-
- public String log() {
- StringBuilder sb = new StringBuilder();
-
- sb.append("TempTarget=").append(tempTarget != null ? tempTarget.toString() : "null").append("; ");
- sb.append("Carbs=").append(carbs != null ? carbs : null).append("; ");
- sb.append("Bg=").append(bg).append("; ");
- sb.append("Cob=").append(cob).append("; ");
- sb.append("Correction=").append(correction).append("; ");
- sb.append("PercentageCorrection=").append(percentageCorrection).append("; ");
- sb.append("IncludeBolusIOB=").append(includeBolusIOB).append("; ");
- sb.append("IncludeBasalIOB=").append(includeBasalIOB).append("; ");
- sb.append("Superbolus=").append(superBolus).append("; ");
- sb.append("Trend=").append(trend).append("; ");
- sb.append("Profile=").append(specificProfile != null && specificProfile.getData() != null ? specificProfile.getData().toString() : "null").append("; ");
- sb.append("\n");
-
- sb.append("targetBGLow=").append(targetBGLow).append("; ");
- sb.append("targetBGHigh=").append(targetBGHigh).append("; ");
- sb.append("bgDiff=").append(bgDiff).append("; ");
- sb.append("insulinFromBG=").append(insulinFromBG).append("; ");
- sb.append("insulinFromCarbs=").append(insulinFromCarbs).append("; ");
- sb.append("insulingFromBolusIOB=").append(insulingFromBolusIOB).append("; ");
- sb.append("insulingFromBasalsIOB=").append(insulingFromBasalsIOB).append("; ");
- sb.append("insulinFromCorrection=").append(insulinFromCorrection).append("; ");
- sb.append("insulinFromSuperBolus=").append(insulinFromSuperBolus).append("; ");
- sb.append("insulinFromCOB=").append(insulinFromCOB).append("; ");
- sb.append("insulinFromTrend=").append(insulinFromTrend).append("; ");
- sb.append("\n");
-
-
- sb.append("calculatedTotalInsulin=").append(calculatedTotalInsulin).append("; ");
- sb.append("totalBeforePercentageAdjustment=").append(totalBeforePercentageAdjustment).append("; ");
- sb.append("carbsEquivalent=").append(carbsEquivalent).append("; ");
-
- return sb.toString();
- }
-}
diff --git a/app/src/main/java/info/nightscout/androidaps/utils/BolusWizard.kt b/app/src/main/java/info/nightscout/androidaps/utils/BolusWizard.kt
new file mode 100644
index 0000000000..6f695fc401
--- /dev/null
+++ b/app/src/main/java/info/nightscout/androidaps/utils/BolusWizard.kt
@@ -0,0 +1,344 @@
+package info.nightscout.androidaps.utils
+
+import android.content.Context
+import android.content.Intent
+import android.text.Html
+import androidx.appcompat.app.AlertDialog
+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.events.EventRefreshOverview
+import info.nightscout.androidaps.interfaces.Constraint
+import info.nightscout.androidaps.interfaces.PluginType
+import info.nightscout.androidaps.interfaces.PumpDescription
+import info.nightscout.androidaps.interfaces.PumpInterface
+import info.nightscout.androidaps.logging.L
+import info.nightscout.androidaps.plugins.aps.loop.LoopPlugin
+import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin
+import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions
+import info.nightscout.androidaps.plugins.general.overview.dialogs.ErrorHelperActivity
+import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus
+import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin
+import info.nightscout.androidaps.queue.Callback
+import org.json.JSONException
+import org.json.JSONObject
+import org.slf4j.LoggerFactory
+import java.util.*
+
+class BolusWizard @JvmOverloads constructor(val profile: Profile,
+ val profileName: String,
+ val tempTarget: TempTarget?,
+ val carbs: Int,
+ val cob: Double,
+ val bg: Double,
+ val correction: Double,
+ private val percentageCorrection: Double = 100.0,
+ private val useBg: Boolean,
+ private val useCob: Boolean,
+ private val includeBolusIOB: Boolean,
+ private val includeBasalIOB: Boolean,
+ private val useSuperBolus: Boolean,
+ private val useTT: Boolean,
+ private val useTrend: Boolean,
+ val notes: String = "",
+ private val carbTime: Int = 0
+) {
+
+ private val log = LoggerFactory.getLogger(L.CORE)
+
+ // Intermediate
+ var sens = 0.0
+ private set
+
+ var ic = 0.0
+ private set
+
+ var glucoseStatus: GlucoseStatus? = null
+ private set
+
+ var targetBGLow = 0.0
+ private set
+
+ var targetBGHigh = 0.0
+ private set
+
+ var bgDiff = 0.0
+ private set
+
+ var insulinFromBG = 0.0
+ private set
+
+ var insulinFromCarbs = 0.0
+ private set
+
+ var insulinFromBolusIOB = 0.0
+ private set
+
+ var insulinFromBasalsIOB = 0.0
+ private set
+
+ var insulinFromCorrection = 0.0
+ private set
+
+ var insulinFromSuperBolus = 0.0
+ private set
+
+ var insulinFromCOB = 0.0
+ private set
+
+ var insulinFromTrend = 0.0
+ private set
+
+ var trend = 0.0
+ private set
+
+ var accepted = false
+ private set
+
+ // Result
+ var calculatedTotalInsulin: Double = 0.0
+ private set
+
+ var totalBeforePercentageAdjustment: Double = 0.0
+ private set
+
+ var carbsEquivalent: Double = 0.0
+ private set
+
+ var insulinAfterConstraints: Double = 0.0
+ private set
+
+ init {
+ doCalc()
+ }
+
+ private fun doCalc() {
+
+ // Insulin from BG
+ sens = profile.isf
+ targetBGLow = profile.targetLow
+ targetBGHigh = profile.targetHigh
+ if (useTT && tempTarget != null) {
+ targetBGLow = Profile.fromMgdlToUnits(tempTarget.low, profile.units)
+ targetBGHigh = Profile.fromMgdlToUnits(tempTarget.high, profile.units)
+ }
+ if (useBg && bg > 0) {
+ if (bg >= targetBGLow && bg <= targetBGHigh) {
+ bgDiff = 0.0
+ } else if (bg <= targetBGLow) {
+ bgDiff = bg - targetBGLow
+ } else {
+ bgDiff = bg - targetBGHigh
+ }
+ insulinFromBG = bgDiff / sens
+ }
+
+ // Insulin from 15 min trend
+ glucoseStatus = GlucoseStatus.getGlucoseStatusData()
+ glucoseStatus?.let {
+ if (useTrend) {
+ trend = it.short_avgdelta
+ insulinFromTrend = Profile.fromMgdlToUnits(trend, profile.units) * 3 / sens
+ }
+ }
+
+
+ // Insuling from carbs
+ ic = profile.ic
+ insulinFromCarbs = carbs / ic
+ insulinFromCOB = if (useCob) (cob / ic) else 0.0
+
+ // Insulin from IOB
+ // IOB calculation
+ val treatments = TreatmentsPlugin.getPlugin()
+ treatments.updateTotalIOBTreatments()
+ val bolusIob = treatments.lastCalculationTreatments.round()
+ treatments.updateTotalIOBTempBasals()
+ val basalIob = treatments.lastCalculationTempBasals.round()
+
+ insulinFromBolusIOB = if (includeBolusIOB) -bolusIob.iob else 0.0
+ insulinFromBasalsIOB = if (includeBasalIOB) -basalIob.basaliob else 0.0
+
+ // Insulin from correction
+ insulinFromCorrection = correction
+
+ // Insulin from superbolus for 2h. Get basal rate now and after 1h
+ if (useSuperBolus) {
+ insulinFromSuperBolus = profile.basal
+ var timeAfter1h = System.currentTimeMillis()
+ timeAfter1h += T.hours(1).msecs()
+ insulinFromSuperBolus += profile.getBasal(timeAfter1h)
+ }
+
+ // Total
+ calculatedTotalInsulin = insulinFromBG + insulinFromTrend + insulinFromCarbs + insulinFromBolusIOB + insulinFromBasalsIOB + insulinFromCorrection + insulinFromSuperBolus + insulinFromCOB
+
+ // Percentage adjustment
+ totalBeforePercentageAdjustment = calculatedTotalInsulin
+ if (calculatedTotalInsulin > 0) {
+ calculatedTotalInsulin = calculatedTotalInsulin * percentageCorrection / 100.0
+ }
+
+ if (calculatedTotalInsulin < 0) {
+ carbsEquivalent = (-calculatedTotalInsulin) * ic
+ calculatedTotalInsulin = 0.0
+ }
+
+ val bolusStep = ConfigBuilderPlugin.getPlugin().activePump?.pumpDescription!!.bolusStep
+ calculatedTotalInsulin = Round.roundTo(calculatedTotalInsulin, bolusStep)
+
+ insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(Constraint(calculatedTotalInsulin)).value()
+
+ log.debug(this.toString())
+ }
+
+ fun nsJSON(): JSONObject {
+ val boluscalcJSON = JSONObject()
+ try {
+ boluscalcJSON.put("profile", profileName)
+ boluscalcJSON.put("notes", notes)
+ boluscalcJSON.put("eventTime", DateUtil.toISOString(Date()))
+ boluscalcJSON.put("targetBGLow", targetBGLow)
+ boluscalcJSON.put("targetBGHigh", targetBGHigh)
+ boluscalcJSON.put("isf", sens)
+ boluscalcJSON.put("ic", ic)
+ boluscalcJSON.put("iob", -(insulinFromBolusIOB + insulinFromBasalsIOB))
+ boluscalcJSON.put("bolusiob", insulinFromBolusIOB)
+ boluscalcJSON.put("basaliob", insulinFromBasalsIOB)
+ boluscalcJSON.put("bolusiobused", includeBolusIOB)
+ boluscalcJSON.put("basaliobused", includeBasalIOB)
+ boluscalcJSON.put("bg", bg)
+ boluscalcJSON.put("insulinbg", insulinFromBG)
+ boluscalcJSON.put("insulinbgused", useBg)
+ boluscalcJSON.put("bgdiff", bgDiff)
+ boluscalcJSON.put("insulincarbs", insulinFromCarbs)
+ boluscalcJSON.put("carbs", carbs)
+ boluscalcJSON.put("cob", cob)
+ boluscalcJSON.put("cobused", useCob)
+ boluscalcJSON.put("insulincob", insulinFromCOB)
+ boluscalcJSON.put("othercorrection", correction)
+ boluscalcJSON.put("insulinsuperbolus", insulinFromSuperBolus)
+ boluscalcJSON.put("insulintrend", insulinFromTrend)
+ boluscalcJSON.put("insulin", calculatedTotalInsulin)
+ boluscalcJSON.put("superbolusused", useSuperBolus)
+ boluscalcJSON.put("insulinsuperbolus", insulinFromSuperBolus)
+ boluscalcJSON.put("trendused", useTrend)
+ boluscalcJSON.put("insulintrend", insulinFromTrend)
+ boluscalcJSON.put("trend", trend)
+ boluscalcJSON.put("ttused", useTT)
+ } catch (e: JSONException) {
+ log.error("Unhandled exception", e)
+ }
+ return boluscalcJSON
+ }
+
+ private fun confirmMessageAfterConstraints(pump: PumpInterface): String {
+
+ var confirmMessage = MainApp.gs(R.string.entertreatmentquestion)
+ if (insulinAfterConstraints > 0)
+ confirmMessage += "
" + MainApp.gs(R.string.bolus) + ": " + "" + DecimalFormatter.toPumpSupportedBolus(insulinAfterConstraints) + "U" + ""
+ if (carbs > 0)
+ confirmMessage += "
" + MainApp.gs(R.string.carbs) + ": " + "" + carbs + "g" + ""
+
+ if (Math.abs(insulinAfterConstraints - calculatedTotalInsulin) > pump.getPumpDescription().pumpType.determineCorrectBolusStepSize(insulinAfterConstraints)) {
+ confirmMessage += "
" + MainApp.gs(R.string.bolusconstraintapplied) + ""
+ }
+
+ return confirmMessage
+ }
+
+ fun confirmAndExecute(context: Context) {
+ val profile = ProfileFunctions.getInstance().profile
+ val pump = ConfigBuilderPlugin.getPlugin().activePump
+
+ if (pump != null && profile != null && (calculatedTotalInsulin > 0.0 || carbs > 0.0)) {
+ val confirmMessage = confirmMessageAfterConstraints(pump)
+
+ val builder = AlertDialog.Builder(context)
+ builder.setTitle(MainApp.gs(R.string.confirmation))
+ builder.setMessage(Html.fromHtml(confirmMessage))
+ builder.setPositiveButton(MainApp.gs(R.string.ok)) { _, _ ->
+ synchronized(builder) {
+ if (accepted) {
+ log.debug("guarding: already accepted")
+ return@setPositiveButton
+ }
+ accepted = true
+ if (insulinAfterConstraints > 0 || carbs > 0) {
+ if (useSuperBolus) {
+ val loopPlugin = LoopPlugin.getPlugin()
+ if (loopPlugin.isEnabled(PluginType.LOOP)) {
+ loopPlugin.superBolusTo(System.currentTimeMillis() + 2 * 60L * 60 * 1000)
+ MainApp.bus().post(EventRefreshOverview("WizardDialog"))
+ }
+
+ val pump1 = ConfigBuilderPlugin.getPlugin().activePump
+
+ if (pump1?.pumpDescription?.tempBasalStyle == PumpDescription.ABSOLUTE) {
+ ConfigBuilderPlugin.getPlugin().commandQueue.tempBasalAbsolute(0.0, 120, true, profile, object : Callback() {
+ override fun run() {
+ if (!result.success) {
+ val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java)
+ i.putExtra("soundid", R.raw.boluserror)
+ i.putExtra("status", result.comment)
+ i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror))
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ MainApp.instance().startActivity(i)
+ }
+ }
+ })
+ } else {
+
+ ConfigBuilderPlugin.getPlugin().commandQueue.tempBasalPercent(0, 120, true, profile, object : Callback() {
+ override fun run() {
+ if (!result.success) {
+ val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java)
+ i.putExtra("soundid", R.raw.boluserror)
+ i.putExtra("status", result.comment)
+ i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror))
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ MainApp.instance().startActivity(i)
+ }
+ }
+ })
+ }
+ }
+ val detailedBolusInfo = DetailedBolusInfo()
+ detailedBolusInfo.eventType = CareportalEvent.BOLUSWIZARD
+ detailedBolusInfo.insulin = insulinAfterConstraints
+ detailedBolusInfo.carbs = carbs.toDouble()
+ detailedBolusInfo.context = context
+ detailedBolusInfo.glucose = bg
+ detailedBolusInfo.glucoseType = "Manual"
+ detailedBolusInfo.carbTime = carbTime
+ detailedBolusInfo.boluscalc = nsJSON()
+ detailedBolusInfo.source = Source.USER
+ detailedBolusInfo.notes = notes
+ if (detailedBolusInfo.insulin > 0 || ConfigBuilderPlugin.getPlugin().activePump?.pumpDescription!!.storesCarbInfo) {
+ ConfigBuilderPlugin.getPlugin().commandQueue.bolus(detailedBolusInfo, object : Callback() {
+ override fun run() {
+ if (!result.success) {
+ val i = Intent(MainApp.instance(), ErrorHelperActivity::class.java)
+ i.putExtra("soundid", R.raw.boluserror)
+ i.putExtra("status", result.comment)
+ i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror))
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ MainApp.instance().startActivity(i)
+ }
+ }
+ })
+ } else {
+ TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo, false)
+ }
+ }
+ }
+ }
+ builder.setNegativeButton(MainApp.gs(R.string.cancel), null)
+ builder.show()
+ }
+ }
+}
diff --git a/app/src/main/java/info/nightscout/androidaps/utils/StringUtils.java b/app/src/main/java/info/nightscout/androidaps/utils/StringUtils.java
index 37a3b7b7bf..74e8da7c9d 100644
--- a/app/src/main/java/info/nightscout/androidaps/utils/StringUtils.java
+++ b/app/src/main/java/info/nightscout/androidaps/utils/StringUtils.java
@@ -1,5 +1,8 @@
package info.nightscout.androidaps.utils;
+import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.R;
+
/**
* class contains useful String functions
*/
@@ -22,4 +25,7 @@ public class StringUtils {
return str == null || str.length() == 0;
}
+ public static String formatInsulin(double insulin) {
+ return String.format(MainApp.gs(R.string.formatinsulinunits), insulin);
+ }
}
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
index a0a0048ca1..f2b6a1bc8a 100644
--- a/app/src/main/res/values-af/strings.xml
+++ b/app/src/main/res/values-af/strings.xml
@@ -147,6 +147,8 @@
Beperkings skending
Bolus aflewering fout
Tempbasal aflewering fout
+ Basale waarde [%%]
+ %% (100%% = huidig)
Aanvaar nuwe tydelike basale:
Behandeling
Rekenaar
@@ -246,6 +248,7 @@
Pomp IAB
Daaglikse eenhede
Laaste bolus
+ %1$.1fh terug
Ongeldige invoer
Waarde nie behoorlik gestel
Herlaai profiel
@@ -525,6 +528,7 @@
Insulien weerstandige volwasse
Kies asseblief pasiënt ouderdom om veiligheids limiete te stel
Glimp
+ %1$s benodig battery optimisering bemagtiging vir beter werksverrigting
Lus opgeskort
Opgeskort (%1$d m)
Superbolus (%1$d m)
@@ -560,6 +564,8 @@
Wys status vlae vir cage, iage, sage, stoor en battery vlak op tuisskerm.
Drempel waarskuwings stoor vlak [U]
Drempel kritieke stoor vlak [U]
+ Drempel waarskuwing battery vlak [%%]
+ Drempel kritieke battery vlak [%%]
IAB
KOB
Firmware
@@ -758,6 +764,7 @@
Loop tans
Kanselleer TBR
Stel TBR (%1$d%% / %2$d min)
+ Bolusing (%1$.1f U)
Verfris
Versoekte bewerking nie ondersteun deur pomp
Onveilige gebruik: uitgebreide of multigolf boluses is aktief. Lus modus is gestel om laag te opskort net 6 ure. Net gewone boluses is ondersteun in lus modus
@@ -1149,6 +1156,12 @@
Verkeerde kode. Opdrag gekanselleer.
Nie gekonfigureer nie
Profiel skakelaar geskep
+ Weergawe Navolger
+ ou weergawe
+ baie ou weergawe
+ Nuwe weergawe reeds beskikbaar vir %1$d! Sal na 60 dae terugval na LGS, lus sal ongeldig gemaak word na 90 dae
+ 2h
+ %1$.2fU
- %1$d dae
- %1$d dae
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index 8453a50ffe..0c3b51a97c 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -1160,6 +1160,8 @@
стара версия
много стара версия
Има нова версия от най-малко %1$d дни! Връщане към LGS след 60 дни, цикълът ще бъде изключен след 90 дни
+ 2ч
+ %1$.2fЕ
- %1$d дeн
- %1$d дни
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index e21f869a5b..589dafb8ef 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -329,8 +329,8 @@
Loope eine Woche erfolgreich am Tag mit regelmäßiger Kohlenhydrat-Eingabe.
Aktiviere zusätzliche Funktionen wie z. B. den Mahlzeitenassistenten
Aktiviere zusätzliche Funktionen wie z. B. SMB
- "Lies das Wiki und hebe maxIOB an, damit SMB funktioniert. Ein guter Startwert ist
-maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate"
+ Lies das Wiki und hebe maxIOB an, damit SMB funktioniert. Ein guter Startwert ist
+maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate
Limit erreicht
Kein Profil ausgewählt
Loop wurde deaktiviert.
@@ -1066,8 +1066,8 @@ maxIOB = durchschnittlicher Essensbolus + 3 x maximale Basalrate"
Gesamt
Berech.
Handshaking
- "Sende die heutigen Logdateien unter Angabe dieser Uhrzeit an die Entwickler.
-Unerwartetes Verhalten."
+ Sende die heutigen Logdateien unter Angabe dieser Uhrzeit an die Entwickler.
+Unerwartetes Verhalten.
Max. Bolus überschritten
Fehler bei Befehl
Geschwindigkeits-Fehler
@@ -1162,6 +1162,8 @@ Unerwartetes Verhalten."
Vorherige Version
sehr alte Version
Neue Version für mindestens %1$d Tage verfügbar! Rückfall zur sensorunterstützten Pumpentherapie nach 60 Tagen, Loop wird nach 90 Tagen deaktiviert
+ 2h
+ %1$.2f IE
- %1$d Tag
- %1$d Tage
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 8f9fb110db..8dd502b75c 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -239,8 +239,8 @@
Déconnectée
Paramètres pompe DanaR
Contrat de Licence pour Utilisateur Final
- "NE DOIT PAS ÊTRE UTILISÉ POUR PRENDRE DES DÉCISIONS MÉDICALES. IL N'Y A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LA LIMITE PERMISE PAR LA LOI APPLICABLE. SAUF S'IL EST INDIQUÉ LE CONTRAIRE PAR ÉCRIT. LES TITULAIRES DU DROIT D'AUTEUR ET / OU D'AUTRES PARTIES FOURNISSENT LE PROGRAMME «EN L'ÉTAT» SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE, Y COMPRIS MAIS NON SEULEMENT AUX GARANTIES IMPLICITES DE QUALITÉ MARCHANDE ET D'ADÉQUATION À UN USAGE PARTICULIER
-L'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME SONT DE VOTRE RESPONSABILITÉ. SI LE PROGRAMME EST DÉFECTUEUX, VOUS ASSUMEZ LE COÛT DE TOUS LES SERVICES, RÉPARATIONS OU CORRECTIONS NÉCESSAIRES."
+ NE DOIT PAS ÊTRE UTILISÉ POUR PRENDRE DES DÉCISIONS MÉDICALES. IL N\'Y A AUCUNE GARANTIE POUR LE PROGRAMME, DANS LA LIMITE PERMISE PAR LA LOI APPLICABLE. SAUF S\'IL EST INDIQUÉ LE CONTRAIRE PAR ÉCRIT. LES TITULAIRES DU DROIT D\'AUTEUR ET / OU D\'AUTRES PARTIES FOURNISSENT LE PROGRAMME «EN L\'ÉTAT» SANS GARANTIE D\'AUCUNE SORTE, EXPLICITE OU IMPLICITE, Y COMPRIS MAIS NON SEULEMENT AUX GARANTIES IMPLICITES DE QUALITÉ MARCHANDE ET D\'ADÉQUATION À UN USAGE PARTICULIER
+L\'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME SONT DE VOTRE RESPONSABILITÉ. SI LE PROGRAMME EST DÉFECTUEUX, VOUS ASSUMEZ LE COÛT DE TOUS LES SERVICES, RÉPARATIONS OU CORRECTIONS NÉCESSAIRES.
JE COMPRENDS ET J\'ACCEPTE LES CONDITIONS DU CONTRAT
Sauvegarder
L\'adaptateur bluetooth est introuvable
@@ -1161,6 +1161,8 @@ L'ENSEMBLE DES RISQUES LIÉS À LA QUALITÉ ET À LA PERFORMANCE DU PROGRAMME SO
ancienne version
très ancienne version
Une nouvelle version est disponible depuis au moins %1$d jours ! Retour au traitement par pompe assistée par capteur (Arrêt par Glycémie Basse (AGB), Low Glucose Suspend (LGS) ) après 60 jours et la Boucle sera désactivée après 90 jours
+ 2 h
+ %1$.2fU
- %1$d jour
- %1$d jours
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index fa54a4f375..9b6d9033eb 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -2,8 +2,8 @@
רענן טיפול מ-Nightscout
- "בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת
-אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)!"
+ בבקשה אתחל את הסמרטפון שלך או תרענן את אפלקצית AndroidAPS בהגדרות המערכת
+אחרת AndroidAPS לא יוכל לבצע רישום (חשוב לעקוב אחר ולוודא כי האלגוריתמים פועלים כראוי)!
מציג את ההגדרות הקבועות מראש עבור מזון המוגדר ב-Nightscout
להפעיל או לכבות את הלולאה.
מסנכרן את הנתונים שלך עם Nightscout
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 907b2e7c08..2d164b3247 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -318,8 +318,8 @@
Opzetten van visualisatie en monitoring en analyzeren van basaal en ratio\'s
Controleren van beschikbaarheid BG en insuline pomp data op Nightscout
Starten met de Open Loop modus
- "In Open Loop modus werken voor enkele dagen en handmatig meermaals tijdelijke basaal instellen.
-Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sporten of koolhydraten inname bij hypo)"
+ In Open Loop modus werken voor enkele dagen en handmatig meermaals tijdelijke basaal instellen.
+Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sporten of koolhydraten inname bij hypo)
De Open Loop begrijpen, inclusief de voorgestelde tijdelijke basaalstanden
Gebaseerd op deze ervaringen beslissen wat het maximale basaal mag zijn en dit in de pomp instellen
Starten met closed Loop met bescherming tegen lage BG
@@ -1161,6 +1161,7 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport
oude versie
zeer oude versie
Er is als sinds ten minste %1$d dagen een nieuwe versie beschikbaar! Na 60 dagen wordt de loop beperkt tot LGS, na 90 dagen zal de loop worden uitgeschakeld
+ 2u
- %1$d dag
- %1$d dag
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index f032934ccf..b06da87522 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -580,8 +580,8 @@
Pokaż BGI
Dodaj BGI do Linii Statusu
Brak przesyłania do NS
- "Wszystkie dane wysyłane do NS są odrzucane. AAPS jest podłączony do NS, ale nie dokonuje
- żadnych zmian w NS"
+ Wszystkie dane wysyłane do NS są odrzucane. AAPS jest podłączony do NS, ale nie dokonuje
+ żadnych zmian w NS
Krok bazy
Krok bolusa
BolusPrzedłużony
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 4ae1ab91b3..4da6630cef 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -1,28 +1,28 @@
- Segurança do Tratamento
- Máximo bolus permitido [U]
- Máximo de carbs permitidos [g]
+ Segurança de tratamentos
+ Max bolus permitido [U]
+ Max hidratos permitidos [g]
Preferências
- Atualizar tratamentos de NS
- Redefinir banco de dados
- Você realmente quer redefinir os bancos de dados?
+ Atualizar tratamentos do NS
+ Reinicializar base de dados
+ Quer realmente reiniciar a base de dados?
Sair
Usar bólus prolongado de >200%%
Dispositivo Bluetooth DanaR
- Sempre usar valores absolutos basais
- Por favor, reinicie seu telefone ou reinicie o AndroidAPS nas Configurações do Sistema \nCaso contrário o Android APS não terá registro (importante para rastrear e verificar que os algoritmos estão funcionando corretamente)!
- Alguns botões para acessar rapidamente a funções comuns
- Digite as entradas avançadas do livro de log.
+ Usar sempre valores absolutos de basal
+ Por favor, reinicie o seu telefone ou reinicie o AndroidAPS a partir das Configurações do Sistema \ncaso contrário, o AndroidAPS não terá registro (importante para controlar e verificar se os algoritmos estão a funcionar corretamente)!
+ Alguns botões para aceder rapidamente a funções comuns
+ Inserir as entradas avançadas do livro de registo.
Usado para configurar os plugins ativos
Programa de aprendizagem
Exibe as predefinições de comida definidas no Nightscout
- Predefinição de Insulina para Humalog e NovoRapid / NovoLog
- Pré-ajuste de Insulina para Fiasp
- Permite que você defina o pico da atividade de insulina, deve ser usado apenas por usuários avançados
+ Predefinição de Insulina Humalog e NovoRapid / NovoLog
+ Predefinição de Insulina Fiasp
+ Permite definir o pico de atividade da insulina e deve ser usado somente por usuários avançados
Ativar ou desativar a aplicação que desencadeia o loop.
- Sincroniza seus dados com o Nightscout
+ Sincroniza os seus dados com o Nightscout
Estado do algoritmo em 2016
Estado do algoritmo em 2017
Algoritmo mais recente para usuários avançados
@@ -1160,6 +1160,8 @@
versão antiga
versão muito antiga
Nova versão para pelo menos %1$d dias disponíveis! Voltar para o LGS após 60 dias, o loop será desativado após 90 dias
+ 2h
+ %1$.2fU
- %1$d dia
- %1$d dias
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 4d127557cf..af83011fb8 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -991,9 +991,9 @@
Настроить плагин APS
Настроить плагин чувствительности Sensitivity
Плагин чувствительности Sensitivity применяется для определения чувствительности к инсулину и вычисления активных углеводов COB. Дополнительная информация:
- "https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
+ https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB
-Context | Edit Context"
+Context | Edit Context
NSClient обрабатывает подключения к Nightscout. Вы можете пропустить этот этап сейчас, но вы не преодолеете все Цели пока не настроите его.
Напоминание: новые профили инсулина требуют как минимум 5 часов длительности действия DIA. 5-6 часовая DIA эквивалентна трехчасовой на старых профилях.
Настройте источник СК
@@ -1162,4 +1162,6 @@ Context | Edit Context"
старая версия
очень старая версия
Новая версия доступна не менее %1$d дней! После 60 дней переход на остановку при низкой гликемии LGS, замкнутый цикл будет отключен через 90 дней
+ 2ч
+ %1$.2f ед
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 080955de03..409b7f21a6 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -45,8 +45,8 @@
Känsligheten beräknas som ett viktat medelvärde av avvikelserna. Senare avvikelser får en högre vikt. Minimal upptagning av kolhydrater beräknas utifrån maximal upptagstid för kolhydrater som angetts i inställningarna. Den här algoritmen är den snabbaste att justera förändringar i känsligheten.
Ta emot BG-data från den modifierade Dexcom G5-appen
Ta emot BG-data från den modifierade Dexcom G6-appen.
- "Ta emot BG-data från den modifierade
-Eversense-appen."
+ Ta emot BG-data från den modifierade
+Eversense-appen.
Ta emot BG-data från Glimp
Ta emot BG-data från 600SeriesAndroidUploader
Ladda ner BG-data från Nightscout
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index c446e64172..d858630fff 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -441,8 +441,8 @@
Autosens hedefleri de ayarlar
Varsayılan değer: true\nBu autosens in İnsülin Duyarlılık Faktörü ve bazallara ek olarak KŞ hedeflerinin ayarlanmasında kullanılır.
Varsayılan değer: 2\nEğer sadece öğününüzü yerseniz, öğün bolusu alındıktan sonra bolus ertelemesi devreye girer, bu şekilde Döngü karşı bir tetbir olarak geçici bazal oranını azaltmasın diye. Buaradaki örnekte olduğu gibi varsayılan 2; 3 saat DIA olacak şekilde bolus ertelemesi kademeli olarak 1,5 saat üzeri (3DIA/2=1,5).
- "Varsayılan değer: 3.0 (AMA) Gelişmiş Yemek Asistanı veya 8.0 (SMB) Super Micro Bolus. Bu 5 dakika başına varsayılan karbonhidrat emilimi için bir ayardır. Standart değer AMA için 3mg/dl/5dk aynı şekilde SMB 8mg/dl/5dk dir.
-Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ'nin beklenenden daha fazla düştüğü veya beklenildiği kadar yükselmediği zamanlarda gelecekte yapılacak tahminlerde KŞ'nin hesaplanmasında ne kadar karbonhidrat emilimi gerçekleşeceğini öngörür."
+ Varsayılan değer: 3.0 (AMA) Gelişmiş Yemek Asistanı veya 8.0 (SMB) Super Micro Bolus. Bu 5 dakika başına varsayılan karbonhidrat emilimi için bir ayardır. Standart değer AMA için 3mg/dl/5dk aynı şekilde SMB 8mg/dl/5dk dir.
+Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ\'nin beklenenden daha fazla düştüğü veya beklenildiği kadar yükselmediği zamanlarda gelecekte yapılacak tahminlerde KŞ\'nin hesaplanmasında ne kadar karbonhidrat emilimi gerçekleşeceğini öngörür.
Dikkat!\nNormalde aşağıdaki bu değerleri değiştirmek zorunda değilsiniz. Lütfen burayı TIKLAYIN ve metni OKUYUN ve bu değerlerden herhangi birini değiştirmeden önce ANLADIĞINIZDAN emin olun.
Yalnızca sayısal rakam girebilirsiniz.
%1$s - %2$s aralığında yalnızca sayısal rakamlar kullanılabilir.
@@ -701,8 +701,7 @@ Aktif Karbonhidratın ne kadar hızlı sindirildiğine ve KŞ'nin beklenenden da
Hayır
Sadece pozitif
Sadece negatif
- "COB (Aktif Karbonhidrat) hesaplaması
-"
+ COB (Aktif Karbonhidrat) hesaplaması
Geçici hedef hesaplaması
Döngü etkin
Seçili APS
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index fe8b7ba397..cd6651e144 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1345,6 +1345,17 @@
TDP
Uploads data to Tidepool
tidepool_last_end
+ Upload CGM data
+ tidepool_upload_cgm
+ tidepool_upload_bolus
+ Upload treatments (insulin, carbs)
+ tidepool_upload_tbr
+ Upload temporary basals
+ tidepool_upload_profile
+ Upload profile switches, temp targets
+ tidepool_upload_bg
+ Upload BG tests
+ instanceid
smbmaxminutes
Dayligh Saving time
@@ -1364,17 +1375,8 @@
old version
very old version
New version for at least %1$d days available! Fallback to LGS after 60 days, loop will be disabled after 90 days
- Upload CGM data
- tidepool_upload_cgm
- tidepool_upload_bolus
- Upload treatments (insulin, carbs)
- tidepool_upload_tbr
- Upload temporary basals
- tidepool_upload_profile
- Upload profile switches, temp targets
- tidepool_upload_bg
- Upload BG tests
- instanceid
+ 2h
+ %1$.2fU
Dexcom App (patched)
DXCM
diff --git a/app/src/test/java/info/AAPSMocker.java b/app/src/test/java/info/AAPSMocker.java
index 79e0f89996..b757840b2e 100644
--- a/app/src/test/java/info/AAPSMocker.java
+++ b/app/src/test/java/info/AAPSMocker.java
@@ -10,7 +10,6 @@ import com.squareup.otto.Bus;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Assert;
-import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import java.util.Locale;
@@ -27,14 +26,12 @@ import info.nightscout.androidaps.logging.L;
import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions;
import info.nightscout.androidaps.plugins.general.nsclient.NSUpload;
-import info.nightscout.androidaps.plugins.iob.iobCobCalculator.CobInfo;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.IobCobCalculatorPlugin;
import info.nightscout.androidaps.plugins.pump.danaR.DanaRPlugin;
import info.nightscout.androidaps.plugins.pump.danaRKorean.DanaRKoreanPlugin;
import info.nightscout.androidaps.plugins.pump.danaRv2.DanaRv2Plugin;
import info.nightscout.androidaps.plugins.treatments.TreatmentService;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
-import info.nightscout.androidaps.queue.Callback;
import info.nightscout.androidaps.queue.CommandQueue;
import info.nightscout.androidaps.utils.SP;
@@ -42,7 +39,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -59,6 +55,7 @@ public class AAPSMocker {
public static Intent intentSent = null;
public static CommandQueue queue;
+ public static ConstraintChecker constraintChecker;
public static void mockStrings() {
Locale.setDefault(new Locale("en", "US"));
@@ -168,7 +165,7 @@ public class AAPSMocker {
}
public static ConstraintChecker mockConstraintsChecker() {
- ConstraintChecker constraintChecker = mock(ConstraintChecker.class);
+ constraintChecker = mock(ConstraintChecker.class);
when(MainApp.getConstraintChecker()).thenReturn(constraintChecker);
return constraintChecker;
}
diff --git a/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java b/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java
index 2143a7101c..e56970182b 100644
--- a/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java
+++ b/app/src/test/java/info/nightscout/androidaps/utils/BolusWizardTest.java
@@ -3,12 +3,15 @@ package info.nightscout.androidaps.utils;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import info.AAPSMocker;
import info.nightscout.androidaps.MainApp;
+import info.nightscout.androidaps.data.ConstraintChecker;
+import info.nightscout.androidaps.interfaces.Constraint;
import info.nightscout.androidaps.plugins.iob.iobCobCalculator.GlucoseStatus;
import info.nightscout.androidaps.data.IobTotal;
import info.nightscout.androidaps.data.Profile;
@@ -17,6 +20,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConfigBuilderPlugin;
import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin;
import info.nightscout.androidaps.plugins.pump.mdi.MDIPlugin;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -24,38 +28,41 @@ import static org.mockito.Mockito.when;
* Created by kuchjir on 12/12/2017.
*/
@RunWith(PowerMockRunner.class)
-@PrepareForTest({MainApp.class, GlucoseStatus.class, ConfigBuilderPlugin.class, TreatmentsPlugin.class})
+@PrepareForTest({MainApp.class, GlucoseStatus.class, ConfigBuilderPlugin.class, TreatmentsPlugin.class, ConstraintChecker.class})
public class BolusWizardTest {
private static final double PUMP_BOLUS_STEP = 0.1;
@Test
/** Should calculate the same bolus when different blood glucose but both in target range */
- public void shuldCalculateTheSameBolusWhenBGsInRange() throws Exception {
- BolusWizard bw = new BolusWizard();
+ public void shouldCalculateTheSameBolusWhenBGsInRange() throws Exception {
Profile profile = setupProfile(4d, 8d, 20d, 12d);
- Double bolusForBg42 = bw.doCalc(profile, null, 20, 0.0, 4.2, 0d, 100d, true, true, false, false);
- Double bolusForBg54 = bw.doCalc(profile, null, 20, 0.0, 5.4, 0d, 100d, true, true, false, false);
+ BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 4.2, 0d, 100d, true, true, true, true, false, false, false);
+ Double bolusForBg42 = bw.getCalculatedTotalInsulin();
+ bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
+ Double bolusForBg54 = bw.getCalculatedTotalInsulin();
Assert.assertEquals(bolusForBg42, bolusForBg54);
}
@Test
- public void shuldCalculateHigherBolusWhenHighBG() throws Exception {
- BolusWizard bw = new BolusWizard();
+ public void shouldCalculateHigherBolusWhenHighBG() throws Exception {
Profile profile = setupProfile(4d, 8d, 20d, 12d);
- Double bolusForHighBg = bw.doCalc(profile, null, 20, 0d, 9.8, 0d, 100d, true, true, false, false);
- Double bolusForBgInRange = bw.doCalc(profile, null, 20, 0.0, 5.4, 0d, 100d, true, true, false, false);
+ BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 9.8, 0d, 100d, true, true, true, true, false, false, false);
+ Double bolusForHighBg = bw.getCalculatedTotalInsulin();
+ bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
+ Double bolusForBgInRange = bw.getCalculatedTotalInsulin();
Assert.assertTrue(bolusForHighBg > bolusForBgInRange);
}
@Test
- public void shuldCalculateLowerBolusWhenLowBG() throws Exception {
- BolusWizard bw = new BolusWizard();
+ public void shouldCalculateLowerBolusWhenLowBG() throws Exception {
Profile profile = setupProfile(4d, 8d, 20d, 12d);
- Double bolusForLowBg = bw.doCalc(profile, null, 20, 0d, 3.6, 0d, 100d, true, true, false, false);
- Double bolusForBgInRange = bw.doCalc(profile, null, 20, 0.0, 5.4, 0d, 100d, true, true, false, false);
+ BolusWizard bw = new BolusWizard(profile, "", null, 20, 0.0, 3.6, 0d, 100d, true, true, true, true, false, false, false);
+ Double bolusForLowBg = bw.getCalculatedTotalInsulin();
+ bw = new BolusWizard(profile, "", null, 20, 0.0, 5.4, 0d, 100d, true, true, true, true, false, false, false);
+ Double bolusForBgInRange = bw.getCalculatedTotalInsulin();
Assert.assertTrue(bolusForLowBg < bolusForBgInRange);
}
@@ -82,6 +89,12 @@ public class BolusWizardTest {
pump.getPumpDescription().bolusStep = PUMP_BOLUS_STEP;
when(ConfigBuilderPlugin.getPlugin().getActivePump()).thenReturn(pump);
+ AAPSMocker.mockConstraintsChecker();
+ Mockito.doAnswer(invocation -> {
+ Constraint constraint = invocation.getArgument(0);
+ return constraint;
+ }).when(AAPSMocker.constraintChecker).applyBolusConstraints(any(Constraint.class));
+
return profile;
}
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 398f280881..571b6b73d3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.3.31'
+ ext.kotlin_version = '1.3.41'
ext.butterknifeVersion = '10.1.0'
repositories {
google()
@@ -10,9 +10,9 @@ buildscript {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.4.1'
- classpath 'com.google.gms:google-services:4.2.0'
- classpath 'io.fabric.tools:gradle:1.29.0'
+ classpath 'com.android.tools.build:gradle:3.4.2'
+ classpath 'com.google.gms:google-services:4.3.0'
+ classpath 'io.fabric.tools:gradle:1.30.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files