diff --git a/app/build.gradle b/app/build.gradle index 94e1318389..79a53ae727 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { targetSdkVersion 25 multiDexEnabled true versionCode 1500 - version "1.60d-dev" + version "1.60e-dev" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", generateGitBuild() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -209,7 +209,7 @@ dependencies { implementation("com.google.android:flexbox:0.3.0") { exclude group: "com.android.support" } - implementation("io.socket:socket.io-client:0.8.3") { + implementation("io.socket:socket.io-client:1.0.0") { // excluding org.json which is provided by Android exclude group: "org.json", module: "json" } diff --git a/app/libs/sightparser-release.aar b/app/libs/sightparser-release.aar index 4e474e608e..302b9e836d 100644 Binary files a/app/libs/sightparser-release.aar and b/app/libs/sightparser-release.aar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1b372a0cf9..b6fa5f8796 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,9 +15,11 @@ - + + + @@ -114,6 +116,14 @@ + + + + + + + + highLine) @@ -220,8 +221,7 @@ public class BgReading implements DataPointWithLabelInterface { return color; } - @Override - public int getSecondColor() { + public int getPredectionColor() { if (isIOBPrediction) return MainApp.sResources.getColor(R.color.iob); if (isCOBPrediction) diff --git a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java index b0f69144c5..755005cdae 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java +++ b/app/src/main/java/info/nightscout/androidaps/db/CareportalEvent.java @@ -95,7 +95,7 @@ public class CareportalEvent implements DataPointWithLabelInterface { if (OverviewFragment.shorttextmode) return diff.get(TimeUnit.DAYS) +"d" + diff.get(TimeUnit.HOURS) + "h"; else - return diff.get(TimeUnit.DAYS) + " " + MainApp.sResources.getString(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.sResources.getString(R.string.hours); + return diff.get(TimeUnit.DAYS) + " " + MainApp.gs(R.string.days) + " " + diff.get(TimeUnit.HOURS) + " " + MainApp.gs(R.string.hours); } public boolean isOlderThan(double hours) { @@ -263,9 +263,4 @@ public class CareportalEvent implements DataPointWithLabelInterface { return Color.GRAY; } - @Override - public int getSecondColor() { - return 0; - } - } diff --git a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java index 418de86c6c..1123cb58df 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ExtendedBolus.java @@ -297,8 +297,4 @@ public class ExtendedBolus implements Interval, DataPointWithLabelInterface { return Color.CYAN; } - @Override - public int getSecondColor() { - return 0; - } } diff --git a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java index 9dca91c595..40c8e50c6d 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java +++ b/app/src/main/java/info/nightscout/androidaps/db/ProfileSwitch.java @@ -263,11 +263,6 @@ public class ProfileSwitch implements Interval, DataPointWithLabelInterface { return Color.CYAN; } - @Override - public int getSecondColor() { - return 0; - } - public String toString() { return "ProfileSwitch{" + "date=" + date + diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java b/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java new file mode 100644 index 0000000000..bcd9061133 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/events/EventChargingState.java @@ -0,0 +1,13 @@ +package info.nightscout.androidaps.events; + +public class EventChargingState { + + public boolean isCharging = false; + + public EventChargingState() {} + + public EventChargingState(boolean isCharging) { + this.isCharging = isCharging; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java b/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java new file mode 100644 index 0000000000..03df71f31b --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/events/EventNetworkChange.java @@ -0,0 +1,14 @@ +package info.nightscout.androidaps.events; + +public class EventNetworkChange extends Event { + + public boolean mobileConnected = false; + public boolean wifiConnected = false; + + public String ssid = ""; + public boolean roaming = false; + + public String getSsid() { + return ssid.replace("SSID: ","").replaceAll("\"",""); + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java b/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java index f99cb54568..f23d4e802a 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventPreferenceChange.java @@ -12,11 +12,11 @@ public class EventPreferenceChange extends Event { } public EventPreferenceChange(int resourceID) { - changedKey = MainApp.sResources.getString(resourceID); + changedKey = MainApp.gs(resourceID); } public boolean isChanged(int id) { - return changedKey.equals(MainApp.sResources.getString(id)); + return changedKey.equals(MainApp.gs(id)); } public boolean isChanged(String id) { diff --git a/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java b/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java index 52c3183821..7d810702b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java +++ b/app/src/main/java/info/nightscout/androidaps/events/EventPumpStatusChanged.java @@ -46,13 +46,13 @@ public class EventPumpStatusChanged extends Event { public String textStatus() { if (sStatus == CONNECTING) - return String.format(MainApp.sResources.getString(R.string.danar_history_connectingfor), sSecondsElapsed); + return String.format(MainApp.gs(R.string.danar_history_connectingfor), sSecondsElapsed); else if (sStatus == CONNECTED) - return MainApp.sResources.getString(R.string.connected); + return MainApp.gs(R.string.connected); else if (sStatus == PERFORMING) return sPerfomingAction; else if (sStatus == DISCONNECTING) - return MainApp.sResources.getString(R.string.disconnecting); + return MainApp.gs(R.string.disconnecting); else if (sStatus == DISCONNECTED) return ""; return ""; diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java index 11c01112ba..0b965d48af 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/APSInterface.java @@ -11,5 +11,5 @@ public interface APSInterface { public APSResult getLastAPSResult(); public Date getLastAPSRun(); - public void invoke(String initiator); + public void invoke(String initiator, boolean tempBasalFallback); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java index cc73571b9d..84086d6117 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/ActionsFragment.java @@ -158,7 +158,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL if (activeExtendedBolus != null) { extendedBolus.setVisibility(View.GONE); extendedBolusCancel.setVisibility(View.VISIBLE); - extendedBolusCancel.setText(MainApp.instance().getString(R.string.cancel) + " " + activeExtendedBolus.toString()); + extendedBolusCancel.setText(MainApp.gs(R.string.cancel) + " " + activeExtendedBolus.toString()); } else { extendedBolus.setVisibility(View.VISIBLE); extendedBolusCancel.setVisibility(View.GONE); @@ -174,7 +174,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL if (activeTemp != null) { tempBasal.setVisibility(View.GONE); tempBasalCancel.setVisibility(View.VISIBLE); - tempBasalCancel.setText(MainApp.instance().getString(R.string.cancel) + " " + activeTemp.toStringShort()); + tempBasalCancel.setText(MainApp.gs(R.string.cancel) + " " + activeTemp.toStringShort()); } else { tempBasal.setVisibility(View.VISIBLE); tempBasalCancel.setVisibility(View.GONE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java index 5e99a6ca17..828c7dbcc9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/FillDialog.java @@ -179,10 +179,10 @@ public class FillDialog extends DialogFragment implements OnClickListener { } if (pumpSiteChangeCheckbox.isChecked()) - confirmMessage.add("" + "" + getString(R.string.record_pump_site_change) + ""); + confirmMessage.add("" + "" + MainApp.gs(R.string.record_pump_site_change) + ""); if (insulinCartridgeChangeCheckbox.isChecked()) - confirmMessage.add("" + "" + getString(R.string.record_insulin_cartridge_change) + ""); + confirmMessage.add("" + "" + MainApp.gs(R.string.record_insulin_cartridge_change) + ""); final String notes = notesEdit.getText().toString(); if (!notes.isEmpty()) { @@ -197,7 +197,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { builder.setTitle(MainApp.gs(R.string.confirmation)); if (insulinAfterConstraints > 0 || pumpSiteChangeCheckbox.isChecked() || insulinCartridgeChangeCheckbox.isChecked()) { builder.setMessage(Html.fromHtml(Joiner.on("
").join(confirmMessage))); - builder.setPositiveButton(getString(R.string.primefill), (dialog, id) -> { + builder.setPositiveButton(MainApp.gs(R.string.primefill), (dialog, id) -> { if (finalInsulinAfterConstraints > 0) { DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); detailedBolusInfo.insulin = finalInsulinAfterConstraints; @@ -212,7 +212,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -228,7 +228,7 @@ public class FillDialog extends DialogFragment implements OnClickListener { } else { builder.setMessage(MainApp.gs(R.string.no_action_selected)); } - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); } catch (RuntimeException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java index 04dd783b04..45b6460392 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewExtendedBolusDialog.java @@ -12,6 +12,7 @@ import android.view.ViewGroup; import com.crashlytics.android.answers.CustomEvent; +import org.mozilla.javascript.tools.jsc.Main; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,7 +40,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - getDialog().setTitle(getString(R.string.overview_extendedbolus_button)); + getDialog().setTitle(MainApp.gs(R.string.overview_extendedbolus_button)); View view = inflater.inflate(R.layout.overview_newextendedbolus_dialog, container, false); @@ -68,13 +69,13 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli Double insulin = SafeParse.stringToDouble(editInsulin.getText()); int durationInMinutes = SafeParse.stringToInt(editDuration.getText()); - String confirmMessage = getString(R.string.setextendedbolusquestion); + String confirmMessage = MainApp.gs(R.string.setextendedbolusquestion); Double insulinAfterConstraint = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value(); confirmMessage += " " + insulinAfterConstraint + " U "; - confirmMessage += getString(R.string.duration) + " " + durationInMinutes + "min ?"; + confirmMessage += MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?"; if (insulinAfterConstraint - insulin != 0d) - confirmMessage += "\n" + getString(R.string.constraintapllied); + confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied); insulin = insulinAfterConstraint; final Double finalInsulin = insulin; @@ -82,9 +83,9 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli final Context context = getContext(); AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(context.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { ConfigBuilderPlugin.getCommandQueue().extendedBolus(finalInsulin, finalDurationInMinutes, new Callback() { @Override @@ -93,7 +94,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -102,7 +103,7 @@ public class NewExtendedBolusDialog extends DialogFragment implements View.OnCli FabricPrivacy.getInstance().logCustom(new CustomEvent("ExtendedBolus")); } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java index fb00879ae4..7a03887cf6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/dialogs/NewTempBasalDialog.java @@ -52,7 +52,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - getDialog().setTitle(getString(R.string.overview_tempbasal_button)); + getDialog().setTitle(MainApp.gs(R.string.overview_tempbasal_button)); View view = inflater.inflate(R.layout.overview_newtempbasal_dialog, container, false); @@ -122,21 +122,21 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi if (profile == null) return; - String confirmMessage = getString(R.string.setbasalquestion); + String confirmMessage = MainApp.gs(R.string.setbasalquestion); if (setAsPercent) { int basalPercentInput = SafeParse.stringToInt(basalPercent.getText()); percent = MainApp.getConstraintChecker().applyBasalPercentConstraints(new Constraint<>(basalPercentInput), profile).value(); confirmMessage += "\n" + percent + "% "; - confirmMessage += "\n" + getString(R.string.duration) + " " + durationInMinutes + "min ?"; + confirmMessage += "\n" + MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?"; if (percent != basalPercentInput) - confirmMessage += "\n" + getString(R.string.constraintapllied); + confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied); } else { Double basalAbsoluteInput = SafeParse.stringToDouble(basalAbsolute.getText()); absolute = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(basalAbsoluteInput), profile).value(); confirmMessage += "\n" + absolute + " U/h "; - confirmMessage += "\n" + getString(R.string.duration) + " " + durationInMinutes + "min ?"; + confirmMessage += "\n" + MainApp.gs(R.string.duration) + " " + durationInMinutes + "min ?"; if (absolute - basalAbsoluteInput != 0d) - confirmMessage += "\n" + getString(R.string.constraintapllied); + confirmMessage += "\n" + MainApp.gs(R.string.constraintapllied); } final int finalBasalPercent = percent; @@ -144,9 +144,9 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi final int finalDurationInMinutes = durationInMinutes; AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Callback callback = new Callback() { @Override @@ -155,7 +155,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -169,7 +169,7 @@ public class NewTempBasalDialog extends DialogFragment implements View.OnClickLi FabricPrivacy.getInstance().logCustom(new CustomEvent("TempBasal")); } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java index 8a8a730bb3..ac018e3101 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/CareportalFragment.java @@ -216,8 +216,8 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli CareportalEvent careportalEvent; NSSettingsStatus nsSettings = new NSSettingsStatus().getInstance(); - double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 72); - double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 48); + double iageUrgent = nsSettings.getExtendedWarnValue("iage", "urgent", 96); + double iageWarn = nsSettings.getExtendedWarnValue("iage", "warn", 72); double cageUrgent = nsSettings.getExtendedWarnValue("cage", "urgent", 72); double cageWarn = nsSettings.getExtendedWarnValue("cage", "warn", 48); double sageUrgent = nsSettings.getExtendedWarnValue("sage", "urgent", 166); @@ -225,7 +225,7 @@ public class CareportalFragment extends SubscriberFragment implements View.OnCli double pbageUrgent = nsSettings.getExtendedWarnValue("pgage", "urgent", 360); double pbageWarn = nsSettings.getExtendedWarnValue("pgage", "warn", 240); - String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.sResources.getString(R.string.notavailable); + String notavailable = OverviewFragment.shorttextmode ? "-" : MainApp.gs(R.string.notavailable); if (sage != null) { careportalEvent = MainApp.getDbHelper().getLastCareportalEvent(CareportalEvent.SENSORCHANGE); if (careportalEvent != null) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java index 56aa0158cf..46c1e3666d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Careportal/Dialogs/NewNSTreatmentDialog.java @@ -715,14 +715,26 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick FabricPrivacy.getInstance().logCustom(new CustomEvent("TempTarget")); } } else { - NSUpload.uploadCareportalEntryToNS(data); + if (JsonHelper.safeGetString(data, "eventType").equals(CareportalEvent.PROFILESWITCH)) { + ProfileSwitch profileSwitch = prepareProfileSwitch( + profileStore, + JsonHelper.safeGetString(data, "profile"), + JsonHelper.safeGetInt(data, "duration"), + JsonHelper.safeGetInt(data, "percentage"), + JsonHelper.safeGetInt(data, "timeshift"), + eventTime.getTime() + ); + NSUpload.uploadProfileSwitch(profileSwitch); + } else { + NSUpload.uploadCareportalEntryToNS(data); + } FabricPrivacy.getInstance().logCustom(new CustomEvent("NSTreatment")); } } - public static void doProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift) { + public static ProfileSwitch prepareProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift, long date) { ProfileSwitch profileSwitch = new ProfileSwitch(); - profileSwitch.date = System.currentTimeMillis(); + profileSwitch.date = date; profileSwitch.source = Source.USER; profileSwitch.profileName = profileName; profileSwitch.profileJson = profileStore.getSpecificProfile(profileName).getData().toString(); @@ -731,6 +743,11 @@ public class NewNSTreatmentDialog extends DialogFragment implements View.OnClick profileSwitch.isCPP = percentage != 100 || timeshift != 0; profileSwitch.timeshift = timeshift; profileSwitch.percentage = percentage; + return profileSwitch; + } + + public static void doProfileSwitch(final ProfileStore profileStore, final String profileName, final int duration, final int percentage, final int timeshift) { + ProfileSwitch profileSwitch = prepareProfileSwitch(profileStore, profileName, duration, percentage, timeshift, System.currentTimeMillis()); TreatmentsPlugin.getPlugin().addToHistoryProfileSwitch(profileSwitch); FabricPrivacy.getInstance().logCustom(new CustomEvent("ProfileSwitch")); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java index 06ddbef86f..35130c5209 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/ConfigBuilderPlugin.java @@ -417,6 +417,9 @@ public class ConfigBuilderPlugin extends PluginBase { */ public void applyTBRRequest(APSResult request, Profile profile, Callback callback) { if (!request.tempBasalRequested) { + if (callback != null) { + callback.result(new PumpEnactResult().enacted(false).success(true).comment(MainApp.gs(R.string.nochangerequested))).run(); + } return; } @@ -426,17 +429,17 @@ public class ConfigBuilderPlugin extends PluginBase { request.rate = MainApp.getConstraintChecker().applyBasalConstraints(request.rateConstraint, profile).value(); if (!pump.isInitialized()) { - log.debug("applyAPSRequest: " + MainApp.sResources.getString(R.string.pumpNotInitialized)); + log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpNotInitialized)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); } return; } if (pump.isSuspended()) { - log.debug("applyAPSRequest: " + MainApp.sResources.getString(R.string.pumpsuspended)); + log.debug("applyAPSRequest: " + MainApp.gs(R.string.pumpsuspended)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpsuspended)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run(); } return; } @@ -496,17 +499,17 @@ public class ConfigBuilderPlugin extends PluginBase { PumpInterface pump = getActivePump(); if (!pump.isInitialized()) { - log.debug("applySMBRequest: " + MainApp.sResources.getString(R.string.pumpNotInitialized)); + log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpNotInitialized)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpNotInitialized)).enacted(false).success(false)).run(); } return; } if (pump.isSuspended()) { - log.debug("applySMBRequest: " + MainApp.sResources.getString(R.string.pumpsuspended)); + log.debug("applySMBRequest: " + MainApp.gs(R.string.pumpsuspended)); if (callback != null) { - callback.result(new PumpEnactResult().comment(MainApp.sResources.getString(R.string.pumpsuspended)).enacted(false).success(false)).run(); + callback.result(new PumpEnactResult().comment(MainApp.gs(R.string.pumpsuspended)).enacted(false).success(false)).run(); } return; } @@ -535,7 +538,7 @@ public class ConfigBuilderPlugin extends PluginBase { Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.failedupdatebasalprofile)); + i.putExtra("title", MainApp.gs(R.string.failedupdatebasalprofile)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java index abe3c75c73..7a4e99b584 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConfigBuilder/DetailedBolusInfoStorage.java @@ -19,13 +19,13 @@ public class DetailedBolusInfoStorage { private static Logger log = LoggerFactory.getLogger(DetailedBolusInfoStorage.class); private static List store = new ArrayList<>(); - public static void add(DetailedBolusInfo detailedBolusInfo) { + public static synchronized void add(DetailedBolusInfo detailedBolusInfo) { log.debug("Stored bolus info: " + detailedBolusInfo); store.add(detailedBolusInfo); } @Nullable - public static DetailedBolusInfo findDetailedBolusInfo(long bolustime) { + public static synchronized DetailedBolusInfo findDetailedBolusInfo(long bolustime) { DetailedBolusInfo found = null; for (int i = 0; i < store.size(); i++) { long infoTime = store.get(i).date; @@ -38,7 +38,7 @@ public class DetailedBolusInfoStorage { return found; } - public static void remove(long bolustime) { + public static synchronized void remove(long bolustime) { for (int i = 0; i < store.size(); i++) { long infoTime = store.get(i).date; if (bolustime > infoTime - 60 * 1000 && bolustime < infoTime + 60 * 1000) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java index 688c741329..1424013440 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragment.java @@ -26,6 +26,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.utils.FabricPrivacy; +import info.nightscout.utils.T; public class ObjectivesFragment extends SubscriberFragment { private static Logger log = LoggerFactory.getLogger(ObjectivesFragment.class); @@ -58,7 +59,7 @@ public class ObjectivesFragment extends SubscriberFragment { holder.position.setText(String.valueOf(position + 1)); holder.objective.setText(o.objective); holder.gate.setText(o.gate); - holder.duration.setText(context.getString(R.string.objectives_minimalduration) + " " + o.durationInDays + " " + context.getString(R.string.days)); + holder.duration.setText(MainApp.gs(R.string.objectives_minimalduration) + " " + o.durationInDays + " " + MainApp.gs(R.string.days)); holder.progress.setText(requirementsMet.comment); holder.started.setText(o.started.toLocaleString()); holder.accomplished.setText(o.accomplished.toLocaleString()); @@ -204,7 +205,7 @@ public class ObjectivesFragment extends SubscriberFragment { return 1; } else if (objectiveStartedTime > 0 && !enableFakeValue && objectiveAccomplishedTime == 0 - && !(objectiveStartedTime + durationInDays * 24 * 60 * 60 * 1000 >= now && requirementsMet)) { + && !(objectiveStartedTime + T.days(durationInDays).msecs() < now && requirementsMet)) { return 2; } else if (objectiveAccomplishedTime == 0) { return 3; @@ -240,20 +241,20 @@ public class ObjectivesFragment extends SubscriberFragment { }); // Add correct translations to array after app is initialized - ObjectivesPlugin.objectives.get(0).objective = MainApp.sResources.getString(R.string.objectives_0_objective); - ObjectivesPlugin.objectives.get(1).objective = MainApp.sResources.getString(R.string.objectives_1_objective); - ObjectivesPlugin.objectives.get(2).objective = MainApp.sResources.getString(R.string.objectives_2_objective); - ObjectivesPlugin.objectives.get(3).objective = MainApp.sResources.getString(R.string.objectives_3_objective); - ObjectivesPlugin.objectives.get(4).objective = MainApp.sResources.getString(R.string.objectives_4_objective); - ObjectivesPlugin.objectives.get(5).objective = MainApp.sResources.getString(R.string.objectives_5_objective); - ObjectivesPlugin.objectives.get(6).objective = MainApp.sResources.getString(R.string.objectives_6_objective); - ObjectivesPlugin.objectives.get(7).objective = MainApp.sResources.getString(R.string.objectives_7_objective); - ObjectivesPlugin.objectives.get(0).gate = MainApp.sResources.getString(R.string.objectives_0_gate); - ObjectivesPlugin.objectives.get(1).gate = MainApp.sResources.getString(R.string.objectives_1_gate); - ObjectivesPlugin.objectives.get(2).gate = MainApp.sResources.getString(R.string.objectives_2_gate); - ObjectivesPlugin.objectives.get(3).gate = MainApp.sResources.getString(R.string.objectives_3_gate); - ObjectivesPlugin.objectives.get(4).gate = MainApp.sResources.getString(R.string.objectives_4_gate); - ObjectivesPlugin.objectives.get(5).gate = MainApp.sResources.getString(R.string.objectives_5_gate); + ObjectivesPlugin.objectives.get(0).objective = MainApp.gs(R.string.objectives_0_objective); + ObjectivesPlugin.objectives.get(1).objective = MainApp.gs(R.string.objectives_1_objective); + ObjectivesPlugin.objectives.get(2).objective = MainApp.gs(R.string.objectives_2_objective); + ObjectivesPlugin.objectives.get(3).objective = MainApp.gs(R.string.objectives_3_objective); + ObjectivesPlugin.objectives.get(4).objective = MainApp.gs(R.string.objectives_4_objective); + ObjectivesPlugin.objectives.get(5).objective = MainApp.gs(R.string.objectives_5_objective); + ObjectivesPlugin.objectives.get(6).objective = MainApp.gs(R.string.objectives_6_objective); + ObjectivesPlugin.objectives.get(7).objective = MainApp.gs(R.string.objectives_7_objective); + ObjectivesPlugin.objectives.get(0).gate = MainApp.gs(R.string.objectives_0_gate); + ObjectivesPlugin.objectives.get(1).gate = MainApp.gs(R.string.objectives_1_gate); + ObjectivesPlugin.objectives.get(2).gate = MainApp.gs(R.string.objectives_2_gate); + ObjectivesPlugin.objectives.get(3).gate = MainApp.gs(R.string.objectives_3_gate); + ObjectivesPlugin.objectives.get(4).gate = MainApp.gs(R.string.objectives_4_gate); + ObjectivesPlugin.objectives.get(5).gate = MainApp.gs(R.string.objectives_5_gate); updateGUI(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java index 490146cc14..1acf6ea083 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Food/FoodFragment.java @@ -54,7 +54,7 @@ public class FoodFragment extends SubscriberFragment { ArrayList categories; ArrayList subcategories; - final String EMPTY = MainApp.sResources.getString(R.string.none); + final String EMPTY = MainApp.gs(R.string.none); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -158,7 +158,7 @@ public class FoodFragment extends SubscriberFragment { // make it unique categories = new ArrayList<>(catSet); - categories.add(0, MainApp.sResources.getString(R.string.none)); + categories.add(0, MainApp.gs(R.string.none)); ArrayAdapter adapterCategories = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, categories); @@ -180,7 +180,7 @@ public class FoodFragment extends SubscriberFragment { // make it unique subcategories = new ArrayList<>(subCatSet); - subcategories.add(0, MainApp.sResources.getString(R.string.none)); + subcategories.add(0, MainApp.gs(R.string.none)); ArrayAdapter adapterSubcategories = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, subcategories); @@ -242,14 +242,14 @@ public class FoodFragment extends SubscriberFragment { holder.ns.setVisibility(food._id != null ? View.VISIBLE : View.GONE); holder.name.setText(food.name); holder.portion.setText(food.portion + food.units); - holder.carbs.setText(food.carbs + MainApp.sResources.getString(R.string.shortgramm)); - holder.fat.setText(MainApp.sResources.getString(R.string.shortfat) + ": " + food.fat + MainApp.sResources.getString(R.string.shortgramm)); + holder.carbs.setText(food.carbs + MainApp.gs(R.string.shortgramm)); + holder.fat.setText(MainApp.gs(R.string.shortfat) + ": " + food.fat + MainApp.gs(R.string.shortgramm)); if (food.fat == 0) holder.fat.setVisibility(View.INVISIBLE); - holder.protein.setText(MainApp.sResources.getString(R.string.shortprotein) + ": " + food.protein + MainApp.sResources.getString(R.string.shortgramm)); + holder.protein.setText(MainApp.gs(R.string.shortprotein) + ": " + food.protein + MainApp.gs(R.string.shortgramm)); if (food.protein == 0) holder.protein.setVisibility(View.INVISIBLE); - holder.energy.setText(MainApp.sResources.getString(R.string.shortenergy) + ": " + food.energy + MainApp.sResources.getString(R.string.shortkilojoul)); + holder.energy.setText(MainApp.gs(R.string.shortenergy) + ": " + food.energy + MainApp.gs(R.string.shortkilojoul)); if (food.energy == 0) holder.energy.setVisibility(View.INVISIBLE); holder.remove.setTag(food); @@ -291,9 +291,9 @@ public class FoodFragment extends SubscriberFragment { case R.id.food_remove: AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + food.name); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + food.name); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = food._id; if (_id != null && !_id.equals("")) { @@ -302,7 +302,7 @@ public class FoodFragment extends SubscriberFragment { MainApp.getSpecificPlugin(FoodPlugin.class).getService().delete(food); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java index 672c5cfeb6..2c46cd7bb6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefBasePlugin.java @@ -56,7 +56,7 @@ public abstract class InsulinOrefBasePlugin extends PluginBase implements Insuli } public String getNotificationPattern() { - return MainApp.sResources.getString(R.string.dia_too_short); + return MainApp.gs(R.string.dia_too_short); } public double getUserDefinedDia() { @@ -98,7 +98,7 @@ public abstract class InsulinOrefBasePlugin extends PluginBase implements Insuli String comment = commentStandardText(); double userDia = getUserDefinedDia(); if (userDia < MIN_DIA) { - comment += "\n" + String.format(MainApp.sResources.getString(R.string.dia_too_short), userDia, MIN_DIA); + comment += "\n" + String.format(MainApp.gs(R.string.dia_too_short), userDia, MIN_DIA); } return comment; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java index 3a19573d71..a710f742a7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefFreePeakPlugin.java @@ -33,12 +33,12 @@ public class InsulinOrefFreePeakPlugin extends InsulinOrefBasePlugin { } public String getFriendlyName() { - return MainApp.sResources.getString(R.string.free_peak_oref); + return MainApp.gs(R.string.free_peak_oref); } @Override public String commentStandardText() { - return MainApp.sResources.getString(R.string.insulin_peak_time) + ": " + getPeak(); + return MainApp.gs(R.string.insulin_peak_time) + ": " + getPeak(); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java index cd7769b55b..a8f9761771 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefRapidActingPlugin.java @@ -32,12 +32,12 @@ public class InsulinOrefRapidActingPlugin extends InsulinOrefBasePlugin { @Override public String getFriendlyName() { - return MainApp.sResources.getString(R.string.rapid_acting_oref); + return MainApp.gs(R.string.rapid_acting_oref); } @Override public String commentStandardText() { - return MainApp.sResources.getString(R.string.fastactinginsulincomment); + return MainApp.gs(R.string.fastactinginsulincomment); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java index 0e20f8dd42..ba5fc99011 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Insulin/InsulinOrefUltraRapidActingPlugin.java @@ -32,17 +32,17 @@ public class InsulinOrefUltraRapidActingPlugin extends InsulinOrefBasePlugin { @Override public String getName() { - return MainApp.sResources.getString(R.string.ultrarapid_oref); + return MainApp.gs(R.string.ultrarapid_oref); } @Override public String getFriendlyName() { - return MainApp.sResources.getString(R.string.ultrarapid_oref); + return MainApp.gs(R.string.ultrarapid_oref); } @Override public String commentStandardText() { - return MainApp.sResources.getString(R.string.ultrafastactinginsulincomment); + return MainApp.gs(R.string.ultrafastactinginsulincomment); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java index 397656306b..79ab63e2ac 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/AutosensData.java @@ -7,22 +7,31 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; -import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; +import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; +import info.nightscout.androidaps.plugins.Overview.graphExtensions.DataPointWithLabelInterface; +import info.nightscout.androidaps.plugins.Overview.graphExtensions.PointsWithLabelGraphSeries; +import info.nightscout.androidaps.plugins.Overview.graphExtensions.Scale; import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.utils.SP; /** * Created by mike on 25.04.2017. */ -public class AutosensData { +public class AutosensData implements DataPointWithLabelInterface { private static Logger log = LoggerFactory.getLogger(AutosensData.class); + public void setChartTime(long chartTime) { + this.chartTime = chartTime; + } + static class CarbsInPast { long time = 0L; double carbs = 0d; @@ -34,19 +43,20 @@ public class AutosensData { carbs = t.carbs; remaining = t.carbs; if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { - double maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, 4d); + double maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME); Profile profile = MainApp.getConfigBuilder().getProfile(t.date); double sens = Profile.toMgdl(profile.getIsf(t.date), profile.getUnits()); double ic = profile.getIc(t.date); min5minCarbImpact = t.carbs / (maxAbsorptionHours * 60 / 5) * sens / ic; log.debug("Min 5m carbs impact for " + carbs + "g @" + new Date(t.date).toLocaleString() + " for " + maxAbsorptionHours + "h calculated to " + min5minCarbImpact + " ISF: " + sens + " IC: " + ic); } else { - min5minCarbImpact = SP.getDouble("openapsama_min_5m_carbimpact", 3.0); + min5minCarbImpact = SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact); } } } public long time = 0L; + long chartTime; public String pastSensitivity = ""; public double deviation = 0d; boolean nonCarbsDeviation = false; @@ -63,25 +73,33 @@ public class AutosensData { public double autosensRatio = 1d; public double slopeFromMaxDeviation = 0; public double slopeFromMinDeviation = 999; + public double usedMinCarbsImpact = 0d; + public boolean failoverToMinAbsorbtionRate = false; @Override public String toString() { - return "AutosensData: " + new Date(time).toLocaleString() + " " + pastSensitivity + " Delta=" + delta + " avgDelta=" + avgDelta + " Bgi=" + bgi + " Deviation=" + deviation + " avgDeviation=" + avgDeviation + " Absorbed=" + absorbed + " CarbsFromBolus=" + carbsFromBolus + " COB=" + cob + " autosensRatio=" + autosensRatio + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation =" + slopeFromMinDeviation ; + return "AutosensData: " + new Date(time).toLocaleString() + " " + pastSensitivity + " Delta=" + delta + " avgDelta=" + avgDelta + " Bgi=" + bgi + " Deviation=" + deviation + " avgDeviation=" + avgDeviation + " Absorbed=" + absorbed + " CarbsFromBolus=" + carbsFromBolus + " COB=" + cob + " autosensRatio=" + autosensRatio + " slopeFromMaxDeviation=" + slopeFromMaxDeviation + " slopeFromMinDeviation =" + slopeFromMinDeviation; } public int minOld() { return (int) ((System.currentTimeMillis() - time) / 1000 / 60); } - // remove carbs older than 4h + // remove carbs older than timeframe public void removeOldCarbs(long toTime) { + double maxAbsorptionHours = Constants.DEFAULT_MAX_ABSORPTION_TIME; + if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } else { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_cutoff, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } for (int i = 0; i < activeCarbsList.size(); i++) { CarbsInPast c = activeCarbsList.get(i); - if (c.time + 4 * 60 * 60 * 1000L < toTime) { + if (c.time + maxAbsorptionHours * 60 * 60 * 1000L < toTime) { activeCarbsList.remove(i--); if (c.remaining > 0) cob -= c.remaining; - log.debug("Removing carbs at "+ new Date(toTime).toLocaleString() + " + after 4h :" + new Date(c.time).toLocaleString()); + log.debug("Removing carbs at " + new Date(toTime).toLocaleString() + " + after " + maxAbsorptionHours + "h :" + new Date(c.time).toLocaleString()); } } } @@ -98,4 +116,52 @@ public class AutosensData { } } + // ------- DataPointWithLabelInterface ------ + + private Scale scale; + + public void setScale(Scale scale) { + this.scale = scale; + } + + @Override + public double getX() { + return chartTime; + } + + @Override + public double getY() { + return scale.transform(cob); + } + + @Override + public void setY(double y) { + + } + + @Override + public String getLabel() { + return null; + } + + @Override + public long getDuration() { + return 0; + } + + @Override + public PointsWithLabelGraphSeries.Shape getShape() { + return PointsWithLabelGraphSeries.Shape.COBFAILOVER; + } + + @Override + public float getSize() { + return 0.5f; + } + + @Override + public int getColor() { + return MainApp.gc(R.color.cob); + } + } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java new file mode 100644 index 0000000000..d8b6d7674a --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/CobInfo.java @@ -0,0 +1,31 @@ +package info.nightscout.androidaps.plugins.IobCobCalculator; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import info.nightscout.utils.DecimalFormatter; + +public class CobInfo { + /** All COB up to now, including carbs not yet processed by IobCob calculation. */ + @Nullable + public final Double displayCob; + public final double futureCarbs; + + public CobInfo(@Nullable Double displayCob, double futureCarbs) { + this.displayCob = displayCob; + this.futureCarbs = futureCarbs; + } + + @NonNull + public String generateCOBString() { + String cobStringResult = "--g"; + if (displayCob != null) { + cobStringResult = DecimalFormatter.to0Decimal(displayCob); + if (futureCarbs > 0) { + cobStringResult += "(" + DecimalFormatter.to0Decimal(futureCarbs) + ")"; + } + cobStringResult += "g"; + } + return cobStringResult; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java index f51c7f7a94..89d66fd891 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobCalculatorPlugin.java @@ -1,6 +1,7 @@ package info.nightscout.androidaps.plugins.IobCobCalculator; import android.os.SystemClock; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.LongSparseArray; @@ -34,9 +35,12 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventNewHistoryData; import info.nightscout.androidaps.plugins.OpenAPSSMB.OpenAPSSMBPlugin; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; +import static info.nightscout.utils.DateUtil.now; + /** * Created by mike on 24.04.2017. */ @@ -74,7 +78,7 @@ public class IobCobCalculatorPlugin extends PluginBase { .neverVisible(true) .alwaysEnabled(true) ); - } + } @Override protected void onStart() { @@ -309,7 +313,7 @@ public class IobCobCalculatorPlugin extends PluginBase { //log.debug(">>> calculateFromTreatmentsAndTemps Cache miss " + new Date(time).toLocaleString()); } IobTotal bolusIob = TreatmentsPlugin.getPlugin().getCalculationToTimeTreatments(time).round(); - IobTotal basalIob = TreatmentsPlugin.getPlugin().getCalculationToTimeTempBasals(time, profile).round(); + IobTotal basalIob = TreatmentsPlugin.getPlugin().getCalculationToTimeTempBasals(time, profile, true, now).round(); if (OpenAPSSMBPlugin.getPlugin().isEnabled(PluginType.APS)) { // Add expected zero temp basal for next 240 mins IobTotal basalIobWithZeroTemp = basalIob.copy(); @@ -322,7 +326,7 @@ public class IobCobCalculatorPlugin extends PluginBase { basalIobWithZeroTemp.plus(calc); } - basalIob.iobWithZeroTemp = basalIobWithZeroTemp; + basalIob.iobWithZeroTemp = IobTotal.combine(bolusIob, basalIobWithZeroTemp).round(); } IobTotal iobTotal = IobTotal.combine(bolusIob, basalIob).round(); @@ -402,6 +406,33 @@ public class IobCobCalculatorPlugin extends PluginBase { } + @NonNull + public CobInfo getCobInfo(boolean _synchronized, String reason) { + AutosensData autosensData = _synchronized ? getLastAutosensDataSynchronized(reason) : getLastAutosensData(reason); + Double displayCob = null; + double futureCarbs = 0; + long now = now(); + List treatments = TreatmentsPlugin.getPlugin().getTreatmentsFromHistory(); + + if (autosensData != null) { + displayCob = autosensData.cob; + for (Treatment treatment : treatments) { + if (!treatment.isValid) continue; + if (IobCobCalculatorPlugin.roundUpTime(treatment.date) > IobCobCalculatorPlugin.roundUpTime(autosensData.time) + && treatment.date <= now && treatment.carbs > 0) { + displayCob += treatment.carbs; + } + } + } + for (Treatment treatment : treatments) { + if (!treatment.isValid) continue; + if (treatment.date > now && treatment.carbs > 0) { + futureCarbs += treatment.carbs; + } + } + return new CobInfo(displayCob, futureCarbs); + } + @Nullable public AutosensData getLastAutosensData(String reason) { if (autosensDataTable.size() < 1) { @@ -548,7 +579,9 @@ public class IobCobCalculatorPlugin extends PluginBase { } if (ev.isChanged(R.string.key_openapsama_autosens_period) || ev.isChanged(R.string.key_age) || - ev.isChanged(R.string.key_absorption_maxtime) + ev.isChanged(R.string.key_absorption_maxtime) || + ev.isChanged(R.string.key_openapsama_min_5m_carbimpact) || + ev.isChanged(R.string.key_absorption_cutoff) ) { stopCalculation("onEventPreferenceChange"); synchronized (dataLock) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java index e3f12cbea6..9818ed17e4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/IobCobThread.java @@ -17,15 +17,24 @@ import info.nightscout.androidaps.BuildConfig; 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.IobTotal; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; -import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.Event; +import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; +import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress; +import info.nightscout.androidaps.plugins.OpenAPSSMB.SMBDefaults; +import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; +import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.FabricPrivacy; +import info.nightscout.utils.SP; + +import static info.nightscout.utils.DateUtil.now; /** * Created by mike on 23.01.2018. @@ -69,28 +78,29 @@ public class IobCobThread extends Thread { } //log.debug("Locking calculateSensitivityData"); - Object dataLock = iobCobCalculatorPlugin.dataLock; - long oldestTimeWithData = iobCobCalculatorPlugin.oldestDataAvailable(); - synchronized (dataLock) { + synchronized (iobCobCalculatorPlugin.dataLock) { if (bgDataReload) { iobCobCalculatorPlugin.loadBgData(start); iobCobCalculatorPlugin.createBucketedData(); } List bucketed_data = iobCobCalculatorPlugin.getBucketedData(); - LongSparseArray autosensDataTable = iobCobCalculatorPlugin.getAutosensDataTable(); + LongSparseArray autosensDataTable = IobCobCalculatorPlugin.getPlugin().getAutosensDataTable(); if (bucketed_data == null || bucketed_data.size() < 3) { log.debug("Aborting calculation thread (No bucketed data available): " + from); return; } - long prevDataTime = iobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date); + long prevDataTime = IobCobCalculatorPlugin.roundUpTime(bucketed_data.get(bucketed_data.size() - 3).date); log.debug("Prev data time: " + new Date(prevDataTime).toLocaleString()); AutosensData previous = autosensDataTable.get(prevDataTime); // start from oldest to be able sub cob for (int i = bucketed_data.size() - 4; i >= 0; i--) { + String progress = i + (MainApp.isDev() ? " (" + from + ")" : ""); + MainApp.bus().post(new EventIobCalculationProgress(progress)); + if (iobCobCalculatorPlugin.stopCalculationTrigger) { iobCobCalculatorPlugin.stopCalculationTrigger = false; log.debug("Aborting calculation thread (trigger): " + from); @@ -98,10 +108,9 @@ public class IobCobThread extends Thread { } // check if data already exists long bgTime = bucketed_data.get(i).date; - bgTime = iobCobCalculatorPlugin.roundUpTime(bgTime); - if (bgTime > System.currentTimeMillis()) + bgTime = IobCobCalculatorPlugin.roundUpTime(bgTime); + if (bgTime > IobCobCalculatorPlugin.roundUpTime(now())) continue; - Profile profile = MainApp.getConfigBuilder().getProfile(bgTime); AutosensData existing; if ((existing = autosensDataTable.get(bgTime)) != null) { @@ -109,6 +118,7 @@ public class IobCobThread extends Thread { continue; } + Profile profile = MainApp.getConfigBuilder().getProfile(bgTime); if (profile == null) { log.debug("Aborting calculation thread (no profile): " + from); return; // profile not set yet @@ -152,7 +162,7 @@ public class IobCobThread extends Thread { // https://github.com/openaps/oref0/blob/master/lib/determine-basal/cob-autosens.js#L169 if (i < bucketed_data.size() - 16) { // we need 1h of data to calculate minDeviationSlope long hourago = bgTime + 10 * 1000 - 60 * 60 * 1000L; - AutosensData hourAgoData = iobCobCalculatorPlugin.getAutosensData(hourago); + AutosensData hourAgoData = IobCobCalculatorPlugin.getPlugin().getAutosensData(hourago); if (hourAgoData != null) { int initialIndex = autosensDataTable.indexOfKey(hourAgoData.time); if (Config.logAutosensData) @@ -199,18 +209,27 @@ public class IobCobThread extends Thread { if (previous != null && previous.cob > 0) { // calculate sum of min carb impact from all active treatments double totalMinCarbsImpact = 0d; - for (int ii = 0; ii < autosensData.activeCarbsList.size(); ++ii) { - AutosensData.CarbsInPast c = autosensData.activeCarbsList.get(ii); - totalMinCarbsImpact += c.min5minCarbImpact; + if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { + //when the impact depends on a max time, sum them up as smaller carb sizes make them smaller + for (int ii = 0; ii < autosensData.activeCarbsList.size(); ++ii) { + AutosensData.CarbsInPast c = autosensData.activeCarbsList.get(ii); + totalMinCarbsImpact += c.min5minCarbImpact; + } + } else { + //Oref sensitivity + totalMinCarbsImpact = SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact); } // figure out how many carbs that represents // but always assume at least 3mg/dL/5m (default) absorption per active treatment double ci = Math.max(deviation, totalMinCarbsImpact); + if (ci != deviation) + autosensData.failoverToMinAbsorbtionRate = true; autosensData.absorbed = ci * profile.getIc(bgTime) / sens; // and add that to the running total carbsAbsorbed autosensData.cob = Math.max(previous.cob - autosensData.absorbed, 0d); autosensData.substractAbosorbedCarbs(); + autosensData.usedMinCarbsImpact = totalMinCarbsImpact; } autosensData.removeOldCarbs(bgTime); autosensData.cob += autosensData.carbsFromBolus; @@ -254,6 +273,7 @@ public class IobCobThread extends Thread { log.debug("Finishing calculation thread: " + from); } finally { mWakeLock.release(); + MainApp.bus().post(new EventIobCalculationProgress("")); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java new file mode 100644 index 0000000000..08f2747e60 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/IobCobCalculator/events/EventIobCalculationProgress.java @@ -0,0 +1,11 @@ +package info.nightscout.androidaps.plugins.IobCobCalculator.events; + +import info.nightscout.androidaps.events.Event; + +public class EventIobCalculationProgress extends Event { + public String progress; + + public EventIobCalculationProgress(String progress) { + this.progress = progress; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java index 7a9c4deae9..87e55c7dc6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/APSResult.java @@ -52,23 +52,23 @@ public class APSResult { String ret; // rate if (rate == 0 && duration == 0) - ret = MainApp.sResources.getString(R.string.canceltemp) + "\n"; + ret = MainApp.gs(R.string.canceltemp) + "\n"; else if (rate == -1) - ret = MainApp.sResources.getString(R.string.let_temp_basal_run) + "\n"; + ret = MainApp.gs(R.string.let_temp_basal_run) + "\n"; else - ret = MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + + ret = MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%) \n" + - MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min\n"; + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min\n"; // smb if (smb != 0) ret += ("SMB: " + DecimalFormatter.toPumpSupportedBolus(smb) + " U\n"); // reason - ret += MainApp.sResources.getString(R.string.reason) + ": " + reason; + ret += MainApp.gs(R.string.reason) + ": " + reason; return ret; } else - return MainApp.sResources.getString(R.string.nochangerequested); + return MainApp.gs(R.string.nochangerequested); } public Spanned toSpanned() { @@ -77,23 +77,23 @@ public class APSResult { String ret; // rate if (rate == 0 && duration == 0) - ret = MainApp.sResources.getString(R.string.canceltemp) + "
"; + ret = MainApp.gs(R.string.canceltemp) + "
"; else if (rate == -1) - ret = MainApp.sResources.getString(R.string.let_temp_basal_run) + "
"; + ret = MainApp.gs(R.string.let_temp_basal_run) + "
"; else - ret = "" + MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + + ret = "" + MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(rate / pump.getBaseBasalRate() * 100) + "%)
" + - "" + MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min
"; + "" + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to2Decimal(duration) + " min
"; // smb if (smb != 0) ret += ("" + "SMB" + ": " + DecimalFormatter.toPumpSupportedBolus(smb) + " U
"); // reason - ret += "" + MainApp.sResources.getString(R.string.reason) + ": " + reason.replace("<", "<").replace(">", ">"); + ret += "" + MainApp.gs(R.string.reason) + ": " + reason.replace("<", "<").replace(">", ">"); return Html.fromHtml(ret); } else - return Html.fromHtml(MainApp.sResources.getString(R.string.nochangerequested)); + return Html.fromHtml(MainApp.gs(R.string.nochangerequested)); } public APSResult() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java index 5285dc7831..4ad35c0d02 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopFragment.java @@ -65,7 +65,7 @@ public class LoopFragment extends SubscriberFragment { @OnClick(R.id.loop_run) void onRunClick() { - lastRunView.setText(MainApp.sResources.getString(R.string.executing)); + lastRunView.setText(MainApp.gs(R.string.executing)); new Thread(() -> LoopPlugin.getPlugin().invoke("Loop button", true)).start(); FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run")); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java index e5510aae00..f6ec0ff7ab 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Loop/LoopPlugin.java @@ -9,6 +9,7 @@ import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; import android.os.Build; +import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.v4.app.NotificationCompat; @@ -27,6 +28,9 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.db.BgReading; +import info.nightscout.androidaps.db.DatabaseHelper; +import info.nightscout.androidaps.events.Event; import info.nightscout.androidaps.events.EventNewBG; import info.nightscout.androidaps.events.EventTreatmentChange; import info.nightscout.androidaps.interfaces.APSInterface; @@ -54,6 +58,7 @@ public class LoopPlugin extends PluginBase { public static final String CHANNEL_ID = "AndroidAPS-Openloop"; + long lastBgTriggeredRun = 0; protected static LoopPlugin loopPlugin; @@ -125,19 +130,34 @@ public class LoopPlugin extends PluginBase { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); return pump == null || pump.getPumpDescription().isTempBasalCapable; } - - @Subscribe - public void onStatusEvent(final EventTreatmentChange ev) { - if (ev.treatment == null || !ev.treatment.isSMB) { - invoke("EventTreatmentChange", true); - } - } - + + /** + * This method is triggered once autosens calculation has completed, so the LoopPlugin + * has current data to work with. However, autosens calculation can be triggered by multiple + * sources and currently only a new BG should trigger a loop run. Hence we return early if + * the event causing the calculation is not EventNewBg. + * + * Callers of {@link info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin#runCalculation(String, long, boolean, Event)} + * are sources triggering a calculation which triggers this method upon completion. + */ @Subscribe public void onStatusEvent(final EventAutosensCalculationFinished ev) { - if (ev.cause instanceof EventNewBG) { - invoke(ev.getClass().getSimpleName() + "(" + ev.cause.getClass().getSimpleName() + ")", true); + if (!(ev.cause instanceof EventNewBG)) { + // Autosens calculation not triggered by a new BG + return; } + BgReading bgReading = DatabaseHelper.actualBg(); + if (bgReading == null) { + // BG outdated + return; + } + if (bgReading.date <= lastBgTriggeredRun) { + // already looped with that value + return; + } + + lastBgTriggeredRun = bgReading.date; + invoke("AutosenseCalculation for " + bgReading, true); } public long suspendedTo() { @@ -227,14 +247,18 @@ public class LoopPlugin extends PluginBase { return isDisconnected; } - public void invoke(String initiator, boolean allowNotification) { + public synchronized void invoke(String initiator, boolean allowNotification){ + invoke(initiator, allowNotification, false); + } + + public synchronized void invoke(String initiator, boolean allowNotification, boolean tempBasalFallback) { try { if (Config.logFunctionCalls) log.debug("invoke from " + initiator); Constraint loopEnabled = MainApp.getConstraintChecker().isLoopInvokationAllowed(); if (!loopEnabled.value()) { - String message = MainApp.sResources.getString(R.string.loopdisabled) + "\n" + loopEnabled.getReasons(); + String message = MainApp.gs(R.string.loopdisabled) + "\n" + loopEnabled.getReasons(); log.debug(message); MainApp.bus().post(new EventLoopSetLastRunGui(message)); return; @@ -248,8 +272,8 @@ public class LoopPlugin extends PluginBase { Profile profile = MainApp.getConfigBuilder().getProfile(); if (!MainApp.getConfigBuilder().isProfileValid("Loop")) { - log.debug(MainApp.sResources.getString(R.string.noprofileselected)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noprofileselected))); + log.debug(MainApp.gs(R.string.noprofileselected)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.noprofileselected))); return; } @@ -258,13 +282,13 @@ public class LoopPlugin extends PluginBase { APSInterface usedAPS = ConfigBuilderPlugin.getActiveAPS(); if (usedAPS != null && ((PluginBase) usedAPS).isEnabled(PluginType.APS)) { - usedAPS.invoke(initiator); + usedAPS.invoke(initiator, tempBasalFallback); result = usedAPS.getLastAPSResult(); } // Check if we have any result if (result == null) { - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.noapsselected))); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.noapsselected))); return; } @@ -293,14 +317,14 @@ public class LoopPlugin extends PluginBase { NSUpload.uploadDeviceStatus(); if (isSuspended()) { - log.debug(MainApp.sResources.getString(R.string.loopsuspended)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.loopsuspended))); + log.debug(MainApp.gs(R.string.loopsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.loopsuspended))); return; } if (pump.isSuspended()) { - log.debug(MainApp.sResources.getString(R.string.pumpsuspended)); - MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.sResources.getString(R.string.pumpsuspended))); + log.debug(MainApp.gs(R.string.pumpsuspended)); + MainApp.bus().post(new EventLoopSetLastRunGui(MainApp.gs(R.string.pumpsuspended))); return; } @@ -322,16 +346,23 @@ public class LoopPlugin extends PluginBase { if (result.enacted || result.success) { lastRun.tbrSetByPump = result; lastRun.lastEnact = lastRun.lastAPSRun; - } - MainApp.bus().post(new EventLoopUpdateGui()); - } - }); - MainApp.getConfigBuilder().applySMBRequest(resultAfterConstraints, new Callback() { - @Override - public void run() { - if (result.enacted || result.success) { - lastRun.smbSetByPump = result; - lastRun.lastEnact = lastRun.lastAPSRun; + MainApp.getConfigBuilder().applySMBRequest(resultAfterConstraints, new Callback() { + @Override + public void run() { + //Callback is only called if a bolus was acutally requested + if (result.enacted || result.success) { + lastRun.smbSetByPump = result; + lastRun.lastEnact = lastRun.lastAPSRun; + } else { + new Thread(() -> { + SystemClock.sleep(1000); + LoopPlugin.getPlugin().invoke("tempBasalFallback", allowNotification, true); + }).start(); + FabricPrivacy.getInstance().logCustom(new CustomEvent("Loop_Run_TempBasalFallback")); + } + MainApp.bus().post(new EventLoopUpdateGui()); + } + }); } MainApp.bus().post(new EventLoopUpdateGui()); } @@ -345,7 +376,7 @@ public class LoopPlugin extends PluginBase { NotificationCompat.Builder builder = new NotificationCompat.Builder(MainApp.instance().getApplicationContext(), CHANNEL_ID); builder.setSmallIcon(R.drawable.notif_icon) - .setContentTitle(MainApp.sResources.getString(R.string.openloop_newsuggestion)) + .setContentTitle(MainApp.gs(R.string.openloop_newsuggestion)) .setContentText(resultAfterConstraints.toString()) .setAutoCancel(true) .setPriority(Notification.PRIORITY_HIGH) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java index 39e24f8b38..3bff1c9be3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientFragment.java @@ -110,16 +110,16 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick final Context context = getContext(); AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(this.getContext().getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage("Clear queue? All data in queue will be lost!"); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { UploadQueue.clearQueue(); updateGUI(); FabricPrivacy.getInstance().logCustom(new CustomEvent("NSClientClearQueue")); } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; case R.id.nsclientinternal_showqueue: @@ -165,7 +165,7 @@ public class NSClientFragment extends SubscriberFragment implements View.OnClick logScrollview.fullScroll(ScrollView.FOCUS_DOWN); } urlTextView.setText(NSClientPlugin.getPlugin().url()); - Spanned queuetext = Html.fromHtml(MainApp.sResources.getString(R.string.queue) + " " + UploadQueue.size() + ""); + Spanned queuetext = Html.fromHtml(MainApp.gs(R.string.queue) + " " + UploadQueue.size() + ""); queueTextView.setText(queuetext); statusTextView.setText(NSClientPlugin.getPlugin().status); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java index aad81a29ef..c43297ccf6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientPlugin.java @@ -18,12 +18,14 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; -import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.events.EventAppExit; +import info.nightscout.androidaps.events.EventChargingState; +import info.nightscout.androidaps.events.EventNetworkChange; +import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; @@ -58,7 +60,9 @@ public class NSClientPlugin extends PluginBase { public NSClientService nsClientService = null; - public NSClientPlugin() { + private NsClientReceiverDelegate nsClientReceiverDelegate; + + private NSClientPlugin() { super(new PluginDescription() .mainType(PluginType.GENERAL) .fragmentClass(NSClientFragment.class.getName()) @@ -78,8 +82,16 @@ public class NSClientPlugin extends PluginBase { handlerThread.start(); handler = new Handler(handlerThread.getLooper()); } + + nsClientReceiverDelegate = + new NsClientReceiverDelegate(MainApp.instance().getApplicationContext(), MainApp.bus()); } + public boolean isAllowed() { + return nsClientReceiverDelegate.allowed; + } + + @Override protected void onStart() { MainApp.bus().register(this); @@ -87,6 +99,8 @@ public class NSClientPlugin extends PluginBase { Intent intent = new Intent(context, NSClientService.class); context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); super.onStart(); + + nsClientReceiverDelegate.registerReceivers(); } @Override @@ -94,8 +108,26 @@ public class NSClientPlugin extends PluginBase { MainApp.bus().unregister(this); Context context = MainApp.instance().getApplicationContext(); context.unbindService(mConnection); + + nsClientReceiverDelegate.unregisterReceivers(); } + @Subscribe + public void onStatusEvent(EventPreferenceChange ev) { + nsClientReceiverDelegate.onStatusEvent(ev); + } + + @Subscribe + public void onStatusEvent(final EventChargingState ev) { + nsClientReceiverDelegate.onStatusEvent(ev); + } + + @Subscribe + public void onStatusEvent(final EventNetworkChange ev) { + nsClientReceiverDelegate.onStatusEvent(ev); + } + + private ServiceConnection mConnection = new ServiceConnection() { public void onServiceDisconnected(ComponentName name) { @@ -111,11 +143,12 @@ public class NSClientPlugin extends PluginBase { } }; - @SuppressWarnings("UnusedParameters") @Subscribe - public void onStatusEvent(final EventAppExit e) { - if (nsClientService != null) + public void onStatusEvent(final EventAppExit ignored) { + if (nsClientService != null) { MainApp.instance().getApplicationContext().unbindService(mConnection); + nsClientReceiverDelegate.unregisterReceivers(); + } } @Subscribe diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java new file mode 100644 index 0000000000..04b587ca24 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegate.java @@ -0,0 +1,138 @@ +package info.nightscout.androidaps.plugins.NSClientInternal; + +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.ConnectivityManager; +import android.net.wifi.WifiManager; + +import com.squareup.otto.Bus; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.events.EventChargingState; +import info.nightscout.androidaps.events.EventNetworkChange; +import info.nightscout.androidaps.events.EventPreferenceChange; +import info.nightscout.androidaps.receivers.ChargingStateReceiver; +import info.nightscout.androidaps.receivers.NetworkChangeReceiver; +import info.nightscout.utils.SP; + +class NsClientReceiverDelegate { + + private final Context context; + private final Bus bus; + + private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver(); + private ChargingStateReceiver chargingStateReceiver = new ChargingStateReceiver(); + + private boolean allowedChargingState = true; + private boolean allowedNetworkState = true; + boolean allowed = true; + + NsClientReceiverDelegate(Context context, Bus bus) { + this.context = context; + this.bus = bus; + } + + void registerReceivers() { + Context context = MainApp.instance().getApplicationContext(); + // register NetworkChangeReceiver --> https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html + // Nougat is not providing Connectivity-Action anymore ;-( + context.registerReceiver(networkChangeReceiver, + new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); + context.registerReceiver(networkChangeReceiver, + new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); + + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(context); + if (event != null) + bus.post(event); + + context.registerReceiver(chargingStateReceiver, + new IntentFilter(Intent.ACTION_POWER_CONNECTED)); + context.registerReceiver(chargingStateReceiver, + new IntentFilter(Intent.ACTION_POWER_DISCONNECTED)); + + EventChargingState eventChargingState = chargingStateReceiver.grabChargingState(context); + if (eventChargingState != null) + bus.post(eventChargingState); + + } + + void unregisterReceivers() { + context.unregisterReceiver(networkChangeReceiver); + context.unregisterReceiver(chargingStateReceiver); + } + + void onStatusEvent(EventPreferenceChange ev) { + if (ev.isChanged(R.string.key_ns_wifionly) || + ev.isChanged(R.string.key_ns_wifi_ssids) || + ev.isChanged(R.string.key_ns_allowroaming) + ) { + EventNetworkChange event = networkChangeReceiver.grabNetworkStatus(MainApp.instance().getApplicationContext()); + if (event != null) + bus.post(event); + } else if (ev.isChanged(R.string.key_ns_chargingonly)) { + EventChargingState event = chargingStateReceiver.grabChargingState(MainApp.instance().getApplicationContext()); + if (event != null) + bus.post(event); + } + } + + void onStatusEvent(final EventChargingState ev) { + boolean newChargingState = calculateStatus(ev); + + if (newChargingState != allowedChargingState) { + allowedChargingState = newChargingState; + processStateChange(); + } + } + + void onStatusEvent(final EventNetworkChange ev) { + boolean newNetworkState = calculateStatus(ev); + + if (newNetworkState != allowedNetworkState) { + allowedNetworkState = newNetworkState; + processStateChange(); + } + } + + void processStateChange() { + boolean newAllowedState = allowedChargingState && allowedNetworkState; + if (newAllowedState != allowed) { + allowed = newAllowedState; + bus.post(new EventPreferenceChange(R.string.key_nsclientinternal_paused)); + } + } + + boolean calculateStatus(final EventChargingState ev) { + boolean chargingOnly = SP.getBoolean(R.string.key_ns_chargingonly, false); + + boolean newAllowedState = true; + + if (!ev.isCharging && chargingOnly) newAllowedState = false; + + return newAllowedState; + } + + boolean calculateStatus(final EventNetworkChange ev) { + boolean wifiOnly = SP.getBoolean(R.string.key_ns_wifionly, false); + String allowedSSIDs = SP.getString(R.string.key_ns_wifi_ssids, ""); + boolean allowRoaming = SP.getBoolean(R.string.key_ns_allowroaming, true); + + boolean newAllowedState = true; + + if (ev.wifiConnected) { + if (!allowedSSIDs.trim().isEmpty() && !allowedSSIDs.contains(ev.ssid)) { + newAllowedState = false; + } + } else { + if ((!allowRoaming && ev.roaming) || wifiOnly) { + newAllowedState = false; + } + } + + + return newAllowedState; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java index 79a66186fb..2723fc0748 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbLogger.java @@ -22,7 +22,7 @@ public class DbLogger { public static void dbAdd(Intent intent, String data) { List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0); if (q.size() < 1) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.nsclientnotinstalled)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.gs(R.string.nsclientnotinstalled)); log.error("DBADD No receivers"); } else if (Config.logNSUpload) log.debug("DBADD dbAdd " + q.size() + " receivers " + data); @@ -31,7 +31,7 @@ public class DbLogger { public static void dbRemove(Intent intent, String data) { List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0); if (q.size() < 1) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.sResources.getString(R.string.nsclientnotinstalled)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(),MainApp.gs(R.string.nsclientnotinstalled)); log.error("DBREMOVE No receivers"); } else if (Config.logNSUpload) log.debug("DBREMOVE dbRemove " + q.size() + " receivers " + data); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index 1d9d832837..fab9a181c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -33,7 +33,6 @@ import info.nightscout.androidaps.db.DbRequest; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventConfigBuilderChange; import info.nightscout.androidaps.events.EventPreferenceChange; -import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.NSClientInternal.NSClientPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue; @@ -203,7 +202,10 @@ public class NSClientService extends Service { nsAPIhashCode = Hashing.sha1().hashString(nsAPISecret, Charsets.UTF_8).toString(); MainApp.bus().post(new EventNSClientStatus("Initializing")); - if (MainApp.getSpecificPlugin(NSClientPlugin.class).paused) { + if (!MainApp.getSpecificPlugin(NSClientPlugin.class).isAllowed()) { + MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "not allowed")); + MainApp.bus().post(new EventNSClientStatus("Not allowed")); + } else if (MainApp.getSpecificPlugin(NSClientPlugin.class).paused) { MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "paused")); MainApp.bus().post(new EventNSClientStatus("Paused")); } else if (!nsEnabled) { @@ -248,6 +250,7 @@ public class NSClientService extends Service { private Emitter.Listener onDisconnect = new Emitter.Listener() { @Override public void call(Object... args) { + log.debug("disconnect reason: {}", args); MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "disconnect event")); } }; @@ -306,7 +309,7 @@ public class NSClientService extends Service { MainApp.bus().post(new EventNSClientNewLog("ERROR", "Write treatment permission not granted !!!!")); } if (!hasWriteAuth) { - Notification noperm = new Notification(Notification.NSCLIENT_NO_WRITE_PERMISSION, MainApp.sResources.getString(R.string.nowritepermission), Notification.URGENT); + Notification noperm = new Notification(Notification.NSCLIENT_NO_WRITE_PERMISSION, MainApp.gs(R.string.nowritepermission), Notification.URGENT); MainApp.bus().post(new EventNewNotification(noperm)); } else { MainApp.bus().post(new EventDismissNotification(Notification.NSCLIENT_NO_WRITE_PERMISSION)); @@ -652,7 +655,7 @@ public class NSClientService extends Service { } //MainApp.bus().post(new EventNSClientNewLog("NSCLIENT", "onDataUpdate end"); } finally { - if (wakeLock.isHeld()) wakeLock.release(); + if (wakeLock.isHeld()) wakeLock.release(); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java index 96e004d996..4c8de10b9c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/DetermineBasalAdapterAMAJS.java @@ -212,9 +212,13 @@ public class DetermineBasalAdapterAMAJS { mProfile.put("skip_neutral_temps", true); mProfile.put("current_basal", basalrate); mProfile.put("temptargetSet", tempTargetSet); - mProfile.put("autosens_adjust_targets", SP.getBoolean("openapsama_autosens_adjusttargets", true)); - //TODO: align with max-absorption model in AMA sensitivity - mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); + mProfile.put("autosens_adjust_targets", SP.getBoolean(R.string.key_openapsama_autosens_adjusttargets, true)); + //align with max-absorption model in AMA sensitivity + if(mealData.usedMinCarbsImpact > 0){ + mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); + } else { + mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact)); + } if (units.equals(Constants.MMOL)) { mProfile.put("out_units", "mmol/L"); @@ -239,7 +243,7 @@ public class DetermineBasalAdapterAMAJS { mGlucoseStatus = new JSONObject(); mGlucoseStatus.put("glucose", glucoseStatus.glucose); - if (SP.getBoolean("always_use_shortavg", false)) { + if (SP.getBoolean(R.string.key_always_use_shortavg, false)) { mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta); } else { mGlucoseStatus.put("delta", glucoseStatus.delta); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java index 9c9ad7d222..f05b0ac696 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAFragment.java @@ -72,7 +72,7 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli public void onClick(View view) { switch (view.getId()) { case R.id.openapsma_run: - OpenAPSAMAPlugin.getPlugin().invoke("OpenAPSAMA button"); + OpenAPSAMAPlugin.getPlugin().invoke("OpenAPSAMA button", false); FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_AMA_Run")); break; } @@ -107,7 +107,7 @@ public class OpenAPSAMAFragment extends SubscriberFragment implements View.OnCli currentTempView.setText(JSONFormatter.format(determineBasalAdapterAMAJS.getCurrentTempParam())); try { JSONArray iobArray = new JSONArray(determineBasalAdapterAMAJS.getIobDataParam()); - iobDataView.setText(String.format(MainApp.sResources.getString(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))); + iobDataView.setText(String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))); } catch (JSONException e) { log.error("Unhandled exception", e); iobDataView.setText("JSONException"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java index 2789c75252..143456f6fc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSAMA/OpenAPSAMAPlugin.java @@ -88,8 +88,8 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator) { - log.debug("invoke from " + initiator); + public void invoke(String initiator, boolean tempBasalFallback) { + log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterAMAJS determineBasalAdapterAMAJS; try { @@ -104,23 +104,23 @@ public class OpenAPSAMAPlugin extends PluginBase implements APSInterface { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (profile == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.noprofileselected)); + log.debug(MainApp.gs(R.string.noprofileselected)); return; } if (!isEnabled(PluginType.APS)) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_disabled)); + log.debug(MainApp.gs(R.string.openapsma_disabled)); return; } if (glucoseStatus == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata)); + log.debug(MainApp.gs(R.string.openapsma_noglucosedata)); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java index a56636385d..6275154450 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/DetermineBasalAdapterMAJS.java @@ -18,6 +18,7 @@ import java.lang.reflect.InvocationTargetException; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.Constants; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; import info.nightscout.androidaps.data.MealData; @@ -197,7 +198,7 @@ public class DetermineBasalAdapterMAJS { mGlucoseStatus = new JSONObject(); mGlucoseStatus.put("glucose", glucoseStatus.glucose); - if (SP.getBoolean("always_use_shortavg", false)) { + if (SP.getBoolean(R.string.key_always_use_shortavg, false)) { mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta); } else { mGlucoseStatus.put("delta", glucoseStatus.delta); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java index 6b8cb9d0aa..7360bb8b2a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAFragment.java @@ -66,7 +66,7 @@ public class OpenAPSMAFragment extends SubscriberFragment implements View.OnClic public void onClick(View view) { switch (view.getId()) { case R.id.openapsma_run: - OpenAPSMAPlugin.getPlugin().invoke("OpenAPSMA button"); + OpenAPSMAPlugin.getPlugin().invoke("OpenAPSMA button", false); FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_MA_Run")); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java index 0d9895bad7..14dac65625 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSMA/OpenAPSMAPlugin.java @@ -88,8 +88,8 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator) { - log.debug("invoke from " + initiator); + public void invoke(String initiator, boolean tempBasalFallback) { + log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterMAJS determineBasalAdapterMAJS = null; try { @@ -104,23 +104,23 @@ public class OpenAPSMAPlugin extends PluginBase implements APSInterface { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (profile == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.noprofileselected)); + log.debug(MainApp.gs(R.string.noprofileselected)); return; } if (!isEnabled(PluginType.APS)) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_disabled)); + log.debug(MainApp.gs(R.string.openapsma_disabled)); return; } if (glucoseStatus == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata)); + log.debug(MainApp.gs(R.string.openapsma_noglucosedata)); return; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java index 89bf8431f4..da96241e61 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/DetermineBasalAdapterSMBJS.java @@ -214,7 +214,7 @@ public class DetermineBasalAdapterSMBJS { double autosensDataRatio, boolean tempTargetSet, boolean microBolusAllowed, - boolean smbAlwaysAllowed + boolean advancedFiltering ) throws JSONException { String units = profile.getUnits(); @@ -243,23 +243,26 @@ public class DetermineBasalAdapterSMBJS { mProfile.put("half_basal_exercise_target", SMBDefaults.half_basal_exercise_target); mProfile.put("maxCOB", SMBDefaults.maxCOB); mProfile.put("skip_neutral_temps", SMBDefaults.skip_neutral_temps); - //TODO: align with max-absorption model in AMA sensitivity - mProfile.put("min_5m_carbimpact", SP.getDouble("openapsama_min_5m_carbimpact", SMBDefaults.min_5m_carbimpact)); - ; + //align with max-absorption model in AMA sensitivity + if(mealData.usedMinCarbsImpact > 0){ + mProfile.put("min_5m_carbimpact", mealData.usedMinCarbsImpact); + } else { + mProfile.put("min_5m_carbimpact", SP.getDouble(R.string.key_openapsama_min_5m_carbimpact, SMBDefaults.min_5m_carbimpact)); + } mProfile.put("remainingCarbsCap", SMBDefaults.remainingCarbsCap); - mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false)); + mProfile.put("enableUAM", SP.getBoolean(R.string.key_use_uam, false)&& advancedFiltering); mProfile.put("A52_risk_enable", SMBDefaults.A52_risk_enable); mProfile.put("enableSMB_with_COB", SP.getBoolean(R.string.key_enableSMB_with_COB, false)); mProfile.put("enableSMB_with_temptarget", SP.getBoolean(R.string.key_enableSMB_with_temptarget, false)); mProfile.put("allowSMB_with_high_temptarget", SP.getBoolean(R.string.key_allowSMB_with_high_temptarget, false)); - mProfile.put("enableSMB_always", SP.getBoolean(R.string.key_enableSMB_always, false) && smbAlwaysAllowed); - mProfile.put("enableSMB_after_carbs", SP.getBoolean(R.string.key_enableSMB_after_carbs, false) && smbAlwaysAllowed); + mProfile.put("enableSMB_always", SP.getBoolean(R.string.key_enableSMB_always, false) && advancedFiltering); + mProfile.put("enableSMB_after_carbs", SP.getBoolean(R.string.key_enableSMB_after_carbs, false) && advancedFiltering); mProfile.put("maxSMBBasalMinutes", SP.getInt("key_smbmaxminutes", SMBDefaults.maxSMBBasalMinutes)); mProfile.put("carbsReqThreshold", SMBDefaults.carbsReqThreshold); mProfile.put("current_basal", basalrate); mProfile.put("temptargetSet", tempTargetSet); - mProfile.put("autosens_max", SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + mProfile.put("autosens_max", SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (units.equals(Constants.MMOL)) { mProfile.put("out_units", "mmol/L"); @@ -285,7 +288,7 @@ public class DetermineBasalAdapterSMBJS { mGlucoseStatus = new JSONObject(); mGlucoseStatus.put("glucose", glucoseStatus.glucose); - if (SP.getBoolean("always_use_shortavg", false)) { + if (SP.getBoolean(R.string.key_always_use_shortavg, false)) { mGlucoseStatus.put("delta", glucoseStatus.short_avgdelta); } else { mGlucoseStatus.put("delta", glucoseStatus.delta); @@ -312,7 +315,7 @@ public class DetermineBasalAdapterSMBJS { mAutosensData.put("ratio", 1.0); } mMicrobolusAllowed = microBolusAllowed; - mSMBAlwaysAllowed = smbAlwaysAllowed; + mSMBAlwaysAllowed = advancedFiltering; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java index c35e229354..724bfcf86c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBFragment.java @@ -66,7 +66,7 @@ public class OpenAPSSMBFragment extends SubscriberFragment { @OnClick(R.id.openapsma_run) public void onRunClick() { - OpenAPSSMBPlugin.getPlugin().invoke("OpenAPSSMB button"); + OpenAPSSMBPlugin.getPlugin().invoke("OpenAPSSMB button", false); FabricPrivacy.getInstance().logCustom(new CustomEvent("OpenAPS_SMB_Run")); } @@ -99,7 +99,7 @@ public class OpenAPSSMBFragment extends SubscriberFragment { currentTempView.setText(JSONFormatter.format(determineBasalAdapterSMBJS.getCurrentTempParam()).toString().trim()); try { JSONArray iobArray = new JSONArray(determineBasalAdapterSMBJS.getIobDataParam()); - iobDataView.setText((String.format(MainApp.sResources.getString(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))).trim()); + iobDataView.setText((String.format(MainApp.gs(R.string.array_of_elements), iobArray.length()) + "\n" + JSONFormatter.format(iobArray.getString(0))).trim()); } catch (JSONException e) { log.error("Unhandled exception", e); iobDataView.setText("JSONException see log for details"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java index 60b516fc63..49a81ea612 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/OpenAPSSMB/OpenAPSSMBPlugin.java @@ -91,8 +91,8 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { } @Override - public void invoke(String initiator) { - log.debug("invoke from " + initiator); + public void invoke(String initiator, boolean tempBasalFallback) { + log.debug("invoke from " + initiator + " tempBasalFallback: " + tempBasalFallback); lastAPSResult = null; DetermineBasalAdapterSMBJS determineBasalAdapterSMBJS = null; try { @@ -107,23 +107,23 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (profile == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.noprofileselected))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.noprofileselected))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.noprofileselected)); + log.debug(MainApp.gs(R.string.noprofileselected)); return; } if (!isEnabled(PluginType.APS)) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_disabled))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_disabled))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_disabled)); + log.debug(MainApp.gs(R.string.openapsma_disabled)); return; } if (glucoseStatus == null) { - MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.instance().getString(R.string.openapsma_noglucosedata))); + MainApp.bus().post(new EventOpenAPSUpdateResultGui(MainApp.gs(R.string.openapsma_noglucosedata))); if (Config.logAPSResult) - log.debug(MainApp.instance().getString(R.string.openapsma_noglucosedata)); + log.debug(MainApp.gs(R.string.openapsma_noglucosedata)); return; } @@ -184,13 +184,13 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { lastAutosensResult = new AutosensResult(); } - Constraint smbAllowed = new Constraint<>(true); + Constraint smbAllowed = new Constraint<>(!tempBasalFallback); MainApp.getConstraintChecker().isSMBModeEnabled(smbAllowed); inputConstraints.copyReasons(smbAllowed); - Constraint smbAlwaysEnabled = new Constraint<>(true); - MainApp.getConstraintChecker().isAdvancedFilteringEnabled(smbAlwaysEnabled); - inputConstraints.copyReasons(smbAlwaysEnabled); + Constraint advancedFiltering = new Constraint<>(!tempBasalFallback); + MainApp.getConstraintChecker().isAdvancedFilteringEnabled(advancedFiltering); + inputConstraints.copyReasons(advancedFiltering); Profiler.log(log, "detectSensitivityandCarbAbsorption()", startPart); Profiler.log(log, "SMB data gathering", start); @@ -201,7 +201,7 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { lastAutosensResult.ratio, //autosensDataRatio isTempTarget, smbAllowed.value(), - smbAlwaysEnabled.value() + advancedFiltering.value() ); } catch (JSONException e) { log.error(e.getMessage()); @@ -255,9 +255,9 @@ public class OpenAPSSMBPlugin extends PluginBase implements APSInterface { if (newvalue < lowLimit || newvalue > highLimit) { newvalue = Math.max(newvalue, lowLimit); newvalue = Math.min(newvalue, highLimit); - String msg = String.format(MainApp.sResources.getString(R.string.valueoutofrange), valueName); + String msg = String.format(MainApp.gs(R.string.valueoutofrange), valueName); msg += ".\n"; - msg += String.format(MainApp.sResources.getString(R.string.valuelimitedto), value, newvalue); + msg += String.format(MainApp.gs(R.string.valuelimitedto), value, newvalue); log.error(msg); NSUpload.uploadError(msg); ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), msg, R.raw.error); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java index 35906187a6..2ca8e6961a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/BolusProgressDialog.java @@ -42,7 +42,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL } public void setInsulin(double amount) { - this.amount = amount; + BolusProgressDialog.amount = amount; bolusEnded = false; } @@ -53,15 +53,15 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - getDialog().setTitle(String.format(MainApp.sResources.getString(R.string.overview_bolusprogress_goingtodeliver), amount)); + getDialog().setTitle(String.format(MainApp.gs(R.string.overview_bolusprogress_goingtodeliver), amount)); View view = inflater.inflate(R.layout.overview_bolusprogress_dialog, container, false); - stopButton = (Button) view.findViewById(R.id.overview_bolusprogress_stop); - statusView = (TextView) view.findViewById(R.id.overview_bolusprogress_status); - stopPressedView = (TextView) view.findViewById(R.id.overview_bolusprogress_stoppressed); - progressBar = (ProgressBar) view.findViewById(R.id.overview_bolusprogress_progressbar); + stopButton = view.findViewById(R.id.overview_bolusprogress_stop); + statusView = view.findViewById(R.id.overview_bolusprogress_status); + stopPressedView = view.findViewById(R.id.overview_bolusprogress_stoppressed); + progressBar = view.findViewById(R.id.overview_bolusprogress_progressbar); stopButton.setOnClickListener(this); progressBar.setMax(100); - statusView.setText(MainApp.sResources.getString(R.string.waitingforpump)); + statusView.setText(MainApp.gs(R.string.waitingforpump)); setCancelable(false); stopPressed = false; return view; @@ -70,16 +70,25 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public void onResume() { super.onResume(); - if (getDialog() != null) - getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - MainApp.bus().register(this); - running = true; - if (bolusEnded) dismiss(); + if (bolusEnded) { + dismiss(); + } else { + if (getDialog() != null) + getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + MainApp.subscribe(this); + running = true; + } } @Override public void dismiss() { - super.dismiss(); + try { + super.dismiss(); + } catch (IllegalStateException e) { + // dialog not running yet. onResume will try again. Set bolusEnded to make extra + // sure onResume will catch this + bolusEnded = true; + } if (helperActivity != null) { helperActivity.finish(); } @@ -88,7 +97,7 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Override public void onPause() { super.onPause(); - MainApp.bus().unregister(this); + MainApp.unsubscribe(this); running = false; } @@ -109,16 +118,13 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL public void onStatusEvent(final EventOverviewBolusProgress ev) { Activity activity = getActivity(); if (activity != null) { - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - log.debug("Status: " + ev.status + " Percent: " + ev.percent); - statusView.setText(ev.status); - progressBar.setProgress(ev.percent); - if (ev.percent == 100) { - stopButton.setVisibility(View.INVISIBLE); - scheduleDismiss(); - } + activity.runOnUiThread(() -> { + log.debug("Status: " + ev.status + " Percent: " + ev.percent); + statusView.setText(ev.status); + progressBar.setProgress(ev.percent); + if (ev.percent == 100) { + stopButton.setVisibility(View.INVISIBLE); + scheduleDismiss(); } }); } @@ -133,41 +139,25 @@ public class BolusProgressDialog extends DialogFragment implements View.OnClickL @Subscribe public void onStatusEvent(final EventPumpStatusChanged c) { - Activity activity = getActivity(); if (activity != null) { - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - statusView.setText(c.textStatus()); - } - } - ); + activity.runOnUiThread(() -> statusView.setText(c.textStatus())); } - } private void scheduleDismiss() { - Thread t = new Thread(new Runnable() { - @Override - public void run() { - SystemClock.sleep(5000); - BolusProgressDialog.bolusEnded = true; - Activity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread( - new Runnable() { - @Override - public void run() { - try { - dismiss(); - } catch (Exception e) { - log.error("Unhandled exception", e); - } - } - }); - } + Thread t = new Thread(() -> { + SystemClock.sleep(5000); + BolusProgressDialog.bolusEnded = true; + Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(() -> { + try { + dismiss(); + } catch (Exception e) { + log.error("Unhandled exception", e); + } + }); } }); t.start(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java index 2751b800bc..50de25b656 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/EditQuickWizardDialog.java @@ -149,13 +149,13 @@ public class EditQuickWizardDialog extends DialogFragment implements View.OnClic int getSelection(Spinner spinner) { String value = spinner.getSelectedItem().toString(); - if (value.equals(MainApp.sResources.getString(R.string.yes))) + if (value.equals(MainApp.gs(R.string.yes))) return QuickWizardEntry.YES; - if (value.equals(MainApp.sResources.getString(R.string.no))) + if (value.equals(MainApp.gs(R.string.no))) return QuickWizardEntry.NO; - if (value.equals(MainApp.sResources.getString(R.string.positiveonly))) + if (value.equals(MainApp.gs(R.string.positiveonly))) return QuickWizardEntry.POSITIVE_ONLY; - if (value.equals(MainApp.sResources.getString(R.string.negativeonly))) + if (value.equals(MainApp.gs(R.string.negativeonly))) return QuickWizardEntry.NEGATIVE_ONLY; return QuickWizardEntry.NO; } @@ -164,19 +164,19 @@ public class EditQuickWizardDialog extends DialogFragment implements View.OnClic String selection; switch (value) { case QuickWizardEntry.YES: - selection = MainApp.sResources.getString(R.string.yes); + selection = MainApp.gs(R.string.yes); break; case QuickWizardEntry.NO: - selection = MainApp.sResources.getString(R.string.no); + selection = MainApp.gs(R.string.no); break; case QuickWizardEntry.POSITIVE_ONLY: - selection = MainApp.sResources.getString(R.string.positiveonly); + selection = MainApp.gs(R.string.positiveonly); break; case QuickWizardEntry.NEGATIVE_ONLY: - selection = MainApp.sResources.getString(R.string.negativeonly); + selection = MainApp.gs(R.string.negativeonly); break; default: - selection = MainApp.sResources.getString(R.string.no); + selection = MainApp.gs(R.string.no); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java index bd489971c2..c60d237882 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewCarbsDialog.java @@ -133,9 +133,6 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C editTime = view.findViewById(R.id.newcarbs_time); editTime.setParams(0d, -12 * 60d, 12 * 60d, 5d, new DecimalFormat("0"), false, textWatcher); - LinearLayout durationLayout = view.findViewById(R.id.newcarbs_duration_layout); - durationLayout.setVisibility(MainApp.engineeringMode ? View.VISIBLE : View.GONE); - editDuration = view.findViewById(R.id.new_carbs_duration); editDuration.setParams(0d, 0d, 10d, 1d, new DecimalFormat("0"), false, textWatcher); @@ -406,7 +403,8 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C long carbTime = time + i * 15 * 60 * 1000; long smallCarbAmount = Math.round((1d * remainingCarbs) / (ticks-i)); //on last iteration (ticks-i) is 1 -> smallCarbAmount == remainingCarbs remainingCarbs -= smallCarbAmount; - createCarb(smallCarbAmount, carbTime, notes); + if (smallCarbAmount > 0) + createCarb(smallCarbAmount, carbTime, notes); } } } @@ -431,7 +429,7 @@ public class NewCarbsDialog extends DialogFragment implements OnClickListener, C carbInfo.context = getContext(); carbInfo.source = Source.USER; carbInfo.notes = notes; - if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo) { + if (ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo && carbInfo.date <= now()) { ConfigBuilderPlugin.getCommandQueue().bolus(carbInfo, new Callback() { @Override public void run() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java index f21ccac0e2..a315310dc8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/NewTreatmentDialog.java @@ -35,6 +35,7 @@ import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.queue.Callback; +import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.FabricPrivacy; import info.nightscout.utils.NumberPicker; import info.nightscout.utils.SafeParse; @@ -104,7 +105,7 @@ public class NewTreatmentDialog extends DialogFragment implements OnClickListene editInsulin = (NumberPicker) view.findViewById(R.id.treatments_newtreatment_insulinamount); editCarbs.setParams(0d, 0d, (double) maxCarbs, 1d, new DecimalFormat("0"), false, textWatcher); - editInsulin.setParams(0d, 0d, maxInsulin, ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep, new DecimalFormat("0.00"), false, textWatcher); + editInsulin.setParams(0d, 0d, maxInsulin, ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep, DecimalFormatter.pumpSupportedBolusFormat(), false, textWatcher); recordOnlyCheckbox = (CheckBox) view.findViewById(R.id.newtreatment_record_only); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java index edee0c838d..718b1c6bfa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/Dialogs/WizardDialog.java @@ -56,7 +56,7 @@ import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; @@ -270,13 +270,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com } private void saveCheckedStates() { - SP.putBoolean(getString(R.string.key_wizard_include_cob), cobCheckbox.isChecked()); - SP.putBoolean(getString(R.string.key_wizard_include_trend_bg), bgtrendCheckbox.isChecked()); + SP.putBoolean(MainApp.gs(R.string.key_wizard_include_cob), cobCheckbox.isChecked()); + SP.putBoolean(MainApp.gs(R.string.key_wizard_include_trend_bg), bgtrendCheckbox.isChecked()); } private void loadCheckedStates() { - bgtrendCheckbox.setChecked(SP.getBoolean(getString(R.string.key_wizard_include_trend_bg), false)); - cobCheckbox.setChecked(SP.getBoolean(getString(R.string.key_wizard_include_cob), false)); + bgtrendCheckbox.setChecked(SP.getBoolean(MainApp.gs(R.string.key_wizard_include_trend_bg), false)); + cobCheckbox.setChecked(SP.getBoolean(MainApp.gs(R.string.key_wizard_include_cob), false)); } @Override @@ -287,7 +287,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com @Override public void onNothingSelected(AdapterView parent) { - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.noprofileselected)); + ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.noprofileselected)); okButton.setVisibility(View.GONE); } @@ -306,20 +306,20 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com if (profile != null && (calculatedTotalInsulin > 0d || calculatedCarbs > 0d)) { DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00"); - String confirmMessage = getString(R.string.entertreatmentquestion); + 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(); - confirmMessage += "
" + getString(R.string.bolus) + ": " + "" + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U" + ""; - confirmMessage += "
" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + confirmMessage += "
" + MainApp.gs(R.string.bolus) + ": " + "" + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U" + ""; + confirmMessage += "
" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; if (insulinAfterConstraints - calculatedTotalInsulin != 0 || !carbsAfterConstraints.equals(calculatedCarbs)) { AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), null); + 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(); return; } @@ -332,9 +332,9 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com final String finalNotes = notesEdit.getText().toString(); final AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(Html.fromHtml(confirmMessage)); - builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { synchronized (builder) { if (accepted) { @@ -356,7 +356,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.tempbasaldeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.tempbasaldeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -382,7 +382,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); i.putExtra("soundid", R.raw.boluserror); i.putExtra("status", result.comment); - i.putExtra("title", MainApp.sResources.getString(R.string.treatmentdeliveryerror)); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MainApp.instance().startActivity(i); } @@ -396,7 +396,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com } } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); dismiss(); } @@ -412,14 +412,14 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com ProfileStore profileStore = MainApp.getConfigBuilder().getActiveProfileInterface().getProfile(); if (profile == null) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.noprofile)); dismiss(); return; } ArrayList profileList; profileList = profileStore.getProfileList(); - profileList.add(0, MainApp.sResources.getString(R.string.active)); + profileList.add(0, MainApp.gs(R.string.active)); ArrayAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.spinner_centered, profileList); @@ -458,7 +458,7 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com return; // not initialized yet String selectedAlternativeProfile = profileSpinner.getSelectedItem().toString(); Profile specificProfile; - if (selectedAlternativeProfile.equals(MainApp.sResources.getString(R.string.active))) + if (selectedAlternativeProfile.equals(MainApp.gs(R.string.active))) specificProfile = MainApp.getConfigBuilder().getProfile(); else specificProfile = profileStore.getSpecificProfile(selectedAlternativeProfile); @@ -472,13 +472,13 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com c_correction = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(c_correction)).value(); if (c_correction - corrAfterConstraint != 0) { // c_correction != corrAfterConstraint doesn't work editCorr.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.bolusconstraintapplied)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.bolusconstraintapplied)); return; } Integer carbsAfterConstraint = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(c_carbs)).value(); if (c_carbs - carbsAfterConstraint != 0) { editCarbs.setValue(0d); - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), getString(R.string.carbsconstraintapplied)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.carbsconstraintapplied)); return; } @@ -488,11 +488,9 @@ public class WizardDialog extends DialogFragment implements OnClickListener, Com // COB Double c_cob = 0d; if (cobCheckbox.isChecked()) { - AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Wizard COB"); - - if (autosensData != null) { - c_cob = autosensData.cob; - } + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard COB"); + if (cobInfo != null && cobInfo.displayCob != null) + c_cob = cobInfo.displayCob; } BolusWizard wizard = new BolusWizard(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java index b22d0450e0..3d0970f8f4 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/OverviewFragment.java @@ -5,7 +5,6 @@ import android.app.Activity; import android.app.NotificationManager; import android.content.ActivityNotFoundException; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Color; @@ -15,10 +14,8 @@ import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; -import android.support.v4.content.ContextCompat; import android.support.v4.content.res.ResourcesCompat; import android.support.v7.app.AlertDialog; -import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; @@ -33,7 +30,6 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageButton; @@ -52,8 +48,6 @@ import org.slf4j.LoggerFactory; import java.text.DecimalFormat; import java.util.Calendar; import java.util.Date; -import java.util.List; -import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -94,12 +88,12 @@ import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialo import info.nightscout.androidaps.plugins.Careportal.OptionsToShow; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConstraintsObjectives.ObjectivesPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventAutosensCalculationFinished; +import info.nightscout.androidaps.plugins.IobCobCalculator.events.EventIobCalculationProgress; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Loop.events.EventNewOpenLoopNotification; -import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastAckAlarm; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.Overview.Dialogs.CalibrationDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.ErrorHelperActivity; @@ -108,10 +102,8 @@ import info.nightscout.androidaps.plugins.Overview.Dialogs.NewInsulinDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.NewTreatmentDialog; import info.nightscout.androidaps.plugins.Overview.Dialogs.WizardDialog; import info.nightscout.androidaps.plugins.Overview.activities.QuickWizardListActivity; -import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventSetWakeLock; import info.nightscout.androidaps.plugins.Overview.graphData.GraphData; -import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.Overview.notifications.NotificationRecyclerViewAdapter; import info.nightscout.androidaps.plugins.Overview.notifications.NotificationStore; import info.nightscout.androidaps.plugins.Source.SourceDexcomG5Plugin; @@ -150,6 +142,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, TextView pumpDeviceStatusView; TextView openapsDeviceStatusView; TextView uploaderDeviceStatusView; + TextView iobCalculationProgressView; LinearLayout loopStatusLayout; LinearLayout pumpStatusLayout; GraphView bgGraph; @@ -191,9 +184,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final Object updateSync = new Object(); - public enum CHARTTYPE {PRE, BAS, IOB, COB, DEV, SEN} - - ; + public enum CHARTTYPE {PRE, BAS, IOB, COB, DEV, SEN, DEVSLOPE} private static final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); private static ScheduledFuture scheduledUpdate = null; @@ -245,6 +236,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, pumpDeviceStatusView = (TextView) view.findViewById(R.id.overview_pump); openapsDeviceStatusView = (TextView) view.findViewById(R.id.overview_openaps); uploaderDeviceStatusView = (TextView) view.findViewById(R.id.overview_uploader); + iobCalculationProgressView = (TextView) view.findViewById(R.id.overview_iobcalculationprogess); loopStatusLayout = (LinearLayout) view.findViewById(R.id.overview_looplayout); pumpStatusLayout = (LinearLayout) view.findViewById(R.id.overview_pumpstatuslayout); @@ -416,26 +408,33 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, item.setCheckable(true); item.setChecked(SP.getBoolean("showratios", false)); + if (MainApp.devBranch) { + item = popup.getMenu().add(Menu.NONE, CHARTTYPE.DEVSLOPE.ordinal(), Menu.NONE, "Deviation slope"); + title = item.getTitle(); + s = new SpannableString(title); + s.setSpan(new ForegroundColorSpan(ResourcesCompat.getColor(getResources(), R.color.devslopepos, null)), 0, s.length(), 0); + item.setTitle(s); + item.setCheckable(true); + item.setChecked(SP.getBoolean("showdevslope", false)); + } + popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == CHARTTYPE.PRE.ordinal()) { SP.putBoolean("showprediction", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.BAS.ordinal()) { SP.putBoolean("showbasals", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.IOB.ordinal()) { SP.putBoolean("showiob", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.COB.ordinal()) { SP.putBoolean("showcob", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.DEV.ordinal()) { SP.putBoolean("showdeviations", !item.isChecked()); - } else if (item.getItemId() == CHARTTYPE.SEN.ordinal()) { SP.putBoolean("showratios", !item.isChecked()); + } else if (item.getItemId() == CHARTTYPE.DEVSLOPE.ordinal()) { + SP.putBoolean("showdevslope", !item.isChecked()); } scheduleUpdateGUI("onGraphCheckboxesCheckedChanged"); return true; @@ -679,9 +678,9 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, final LoopPlugin.LastRun finalLastRun = LoopPlugin.lastRun; if (finalLastRun != null && finalLastRun.lastAPSRun != null && finalLastRun.constraintsProcessed.isChangeRequested()) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(getContext().getString(R.string.confirmation)); - builder.setMessage(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); - builder.setPositiveButton(getContext().getString(R.string.ok), (dialog, id) -> { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); + builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> { hideTempRecommendation(); clearNotification(); MainApp.getConfigBuilder().applyTBRRequest(finalLastRun.constraintsProcessed, profile, new Callback() { @@ -703,7 +702,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, }); FabricPrivacy.getInstance().logCustom(new CustomEvent("AcceptTemp")); }); - builder.setNegativeButton(getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); } } @@ -743,18 +742,18 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, } if (wizard.calculatedTotalInsulin > 0d && quickWizardEntry.carbs() > 0d) { DecimalFormat formatNumber2decimalplaces = new DecimalFormat("0.00"); - String confirmMessage = getString(R.string.entertreatmentquestion); + String confirmMessage = MainApp.gs(R.string.entertreatmentquestion); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(wizard.calculatedTotalInsulin)).value(); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(quickWizardEntry.carbs())).value(); - confirmMessage += "\n" + getString(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; - confirmMessage += "\n" + getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + confirmMessage += "\n" + MainApp.gs(R.string.bolus) + ": " + formatNumber2decimalplaces.format(insulinAfterConstraints) + "U"; + confirmMessage += "\n" + MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; if (!insulinAfterConstraints.equals(wizard.calculatedTotalInsulin) || !carbsAfterConstraints.equals(quickWizardEntry.carbs())) { AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(MainApp.gs(R.string.treatmentdeliveryerror)); - builder.setMessage(getString(R.string.constraints_violation) + "\n" + getString(R.string.changeyourinput)); + builder.setMessage(MainApp.gs(R.string.constraints_violation) + "\n" + MainApp.gs(R.string.changeyourinput)); builder.setPositiveButton(MainApp.gs(R.string.ok), null); builder.show(); return; @@ -767,7 +766,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, accepted = false; builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(getString(R.string.ok), (dialog, id) -> { + builder.setPositiveButton(MainApp.gs(R.string.ok), (dialog, id) -> { synchronized (builder) { if (accepted) { log.debug("guarding: already accepted"); @@ -802,24 +801,28 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, detailedBolusInfo.context = context; detailedBolusInfo.boluscalc = boluscalcJSON; detailedBolusInfo.source = Source.USER; - ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { - @Override - public void run() { - if (!result.success) { - Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); - i.putExtra("soundid", R.raw.boluserror); - i.putExtra("status", result.comment); - i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); - i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - MainApp.instance().startActivity(i); + if (finalInsulinAfterConstraints > 0 || ConfigBuilderPlugin.getActivePump().getPumpDescription().storesCarbInfo) { + ConfigBuilderPlugin.getCommandQueue().bolus(detailedBolusInfo, new Callback() { + @Override + public void run() { + if (!result.success) { + Intent i = new Intent(MainApp.instance(), ErrorHelperActivity.class); + i.putExtra("soundid", R.raw.boluserror); + i.putExtra("status", result.comment); + i.putExtra("title", MainApp.gs(R.string.treatmentdeliveryerror)); + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + MainApp.instance().startActivity(i); + } } - } - }); + }); + } else { + TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo); + } FabricPrivacy.getInstance().logCustom(new CustomEvent("QuickWizard")); } } }); - builder.setNegativeButton(getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); } } @@ -911,15 +914,22 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, activity.runOnUiThread(() -> updatePumpStatus(s.textStatus())); } + @Subscribe + public void onStatusEvent(final EventIobCalculationProgress e) { + Activity activity = getActivity(); + if (activity != null) + activity.runOnUiThread(() -> { + if (iobCalculationProgressView != null) + iobCalculationProgressView.setText(e.progress); + }); + } + private void hideTempRecommendation() { Activity activity = getActivity(); if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - if (acceptTempLayout != null) - acceptTempLayout.setVisibility(View.GONE); - } + activity.runOnUiThread(() -> { + if (acceptTempLayout != null) + acceptTempLayout.setVisibility(View.GONE); }); } @@ -1081,7 +1091,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, if (showAcceptButton && pump.isInitialized() && !pump.isSuspended() && LoopPlugin.getPlugin().isEnabled(PluginType.LOOP)) { acceptTempLayout.setVisibility(View.VISIBLE); - acceptTempButton.setText(getContext().getString(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); + acceptTempButton.setText(MainApp.gs(R.string.setbasalquestion) + "\n" + finalLastRun.constraintsProcessed); } else { acceptTempLayout.setVisibility(View.GONE); } @@ -1168,7 +1178,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, extendedBolusView.setText(extendedBolusText); } if (extendedBolusText.equals("")) - extendedBolusView.setVisibility(View.INVISIBLE); + extendedBolusView.setVisibility(View.GONE); else extendedBolusView.setVisibility(View.VISIBLE); } @@ -1259,14 +1269,14 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, iobView.setText(iobtext); iobView.setOnClickListener(v -> { String iobtext1 = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U\n" - + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U\n" - + getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U\n"; + + MainApp.gs(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U\n" + + MainApp.gs(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U\n"; OKDialog.show(getActivity(), MainApp.gs(R.string.iob), iobtext1, null); }); } else if (MainApp.sResources.getBoolean(R.bool.isTablet)) { String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" - + getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " - + getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; + + MainApp.gs(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " + + MainApp.gs(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; iobView.setText(iobtext); } else { String iobtext = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" @@ -1277,10 +1287,13 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // cob if (cobView != null) { // view must not exists - String cobText = ""; - AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("Overview COB"); - if (autosensData != null) - cobText = (int) autosensData.cob + " g"; + String cobText = MainApp.gs(R.string.value_unavailable_short); + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Overview COB"); + if (cobInfo.displayCob != null) { + cobText = DecimalFormatter.to0Decimal(cobInfo.displayCob); + if (cobInfo.futureCarbs > 0) + cobText += "(" + DecimalFormatter.to0Decimal(cobInfo.futureCarbs) + ")"; + } cobView.setText(cobText); } @@ -1346,7 +1359,8 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, // **** BG **** if (predictionsAvailable && SP.getBoolean("showprediction", false)) - graphData.addBgReadings(fromTime, toTime, lowLine, highLine, finalLastRun.constraintsProcessed); + graphData.addBgReadings(fromTime, toTime, lowLine, highLine, + finalLastRun.constraintsProcessed.getPredictions()); else graphData.addBgReadings(fromTime, toTime, lowLine, highLine, null); @@ -1386,7 +1400,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, useDevForScale = true; } else if (SP.getBoolean("showratios", false)) { useRatioForScale = true; - } else if (Config.displayDeviationSlope) { + } else if (SP.getBoolean("showdevslope", false)) { useDSForScale = true; } @@ -1398,7 +1412,7 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, secondGraphData.addDeviations(fromTime, now, useDevForScale, 1d); if (SP.getBoolean("showratios", false)) secondGraphData.addRatio(fromTime, now, useRatioForScale, 1d); - if (Config.displayDeviationSlope) + if (SP.getBoolean("showdevslope", false)) secondGraphData.addDeviationSlope(fromTime, now, useDSForScale, 1d); // **** NOW line **** @@ -1410,7 +1424,11 @@ public class OverviewFragment extends Fragment implements View.OnClickListener, FragmentActivity activity = getActivity(); if (activity != null) { activity.runOnUiThread(() -> { - if (SP.getBoolean("showiob", true) || SP.getBoolean("showcob", true) || SP.getBoolean("showdeviations", false) || SP.getBoolean("showratios", false) || Config.displayDeviationSlope) { + if (SP.getBoolean("showiob", true) + || SP.getBoolean("showcob", true) + || SP.getBoolean("showdeviations", false) + || SP.getBoolean("showratios", false) + || SP.getBoolean("showdevslope", false)) { iobGraph.setVisibility(View.VISIBLE); } else { iobGraph.setVisibility(View.GONE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java index 9921d236a1..177e7f9642 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphData/GraphData.java @@ -12,6 +12,7 @@ import com.jjoe64.graphview.series.LineGraphSeries; import com.jjoe64.graphview.series.Series; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import info.nightscout.androidaps.Constants; @@ -61,7 +62,7 @@ public class GraphData { this.iobCobCalculatorPlugin = iobCobCalculatorPlugin; } - public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, APSResult apsResult) { + public void addBgReadings(long fromTime, long toTime, double lowLine, double highLine, List predictions) { double maxBgValue = 0d; bgReadingsArray = MainApp.getDbHelper().getBgreadingsDataFromTime(fromTime, true); List bgListArray = new ArrayList<>(); @@ -74,9 +75,12 @@ public class GraphData { if (bg.value > maxBgValue) maxBgValue = bg.value; bgListArray.add(bg); } - if (apsResult != null) { - List predArray = apsResult.getPredictions(); - bgListArray.addAll(predArray); + if (predictions != null) { + Collections.sort(predictions, (o1, o2) -> Double.compare(o1.getX(), o2.getX())); + for (BgReading prediction : predictions) { + if (prediction.value >= 40) + bgListArray.add(prediction); + } } maxBgValue = Profile.fromMgdlToUnits(maxBgValue, units); @@ -108,7 +112,7 @@ public class GraphData { inRangeAreaSeries = new AreaGraphSeries<>(inRangeAreaDataPoints); inRangeAreaSeries.setColor(0); inRangeAreaSeries.setDrawBackground(true); - inRangeAreaSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.inrangebackground)); + inRangeAreaSeries.setBackgroundColor(MainApp.gc(R.color.inrangebackground)); addSeries(inRangeAreaSeries); } @@ -184,14 +188,14 @@ public class GraphData { baseBasal = baseBasalArray.toArray(baseBasal); baseBasalsSeries = new LineGraphSeries<>(baseBasal); baseBasalsSeries.setDrawBackground(true); - baseBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.basebasal)); + baseBasalsSeries.setBackgroundColor(MainApp.gc(R.color.basebasal)); baseBasalsSeries.setThickness(0); ScaledDataPoint[] tempBasal = new ScaledDataPoint[tempBasalArray.size()]; tempBasal = tempBasalArray.toArray(tempBasal); tempBasalsSeries = new LineGraphSeries<>(tempBasal); tempBasalsSeries.setDrawBackground(true); - tempBasalsSeries.setBackgroundColor(MainApp.sResources.getColor(R.color.tempbasal)); + tempBasalsSeries.setBackgroundColor(MainApp.gc(R.color.tempbasal)); tempBasalsSeries.setThickness(0); ScaledDataPoint[] basalLine = new ScaledDataPoint[basalLineArray.size()]; @@ -201,7 +205,7 @@ public class GraphData { paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity * 2); paint.setPathEffect(new DashPathEffect(new float[]{2, 4}, 0)); - paint.setColor(MainApp.sResources.getColor(R.color.basal)); + paint.setColor(MainApp.gc(R.color.basal)); basalsLineSeries.setCustomPaint(paint); ScaledDataPoint[] absoluteBasalLine = new ScaledDataPoint[absoluteBasalLineArray.size()]; @@ -210,7 +214,7 @@ public class GraphData { Paint absolutePaint = new Paint(); absolutePaint.setStyle(Paint.Style.STROKE); absolutePaint.setStrokeWidth(MainApp.instance().getApplicationContext().getResources().getDisplayMetrics().scaledDensity * 2); - absolutePaint.setColor(MainApp.sResources.getColor(R.color.basal)); + absolutePaint.setColor(MainApp.gc(R.color.basal)); absoluteBasalsLineSeries.setCustomPaint(absolutePaint); basalScale.setMultiplier(maxY * scale / maxBasalValueFound); @@ -259,7 +263,7 @@ public class GraphData { targets = targetsSeriesArray.toArray(targets); targetsSeries = new LineGraphSeries<>(targets); targetsSeries.setDrawBackground(false); - targetsSeries.setColor(MainApp.sResources.getColor(R.color.tempTargetBackground)); + targetsSeries.setColor(MainApp.gc(R.color.tempTargetBackground)); targetsSeries.setThickness(2); addSeries(targetsSeries); @@ -273,6 +277,7 @@ public class GraphData { for (int tx = 0; tx < treatments.size(); tx++) { Treatment t = treatments.get(tx); if (t.getX() < fromTime || t.getX() > endTime) continue; + if (t.isSMB && !t.isValid) continue; t.setY(getNearestBg((long) t.getX())); filteredTreatments.add(t); } @@ -351,8 +356,8 @@ public class GraphData { iobData = iobArray.toArray(iobData); iobSeries = new FixedLineGraphSeries<>(iobData); iobSeries.setDrawBackground(true); - iobSeries.setBackgroundColor(0x80FFFFFF & MainApp.sResources.getColor(R.color.iob)); //50% - iobSeries.setColor(MainApp.sResources.getColor(R.color.iob)); + iobSeries.setBackgroundColor(0x80FFFFFF & MainApp.gc(R.color.iob)); //50% + iobSeries.setColor(MainApp.gc(R.color.iob)); iobSeries.setThickness(3); if (useForScale) @@ -365,6 +370,7 @@ public class GraphData { // scale in % of vertical size (like 0.3) public void addCob(long fromTime, long toTime, boolean useForScale, double scale) { + List minFailoverActiveList = new ArrayList<>(); FixedLineGraphSeries cobSeries; List cobArray = new ArrayList<>(); Double maxCobValueFound = 0d; @@ -382,6 +388,11 @@ public class GraphData { maxCobValueFound = Math.max(maxCobValueFound, cob); lastCob = cob; } + if (autosensData.failoverToMinAbsorbtionRate) { + autosensData.setScale(cobScale); + autosensData.setChartTime(time); + minFailoverActiveList.add(autosensData); + } } } @@ -390,8 +401,8 @@ public class GraphData { cobData = cobArray.toArray(cobData); cobSeries = new FixedLineGraphSeries<>(cobData); cobSeries.setDrawBackground(true); - cobSeries.setBackgroundColor(0xB0FFFFFF & MainApp.sResources.getColor(R.color.cob)); //50% - cobSeries.setColor(MainApp.sResources.getColor(R.color.cob)); + cobSeries.setBackgroundColor(0x80FFFFFF & MainApp.gc(R.color.cob)); //50% + cobSeries.setColor(MainApp.gc(R.color.cob)); cobSeries.setThickness(3); if (useForScale) @@ -400,6 +411,10 @@ public class GraphData { cobScale.setMultiplier(maxY * scale / maxCobValueFound); addSeries(cobSeries); + + DataPointWithLabelInterface[] minFailover = new DataPointWithLabelInterface[minFailoverActiveList.size()]; + minFailover = minFailoverActiveList.toArray(minFailover); + addSeries(new PointsWithLabelGraphSeries<>(minFailover)); } // scale in % of vertical size (like 0.3) @@ -468,7 +483,7 @@ public class GraphData { ScaledDataPoint[] ratioData = new ScaledDataPoint[ratioArray.size()]; ratioData = ratioArray.toArray(ratioData); ratioSeries = new LineGraphSeries<>(ratioData); - ratioSeries.setColor(MainApp.sResources.getColor(R.color.ratio)); + ratioSeries.setColor(MainApp.gc(R.color.ratio)); ratioSeries.setThickness(3); if (useForScale) @@ -504,13 +519,13 @@ public class GraphData { ScaledDataPoint[] ratioMaxData = new ScaledDataPoint[dsMaxArray.size()]; ratioMaxData = dsMaxArray.toArray(ratioMaxData); dsMaxSeries = new LineGraphSeries<>(ratioMaxData); - dsMaxSeries.setColor(Color.MAGENTA); + dsMaxSeries.setColor(MainApp.gc(R.color.devslopepos)); dsMaxSeries.setThickness(3); ScaledDataPoint[] ratioMinData = new ScaledDataPoint[dsMinArray.size()]; ratioMinData = dsMinArray.toArray(ratioMinData); dsMinSeries = new LineGraphSeries<>(ratioMinData); - dsMinSeries.setColor(Color.YELLOW); + dsMinSeries.setColor(MainApp.gc(R.color.devslopeneg)); dsMinSeries.setThickness(3); if (useForScale) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java index 3f6280431c..20d478692a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/DataPointWithLabelInterface.java @@ -55,5 +55,4 @@ public interface DataPointWithLabelInterface extends DataPointInterface{ PointsWithLabelGraphSeries.Shape getShape(); float getSize(); int getColor(); - int getSecondColor(); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java index 9c8e312fb6..5f39cedafe 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/graphExtensions/PointsWithLabelGraphSeries.java @@ -3,42 +3,46 @@ package info.nightscout.androidaps.plugins.Overview.graphExtensions; /** * GraphView * Copyright (C) 2014 Jonas Gehring - * + *

* This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, * with the "Linking Exception", which can be found at the license.txt * file in this program. - * + *

* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + *

* You should have received a copy of the GNU General Public License * with the "Linking Exception" along with this program; if not, * write to the author Jonas Gehring . + *

+ * Added by mike */ /** * Added by mike */ +import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Typeface; -import android.util.TypedValue; -// Added by Rumen for scalable text -import android.content.Context; -import info.nightscout.androidaps.MainApp; + import com.jjoe64.graphview.GraphView; import com.jjoe64.graphview.series.BaseSeries; import java.util.Iterator; +import info.nightscout.androidaps.MainApp; + +// Added by Rumen for scalable text + /** * Series that plots the data as points. * The points can be different shapes or a @@ -74,7 +78,8 @@ public class PointsWithLabelGraphSeries e OPENAPSOFFLINE, EXERCISE, GENERAL, - GENERALWITHDURATION + GENERALWITHDURATION, + COBFAILOVER } /** @@ -148,7 +153,7 @@ public class PointsWithLabelGraphSeries e float scaleX = (float) (graphWidth / diffX); - int i=0; + int i = 0; while (values.hasNext()) { E value = values.next(); @@ -182,7 +187,7 @@ public class PointsWithLabelGraphSeries e } /* Fix a bug that continue to show the DOT after Y axis */ - if(x < 0) { + if (x < 0) { overdraw = true; } @@ -197,34 +202,33 @@ public class PointsWithLabelGraphSeries e // draw data point if (!overdraw) { - if (value.getShape() == Shape.BG) { + if (value.getShape() == Shape.BG || value.getShape() == Shape.COBFAILOVER) { mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); - canvas.drawCircle(endX, endY, scaledPxSize, mPaint); + canvas.drawCircle(endX, endY, value.getSize() * scaledPxSize, mPaint); } else if (value.getShape() == Shape.PREDICTION) { mPaint.setColor(value.getColor()); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); canvas.drawCircle(endX, endY, scaledPxSize, mPaint); - mPaint.setColor(value.getSecondColor()); mPaint.setStyle(Paint.Style.FILL); mPaint.setStrokeWidth(0); canvas.drawCircle(endX, endY, scaledPxSize / 3, mPaint); } else if (value.getShape() == Shape.RECTANGLE) { - canvas.drawRect(endX-scaledPxSize, endY-scaledPxSize, endX+scaledPxSize, endY+scaledPxSize, mPaint); + canvas.drawRect(endX - scaledPxSize, endY - scaledPxSize, endX + scaledPxSize, endY + scaledPxSize, mPaint); } else if (value.getShape() == Shape.TRIANGLE) { mPaint.setStrokeWidth(0); Point[] points = new Point[3]; - points[0] = new Point((int)endX, (int)(endY-scaledPxSize)); - points[1] = new Point((int)(endX+scaledPxSize), (int)(endY+scaledPxSize*0.67)); - points[2] = new Point((int)(endX-scaledPxSize), (int)(endY+scaledPxSize*0.67)); + points[0] = new Point((int) endX, (int) (endY - scaledPxSize)); + points[1] = new Point((int) (endX + scaledPxSize), (int) (endY + scaledPxSize * 0.67)); + points[2] = new Point((int) (endX - scaledPxSize), (int) (endY + scaledPxSize * 0.67)); drawArrows(points, canvas, mPaint); } else if (value.getShape() == Shape.BOLUS) { mPaint.setStrokeWidth(0); Point[] points = new Point[3]; - points[0] = new Point((int)endX, (int)(endY-scaledPxSize)); - points[1] = new Point((int)(endX+scaledPxSize), (int)(endY+scaledPxSize*0.67)); - points[2] = new Point((int)(endX-scaledPxSize), (int)(endY+scaledPxSize*0.67)); + points[0] = new Point((int) endX, (int) (endY - scaledPxSize)); + points[1] = new Point((int) (endX + scaledPxSize), (int) (endY + scaledPxSize * 0.67)); + points[2] = new Point((int) (endX - scaledPxSize), (int) (endY + scaledPxSize * 0.67)); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); drawArrows(points, canvas, mPaint); if (value.getLabel() != null) { @@ -234,15 +238,15 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(2); Point[] points = new Point[3]; float size = value.getSize() * scaledPxSize; - points[0] = new Point((int)endX, (int)(endY-size)); - points[1] = new Point((int)(endX+size), (int)(endY+size*0.67)); - points[2] = new Point((int)(endX-size), (int)(endY+size*0.67)); + points[0] = new Point((int) endX, (int) (endY - size)); + points[1] = new Point((int) (endX + size), (int) (endY + size * 0.67)); + points[2] = new Point((int) (endX - size), (int) (endY + size * 0.67)); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); drawArrows(points, canvas, mPaint); } else if (value.getShape() == Shape.EXTENDEDBOLUS) { mPaint.setStrokeWidth(0); if (value.getLabel() != null) { - Rect bounds = new Rect((int)endX, (int)endY + 3, (int) (xpluslength), (int) endY + 8); + Rect bounds = new Rect((int) endX, (int) endY + 3, (int) (xpluslength), (int) endY + 8); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); canvas.drawRect(bounds, mPaint); mPaint.setTextSize((float) (scaledTextSize)); @@ -254,7 +258,7 @@ public class PointsWithLabelGraphSeries e mPaint.setStrokeWidth(0); if (value.getLabel() != null) { //mPaint.setTextSize((int) (scaledPxSize * 3)); - mPaint.setTextSize((float) (scaledTextSize*1.2)); + mPaint.setTextSize((float) (scaledTextSize * 1.2)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD)); Rect bounds = new Rect(); mPaint.getTextBounds(value.getLabel(), 0, value.getLabel().length(), bounds); @@ -355,7 +359,7 @@ public class PointsWithLabelGraphSeries e * @param paint paint object */ private void drawArrows(Point[] point, Canvas canvas, Paint paint) { - float [] points = new float[8]; + float[] points = new float[8]; points[0] = point[0].x; points[1] = point[0].y; points[2] = point[1].x; @@ -368,10 +372,10 @@ public class PointsWithLabelGraphSeries e canvas.save(); canvas.drawVertices(Canvas.VertexMode.TRIANGLES, 8, points, 0, null, 0, null, 0, null, 0, 0, paint); Path path = new Path(); - path.moveTo(point[0].x , point[0].y); - path.lineTo(point[1].x,point[1].y); - path.lineTo(point[2].x,point[2].y); - canvas.drawPath(path,paint); + path.moveTo(point[0].x, point[0].y); + path.lineTo(point[1].x, point[1].y); + path.lineTo(point[2].x, point[2].y); + canvas.drawPath(path, paint); canvas.restore(); } @@ -381,7 +385,7 @@ public class PointsWithLabelGraphSeries e float py = endY + scaledPxSize; canvas.save(); canvas.rotate(-45, px, py); - mPaint.setTextSize((float) (scaledTextSize*0.8)); + mPaint.setTextSize((float) (scaledTextSize * 0.8)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); mPaint.setTextAlign(Paint.Align.RIGHT); @@ -393,7 +397,7 @@ public class PointsWithLabelGraphSeries e float py = endY - scaledPxSize; canvas.save(); canvas.rotate(-45, px, py); - mPaint.setTextSize((float) (scaledTextSize*0.8)); + mPaint.setTextSize((float) (scaledTextSize * 0.8)); mPaint.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL)); mPaint.setFakeBoldText(true); canvas.drawText(value.getLabel(), px + scaledPxSize, py, mPaint); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java index 6087ae0210..1b1487bbaa 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Overview/notifications/NotificationRecyclerViewAdapter.java @@ -94,7 +94,7 @@ public class NotificationRecyclerViewAdapter extends RecyclerView.Adapter store = new ArrayList(); public long snoozedUntil = 0L; + private boolean usesChannels; public NotificationStore() { createNotificationChannel(); @@ -60,8 +61,14 @@ public class NotificationStore { } store.add(n); - if (SP.getBoolean(MainApp.sResources.getString(R.string.key_raise_notifications_as_android_notifications), false)) { + if (SP.getBoolean(MainApp.gs(R.string.key_raise_notifications_as_android_notifications), false)) { raiseSystemNotification(n); + if (usesChannels && n.soundId != null) { + Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class); + alarm.putExtra("soundid", n.soundId); + MainApp.instance().startService(alarm); + } + } else { if (n.soundId != null) { Intent alarm = new Intent(MainApp.instance().getApplicationContext(), AlarmSoundService.class); @@ -105,7 +112,7 @@ public class NotificationStore { public void unSnooze() { if (Notification.isAlarmForStaleData()) { - Notification notification = new Notification(Notification.NSALARM, MainApp.sResources.getString(R.string.nsalarm_staledata), Notification.URGENT); + Notification notification = new Notification(Notification.NSALARM, MainApp.gs(R.string.nsalarm_staledata), Notification.URGENT); SP.putLong("snoozedTo", System.currentTimeMillis()); add(notification); log.debug("Snoozed to current time and added back notification!"); @@ -126,11 +133,11 @@ public class NotificationStore { .setDeleteIntent(DismissNotificationService.deleteIntent(n.id)); if (n.level == Notification.URGENT) { notificationBuilder.setVibrate(new long[]{1000, 1000, 1000, 1000}) - .setContentTitle(MainApp.sResources.getString(R.string.urgent_alarm)) + .setContentTitle(MainApp.gs(R.string.urgent_alarm)) .setSound(sound, AudioAttributes.USAGE_ALARM); } else { notificationBuilder.setVibrate(new long[]{0, 100, 50, 100, 50}) - .setContentTitle(MainApp.sResources.getString(R.string.info)) + .setContentTitle(MainApp.gs(R.string.info)) ; } mgr.notify(n.id, notificationBuilder.build()); @@ -138,7 +145,7 @@ public class NotificationStore { private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - + usesChannels = true; NotificationManager mNotificationManager = (NotificationManager) MainApp.instance().getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); @SuppressLint("WrongConstant") NotificationChannel channel = new NotificationChannel(CHANNEL_ID, diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java index 789c9df143..ed57652d1f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Persistentnotification/PersistentNotificationPlugin.java @@ -35,6 +35,8 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DecimalFormatter; @@ -92,7 +94,7 @@ public class PersistentNotificationPlugin extends PluginBase { return; } - String line1 = ctx.getString(R.string.noprofile); + String line1 = ""; if (MainApp.getConfigBuilder().getActiveProfileInterface() == null || !MainApp.getConfigBuilder().isProfileValid("Notificiation")) return; @@ -109,9 +111,11 @@ public class PersistentNotificationPlugin extends PluginBase { + " avgΔ" + deltastring(glucoseStatus.avgdelta, glucoseStatus.avgdelta * Constants.MGDL_TO_MMOLL, units); } else { line1 += " " + - ctx.getString(R.string.old_data) + + MainApp.gs(R.string.old_data) + " "; } + } else { + line1 = MainApp.gs(R.string.missed_bg_readings); } TemporaryBasal activeTemp = TreatmentsPlugin.getPlugin().getTempBasalFromHistory(System.currentTimeMillis()); @@ -125,11 +129,9 @@ public class PersistentNotificationPlugin extends PluginBase { IobTotal bolusIob = TreatmentsPlugin.getPlugin().getLastCalculationTreatments().round(); IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round(); - String line2 = ctx.getString(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" - + ctx.getString(R.string.bolus) + ": " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " - + ctx.getString(R.string.basal) + ": " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; - + String line2 = MainApp.gs(R.string.treatments_iob_label_string) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U " + MainApp.gs(R.string.cob)+": " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "PersistentNotificationPlugin").generateCOBString();; + String line3 = DecimalFormatter.to2Decimal(ConfigBuilderPlugin.getActivePump().getBaseBasalRate()) + " U/h"; @@ -138,6 +140,7 @@ public class PersistentNotificationPlugin extends PluginBase { NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx, CHANNEL_ID); builder.setOngoing(true); + builder.setOnlyAlertOnce(true); builder.setCategory(NotificationCompat.CATEGORY_STATUS); builder.setSmallIcon(R.drawable.ic_notification); Bitmap largeIcon = BitmapFactory.decodeResource(ctx.getResources(), R.mipmap.blueowl); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java index a325f08ad2..6c22a2e9ce 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/ProfileLocal/LocalProfileFragment.java @@ -57,7 +57,7 @@ public class LocalProfileFragment extends SubscriberFragment { Runnable save = () -> { doEdit(); if (basalView != null) { - basalView.updateLabel(MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel()); + basalView.updateLabel(MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel()); } }; @@ -91,10 +91,10 @@ public class LocalProfileFragment extends SubscriberFragment { diaView.setParams(LocalProfilePlugin.getPlugin().dia, 2d, 48d, 0.1d, new DecimalFormat("0.0"), false, textWatch); mgdlView = (RadioButton) layout.findViewById(R.id.localprofile_mgdl); mmolView = (RadioButton) layout.findViewById(R.id.localprofile_mmol); - icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.sResources.getString(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); - isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.sResources.getString(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); - basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); - targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.sResources.getString(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); + icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); + isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); + basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); + targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); profileswitchButton = (Button) layout.findViewById(R.id.localprofile_profileswitch); resetButton = (Button) layout.findViewById(R.id.localprofile_reset); saveButton = (Button) layout.findViewById(R.id.localprofile_save); @@ -144,10 +144,10 @@ public class LocalProfileFragment extends SubscriberFragment { mgdlView.setChecked(LocalProfilePlugin.getPlugin().mgdl); mmolView.setChecked(LocalProfilePlugin.getPlugin().mmol); diaView.setParams(LocalProfilePlugin.getPlugin().dia, 2d, 48d, 0.1d, new DecimalFormat("0.0"), false, textWatch); - icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.sResources.getString(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); - isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.sResources.getString(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); - basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.sResources.getString(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); - targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.sResources.getString(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); + icView = new TimeListEdit(getContext(), layout, R.id.localprofile_ic, MainApp.gs(R.string.nsprofileview_ic_label) + ":", LocalProfilePlugin.getPlugin().ic, null, 0.5, 50d, 0.1d, new DecimalFormat("0.0"), save); + isfView = new TimeListEdit(getContext(), layout, R.id.localprofile_isf, MainApp.gs(R.string.nsprofileview_isf_label) + ":", LocalProfilePlugin.getPlugin().isf, null, 0.5, 500d, 0.1d, new DecimalFormat("0.0"), save); + basalView = new TimeListEdit(getContext(), layout, R.id.localprofile_basal, MainApp.gs(R.string.nsprofileview_basal_label) + ": " + getSumLabel(), LocalProfilePlugin.getPlugin().basal, null, pumpDescription.basalMinimumRate, 10, 0.01d, new DecimalFormat("0.00"), save); + targetView = new TimeListEdit(getContext(), layout, R.id.localprofile_target, MainApp.gs(R.string.nsprofileview_target_label) + ":", LocalProfilePlugin.getPlugin().targetLow, LocalProfilePlugin.getPlugin().targetHigh, 3d, 200, 0.1d, new DecimalFormat("0.0"), save); updateGUI(); }); @@ -199,22 +199,14 @@ public class LocalProfileFragment extends SubscriberFragment { if (isValid) { invalidProfile.setVisibility(View.GONE); //show invalid profile - if (isEdited || !ConfigBuilderPlugin.getActivePump().isInitialized() || ConfigBuilderPlugin.getActivePump().isSuspended()) { + if (isEdited) { //edited profile -> save first - //pump not initialized -> don't update profile yet profileswitchButton.setVisibility(View.GONE); - } else { - profileswitchButton.setVisibility(View.VISIBLE); - } - - if(isEdited){ saveButton.setVisibility(View.VISIBLE); } else { + profileswitchButton.setVisibility(View.VISIBLE); saveButton.setVisibility(View.GONE); - } - - } else { invalidProfile.setVisibility(View.VISIBLE); profileswitchButton.setVisibility(View.GONE); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java index 14fdd3c219..455f1f7015 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboFragment.java @@ -120,12 +120,18 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis // activity String activity = plugin.getPump().activity; - if (StringUtils.isNotEmpty(activity)) { + if (activity != null) { + activityView.setTextColor(Color.WHITE); activityView.setTextSize(14); activityView.setText(activity); - } else { + } else if (plugin.isInitialized()){ + activityView.setTextColor(Color.WHITE); activityView.setTextSize(20); activityView.setText("{fa-bed}"); + } else { + activityView.setTextColor(Color.RED); + activityView.setTextSize(14); + activityView.setText(MainApp.gs(R.string.pump_unreachable)); } if (plugin.isInitialized()) { @@ -145,7 +151,7 @@ public class ComboFragment extends SubscriberFragment implements View.OnClickLis // reservoir int reservoirLevel = plugin.getPump().reservoirLevel; if (reservoirLevel != -1) { - reservoirView.setText(reservoirLevel + " " + MainApp.sResources.getString(R.string.insulin_unit_shortname)); + reservoirView.setText(reservoirLevel + " " + MainApp.gs(R.string.insulin_unit_shortname)); } else if (ps.insulinState == PumpState.LOW) { reservoirView.setText(MainApp.gs(R.string.combo_reservoir_low)); } else if (ps.insulinState == PumpState.EMPTY) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java index 2ba3ba782a..3cf4557e54 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpCombo/ComboPlugin.java @@ -151,7 +151,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint /** * Cache of the last <=2 boluses on the pump. Used to detect changes in pump history, - * requiring reading pump more history. This is read/set in {@link #checkHistory()} when changed + * requiring reading more pump history. This is read/set in {@link #checkHistory()} when changed * pump history was detected and was read, as well as in {@link #deliverBolus(DetailedBolusInfo)} * after bolus delivery. Newest record is the first one. */ @@ -326,7 +326,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint } /** - * Runs pump initializing if needed and reads the pump state from the main screen. + * Runs pump initialization if needed and reads the pump state from the main screen. */ @Override public synchronized void getPumpStatus() { @@ -442,8 +442,6 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint case STOPPED: event.status = MainApp.gs(R.string.bolusstopped); break; - case RECOVERING: - event.status = MainApp.gs(R.string.combo_error_bolus_recovery_progress); } event.percent = percent; MainApp.bus().post(event); @@ -460,7 +458,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint log.error("deliverTreatment: Invalid input"); return new PumpEnactResult().success(false).enacted(false) .bolusDelivered(0d).carbsDelivered(0d) - .comment(MainApp.instance().getString(R.string.danar_invalidinput)); + .comment(MainApp.gs(R.string.danar_invalidinput)); } else if (detailedBolusInfo.insulin > 0) { // bolus needed, ask pump to deliver it return deliverBolus(detailedBolusInfo); @@ -476,7 +474,7 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint return new PumpEnactResult().success(true).enacted(true) .bolusDelivered(0d).carbsDelivered(detailedBolusInfo.carbs) - .comment(MainApp.instance().getString(R.string.virtualpump_resultok)); + .comment(MainApp.gs(R.string.virtualpump_resultok)); } } finally { MainApp.bus().post(new EventComboPumpUpdateGUI()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java index fc57e72e01..903be558b9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/AbstractDanaRPlugin.java @@ -95,22 +95,22 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); - Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); + Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.gs(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + result.comment = MainApp.gs(R.string.pumpNotInitializedProfileNotSet); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!sExecutionService.updateBasalsInPump(profile)) { - Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); + Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.gs(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + result.comment = MainApp.gs(R.string.failedupdatebasalprofile); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); result.success = true; result.enacted = true; @@ -166,7 +166,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte result.isTempCancel = false; result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("setTempBasalPercent: Invalid input"); return result; } @@ -178,7 +178,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte result.enacted = false; result.success = true; result.isTempCancel = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; result.isPercent = true; @@ -191,7 +191,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; @@ -202,7 +202,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.tempbasaldeliveryerror); + result.comment = MainApp.gs(R.string.tempbasaldeliveryerror); log.error("setTempBasalPercent: Failed to set temp basal"); return result; } @@ -219,7 +219,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte if (runningEB != null && Math.abs(runningEB.insulin - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = false; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.extendedBolusRemainingMinutes; result.absolute = pump.extendedBolusAbsoluteRate; result.isPercent = false; @@ -232,7 +232,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte if (connectionOK && pump.isExtendedInProgress && Math.abs(pump.extendedBolusAmount - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.extendedBolusRemainingMinutes; result.absolute = pump.extendedBolusAbsoluteRate; @@ -245,7 +245,7 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("setExtendedBolus: Failed to extended bolus"); return result; } @@ -261,13 +261,13 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } if (!pump.isExtendedInProgress) { result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelExtendedBolus: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("cancelExtendedBolus: Failed to cancel extended bolus"); return result; } @@ -304,7 +304,11 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte @Override public void getPumpStatus() { - if (sExecutionService != null) sExecutionService.getPumpStatus(); + if (sExecutionService != null) { + sExecutionService.getPumpStatus(); + pumpDescription.basalStep = pump.basalStep; + pumpDescription.bolusStep = pump.bolusStep; + } } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java index 7ef3d6a987..b8afdaf15a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRFragment.java @@ -206,7 +206,7 @@ public class DanaRFragment extends SubscriberFragment { if (pump.lastConnection != 0) { Long agoMsec = System.currentTimeMillis() - pump.lastConnection; int agoMin = (int) (agoMsec / 60d / 1000d); - lastConnectionView.setText(DateUtil.timeString(pump.lastConnection) + " (" + String.format(MainApp.sResources.getString(R.string.minago), agoMin) + ")"); + lastConnectionView.setText(DateUtil.timeString(pump.lastConnection) + " (" + String.format(MainApp.gs(R.string.minago), agoMin) + ")"); SetWarnColor.setColor(lastConnectionView, agoMin, 16d, 31d); } if (pump.lastBolusTime.getTime() != 0) { @@ -247,7 +247,7 @@ public class DanaRFragment extends SubscriberFragment { SetWarnColor.setColorInverse(batteryView, pump.batteryRemaining, 51d, 26d); iobView.setText(pump.iob + " U"); if (pump.model != 0 || pump.protocol != 0 || pump.productCode != 0) { - firmwareView.setText(String.format(MainApp.sResources.getString(R.string.danar_model), pump.model, pump.protocol, pump.productCode)); + firmwareView.setText(String.format(MainApp.gs(R.string.danar_model), pump.model, pump.protocol, pump.productCode)); } else { firmwareView.setText("OLD"); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java index cbcf21cd48..279a93340f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/DanaRPlugin.java @@ -18,6 +18,7 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; @@ -71,7 +72,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { pumpDescription.isRefillingCapable = true; - pumpDescription.storesCarbInfo = true; + pumpDescription.storesCarbInfo = false; pumpDescription.supportsTDDs = true; pumpDescription.needsManualTDDLoad = true; @@ -129,7 +130,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { // Plugin base interface @Override public String getName() { - return MainApp.instance().getString(R.string.danarpump); + return MainApp.gs(R.string.danarpump); } @Override @@ -158,10 +159,13 @@ public class DanaRPlugin extends AbstractDanaRPlugin { if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, detailedBolusInfo.carbTime, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStartWithSpeed.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); detailedBolusInfo.insulin = t.insulin; @@ -173,7 +177,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -342,7 +346,7 @@ public class DanaRPlugin extends AbstractDanaRPlugin { PumpEnactResult result = new PumpEnactResult(); result.success = true; result.enacted = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = true; return result; } @@ -358,13 +362,13 @@ public class DanaRPlugin extends AbstractDanaRPlugin { if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java index 7f90fb190b..97c5569b4b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRHistoryActivity.java @@ -122,20 +122,20 @@ public class DanaRHistoryActivity extends Activity { // Types ArrayList typeList = new ArrayList<>(); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ALARM, getString(R.string.danar_history_alarm))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BASALHOUR, getString(R.string.danar_history_basalhours))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BOLUS, getString(R.string.danar_history_bolus))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_CARBO, getString(R.string.danar_history_carbohydrates))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_DAILY, getString(R.string.danar_history_dailyinsulin))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, getString(R.string.danar_history_glucose))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ALARM, MainApp.gs(R.string.danar_history_alarm))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BASALHOUR, MainApp.gs(R.string.danar_history_basalhours))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_BOLUS, MainApp.gs(R.string.danar_history_bolus))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_CARBO, MainApp.gs(R.string.danar_history_carbohydrates))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_DAILY, MainApp.gs(R.string.danar_history_dailyinsulin))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_GLUCOSE, MainApp.gs(R.string.danar_history_glucose))); if (!isKorean && !isRS) { - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ERROR, getString(R.string.danar_history_errors))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_ERROR, MainApp.gs(R.string.danar_history_errors))); } if (isRS) - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_PRIME, getString(R.string.danar_history_prime))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_PRIME, MainApp.gs(R.string.danar_history_prime))); if (!isKorean) { - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, getString(R.string.danar_history_refill))); - typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, getString(R.string.danar_history_syspend))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_REFILL, MainApp.gs(R.string.danar_history_refill))); + typeList.add(new TypeList(RecordTypes.RECORD_TYPE_SUSPEND, MainApp.gs(R.string.danar_history_syspend))); } ArrayAdapter spinnerAdapter = new ArrayAdapter<>(this, R.layout.spinner_centered, typeList); @@ -215,7 +215,7 @@ public class DanaRHistoryActivity extends Activity { }); profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.noprofile)); finish(); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java index e7813fac10..d505443c1d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/activities/DanaRNSHistorySync.java @@ -57,7 +57,7 @@ public class DanaRNSHistorySync { if (record._id != null) continue; //log.debug(record.bytes); JSONObject nsrec = new JSONObject(); - ev.message = MainApp.sResources.getString(R.string.uploading) + " " + processing + "/" + records + " "; // TODO: translations + ev.message = MainApp.gs(R.string.uploading) + " " + processing + "/" + records + " "; // TODO: translations switch (record.recordCode) { case RecordTypes.RECORD_TYPE_BOLUS: if ((what & SYNC_BOLUS) == 0) break; @@ -68,10 +68,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Meal Bolus"); nsrec.put("insulin", record.recordValue); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_sbolus); + ev.message += MainApp.gs(R.string.danar_sbolus); break; case "E": if (record.recordDuration > 0) { @@ -86,10 +86,10 @@ public class DanaRNSHistorySync { cal.setTimeInMillis(record.recordDate); cal.add(Calendar.MINUTE, -1 * record.recordDuration); nsrec.put("created_at", DateUtil.toISOString(cal.getTime())); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_ebolus); + ev.message += MainApp.gs(R.string.danar_ebolus); } else { log.debug("NOT Syncing extended bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate) + " zero duration"); } @@ -102,10 +102,10 @@ public class DanaRNSHistorySync { nsrec.put("splitNow", 100); nsrec.put("splitExt", 0); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_dsbolus); + ev.message += MainApp.gs(R.string.danar_dsbolus); break; case "DE": log.debug("Syncing dual(E) bolus record " + record.recordValue + "U " + DateUtil.toISOString(record.recordDate)); @@ -118,10 +118,10 @@ public class DanaRNSHistorySync { cal.setTimeInMillis(record.recordDate); cal.add(Calendar.MINUTE, -1 * record.recordDuration); nsrec.put("created_at", DateUtil.toISOString(cal.getTime())); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_debolus); + ev.message += MainApp.gs(R.string.danar_debolus); break; default: log.debug("Unknown bolus record"); @@ -135,10 +135,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Note"); nsrec.put("notes", "Error"); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_error); + ev.message += MainApp.gs(R.string.danar_error); break; case RecordTypes.RECORD_TYPE_REFILL: if ((what & SYNC_REFILL) == 0) break; @@ -147,10 +147,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Insulin Change"); nsrec.put("notes", "Refill " + record.recordValue + "U"); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_refill); + ev.message += MainApp.gs(R.string.danar_refill); break; case RecordTypes.RECORD_TYPE_BASALHOUR: if ((what & SYNC_BASALHOURS) == 0) break; @@ -160,10 +160,10 @@ public class DanaRNSHistorySync { nsrec.put("absolute", record.recordValue); nsrec.put("duration", 60); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_basalhour); + ev.message += MainApp.gs(R.string.danar_basalhour); break; case RecordTypes.RECORD_TYPE_TB: //log.debug("Ignoring TB record " + record.bytes + " " + DateUtil.toISOString(record.recordDate)); @@ -176,10 +176,10 @@ public class DanaRNSHistorySync { nsrec.put("glucose", Profile.fromMgdlToUnits(record.recordValue, MainApp.getConfigBuilder().getProfileUnits())); nsrec.put("glucoseType", "Finger"); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_glucose); + ev.message += MainApp.gs(R.string.danar_glucose); break; case RecordTypes.RECORD_TYPE_CARBO: if ((what & SYNC_CARBO) == 0) break; @@ -188,10 +188,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Meal Bolus"); nsrec.put("carbs", record.recordValue); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_carbohydrate); + ev.message += MainApp.gs(R.string.danar_carbohydrate); break; case RecordTypes.RECORD_TYPE_ALARM: if ((what & SYNC_ALARM) == 0) break; @@ -200,10 +200,10 @@ public class DanaRNSHistorySync { nsrec.put("eventType", "Note"); nsrec.put("notes", "Alarm: " + record.recordAlarm); nsrec.put("created_at", DateUtil.toISOString(record.recordDate)); - nsrec.put("enteredBy", "openaps://" + MainApp.sResources.getString(R.string.app_name)); + nsrec.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); NSUpload.uploadCareportalEntryToNS(nsrec); uploaded++; - ev.message += MainApp.sResources.getString(R.string.danar_alarm); + ev.message += MainApp.gs(R.string.danar_alarm); break; case RecordTypes.RECORD_TYPE_SUSPEND: // TODO: this too case RecordTypes.RECORD_TYPE_DAILY: @@ -216,7 +216,7 @@ public class DanaRNSHistorySync { } MainApp.bus().post(ev); } - ev.message = String.format(MainApp.sResources.getString(R.string.danar_totaluploaded), uploaded); + ev.message = String.format(MainApp.gs(R.string.danar_totaluploaded), uploaded); MainApp.bus().post(ev); } catch (JSONException e) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java index 79358526fa..cb01a7d901 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusProgress.java @@ -36,7 +36,7 @@ public class MsgBolusProgress extends MessageBase { Double done = (amount * 100 - progress) / 100d; t.insulin = done; EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), done); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), done); bolusingEvent.t = t; bolusingEvent.percent = Math.min((int) (done / amount * 100), 100); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java index 9173794199..7586edf825 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStart.java @@ -11,6 +11,8 @@ import info.nightscout.utils.HardLimits; public class MsgBolusStart extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgBolusStart.class); + public static int errorCode; + public MsgBolusStart() { SetCommand(0x0102); } @@ -29,13 +31,13 @@ public class MsgBolusStart extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int result = intFromBuff(bytes, 0, 1); - if (result != 2) { + errorCode = intFromBuff(bytes, 0, 1); + if (errorCode != 2) { failed = true; - log.debug("Messsage response: " + result + " FAILED!!"); + log.debug("Messsage response: " + errorCode + " FAILED!!"); } else { if (Config.logDanaMessageDetail) - log.debug("Messsage response: " + result); + log.debug("Messsage response: " + errorCode + " OK"); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java index 3a33e9f866..dd4251a350 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStartWithSpeed.java @@ -11,6 +11,8 @@ import info.nightscout.utils.HardLimits; public class MsgBolusStartWithSpeed extends MessageBase { private static Logger log = LoggerFactory.getLogger(MsgBolusStartWithSpeed.class); + public static int errorCode; + public MsgBolusStartWithSpeed() { SetCommand(0x0104); } @@ -30,13 +32,13 @@ public class MsgBolusStartWithSpeed extends MessageBase { @Override public void handleMessage(byte[] bytes) { - int result = intFromBuff(bytes, 0, 1); - if (result != 2) { + errorCode = intFromBuff(bytes, 0, 1); + if (errorCode != 2) { failed = true; - log.debug("Messsage response: " + result + " FAILED!!"); + log.debug("Messsage response: " + errorCode + " FAILED!!"); } else { if (Config.logDanaMessageDetail) - log.debug("Messsage response: " + result); + log.debug("Messsage response: " + errorCode + " OK"); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java index 6718d76194..5c677b813e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgBolusStop.java @@ -34,10 +34,10 @@ public class MsgBolusStop extends MessageBase { stopped = true; if (!forced) { t.insulin = amount; - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_delivered); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_delivered); bolusingEvent.percent = 100; } else { - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_stoped); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_stoped); } MainApp.bus().post(bolusingEvent); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java index b180d4107b..e42327c3b0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgError.java @@ -25,19 +25,19 @@ public class MsgError extends MessageBase { case 1: case 2: case 3: // Pump error - errorString = MainApp.sResources.getString(R.string.pumperror) + " " + errorCode; + errorString = MainApp.gs(R.string.pumperror) + " " + errorCode; break; case 4: // Shutdown - errorString = MainApp.sResources.getString(R.string.pumpshutdown); + errorString = MainApp.gs(R.string.pumpshutdown); break; case 5: // Occlusion - errorString = MainApp.sResources.getString(R.string.occlusion); + errorString = MainApp.gs(R.string.occlusion); break; case 7: // Low Battery - errorString = MainApp.sResources.getString(R.string.lowbattery); + errorString = MainApp.gs(R.string.lowbattery); break; case 8: // Battery 0% - errorString = MainApp.sResources.getString(R.string.batterydischarged); + errorString = MainApp.gs(R.string.batterydischarged); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java index 83bd9dc77d..4fc9844b0d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusBolus.java @@ -41,7 +41,7 @@ public class MsgInitConnStatusBolus extends MessageBase { } if (!pump.isExtendedBolusEnabled) { - Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.sResources.getString(R.string.danar_enableextendedbolus), Notification.URGENT); + Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java index 642f539f6c..84d9c413bf 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgInitConnStatusTime.java @@ -27,7 +27,7 @@ public class MsgInitConnStatusTime extends MessageBase { @Override public void handleMessage(byte[] bytes) { if (bytes.length - 10 > 7) { - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to Korean DanaR"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java index 01c80bc255..9f945e8b26 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetBasalProfile.java @@ -33,12 +33,12 @@ public class MsgSetBasalProfile extends MessageBase { if (result != 1) { failed = true; log.debug("Set basal profile result: " + result + " FAILED!!!"); - Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.sResources.getString(R.string.profile_set_failed), Notification.URGENT); + Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.gs(R.string.profile_set_failed), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); } else { if (Config.logDanaMessageDetail) log.debug("Set basal profile result: " + result); - Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(reportOK)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java index 1c79080093..7dd9ca522b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSetSingleBasalProfile.java @@ -32,12 +32,12 @@ public class MsgSetSingleBasalProfile extends MessageBase { if (result != 1) { failed = true; log.debug("Set basal profile result: " + result + " FAILED!!!"); - Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.sResources.getString(R.string.profile_set_failed), Notification.URGENT); + Notification reportFail = new Notification(Notification.PROFILE_SET_FAILED, MainApp.gs(R.string.profile_set_failed), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); } else { if (Config.logDanaMessageDetail) log.debug("Set basal profile result: " + result); - Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification reportOK = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(reportOK)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java index 6f87803868..8d94a1784d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/comm/MsgSettingMeal.java @@ -48,14 +48,14 @@ public class MsgSettingMeal extends MessageBase { } if (pump.basalStep != 0.01d) { - Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.sResources.getString(R.string.danar_setbasalstep001), Notification.URGENT); + Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.gs(R.string.danar_setbasalstep001), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.WRONGBASALSTEP)); } if (pump.isConfigUD) { - Notification notification = new Notification(Notification.UD_MODE_ENABLED, MainApp.sResources.getString(R.string.danar_switchtouhmode), Notification.URGENT); + Notification notification = new Notification(Notification.UD_MODE_ENABLED, MainApp.gs(R.string.danar_switchtouhmode), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.UD_MODE_ENABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java index 5524cf5c5c..b7201c1163 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/AbstractDanaRExecutionService.java @@ -134,7 +134,7 @@ public abstract class AbstractDanaRExecutionService extends Service { } protected void getBTSocketForSelectedPump() { - mDevName = SP.getString(MainApp.sResources.getString(R.string.key_danar_bt_name), ""); + mDevName = SP.getString(MainApp.gs(R.string.key_danar_bt_name), ""); BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter != null) { @@ -152,10 +152,10 @@ public abstract class AbstractDanaRExecutionService extends Service { } } } else { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.nobtadapter)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.nobtadapter)); } if (mBTDevice == null) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.devicenotfound)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.devicenotfound)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java index eabf4fc94a..65a5d22d36 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaR/services/DanaRExecutionService.java @@ -97,7 +97,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public void connect() { if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.wrongpumppassword), R.raw.error); return; } @@ -138,7 +138,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); MsgStatusBasic statusBasicMsg = new MsgStatusBasic(); MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(); @@ -154,15 +154,15 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); mSerialIOThread.sendMessage(tempStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); long now = System.currentTimeMillis(); if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRPlugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingMeal()); @@ -173,7 +173,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -192,9 +192,9 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ NSUpload.uploadDeviceStatus(); if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -204,11 +204,11 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean tempBasal(int percent, int durationInHours) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(percent, durationInHours)); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -217,7 +217,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -226,7 +226,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean extendedBolus(double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -235,7 +235,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -264,82 +264,84 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ mSerialIOThread.sendMessage(new MsgSetCarbsEntry(carbtime, carbs)); } - MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables - long bolusStart = System.currentTimeMillis(); + if (amount > 0) { + MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables + long bolusStart = System.currentTimeMillis(); - if (!stop.stopped) { - mSerialIOThread.sendMessage(start); - } else { - t.insulin = 0d; - return false; - } - while (!stop.stopped && !start.failed) { - SystemClock.sleep(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm - stop.stopped = true; - stop.forced = true; - log.debug("Communication stopped"); + if (!stop.stopped) { + mSerialIOThread.sendMessage(start); + } else { + t.insulin = 0d; + return false; } - } - SystemClock.sleep(300); - - EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.t = t; - bolusingEvent.percent = 99; - - mBolusingTreatment = null; - - int speed = 12; - switch (preferencesSpeed) { - case 0: - speed = 12; - break; - case 1: - speed = 30; - break; - case 2: - speed = 60; - break; - } - // try to find real amount if bolusing was interrupted or comm failed - if (t.insulin != amount) { - disconnect("bolusingInterrupted"); - long bolusDurationInMSec = (long) (amount * speed * 1000); - long expectedEnd = bolusStart + bolusDurationInMSec + 3000; - - while (System.currentTimeMillis() < expectedEnd) { - long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); - MainApp.bus().post(bolusingEvent); - SystemClock.sleep(1000); - } - - final Object o = new Object(); - synchronized(o) { - ConfigBuilderPlugin.getCommandQueue().independentConnect("bolusingInterrupted", new Callback() { - @Override - public void run() { - if (mDanaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old - t.insulin = mDanaRPump.lastBolusAmount; - log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount); - } else { - log.debug("Bolus amount in history too old: " + mDanaRPump.lastBolusTime.toLocaleString()); - } - synchronized (o) { - o.notify(); - } - } - }); - try { - o.wait(); - } catch (InterruptedException e) { - e.printStackTrace(); + while (!stop.stopped && !start.failed) { + SystemClock.sleep(100); + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm + stop.stopped = true; + stop.forced = true; + log.debug("Communication stopped"); } } - } else { - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + SystemClock.sleep(300); + + EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); + bolusingEvent.t = t; + bolusingEvent.percent = 99; + + mBolusingTreatment = null; + + int speed = 12; + switch (preferencesSpeed) { + case 0: + speed = 12; + break; + case 1: + speed = 30; + break; + case 2: + speed = 60; + break; + } + // try to find real amount if bolusing was interrupted or comm failed + if (t.insulin != amount) { + disconnect("bolusingInterrupted"); + long bolusDurationInMSec = (long) (amount * speed * 1000); + long expectedEnd = bolusStart + bolusDurationInMSec + 3000; + + while (System.currentTimeMillis() < expectedEnd) { + long waitTime = expectedEnd - System.currentTimeMillis(); + bolusingEvent.status = String.format(MainApp.gs(R.string.waitingforestimatedbolusend), waitTime / 1000); + MainApp.bus().post(bolusingEvent); + SystemClock.sleep(1000); + } + + final Object o = new Object(); + synchronized (o) { + ConfigBuilderPlugin.getCommandQueue().independentConnect("bolusingInterrupted", new Callback() { + @Override + public void run() { + if (mDanaRPump.lastBolusTime.getTime() > System.currentTimeMillis() - 60 * 1000L) { // last bolus max 1 min old + t.insulin = mDanaRPump.lastBolusAmount; + log.debug("Used bolus amount from history: " + mDanaRPump.lastBolusAmount); + } else { + log.debug("Bolus amount in history too old: " + mDanaRPump.lastBolusTime.toLocaleString()); + } + synchronized (o) { + o.notify(); + } + } + }); + try { + o.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } else { + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); + } } - return true; + return !start.failed; } public boolean carbsEntry(int amount) { @@ -361,7 +363,7 @@ public class DanaRExecutionService extends AbstractDanaRExecutionService{ public boolean updateBasalsInPump(final Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); MsgSetBasalProfile msgSet = new MsgSetBasalProfile((byte) 0, basal); mSerialIOThread.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java index a3a39a30f1..092febec61 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/DanaRKoreanPlugin.java @@ -18,14 +18,15 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; -import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.events.EventPreferenceChange; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStart; import info.nightscout.androidaps.plugins.PumpDanaRKorean.services.DanaRKoreanExecutionService; +import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.Round; import info.nightscout.utils.SP; @@ -72,7 +73,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { pumpDescription.isRefillingCapable = true; - pumpDescription.storesCarbInfo = true; + pumpDescription.storesCarbInfo = false; pumpDescription.supportsTDDs = true; pumpDescription.needsManualTDDLoad = true; @@ -130,7 +131,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { // Plugin base interface @Override public String getName() { - return MainApp.instance().getString(R.string.danarkoreanpump); + return MainApp.gs(R.string.danarkoreanpump); } @Override @@ -159,10 +160,13 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { if (detailedBolusInfo.insulin > 0 || detailedBolusInfo.carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) detailedBolusInfo.carbs, detailedBolusInfo.carbTime, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStart.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); detailedBolusInfo.insulin = t.insulin; @@ -174,7 +178,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -343,7 +347,7 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { PumpEnactResult result = new PumpEnactResult(); result.success = true; result.enacted = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = true; return result; } @@ -359,13 +363,13 @@ public class DanaRKoreanPlugin extends AbstractDanaRPlugin { if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java index 82beecc5e9..fa28e664ed 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBasic_k.java @@ -39,7 +39,7 @@ public class MsgInitConnStatusBasic_k extends MessageBase { } if (pump.isEasyModeEnabled) { - Notification notification = new Notification(Notification.EASYMODE_ENABLED, MainApp.sResources.getString(R.string.danar_disableeasymode), Notification.URGENT); + Notification notification = new Notification(Notification.EASYMODE_ENABLED, MainApp.gs(R.string.danar_disableeasymode), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EASYMODE_ENABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java index bf105b8db0..552511cf7c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusBolus_k.java @@ -44,7 +44,7 @@ public class MsgInitConnStatusBolus_k extends MessageBase { } if (!pump.isExtendedBolusEnabled) { - Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.sResources.getString(R.string.danar_enableextendedbolus), Notification.URGENT); + Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java index 2028411791..7553b0cc37 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/comm/MsgInitConnStatusTime_k.java @@ -29,7 +29,7 @@ public class MsgInitConnStatusTime_k extends MessageBase { public void handleMessage(byte[] bytes) { if (bytes.length - 10 < 10) { - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to export DanaR"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java index c136666d5e..b9cc704aba 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRKorean/services/DanaRKoreanExecutionService.java @@ -105,7 +105,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public void connect() { if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.wrongpumppassword), R.raw.error); return; } @@ -146,7 +146,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); //MsgStatus_k statusMsg = new MsgStatus_k(); MsgStatusBasic_k statusBasicMsg = new MsgStatusBasic_k(); MsgStatusTempBasal tempStatusMsg = new MsgStatusTempBasal(); @@ -162,15 +162,15 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { //mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); mSerialIOThread.sendMessage(tempStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); long now = System.currentTimeMillis(); if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRKoreanPlugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingMeal()); mSerialIOThread.sendMessage(new MsgSettingBasal_k()); @@ -178,7 +178,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingMaxValues()); mSerialIOThread.sendMessage(new MsgSettingGlucose()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -197,9 +197,9 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { NSUpload.uploadDeviceStatus(); if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -209,11 +209,11 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean tempBasal(int percent, int durationInHours) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(percent, durationInHours)); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -222,7 +222,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); mSerialIOThread.sendMessage(new MsgStatusTempBasal()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -231,7 +231,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolus(double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -240,7 +240,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); mSerialIOThread.sendMessage(new MsgStatusBolusExtended()); MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTING)); @@ -264,29 +264,31 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSetCarbsEntry(carbtime, carbs)); } - MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables - long bolusStart = System.currentTimeMillis(); + if (amount > 0) { + MsgBolusProgress progress = new MsgBolusProgress(amount, t); // initialize static variables + long bolusStart = System.currentTimeMillis(); - if (!stop.stopped) { - mSerialIOThread.sendMessage(start); - } else { - t.insulin = 0d; - return false; - } - while (!stop.stopped && !start.failed) { - SystemClock.sleep(100); - if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm - stop.stopped = true; - stop.forced = true; - log.debug("Communication stopped"); + if (!stop.stopped) { + mSerialIOThread.sendMessage(start); + } else { + t.insulin = 0d; + return false; } + while (!stop.stopped && !start.failed) { + SystemClock.sleep(100); + if ((System.currentTimeMillis() - progress.lastReceive) > 15 * 1000L) { // if i didn't receive status for more than 15 sec expecting broken comm + stop.stopped = true; + stop.forced = true; + log.debug("Communication stopped"); + } + } + SystemClock.sleep(300); + + mBolusingTreatment = null; + ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); } - SystemClock.sleep(300); - mBolusingTreatment = null; - ConfigBuilderPlugin.getCommandQueue().readStatus("bolusOK", null); - - return true; + return !start.failed; } public boolean carbsEntry(int amount) { @@ -308,7 +310,7 @@ public class DanaRKoreanExecutionService extends AbstractDanaRExecutionService { public boolean updateBasalsInPump(final Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); MsgSetSingleBasalProfile msgSet = new MsgSetSingleBasalProfile(basal); mSerialIOThread.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java index 7655c0ff46..1cbb256c1e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/DanaRSPlugin.java @@ -26,6 +26,7 @@ import info.nightscout.androidaps.data.ProfileStore; import info.nightscout.androidaps.data.PumpEnactResult; import info.nightscout.androidaps.db.ExtendedBolus; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.plugins.PumpDanaRS.comm.DanaRS_Packet_Bolus_Set_Step_Bolus_Start; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.events.EventAppExit; import info.nightscout.androidaps.interfaces.Constraint; @@ -178,8 +179,6 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte final Object o = new Object(); danaRSService.connect(from, mDeviceAddress, o); - pumpDescription.basalStep = pump.basalStep; - pumpDescription.bolusStep = pump.bolusStep; } } @@ -205,8 +204,11 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte @Override public void getPumpStatus() { - if (danaRSService != null) + if (danaRSService != null) { danaRSService.getPumpStatus(); + pumpDescription.basalStep = pump.basalStep; + pumpDescription.bolusStep = pump.bolusStep; + } } // DanaR interface @@ -295,22 +297,22 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); - Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); + Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.gs(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + result.comment = MainApp.gs(R.string.pumpNotInitializedProfileNotSet); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); } if (!danaRSService.updateBasalsInPump(profile)) { - Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); + Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.gs(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + result.comment = MainApp.gs(R.string.failedupdatebasalprofile); return result; } else { MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); result.success = true; result.enacted = true; @@ -368,7 +370,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } // RS stores end time for bolus, we need to adjust time // default delivery speed is 12 sec/U - detailedBolusInfo.date = DateUtil.now() + (long)(speed * detailedBolusInfo.insulin * 1000); + detailedBolusInfo.date = DateUtil.now() + (long) (speed * detailedBolusInfo.insulin * 1000); // clean carbs to prevent counting them as twice because they will picked up as another record // I don't think it's necessary to copy DetailedBolusInfo right now for carbs records double carbs = detailedBolusInfo.carbs; @@ -384,10 +386,13 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (detailedBolusInfo.insulin > 0 || carbs > 0) connectionOK = danaRSService.bolus(detailedBolusInfo.insulin, (int) carbs, DateUtil.now() + carbTime * 60 * 1000, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, DanaRS_Packet_Bolus_Set_Step_Bolus_Start.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); return result; @@ -396,7 +401,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -500,7 +505,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte result.isTempCancel = false; result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("setTempBasalPercent: Invalid input"); return result; } @@ -512,7 +517,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte result.enacted = false; result.success = true; result.isTempCancel = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; result.isPercent = true; @@ -530,7 +535,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; @@ -541,7 +546,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.tempbasaldeliveryerror); + result.comment = MainApp.gs(R.string.tempbasaldeliveryerror); log.error("setTempBasalPercent: Failed to set temp basal"); return result; } @@ -552,7 +557,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; @@ -563,7 +568,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("setHighTempBasalPercent: Failed to set temp basal"); return result; } @@ -579,7 +584,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (runningEB != null && Math.abs(runningEB.insulin - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = false; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.extendedBolusRemainingMinutes; result.absolute = pump.extendedBolusAbsoluteRate; result.isPercent = false; @@ -592,7 +597,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (connectionOK && pump.isExtendedInProgress && Math.abs(pump.extendedBolusAbsoluteRate - insulin) < getPumpDescription().extendedBolusStep) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.extendedBolusRemainingMinutes; result.absolute = pump.extendedBolusAbsoluteRate; @@ -604,7 +609,7 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("setExtendedBolus: Failed to extended bolus"); return result; } @@ -621,13 +626,13 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; @@ -645,13 +650,13 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } if (!pump.isExtendedInProgress) { result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelExtendedBolus: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("cancelExtendedBolus: Failed to cancel extended bolus"); return result; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java index a663d14245..9f72e1d08f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/activities/PairingProgressDialog.java @@ -51,14 +51,14 @@ public class PairingProgressDialog extends DialogFragment implements View.OnClic public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.danars_pairingprogressdialog, container, false); - getDialog().setTitle(MainApp.sResources.getString(R.string.pairing)); + getDialog().setTitle(MainApp.gs(R.string.pairing)); statusView = (TextView) view.findViewById(R.id.danars_paringprogress_status); progressBar = (ProgressBar) view.findViewById(R.id.danars_paringprogress_progressbar); button = (Button) view.findViewById(R.id.ok); progressBar.setMax(100); progressBar.setProgress(0); - statusView.setText(MainApp.sResources.getString(R.string.waitingforpairing)); + statusView.setText(MainApp.gs(R.string.waitingforpairing)); button.setVisibility(View.GONE); button.setOnClickListener(this); setCancelable(false); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java index a707c5e0cc..181584df8e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_APS_History_Events.java @@ -200,7 +200,7 @@ public class DanaRS_Packet_APS_History_Events extends DanaRS_Packet { if (datetime.getTime() > lastEventTimeLoaded) lastEventTimeLoaded = datetime.getTime(); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.processinghistory) + ": " + status)); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.processinghistory) + ": " + status)); } @Override diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java index 048912a23d..f3fef0d49d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Basal_Get_Basal_Rate.java @@ -53,7 +53,7 @@ public class DanaRS_Packet_Basal_Get_Basal_Rate extends DanaRS_Packet { } if (pump.basalStep != 0.01d) { - Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.sResources.getString(R.string.danar_setbasalstep001), Notification.URGENT); + Notification notification = new Notification(Notification.WRONGBASALSTEP, MainApp.gs(R.string.danar_setbasalstep001), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.WRONGBASALSTEP)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java index eb4af6b25f..69c2f75ba6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Get_Bolus_Option.java @@ -102,7 +102,7 @@ public class DanaRS_Packet_Bolus_Get_Bolus_Option extends DanaRS_Packet { int missedBolus04EndMin = byteArrayToInt(getBytes(data, dataIndex, dataSize)); if (!pump.isExtendedBolusEnabled) { - Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.sResources.getString(R.string.danar_enableextendedbolus), Notification.URGENT); + Notification notification = new Notification(Notification.EXTENDED_BOLUS_DISABLED, MainApp.gs(R.string.danar_enableextendedbolus), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); } else { MainApp.bus().post(new EventDismissNotification(Notification.EXTENDED_BOLUS_DISABLED)); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java index 12f2fa95c6..44e5d308dc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Start.java @@ -7,58 +7,64 @@ import org.slf4j.LoggerFactory; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; import info.nightscout.androidaps.interfaces.Constraint; -import info.nightscout.utils.HardLimits; +import info.nightscout.androidaps.plugins.Overview.notifications.Notification; public class DanaRS_Packet_Bolus_Set_Step_Bolus_Start extends DanaRS_Packet { - private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Start.class); + private static Logger log = LoggerFactory.getLogger(DanaRS_Packet_Bolus_Set_Step_Bolus_Start.class); - private double amount; - private int speed; + private double amount; + private int speed; - public boolean failed; + public boolean failed; + public static int errorCode; - public DanaRS_Packet_Bolus_Set_Step_Bolus_Start() { + public DanaRS_Packet_Bolus_Set_Step_Bolus_Start() { super(); opCode = BleCommandUtil.DANAR_PACKET__OPCODE_BOLUS__SET_STEP_BOLUS_START; } // Speed 0 => 12 sec/U, 1 => 30 sec/U, 2 => 60 sec/U - public DanaRS_Packet_Bolus_Set_Step_Bolus_Start(double amount, int speed) { - this(); + public DanaRS_Packet_Bolus_Set_Step_Bolus_Start(double amount, int speed) { + this(); - // HARDCODED LIMIT - amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); + // HARDCODED LIMIT + amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - this.amount = amount; - this.speed = speed; + this.amount = amount; + this.speed = speed; - if (Config.logDanaMessageDetail) - log.debug("Bolus start : " + amount + " speed: " + speed); - } + if (Config.logDanaMessageDetail) + log.debug("Bolus start : " + amount + " speed: " + speed); + } - @Override - public byte[] getRequestParams() { - int stepBolusRate = (int) (amount * 100); - byte[] request = new byte[3]; - request[0] = (byte) (stepBolusRate & 0xff); - request[1] = (byte) ((stepBolusRate >>> 8) & 0xff); - request[2] = (byte) (speed & 0xff); - return request; - } - @Override - public void handleMessage(byte[] data) { - int result = intFromBuff(data, 0, 1); - if (Config.logDanaMessageDetail) { - if (result == 0) - log.debug("Result OK"); - else - log.error("Result Error: " + result); - } - } + @Override + public byte[] getRequestParams() { + int stepBolusRate = (int) (amount * 100); + byte[] request = new byte[3]; + request[0] = (byte) (stepBolusRate & 0xff); + request[1] = (byte) ((stepBolusRate >>> 8) & 0xff); + request[2] = (byte) (speed & 0xff); + return request; + } - @Override - public String getFriendlyName() { - return "BOLUS__SET_STEP_BOLUS_START"; - } + @Override + public void handleMessage(byte[] data) { + errorCode = intFromBuff(data, 0, 1); + if (Config.logDanaMessageDetail) { + if (errorCode == 0) { + log.debug("Result OK"); + failed = false; + } else { + failed = true; + log.error("Result Error: " + errorCode); + } + } + } + + @Override + public String getFriendlyName() { + return "BOLUS__SET_STEP_BOLUS_START"; + } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java index 83e84e28cc..78548ecab3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Bolus_Set_Step_Bolus_Stop.java @@ -47,10 +47,10 @@ public class DanaRS_Packet_Bolus_Set_Step_Bolus_Stop extends DanaRS_Packet { stopped = true; if (!forced) { t.insulin = amount; - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_delivered); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_delivered); bolusingEvent.percent = 100; } else { - bolusingEvent.status = MainApp.sResources.getString(R.string.overview_bolusprogress_stoped); + bolusingEvent.status = MainApp.gs(R.string.overview_bolusprogress_stoped); } MainApp.bus().post(bolusingEvent); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java index a9bb7157af..bdc5ab8d9b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_General_Get_Pump_Check.java @@ -43,7 +43,7 @@ public class DanaRS_Packet_General_Get_Pump_Check extends DanaRS_Packet { } if (pump.productCode < 2) { - MainApp.bus().post(new EventNewNotification(new Notification(Notification.UNSUPPORTED_FIRMWARE, MainApp.sResources.getString(R.string.unsupportedfirmware), Notification.URGENT))); + MainApp.bus().post(new EventNewNotification(new Notification(Notification.UNSUPPORTED_FIRMWARE, MainApp.gs(R.string.unsupportedfirmware), Notification.URGENT))); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java index 88edd13a63..04737f0bdc 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Alarm.java @@ -30,23 +30,23 @@ public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet { switch (alarmCode) { case 0x01: // Battery 0% Alarm - errorString = MainApp.sResources.getString(R.string.batterydischarged); + errorString = MainApp.gs(R.string.batterydischarged); break; case 0x02: // Pump Error - errorString = MainApp.sResources.getString(R.string.pumperror) + " " + alarmCode; + errorString = MainApp.gs(R.string.pumperror) + " " + alarmCode; break; case 0x03: // Occlusion - errorString = MainApp.sResources.getString(R.string.occlusion); + errorString = MainApp.gs(R.string.occlusion); break; case 0x04: // LOW BATTERY - errorString = MainApp.sResources.getString(R.string.lowbattery); + errorString = MainApp.gs(R.string.lowbattery); break; case 0x05: // Shutdown - errorString = MainApp.sResources.getString(R.string.lowbattery); + errorString = MainApp.gs(R.string.lowbattery); break; case 0x06: // Basal Compare @@ -54,20 +54,20 @@ public class DanaRS_Packet_Notify_Alarm extends DanaRS_Packet { break; case 0x09: // Empty Reservoir - errorString = MainApp.sResources.getString(R.string.emptyreservoir); + errorString = MainApp.gs(R.string.emptyreservoir); break; // BT case 0x07: case 0xFF: // Blood sugar measurement alert - errorString = MainApp.sResources.getString(R.string.bloodsugarmeasurementalert); + errorString = MainApp.gs(R.string.bloodsugarmeasurementalert); break; case 0x08: case 0xFE: // Remaining insulin level - errorString = MainApp.sResources.getString(R.string.remaininsulinalert); + errorString = MainApp.gs(R.string.remaininsulinalert); break; case 0xFD: diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java index fb5793995c..2598c5efc9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Complete.java @@ -39,7 +39,7 @@ public class DanaRS_Packet_Notify_Delivery_Complete extends DanaRS_Packet { if (t != null) { t.insulin = deliveredInsulin; EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), deliveredInsulin); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), deliveredInsulin); bolusingEvent.t = t; bolusingEvent.percent = Math.min((int) (deliveredInsulin / amount * 100), 100); done = true; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java index 5354836375..34621d07ee 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/comm/DanaRS_Packet_Notify_Delivery_Rate_Display.java @@ -39,7 +39,7 @@ public class DanaRS_Packet_Notify_Delivery_Rate_Display extends DanaRS_Packet { lastReceive = System.currentTimeMillis(); t.insulin = deliveredInsulin; EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), deliveredInsulin); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), deliveredInsulin); bolusingEvent.t = t; bolusingEvent.percent = Math.min((int) (deliveredInsulin / amount * 100), 100); MainApp.bus().post(bolusingEvent); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java index 2901c4b863..b552026279 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/BLEComm.java @@ -433,7 +433,7 @@ public class BLEComm { if (inputBuffer.length == 4 && inputBuffer[2] == 'O' && inputBuffer[3] == 'K') { log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (OK)" + " " + DanaRS_Packet.toHexString(inputBuffer)); // Grab pairing key from preferences if exists - String pairingKey = SP.getString(MainApp.sResources.getString(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, null); + String pairingKey = SP.getString(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, null); log.debug("Using stored pairing key: " + pairingKey); if (pairingKey != null) { byte[] encodedPairingKey = DanaRS_Packet.hexToBytes(pairingKey); @@ -448,11 +448,11 @@ public class BLEComm { } else if (inputBuffer.length == 6 && inputBuffer[2] == 'B' && inputBuffer[3] == 'U' && inputBuffer[4] == 'S' && inputBuffer[5] == 'Y') { log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (BUSY)" + " " + DanaRS_Packet.toHexString(inputBuffer)); mSendQueue.clear(); - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.sResources.getString(R.string.pumpbusy))); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.pumpbusy))); } else { log.debug("<<<<< " + "ENCRYPTION__PUMP_CHECK (ERROR)" + " " + DanaRS_Packet.toHexString(inputBuffer)); mSendQueue.clear(); - MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.sResources.getString(R.string.connectionerror))); + MainApp.bus().post(new EventPumpStatusChanged(EventPumpStatusChanged.DISCONNECTED, MainApp.gs(R.string.connectionerror))); } break; // 2nd packet, pairing key @@ -480,7 +480,7 @@ public class BLEComm { SendTimeInfo(); byte[] pairingKey = {inputBuffer[2], inputBuffer[3]}; // store pairing key to preferences - SP.putString(MainApp.sResources.getString(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, DanaRS_Packet.bytesToHex(pairingKey)); + SP.putString(MainApp.gs(R.string.key_danars_pairingkey) + DanaRSPlugin.mDeviceName, DanaRS_Packet.bytesToHex(pairingKey)); log.debug("Got pairing key: " + DanaRS_Packet.bytesToHex(pairingKey)); break; // time and user password information. last packet in handshake diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java index 384c1a3772..a6afd0aeb0 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRS/services/DanaRSService.java @@ -123,19 +123,19 @@ public class DanaRSService extends Service { public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); bleComm.sendMessage(new DanaRS_Packet_General_Initial_Screen_Information()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Extended_Bolus_State()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Step_Bolus_Information()); // last bolus, bolusStep, maxBolus - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); long now = System.currentTimeMillis(); if (danaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRSPlugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); bleComm.sendMessage(new DanaRS_Packet_General_Get_Shipping_Information()); // serial no bleComm.sendMessage(new DanaRS_Packet_General_Get_Pump_Check()); // firmware bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Profile_Number()); @@ -143,7 +143,7 @@ public class DanaRSService extends Service { bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Basal_Rate()); // basal profile, basalStep, maxBasal bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Calculation_Information()); // target bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_CIR_CF_Array()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); bleComm.sendMessage(new DanaRS_Packet_Option_Get_Pump_Time()); long timeDiff = (danaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -165,9 +165,9 @@ public class DanaRSService extends Service { NSUpload.uploadDeviceStatus(); if (danaRPump.dailyTotalUnits > danaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + danaRPump.dailyTotalUnits + "/" + danaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -202,7 +202,7 @@ public class DanaRSService extends Service { if (!isConnected()) return false; if (BolusProgressDialog.stopPressed) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.startingbolus))); bolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); DanaRS_Packet_Bolus_Set_Step_Bolus_Start start = new DanaRS_Packet_Bolus_Set_Step_Bolus_Start(insulin, preferencesSpeed); @@ -258,7 +258,7 @@ public class DanaRSService extends Service { long expectedEnd = bolusStart + bolusDurationInMSec + 2000; while (System.currentTimeMillis() < expectedEnd) { long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + bolusingEvent.status = String.format(MainApp.gs(R.string.waitingforestimatedbolusend), waitTime / 1000); MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } @@ -267,13 +267,13 @@ public class DanaRSService extends Service { @Override public void run() { // reread bolus status - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Step_Bolus_Information()); // last bolus bolusingEvent.percent = 100; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.disconnecting))); } }); - return true; + return !start.failed; } public void bolusStop() { @@ -295,11 +295,11 @@ public class DanaRSService extends Service { public boolean tempBasal(Integer percent, int durationInHours) { if (!isConnected()) return false; if (danaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Temporary_Basal(percent, durationInHours)); SystemClock.sleep(200); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); @@ -310,11 +310,11 @@ public class DanaRSService extends Service { public boolean highTempBasal(Integer percent) { if (danaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_APS_Basal_Set_Temporary_Basal(percent)); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); loadEvents(); @@ -343,7 +343,7 @@ public class DanaRSService extends Service { public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); bleComm.sendMessage(new DanaRS_Packet_Basal_Set_Cancel_Temporary_Basal()); bleComm.sendMessage(new DanaRS_Packet_Basal_Get_Temporary_Basal_State()); loadEvents(); @@ -353,7 +353,7 @@ public class DanaRSService extends Service { public boolean extendedBolus(Double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Set_Extended_Bolus(insulin, durationInHalfHours)); SystemClock.sleep(200); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Extended_Bolus_State()); @@ -364,7 +364,7 @@ public class DanaRSService extends Service { public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); bleComm.sendMessage(new DanaRS_Packet_Bolus_Set_Extended_Bolus_Cancel()); bleComm.sendMessage(new DanaRS_Packet_Bolus_Get_Extended_Bolus_State()); loadEvents(); @@ -374,7 +374,7 @@ public class DanaRSService extends Service { public boolean updateBasalsInPump(Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); DanaRS_Packet_Basal_Set_Profile_Basal_Rate msgSet = new DanaRS_Packet_Basal_Set_Profile_Basal_Rate(0, basal); bleComm.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java index 81c5d4d944..7c13707949 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/DanaRv2Plugin.java @@ -22,6 +22,7 @@ import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage; import info.nightscout.androidaps.plugins.PumpDanaR.AbstractDanaRPlugin; +import info.nightscout.androidaps.plugins.PumpDanaR.comm.MsgBolusStartWithSpeed; import info.nightscout.androidaps.plugins.PumpDanaRv2.services.DanaRv2ExecutionService; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; @@ -119,7 +120,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { // Plugin base interface @Override public String getName() { - return MainApp.instance().getString(R.string.danarv2pump); + return MainApp.gs(R.string.danarv2pump); } @Override @@ -173,10 +174,13 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { if (detailedBolusInfo.insulin > 0 || carbs > 0) connectionOK = sExecutionService.bolus(detailedBolusInfo.insulin, (int) carbs, DateUtil.now() + carbTime * 60 * 1000, t); PumpEnactResult result = new PumpEnactResult(); - result.success = connectionOK; + result.success = connectionOK && Math.abs(detailedBolusInfo.insulin - t.insulin) < pumpDescription.bolusStep; result.bolusDelivered = t.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + if (!result.success) + result.comment = String.format(MainApp.gs(R.string.boluserrorcode), detailedBolusInfo.insulin, t.insulin, MsgBolusStartWithSpeed.errorCode); + else + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("deliverTreatment: OK. Asked: " + detailedBolusInfo.insulin + " Delivered: " + result.bolusDelivered); // remove carbs because it's get from history seprately @@ -186,7 +190,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { result.success = false; result.bolusDelivered = 0d; result.carbsDelivered = 0d; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("deliverTreatment: Invalid input"); return result; } @@ -287,7 +291,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { result.isTempCancel = false; result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_invalidinput); + result.comment = MainApp.gs(R.string.danar_invalidinput); log.error("setTempBasalPercent: Invalid input"); return result; } @@ -299,7 +303,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { result.enacted = false; result.success = true; result.isTempCancel = false; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; result.isPercent = true; @@ -317,7 +321,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; @@ -328,7 +332,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.tempbasaldeliveryerror); + result.comment = MainApp.gs(R.string.tempbasaldeliveryerror); log.error("setTempBasalPercent: Failed to set temp basal"); return result; } @@ -339,7 +343,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { if (connectionOK && pump.isTempBasalInProgress && pump.tempBasalPercent == percent) { result.enacted = true; result.success = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.isTempCancel = false; result.duration = pump.tempBasalRemainingMin; result.percent = pump.tempBasalPercent; @@ -350,7 +354,7 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { } result.enacted = false; result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); log.error("setHighTempBasalPercent: Failed to set temp basal"); return result; } @@ -367,13 +371,13 @@ public class DanaRv2Plugin extends AbstractDanaRPlugin { if (!pump.isTempBasalInProgress) { result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpActions) log.debug("cancelRealTempBasal: OK"); return result; } else { result.success = false; - result.comment = MainApp.instance().getString(R.string.danar_valuenotsetproperly); + result.comment = MainApp.gs(R.string.danar_valuenotsetproperly); result.isTempCancel = true; log.error("cancelRealTempBasal: Failed to cancel temp basal"); return result; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java index 9117ad1c98..0869844a1c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgCheckValue_v2.java @@ -39,7 +39,7 @@ public class MsgCheckValue_v2 extends MessageBase { pump.productCode = intFromBuff(bytes, 2, 1); if (pump.model != DanaRPump.EXPORT_MODEL) { pump.lastConnection = 0; - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); MainApp.getSpecificPlugin(DanaRPlugin.class).disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to Korean DanaR"); @@ -64,7 +64,7 @@ public class MsgCheckValue_v2 extends MessageBase { if (pump.protocol != 2) { pump.lastConnection = 0; - Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.sResources.getString(R.string.pumpdrivercorrected), Notification.NORMAL); + Notification notification = new Notification(Notification.WRONG_DRIVER, MainApp.gs(R.string.pumpdrivercorrected), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); DanaRKoreanPlugin.getPlugin().disconnect("Wrong Model"); log.debug("Wrong model selected. Switching to non APS DanaR"); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java index ac31d2df92..05c4087dcb 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/comm/MsgHistoryEvents_v2.java @@ -170,6 +170,6 @@ public class MsgHistoryEvents_v2 extends MessageBase { if (datetime.getTime() > lastEventTimeLoaded) lastEventTimeLoaded = datetime.getTime(); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.processinghistory) + ": " + status)); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.processinghistory) + ": " + status)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java index 551c2684c0..b9eb8ae655 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpDanaRv2/services/DanaRv2ExecutionService.java @@ -120,7 +120,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public void connect() { if (mDanaRPump.password != -1 && mDanaRPump.password != SP.getInt(R.string.key_danar_password, -1)) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.wrongpumppassword), R.raw.error); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.wrongpumppassword), R.raw.error); return; } @@ -161,7 +161,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public void getPumpStatus() { try { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpstatus))); MsgStatus statusMsg = new MsgStatus(); MsgStatusBasic statusBasicMsg = new MsgStatusBasic(); MsgStatusTempBasal_v2 tempStatusMsg = new MsgStatusTempBasal_v2(); @@ -175,17 +175,17 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { } } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); mSerialIOThread.sendMessage(statusMsg); mSerialIOThread.sendMessage(statusBasicMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingtempbasalstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingtempbasalstatus))); mSerialIOThread.sendMessage(tempStatusMsg); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingextendedbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingextendedbolusstatus))); mSerialIOThread.sendMessage(exStatusMsg); long now = System.currentTimeMillis(); if (mDanaRPump.lastSettingsRead + 60 * 60 * 1000L < now || !MainApp.getSpecificPlugin(DanaRv2Plugin.class).isInitialized()) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumpsettings))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumpsettings))); mSerialIOThread.sendMessage(new MsgSettingShippingInfo()); mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingMeal()); @@ -196,7 +196,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { mSerialIOThread.sendMessage(new MsgSettingActiveProfile()); mSerialIOThread.sendMessage(new MsgSettingProfileRatios()); mSerialIOThread.sendMessage(new MsgSettingProfileRatiosAll()); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingpumptime))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingpumptime))); mSerialIOThread.sendMessage(new MsgSettingPumpTime()); long timeDiff = (mDanaRPump.pumpTime.getTime() - System.currentTimeMillis()) / 1000L; log.debug("Pump time difference: " + timeDiff + " seconds"); @@ -218,9 +218,9 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { NSUpload.uploadDeviceStatus(); if (mDanaRPump.dailyTotalUnits > mDanaRPump.maxDailyTotalUnits * Constants.dailyLimitWarning) { log.debug("Approaching daily limit: " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits); - Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.sResources.getString(R.string.approachingdailylimit), Notification.URGENT); + Notification reportFail = new Notification(Notification.APPROACHING_DAILY_LIMIT, MainApp.gs(R.string.approachingdailylimit), Notification.URGENT); MainApp.bus().post(new EventNewNotification(reportFail)); - NSUpload.uploadError(MainApp.sResources.getString(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); + NSUpload.uploadError(MainApp.gs(R.string.approachingdailylimit) + ": " + mDanaRPump.dailyTotalUnits + "/" + mDanaRPump.maxDailyTotalUnits + "U"); } } catch (Exception e) { log.error("Unhandled exception", e); @@ -231,11 +231,11 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean tempBasal(int percent, int durationInHours) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStart(percent, durationInHours)); mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2()); loadEvents(); @@ -246,11 +246,11 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean highTempBasal(int percent) { if (!isConnected()) return false; if (mDanaRPump.isTempBasalInProgress) { - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); SystemClock.sleep(500); } - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingtempbasal))); mSerialIOThread.sendMessage(new MsgSetAPSTempBasalStart_v2(percent)); mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2()); loadEvents(); @@ -280,7 +280,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean tempBasalStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingtempbasal))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingtempbasal))); mSerialIOThread.sendMessage(new MsgSetTempBasalStop()); mSerialIOThread.sendMessage(new MsgStatusTempBasal_v2()); loadEvents(); @@ -290,7 +290,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolus(double insulin, int durationInHalfHours) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.settingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.settingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStart(insulin, (byte) (durationInHalfHours & 0xFF))); mSerialIOThread.sendMessage(new MsgStatusBolusExtended_v2()); loadEvents(); @@ -300,7 +300,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean extendedBolusStop() { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.stoppingextendedbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.stoppingextendedbolus))); mSerialIOThread.sendMessage(new MsgSetExtendedBolusStop()); mSerialIOThread.sendMessage(new MsgStatusBolusExtended_v2()); loadEvents(); @@ -312,7 +312,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { if (!isConnected()) return false; if (BolusProgressDialog.stopPressed) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.startingbolus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.startingbolus))); mBolusingTreatment = t; final int preferencesSpeed = SP.getInt(R.string.key_danars_bolusspeed, 0); MessageBase start; @@ -371,7 +371,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { long expectedEnd = bolusStart + bolusDurationInMSec + 2000; while (System.currentTimeMillis() < expectedEnd) { long waitTime = expectedEnd - System.currentTimeMillis(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.waitingforestimatedbolusend), waitTime / 1000); + bolusingEvent.status = String.format(MainApp.gs(R.string.waitingforestimatedbolusend), waitTime / 1000); MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); } @@ -380,13 +380,13 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { @Override public void run() { // load last bolus status - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.gettingbolusstatus))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.gettingbolusstatus))); mSerialIOThread.sendMessage(new MsgStatus()); bolusingEvent.percent = 100; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.disconnecting))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.disconnecting))); } }); - return true; + return !start.failed; } public void bolusStop() { @@ -442,7 +442,7 @@ public class DanaRv2ExecutionService extends AbstractDanaRExecutionService { public boolean updateBasalsInPump(final Profile profile) { if (!isConnected()) return false; - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.updatingbasalrates))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.updatingbasalrates))); double[] basal = DanaRPump.buildDanaRProfileRecord(profile); MsgSetBasalProfile msgSet = new MsgSetBasalProfile((byte) 0, basal); mSerialIOThread.sendMessage(msgSet); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java index c0e53ddaac..824a449f38 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/InsightPlugin.java @@ -320,9 +320,9 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai PumpEnactResult result = new PumpEnactResult(); if (!isInitialized()) { log.error("setNewBasalProfile not initialized"); - Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); + Notification notification = new Notification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED, MainApp.gs(R.string.pumpNotInitializedProfileNotSet), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.pumpNotInitializedProfileNotSet); + result.comment = MainApp.gs(R.string.pumpNotInitializedProfileNotSet); return result; } MainApp.bus().post(new EventDismissNotification(Notification.PROFILE_NOT_SET_NOT_INITIALIZED)); @@ -339,16 +339,16 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai final Mstatus ms = async.busyWaitForCommandResult(uuid, BUSY_WAIT_TIME); if (ms.success()) { MainApp.bus().post(new EventDismissNotification(Notification.FAILED_UDPATE_PROFILE)); - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); result.success = true; result.enacted = true; result.comment = "OK"; this.profileBlocks = profileBlocks; } else { - Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.sResources.getString(R.string.failedupdatebasalprofile), Notification.URGENT); + Notification notification = new Notification(Notification.FAILED_UDPATE_PROFILE, MainApp.gs(R.string.failedupdatebasalprofile), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); - result.comment = MainApp.sResources.getString(R.string.failedupdatebasalprofile); + result.comment = MainApp.gs(R.string.failedupdatebasalprofile); } return result; } @@ -395,7 +395,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai result.bolusDelivered = detailedBolusInfo.insulin; result.carbsDelivered = detailedBolusInfo.carbs; result.enacted = result.bolusDelivered > 0 || result.carbsDelivered > 0; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); result.percent = 100; @@ -425,7 +425,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai t.isSMB = detailedBolusInfo.isSMB; final EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); bolusingEvent.t = t; - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), 0F); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), 0F); bolusingEvent.bolusId = bolusId; bolusingEvent.percent = 0; MainApp.bus().post(bolusingEvent); @@ -464,7 +464,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai if (activeBolus == null) break; else { bolusingEvent.percent = (int) (100D / activeBolus.getInitialAmount() * (activeBolus.getInitialAmount() - activeBolus.getLeftoverAmount())); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), activeBolus.getInitialAmount() - activeBolus.getLeftoverAmount()); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), activeBolus.getInitialAmount() - activeBolus.getLeftoverAmount()); MainApp.bus().post(bolusingEvent); } } else break; @@ -796,7 +796,7 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai } private String gs(int id) { - return MainApp.instance().getString(id); + return MainApp.gs(id); } private boolean isPumpRunning() { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java index a96c98a39a..82b6cc3cc8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/connector/Connector.java @@ -62,7 +62,7 @@ public class Connector { private int serviceReconnects = 0; private StatusCallback statusCallback = new StatusCallback() { @Override - public synchronized void onStatusChange(Status status) { + public synchronized void onStatusChange(Status status, long statusTime, long waitTime) { if ((status != lastStatus) || (Helpers.msSince(lastStatusTime) > 2000)) { log("Status change: " + status); @@ -94,15 +94,15 @@ public class Connector { serviceConnector.connect(); } else { log("PROTOCOL VERSION MISMATCH! local: " + COMPATIBILITY_VERSION + " remote: " + remoteVersion); - statusCallback.onStatusChange(Status.INCOMPATIBLE); - compatabilityMessage = gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion(); + statusCallback.onStatusChange(Status.INCOMPATIBLE, 0, 0); + compatabilityMessage = MainApp.gs(R.string.insight_incompatible_compantion_app_we_need_version) + " " + getLocalVersion(); serviceConnector.disconnectFromService(); } } catch (NullPointerException e) { log("ERROR: null pointer when trying to connect to pump"); } - statusCallback.onStatusChange(safeGetStatus()); + statusCallback.onStatusChange(safeGetStatus(), 0, 0); } @Override @@ -179,33 +179,29 @@ public class Connector { switch (status) { case EXCHANGING_KEYS: - return gs(R.string.connecting).toUpperCase(); + return MainApp.gs(R.string.connecting).toUpperCase(); case WAITING_FOR_CODE_CONFIRMATION: - return gs(R.string.insight_waiting_for_code).toUpperCase(); + return MainApp.gs(R.string.insight_waiting_for_code).toUpperCase(); case CODE_REJECTED: - return gs(R.string.insight_code_rejected).toUpperCase(); + return MainApp.gs(R.string.insight_code_rejected).toUpperCase(); case APP_BINDING: - return gs(R.string.insight_app_binding).toUpperCase(); + return MainApp.gs(R.string.insight_app_binding).toUpperCase(); case CONNECTING: - return gs(R.string.connecting).toUpperCase(); + return MainApp.gs(R.string.connecting).toUpperCase(); case CONNECTED: - return gs(R.string.connected).toUpperCase(); + return MainApp.gs(R.string.connected).toUpperCase(); case DISCONNECTED: - return gs(R.string.disconnected).toUpperCase(); + return MainApp.gs(R.string.disconnected).toUpperCase(); case NOT_AUTHORIZED: - return gs(R.string.insight_not_authorized).toUpperCase(); + return MainApp.gs(R.string.insight_not_authorized).toUpperCase(); case INCOMPATIBLE: - return gs(R.string.insight_incompatible).toUpperCase(); + return MainApp.gs(R.string.insight_incompatible).toUpperCase(); default: return status.toString(); } } - private static String gs(int id) { - return MainApp.instance().getString(id); - } - private static synchronized void extendKeepAliveIfActive() { if (keepAliveActive()) { if (Helpers.ratelimit("extend-insight-keepalive", 10)) { @@ -221,7 +217,7 @@ public class Connector { public static String getKeepAliveString() { if (keepAliveActive()) { - return MainApp.instance().getString(R.string.insight_keepalive_format_string, + return MainApp.gs(R.string.insight_keepalive_format_string, stayConnectedTime / 1000, Helpers.hourMinuteSecondString(stayConnectedTill)); } else { @@ -384,7 +380,7 @@ public class Connector { public String getLastStatusMessage() { if (!companionAppInstalled) { - return gs(R.string.insight_companion_app_not_installed); + return MainApp.gs(R.string.insight_companion_app_not_installed); } if (!isConnected()) { @@ -398,13 +394,13 @@ public class Connector { // if disconnected but previous state was incompatible return compatabilityMessage; } else { - return gs(R.string.insight_not_connected_to_companion_app); + return MainApp.gs(R.string.insight_not_connected_to_companion_app); } } } if (lastStatus == null) { - return gs(R.string.insight_unknown); + return MainApp.gs(R.string.insight_unknown); } switch (lastStatus) { @@ -414,16 +410,16 @@ public class Connector { } break; case INCOMPATIBLE: - return statusToString(lastStatus) + " " + gs(R.string.insight_needs) + " " + getLocalVersion(); + return statusToString(lastStatus) + " " + MainApp.gs(R.string.insight_needs) + " " + getLocalVersion(); } return statusToString(lastStatus); } public String getNiceLastStatusTime() { if (lastStatusTime < 1) { - return gs(R.string.insight_startup_uppercase); + return MainApp.gs(R.string.insight_startup_uppercase); } else { - return Helpers.niceTimeScalar(Helpers.msSince(lastStatusTime)) + " " + gs(R.string.ago); + return Helpers.niceTimeScalar(Helpers.msSince(lastStatusTime)) + " " + MainApp.gs(R.string.ago); } } @@ -516,7 +512,7 @@ public class Connector { } for (Map.Entry entry : statistics.entrySet()) { if ((long) entry.getValue() > 1000) { - l.add(new StatusItem(gs(R.string.statistics) + " " + Helpers.capitalize(entry.getKey().toString()), + l.add(new StatusItem(MainApp.gs(R.string.statistics) + " " + Helpers.capitalize(entry.getKey().toString()), new Formatter().format("%4s %12s", percentage(getEntryTime(entry), total) + "%", Helpers.niceTimeScalar(getEntryTime(entry))).toString())); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java index 1ddc4fd4b7..e7784287b7 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryIntentAdapter.java @@ -161,18 +161,54 @@ class HistoryIntentAdapter { Date date = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME); String alertType = intent.getStringExtra(HistoryBroadcast.EXTRA_ALERT_TYPE); if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return; - try { - JSONObject data = new JSONObject(); - String enteredBy = SP.getString("careportal_enteredby", ""); - if (!enteredBy.equals("")) data.put("enteredBy", enteredBy); - data.put("created_at", DateUtil.toISOString(date)); - data.put("eventType", CareportalEvent.NOTE); - data.put("notes", MainApp.instance().getString(getAlertText(alertType))); - NSUpload.uploadCareportalEntryToNS(data); - } catch (JSONException e) { - e.printStackTrace(); + logNote(date, MainApp.gs(getAlertText(alertType))); + } + } + + void processPumpStatusChangedIntent(Intent intent) { + Date newStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_EVENT_TIME); + if (SP.getBoolean("insight_automatic_careportal_events", false)) { + String newStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_NEW_STATUS); + switch (newStatus) { + case "STARTED": + logNote(newStatusTime, MainApp.gs(R.string.pump_started)); + break; + case "STOPPED": + logNote(newStatusTime, MainApp.gs(R.string.pump_stopped)); + break; + case "PAUSED": + logNote(newStatusTime, MainApp.gs(R.string.pump_paused)); + break; } } + if (intent.hasExtra(HistoryBroadcast.EXTRA_OLD_STATUS_TIME)) { + String oldStatus = intent.getStringExtra(HistoryBroadcast.EXTRA_OLD_STATUS); + if (oldStatus.equals("STOPPED")) { + Date oldStatusTime = getDateExtra(intent, HistoryBroadcast.EXTRA_OLD_STATUS_TIME); + int duration = (int) ((newStatusTime.getTime() - oldStatusTime.getTime()) / 60000); + + long serialNumber = Long.parseLong(intent.getStringExtra(HistoryBroadcast.EXTRA_PUMP_SERIAL_NUMBER)); + long recordId = intent.getLongExtra(HistoryBroadcast.EXTRA_EVENT_NUMBER, -1); + long uniqueRecordId = getRecordUniqueID(serialNumber, recordId); + + logAdapter.createTBRrecord(oldStatusTime, 0, duration, uniqueRecordId); + } + } + } + + private void logNote(Date date, String note) { + try { + if (MainApp.getDbHelper().getCareportalEventFromTimestamp(date.getTime()) != null) return; + JSONObject data = new JSONObject(); + String enteredBy = SP.getString("careportal_enteredby", ""); + if (!enteredBy.equals("")) data.put("enteredBy", enteredBy); + data.put("created_at", DateUtil.toISOString(date)); + data.put("eventType", CareportalEvent.NOTE); + data.put("notes", note); + NSUpload.uploadCareportalEntryToNS(data); + } catch (JSONException e) { + e.printStackTrace(); + } } private int getAlertText(String type) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java index 0e254e3341..ca68a389c8 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/HistoryReceiver.java @@ -47,6 +47,7 @@ public class HistoryReceiver { filter.addAction(ACTION_CARTRIDGE_INSERTED); filter.addAction(ACTION_BATTERY_INSERTED); filter.addAction(ACTION_OCCURENCE_OF_ALERT); + filter.addAction(ACTION_PUMP_STATUS_CHANGED); MainApp.instance().registerReceiver(historyReceiver, filter); } @@ -108,6 +109,9 @@ public class HistoryReceiver { case ACTION_OCCURENCE_OF_ALERT: intentAdapter.processOccurenceOfAlertIntent(intent); break; + case ACTION_PUMP_STATUS_CHANGED: + intentAdapter.processPumpStatusChangedIntent(intent); + break; } } }; @@ -127,7 +131,7 @@ public class HistoryReceiver { @Override public String toString() { - return MainApp.instance().getString(string_id); + return MainApp.gs(string_id); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java index ca3848e113..46af6bda98 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/history/LiveHistory.java @@ -17,7 +17,7 @@ public class LiveHistory { public static String getStatus() { if (status.equals("")) return status; - return status + " " + Helpers.niceTimeScalar(Helpers.msSince(status_time)) + " " + gs(R.string.ago); + return status + " " + Helpers.niceTimeScalar(Helpers.msSince(status_time)) + " " + MainApp.gs(R.string.ago); } public static long getStatusTime() { @@ -30,8 +30,4 @@ public class LiveHistory { status = mystatus; } } - - private static String gs(int id) { - return MainApp.instance().getString(id); - } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java index a2abda40d7..344bf638b2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpInsight/utils/Helpers.java @@ -96,32 +96,28 @@ public class Helpers { } public static String niceTimeScalar(long t) { - String unit = gs(R.string.second); + String unit = MainApp.gs(R.string.second); t = t / 1000; if (t > 59) { - unit = gs(R.string.minute); + unit = MainApp.gs(R.string.minute); t = t / 60; if (t > 59) { - unit = gs(R.string.hour); + unit = MainApp.gs(R.string.hour); t = t / 60; if (t > 24) { - unit = gs(R.string.day); + unit = MainApp.gs(R.string.day); t = t / 24; if (t > 28) { - unit = gs(R.string.week); + unit = MainApp.gs(R.string.week); t = t / 7; } } } } - if (t != 1) unit = unit + gs(R.string.time_plural); + if (t != 1) unit = unit + MainApp.gs(R.string.time_plural); return qs((double) t, 0) + " " + unit; } - private static String gs(int id) { - return MainApp.instance().getString(id); - } - public static String qs(double x, int digits) { if (digits == -1) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java index 9c19a383ae..fed0c01c64 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpMDI/MDIPlugin.java @@ -134,7 +134,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { result.success = true; result.bolusDelivered = detailedBolusInfo.insulin; result.carbsDelivered = detailedBolusInfo.carbs; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryTreatment(detailedBolusInfo); return result; } @@ -147,7 +147,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult setTempBasalAbsolute(Double absoluteRate, Integer durationInMinutes, Profile profile, boolean enforceNew) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Setting temp basal absolute: " + result); return result; @@ -157,7 +157,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult setTempBasalPercent(Integer percent, Integer durationInMinutes, Profile profile, boolean enforceNew) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Settings temp basal percent: " + result); return result; @@ -167,7 +167,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Setting extended bolus: " + result); return result; @@ -177,7 +177,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult cancelTempBasal(boolean force) { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Cancel temp basal: " + result); return result; @@ -187,7 +187,7 @@ public class MDIPlugin extends PluginBase implements PumpInterface { public PumpEnactResult cancelExtendedBolus() { PumpEnactResult result = new PumpEnactResult(); result.success = false; - result.comment = MainApp.instance().getString(R.string.pumperror); + result.comment = MainApp.gs(R.string.pumperror); if (Config.logPumpComm) log.debug("Canceling extended basal: " + result); return result; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java index 0491ce0f74..34d3fee80b 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/PumpVirtual/VirtualPumpPlugin.java @@ -171,7 +171,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { // Do nothing here. we are using MainApp.getConfigBuilder().getActiveProfile().getProfile(); PumpEnactResult result = new PumpEnactResult(); result.success = true; - Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.sResources.getString(R.string.profile_set_ok), Notification.INFO, 60); + Notification notification = new Notification(Notification.PROFILE_SET_OK, MainApp.gs(R.string.profile_set_ok), Notification.INFO, 60); MainApp.bus().post(new EventNewNotification(notification)); return result; } @@ -202,21 +202,21 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.bolusDelivered = detailedBolusInfo.insulin; result.carbsDelivered = detailedBolusInfo.carbs; result.enacted = result.bolusDelivered > 0 || result.carbsDelivered > 0; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); Double delivering = 0d; while (delivering < detailedBolusInfo.insulin) { SystemClock.sleep(200); EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivering), delivering); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivering), delivering); bolusingEvent.percent = Math.min((int) (delivering / detailedBolusInfo.insulin * 100), 100); MainApp.bus().post(bolusingEvent); delivering += 0.1d; } SystemClock.sleep(200); EventOverviewBolusProgress bolusingEvent = EventOverviewBolusProgress.getInstance(); - bolusingEvent.status = String.format(MainApp.sResources.getString(R.string.bolusdelivered), detailedBolusInfo.insulin); + bolusingEvent.status = String.format(MainApp.gs(R.string.bolusdelivered), detailedBolusInfo.insulin); bolusingEvent.percent = 100; MainApp.bus().post(bolusingEvent); SystemClock.sleep(1000); @@ -246,7 +246,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.isTempCancel = false; result.absolute = absoluteRate; result.duration = durationInMinutes; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal); if (Config.logPumpComm) log.debug("Setting temp basal absolute: " + result); @@ -274,7 +274,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.isPercent = true; result.isTempCancel = false; result.duration = durationInMinutes; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryTempBasal(tempBasal); if (Config.logPumpComm) log.debug("Settings temp basal percent: " + result); @@ -298,7 +298,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.bolusDelivered = insulin; result.isTempCancel = false; result.duration = durationInMinutes; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); TreatmentsPlugin.getPlugin().addToHistoryExtendedBolus(extendedBolus); if (Config.logPumpComm) log.debug("Setting extended bolus: " + result); @@ -312,7 +312,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { PumpEnactResult result = new PumpEnactResult(); result.success = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (TreatmentsPlugin.getPlugin().isTempBasalInProgress()) { result.enacted = true; TemporaryBasal tempStop = new TemporaryBasal().date(System.currentTimeMillis()).source(Source.USER); @@ -337,7 +337,7 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { result.success = true; result.enacted = true; result.isTempCancel = true; - result.comment = MainApp.instance().getString(R.string.virtualpump_resultok); + result.comment = MainApp.gs(R.string.virtualpump_resultok); if (Config.logPumpComm) log.debug("Canceling extended basal: " + result); MainApp.bus().post(new EventVirtualPumpUpdateGui()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java index 0725823ac9..75b1ea9675 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityAAPS/SensitivityAAPSPlugin.java @@ -56,9 +56,9 @@ public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInte String age = SP.getString(R.string.key_age, ""); int defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_adult))) defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_teenage))) defaultHours = 4; - if (age.equals(MainApp.sResources.getString(R.string.key_child))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_adult))) defaultHours = 24; + if (age.equals(MainApp.gs(R.string.key_teenage))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_child))) defaultHours = 4; int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours); Profile profile = MainApp.getConfigBuilder().getProfile(); @@ -139,8 +139,8 @@ public class SensitivityAAPSPlugin extends PluginBase implements SensitivityInte log.debug(sensResult); double rawRatio = ratio; - ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); - ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7"))); + ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (ratio != rawRatio) { ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java index 3e9cc2cf9e..15be72880d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityOref0/SensitivityOref0Plugin.java @@ -150,8 +150,8 @@ public class SensitivityOref0Plugin extends PluginBase implements SensitivityInt ratio = 1 + (basalOff / profile.getMaxDailyBasal()); double rawRatio = ratio; - ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); - ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7"))); + ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (ratio != rawRatio) { ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java index 4066b1edfb..58f59701d9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SensitivityWeightedAverage/SensitivityWeightedAveragePlugin.java @@ -52,9 +52,9 @@ public class SensitivityWeightedAveragePlugin extends PluginBase implements Sens String age = SP.getString(R.string.key_age, ""); int defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_adult))) defaultHours = 24; - if (age.equals(MainApp.sResources.getString(R.string.key_teenage))) defaultHours = 4; - if (age.equals(MainApp.sResources.getString(R.string.key_child))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_adult))) defaultHours = 24; + if (age.equals(MainApp.gs(R.string.key_teenage))) defaultHours = 4; + if (age.equals(MainApp.gs(R.string.key_child))) defaultHours = 4; int hoursForDetection = SP.getInt(R.string.key_openapsama_autosens_period, defaultHours); if (autosensDataTable == null || autosensDataTable.size() < 4) { @@ -159,8 +159,8 @@ public class SensitivityWeightedAveragePlugin extends PluginBase implements Sens log.debug(sensResult); double rawRatio = ratio; - ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_min", "0.7"))); - ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString("openapsama_autosens_max", "1.2"))); + ratio = Math.max(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_min, "0.7"))); + ratio = Math.min(ratio, SafeParse.stringToDouble(SP.getString(R.string.key_openapsama_autosens_max, "1.2"))); if (ratio != rawRatio) { ratioLimit = "Ratio limited from " + rawRatio + " to " + ratio; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java index a0192a528c..9de6cc6ad6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorPlugin.java @@ -206,24 +206,24 @@ public class SmsCommunicatorPlugin extends PluginBase { String units = MainApp.getConfigBuilder().getProfileUnits(); if (actualBG != null) { - reply = MainApp.sResources.getString(R.string.sms_actualbg) + " " + actualBG.valueToUnitsToString(units) + ", "; + reply = MainApp.gs(R.string.sms_actualbg) + " " + actualBG.valueToUnitsToString(units) + ", "; } else if (lastBG != null) { Long agoMsec = System.currentTimeMillis() - lastBG.date; int agoMin = (int) (agoMsec / 60d / 1000d); - reply = MainApp.sResources.getString(R.string.sms_lastbg) + " " + lastBG.valueToUnitsToString(units) + " " + String.format(MainApp.sResources.getString(R.string.sms_minago), agoMin) + ", "; + reply = MainApp.gs(R.string.sms_lastbg) + " " + lastBG.valueToUnitsToString(units) + " " + String.format(MainApp.gs(R.string.sms_minago), agoMin) + ", "; } GlucoseStatus glucoseStatus = GlucoseStatus.getGlucoseStatusData(); if (glucoseStatus != null) - reply += MainApp.sResources.getString(R.string.sms_delta) + " " + Profile.toUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) + " " + units + ", "; + reply += MainApp.gs(R.string.sms_delta) + " " + Profile.toUnitsString(glucoseStatus.delta, glucoseStatus.delta * Constants.MGDL_TO_MMOLL, units) + " " + units + ", "; TreatmentsPlugin.getPlugin().updateTotalIOBTreatments(); IobTotal bolusIob = TreatmentsPlugin.getPlugin().getLastCalculationTreatments().round(); TreatmentsPlugin.getPlugin().updateTotalIOBTempBasals(); IobTotal basalIob = TreatmentsPlugin.getPlugin().getLastCalculationTempBasals().round(); - reply += MainApp.sResources.getString(R.string.sms_iob) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" - + MainApp.sResources.getString(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " - + MainApp.sResources.getString(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; + reply += MainApp.gs(R.string.sms_iob) + " " + DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob) + "U (" + + MainApp.gs(R.string.sms_bolus) + " " + DecimalFormatter.to2Decimal(bolusIob.iob) + "U " + + MainApp.gs(R.string.sms_basal) + " " + DecimalFormatter.to2Decimal(basalIob.basaliob) + "U)"; sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); receivedSms.processed = true; @@ -241,8 +241,8 @@ public class SmsCommunicatorPlugin extends PluginBase { @Override public void run() { MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_STOP")); - String reply = MainApp.sResources.getString(R.string.smscommunicator_loophasbeendisabled) + " " + - MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_loophasbeendisabled) + " " + + MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } }); @@ -255,7 +255,7 @@ public class SmsCommunicatorPlugin extends PluginBase { loopPlugin = MainApp.getSpecificPlugin(LoopPlugin.class); if (loopPlugin != null && !loopPlugin.isEnabled(PluginType.LOOP)) { loopPlugin.setPluginEnabled(PluginType.LOOP, true); - reply = MainApp.sResources.getString(R.string.smscommunicator_loophasbeenenabled); + reply = MainApp.gs(R.string.smscommunicator_loophasbeenenabled); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_START")); } @@ -267,11 +267,11 @@ public class SmsCommunicatorPlugin extends PluginBase { if (loopPlugin != null) { if (loopPlugin.isEnabled(PluginType.LOOP)) { if (loopPlugin.isSuspended()) - reply = String.format(MainApp.sResources.getString(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend()); + reply = String.format(MainApp.gs(R.string.loopsuspendedfor), loopPlugin.minutesToEndOfSuspend()); else - reply = MainApp.sResources.getString(R.string.smscommunicator_loopisenabled); + reply = MainApp.gs(R.string.smscommunicator_loopisenabled); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_loopisdisabled); + reply = MainApp.gs(R.string.smscommunicator_loopisdisabled); } sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } @@ -282,7 +282,7 @@ public class SmsCommunicatorPlugin extends PluginBase { LoopPlugin.getPlugin().suspendTo(0); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_RESUME")); NSUpload.uploadOpenAPSOffline(0); - reply = MainApp.sResources.getString(R.string.smscommunicator_loopresumed); + reply = MainApp.gs(R.string.smscommunicator_loopresumed); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume")); break; @@ -292,18 +292,18 @@ public class SmsCommunicatorPlugin extends PluginBase { duration = Math.max(0, duration); duration = Math.min(180, duration); if (duration == 0) { - reply = MainApp.sResources.getString(R.string.smscommunicator_wrongduration); + reply = MainApp.gs(R.string.smscommunicator_wrongduration); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_suspendreplywithcode), duration, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_suspendreplywithcode), duration, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); suspendWaitingForConfirmation.duration = duration; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotecommandnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotecommandnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } break; @@ -350,7 +350,7 @@ public class SmsCommunicatorPlugin extends PluginBase { sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } } else { - String reply = MainApp.sResources.getString(R.string.readstatusfailed); + String reply = MainApp.gs(R.string.readstatusfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -363,33 +363,33 @@ public class SmsCommunicatorPlugin extends PluginBase { if (splited[1].toUpperCase().equals("CANCEL") || splited[1].toUpperCase().equals("STOP")) { if (remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_basalstopreplywithcode), passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_basalstopreplywithcode), passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } else { tempBasal = SafeParse.stringToDouble(splited[1]); Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { - reply = MainApp.sResources.getString(R.string.noprofile); + reply = MainApp.gs(R.string.noprofile); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { tempBasal = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(tempBasal), profile).value(); if (remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_basalreplywithcode), tempBasal, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_basalreplywithcode), tempBasal, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); tempBasalWaitingForConfirmation.tempBasal = tempBasal; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebasalnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -398,24 +398,24 @@ public class SmsCommunicatorPlugin extends PluginBase { break; case "BOLUS": if (System.currentTimeMillis() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (ConfigBuilderPlugin.getActivePump().isSuspended()) { - reply = MainApp.sResources.getString(R.string.pumpsuspended); + reply = MainApp.gs(R.string.pumpsuspended); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } else if (splited.length > 1) { amount = SafeParse.stringToDouble(splited[1]); amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); if (amount > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusreplywithcode), amount, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_bolusreplywithcode), amount, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); bolusWaitingForConfirmation.bolusRequested = amount; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bolus")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotebolusnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -425,14 +425,14 @@ public class SmsCommunicatorPlugin extends PluginBase { amount = SafeParse.stringToDouble(splited[1]); if (amount > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_calibrationreplywithcode), amount, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_calibrationreplywithcode), amount, passCode); receivedSms.processed = true; resetWaitingMessages(); sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, new Date(), passCode)); calibrationWaitingForConfirmation.calibrationRequested = amount; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Cal")); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_remotecalibrationnotallowed); + reply = MainApp.gs(R.string.smscommunicator_remotecalibrationnotallowed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } @@ -449,13 +449,13 @@ public class SmsCommunicatorPlugin extends PluginBase { public void run() { PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); if (result.success) { - String reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); + String reply = String.format(MainApp.gs(R.string.smscommunicator_bolusdelivered), result.bolusDelivered); if (pump != null) reply += "\n" + pump.shortStatus(true); lastRemoteBolusTime = new Date(); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_bolusfailed); + String reply = MainApp.gs(R.string.smscommunicator_bolusfailed); if (pump != null) reply += "\n" + pump.shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); @@ -471,11 +471,11 @@ public class SmsCommunicatorPlugin extends PluginBase { @Override public void run() { if (result.success) { - String reply = String.format(MainApp.sResources.getString(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); + String reply = String.format(MainApp.gs(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalfailed); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalfailed); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } @@ -488,11 +488,11 @@ public class SmsCommunicatorPlugin extends PluginBase { @Override public void run() { if (result.success) { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcanceled); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcanceled); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } @@ -503,10 +503,10 @@ public class SmsCommunicatorPlugin extends PluginBase { calibrationWaitingForConfirmation.processed = true; boolean result = XdripCalibrations.sendIntent(calibrationWaitingForConfirmation.calibrationRequested); if (result) { - reply = MainApp.sResources.getString(R.string.smscommunicator_calibrationsent); + reply = MainApp.gs(R.string.smscommunicator_calibrationsent); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - reply = MainApp.sResources.getString(R.string.smscommunicator_calibrationfailed); + reply = MainApp.gs(R.string.smscommunicator_calibrationfailed); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed && @@ -519,18 +519,18 @@ public class SmsCommunicatorPlugin extends PluginBase { LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + suspendWaitingForConfirmation.duration * 60L * 1000); NSUpload.uploadOpenAPSOffline(suspendWaitingForConfirmation.duration * 60); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED")); - String reply = MainApp.sResources.getString(R.string.smscommunicator_loopsuspended) + " " + - MainApp.sResources.getString(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_loopsuspended) + " " + + MainApp.gs(result.success ? R.string.smscommunicator_tempbasalcanceled : R.string.smscommunicator_tempbasalcancelfailed); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, new Date())); } else { - String reply = MainApp.sResources.getString(R.string.smscommunicator_tempbasalcancelfailed); + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); reply += "\n" + ConfigBuilderPlugin.getActivePump().shortStatus(true); sendSMS(new Sms(receivedSms.phoneNumber, reply, new Date())); } } }); } else { - sendSMS(new Sms(receivedSms.phoneNumber, MainApp.sResources.getString(R.string.smscommunicator_unknowncommand), new Date())); + sendSMS(new Sms(receivedSms.phoneNumber, MainApp.gs(R.string.smscommunicator_unknowncommand), new Date())); } resetWaitingMessages(); break; @@ -563,10 +563,10 @@ public class SmsCommunicatorPlugin extends PluginBase { smsManager.sendTextMessage(sms.phoneNumber, null, sms.text, null, null); messages.add(sms); } catch (IllegalArgumentException e) { - Notification notification = new Notification(Notification.INVALID_PHONE_NUMBER, MainApp.sResources.getString(R.string.smscommunicator_invalidphonennumber), Notification.NORMAL); + Notification notification = new Notification(Notification.INVALID_PHONE_NUMBER, MainApp.gs(R.string.smscommunicator_invalidphonennumber), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); } catch (java.lang.SecurityException e) { - Notification notification = new Notification(Notification.MISSING_SMS_PERMISSION, MainApp.sResources.getString(R.string.smscommunicator_missingsmspermission), Notification.NORMAL); + Notification notification = new Notification(Notification.MISSING_SMS_PERMISSION, MainApp.gs(R.string.smscommunicator_missingsmspermission), Notification.NORMAL); MainApp.bus().post(new EventNewNotification(notification)); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java index 7e959b78d4..3e9a79d459 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/BGSourceFragment.java @@ -143,9 +143,9 @@ public class BGSourceFragment extends SubscriberFragment { case R.id.bgsource_remove: AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(profile.getUnits())); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(bgReading.date) + "\n" + bgReading.valueToUnitsToString(profile.getUnits())); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { /* final String _id = bgReading._id; if (NSUpload.isIdValid(_id)) { @@ -159,7 +159,7 @@ public class BGSourceFragment extends SubscriberFragment { updateGUI(); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java index f47d25abb1..bd3d96162e 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Source/SourceXdripPlugin.java @@ -35,6 +35,6 @@ public class SourceXdripPlugin extends PluginBase implements BgSourceInterface { } public void setSource(String source) { - this.advancedFiltering = "G5 Native".equals(source); + this.advancedFiltering = source.contains("G5 Native"); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java index 31d44a3e30..1983c38242 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/Treatment.java @@ -193,11 +193,6 @@ public class Treatment implements DataPointWithLabelInterface { return MainApp.instance().getResources().getColor(android.R.color.holo_red_light); } - @Override - public int getSecondColor() { - return 0; - } - @Override public void setY(double y) { yValue = y; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java index 8f82f71c35..8ae2e6d7b1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/TreatmentsPlugin.java @@ -40,6 +40,8 @@ import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; +import info.nightscout.androidaps.plugins.SensitivityAAPS.SensitivityAAPSPlugin; +import info.nightscout.androidaps.plugins.SensitivityWeightedAverage.SensitivityWeightedAveragePlugin; import info.nightscout.utils.DateUtil; import info.nightscout.utils.NSUpload; import info.nightscout.utils.SP; @@ -173,13 +175,13 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface Iob tIOB = t.iobCalc(time, dia); total.iob += tIOB.iobContrib; total.activity += tIOB.activityContrib; - if (t.date > total.lastBolusTime) + if (t.insulin > 0 && t.date > total.lastBolusTime) total.lastBolusTime = t.date; if (!t.isSMB) { // instead of dividing the DIA that only worked on the bilinear curves, // multiply the time the treatment is seen active. long timeSinceTreatment = time - t.date; - long snoozeTime = t.date + (long) (timeSinceTreatment * SP.getDouble("openapsama_bolussnooze_dia_divisor", 2.0)); + long snoozeTime = t.date + (long) (timeSinceTreatment * SP.getDouble(R.string.key_openapsama_bolussnooze_dia_divisor, 2.0)); Iob bIOB = t.iobCalc(snoozeTime, dia); total.bolussnooze += bIOB.iobContrib; } @@ -211,22 +213,35 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface if (profile == null) return result; long now = System.currentTimeMillis(); - long dia_ago = now - (Double.valueOf(1.5d * profile.getDia() * T.hours(1).msecs())).longValue(); + long dia_ago = now - (Double.valueOf(profile.getDia() * T.hours(1).msecs())).longValue(); + + double maxAbsorptionHours = Constants.DEFAULT_MAX_ABSORPTION_TIME; + if (SensitivityAAPSPlugin.getPlugin().isEnabled(PluginType.SENSITIVITY) || SensitivityWeightedAveragePlugin.getPlugin().isEnabled(PluginType.SENSITIVITY)) { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_maxtime, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } else { + maxAbsorptionHours = SP.getDouble(R.string.key_absorption_cutoff, Constants.DEFAULT_MAX_ABSORPTION_TIME); + } + long absorptionTime_ago = now - (Double.valueOf(maxAbsorptionHours * T.hours(1).msecs())).longValue(); synchronized (treatments) { for (Treatment treatment : treatments) { if (!treatment.isValid) continue; long t = treatment.date; + if (t > dia_ago && t <= now) { - if (treatment.carbs >= 1) { - result.carbs += treatment.carbs; - result.lastCarbTime = t; - } if (treatment.insulin > 0 && treatment.mealBolus) { result.boluses += treatment.insulin; } } + + if (t > absorptionTime_ago && t <= now) { + if (treatment.carbs >= 1) { + result.carbs += treatment.carbs; + if(t > result.lastCarbTime) + result.lastCarbTime = t; + } + } } } @@ -235,6 +250,7 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface result.mealCOB = autosensData.cob; result.slopeFromMinDeviation = autosensData.slopeFromMinDeviation; result.slopeFromMaxDeviation = autosensData.slopeFromMaxDeviation; + result.usedMinCarbsImpact = autosensData.usedMinCarbsImpact; } result.lastBolusTime = getLastBolusTime(); return result; @@ -268,6 +284,8 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface long last = 0; synchronized (treatments) { for (Treatment t : treatments) { + if (!t.isValid) + continue; if (t.date > last && t.insulin > 0 && t.isValid && t.date <= now) last = t.date; } @@ -322,12 +340,24 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface @Override public IobTotal getCalculationToTimeTempBasals(long time, Profile profile) { + return getCalculationToTimeTempBasals(time, profile, false, 0); + } + + public IobTotal getCalculationToTimeTempBasals(long time, Profile profile, boolean truncate, long truncateTime) { IobTotal total = new IobTotal(time); synchronized (tempBasals) { for (Integer pos = 0; pos < tempBasals.size(); pos++) { TemporaryBasal t = tempBasals.get(pos); if (t.date > time) continue; - IobTotal calc = t.iobCalc(time, profile); + IobTotal calc; + if(truncate && t.end() > truncateTime){ + TemporaryBasal dummyTemp = new TemporaryBasal(); + dummyTemp.copyFrom(t); + dummyTemp.cutEndTo(truncateTime); + calc = dummyTemp.iobCalc(time, profile); + } else { + calc = t.iobCalc(time, profile); + } //log.debug("BasalIOB " + new Date(time) + " >>> " + calc.basaliob); total.plus(calc); } @@ -338,7 +368,15 @@ public class TreatmentsPlugin extends PluginBase implements TreatmentsInterface for (Integer pos = 0; pos < extendedBoluses.size(); pos++) { ExtendedBolus e = extendedBoluses.get(pos); if (e.date > time) continue; - IobTotal calc = e.iobCalc(time); + IobTotal calc; + if(truncate && e.end() > truncateTime){ + ExtendedBolus dummyExt = new ExtendedBolus(); + dummyExt.copyFrom(e); + dummyExt.cutEndTo(truncateTime); + calc = dummyExt.iobCalc(time); + } else { + calc = e.iobCalc(time); + } totalExt.plus(calc); } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java index ae977d4024..57ad6833a9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsBolusFragment.java @@ -81,7 +81,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. Iob iob = t.iobCalc(System.currentTimeMillis(), profile.getDia()); holder.iob.setText(DecimalFormatter.to2Decimal(iob.iobContrib) + " U"); holder.activity.setText(DecimalFormatter.to3Decimal(iob.activityContrib) + " U"); - holder.mealOrCorrection.setText(t.isSMB ? "SMB" : t.mealBolus ? MainApp.sResources.getString(R.string.mealbolus) : MainApp.sResources.getString(R.string.correctionbous)); + holder.mealOrCorrection.setText(t.isSMB ? "SMB" : t.mealBolus ? MainApp.gs(R.string.mealbolus) : MainApp.gs(R.string.correctionbous)); holder.ph.setVisibility(t.source == Source.PUMP ? View.VISIBLE : View.GONE); holder.ns.setVisibility(NSUpload.isIdValid(t._id) ? View.VISIBLE : View.GONE); holder.invalid.setVisibility(t.isValid ? View.GONE : View.VISIBLE); @@ -142,9 +142,9 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. switch (v.getId()) { case R.id.treatments_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(treatment.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(treatment.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = treatment._id; if (treatment.source == Source.PUMP) { @@ -162,7 +162,7 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveTreatment")); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } @@ -204,16 +204,16 @@ public class TreatmentsBolusFragment extends SubscriberFragment implements View. switch (view.getId()) { case R.id.treatments_reshreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + "?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { TreatmentsPlugin.getPlugin().getService().resetTreatments(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java index 7218198b43..97c3a05274 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsCareportalFragment.java @@ -105,9 +105,9 @@ public class TreatmentsCareportalFragment extends SubscriberFragment implements switch (v.getId()) { case R.id.careportal_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(careportalEvent.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(careportalEvent.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = careportalEvent._id; if (NSUpload.isIdValid(_id)) { @@ -118,7 +118,7 @@ public class TreatmentsCareportalFragment extends SubscriberFragment implements MainApp.getDbHelper().delete(careportalEvent); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } @@ -157,16 +157,16 @@ public class TreatmentsCareportalFragment extends SubscriberFragment implements switch (view.getId()) { case R.id.careportal_refreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + " ?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + " ?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetCareportalEvents(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java index c8fc539d02..05e18bfdc3 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsExtendedBolusesFragment.java @@ -67,7 +67,7 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment { holder.ns.setVisibility(NSUpload.isIdValid(extendedBolus._id) ? View.VISIBLE : View.GONE); if (extendedBolus.isEndingEvent()) { holder.date.setText(DateUtil.dateAndTimeString(extendedBolus.date)); - holder.duration.setText(MainApp.sResources.getString(R.string.cancel)); + holder.duration.setText(MainApp.gs(R.string.cancel)); holder.insulin.setText(""); holder.realDuration.setText(""); holder.iob.setText(""); @@ -144,9 +144,9 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment { switch (v.getId()) { case R.id.extendedboluses_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(extendedBolus.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(extendedBolus.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = extendedBolus._id; if (NSUpload.isIdValid(_id)) { @@ -158,7 +158,7 @@ public class TreatmentsExtendedBolusesFragment extends SubscriberFragment { FabricPrivacy.getInstance().logCustom(new CustomEvent("RemoveExtendedBolus")); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java index 8a6b0456f5..307f9c8ee6 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsProfileSwitchFragment.java @@ -131,9 +131,9 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen switch (v.getId()) { case R.id.profileswitch_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(profileSwitch.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(profileSwitch.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = profileSwitch._id; if (NSUpload.isIdValid(_id)) { @@ -144,7 +144,7 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen MainApp.getDbHelper().delete(profileSwitch); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; case R.id.profileswitch_date: @@ -190,16 +190,16 @@ public class TreatmentsProfileSwitchFragment extends SubscriberFragment implemen switch (view.getId()) { case R.id.profileswitch_refreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + "?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + "?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetProfileSwitch(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java index 5ce79636b5..df67349839 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Treatments/fragments/TreatmentsTempTargetFragment.java @@ -140,9 +140,9 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements switch (v.getId()) { case R.id.temptargetrange_remove: AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); - builder.setMessage(MainApp.sResources.getString(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(tempTarget.date)); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.removerecord) + "\n" + DateUtil.dateAndTimeString(tempTarget.date)); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { final String _id = tempTarget._id; if (NSUpload.isIdValid(_id)) { @@ -153,7 +153,7 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements MainApp.getDbHelper().delete(tempTarget); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } @@ -192,16 +192,16 @@ public class TreatmentsTempTargetFragment extends SubscriberFragment implements switch (view.getId()) { case R.id.temptargetrange_refreshfromnightscout: AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext()); - builder.setTitle(this.getContext().getString(R.string.confirmation)); - builder.setMessage(this.getContext().getString(R.string.refresheventsfromnightscout) + " ?"); - builder.setPositiveButton(this.getContext().getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setTitle(MainApp.gs(R.string.confirmation)); + builder.setMessage(MainApp.gs(R.string.refresheventsfromnightscout) + " ?"); + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { MainApp.getDbHelper().resetTempTargets(); Intent restartNSClient = new Intent(Intents.ACTION_RESTART); MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); } }); - builder.setNegativeButton(this.getContext().getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); break; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java index fdc14f32d4..d64ee24a30 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/ActionStringHandler.java @@ -31,6 +31,8 @@ import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Careportal.Dialogs.NewNSTreatmentDialog; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.APSResult; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; @@ -95,9 +97,9 @@ public class ActionStringHandler { return; } Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - rMessage += MainApp.instance().getString(R.string.primefill) + ": " + insulinAfterConstraints + "U"; + rMessage += MainApp.gs(R.string.primefill) + ": " + insulinAfterConstraints + "U"; if (insulinAfterConstraints - amount != 0) - rMessage += "\n" + MainApp.instance().getString(R.string.constraintapllied); + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); rAction += "fill " + insulinAfterConstraints; @@ -106,9 +108,9 @@ public class ActionStringHandler { double amount = SafeParse.stringToDouble(act[1]); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - rMessage += MainApp.instance().getString(R.string.primefill) + ": " + insulinAfterConstraints + "U"; + rMessage += MainApp.gs(R.string.primefill) + ": " + insulinAfterConstraints + "U"; if (insulinAfterConstraints - amount != 0) - rMessage += "\n" + MainApp.instance().getString(R.string.constraintapllied); + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); rAction += "fill " + insulinAfterConstraints; @@ -118,11 +120,11 @@ public class ActionStringHandler { int carbs = SafeParse.stringToInt(act[2]); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(insulin)).value(); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbs)).value(); - rMessage += MainApp.instance().getString(R.string.bolus) + ": " + insulinAfterConstraints + "U\n"; - rMessage += MainApp.instance().getString(R.string.carbs) + ": " + carbsAfterConstraints + "g"; + rMessage += MainApp.gs(R.string.bolus) + ": " + insulinAfterConstraints + "U\n"; + rMessage += MainApp.gs(R.string.carbs) + ": " + carbsAfterConstraints + "g"; if ((insulinAfterConstraints - insulin != 0) || (carbsAfterConstraints - carbs != 0)) { - rMessage += "\n" + MainApp.instance().getString(R.string.constraintapllied); + rMessage += "\n" + MainApp.gs(R.string.constraintapllied); } rAction += "bolus " + insulinAfterConstraints + " " + carbsAfterConstraints; @@ -179,6 +181,9 @@ public class ActionStringHandler { } } else if ("wizard".equals(act[0])) { + sendError("Update APP on Watch!"); + return; + } else if ("wizard2".equals(act[0])) { ////////////////////////////////////////////// WIZARD Integer carbsBeforeConstraints = SafeParse.stringToInt(act[1]); Integer carbsAfterConstraints = MainApp.getConstraintChecker().applyCarbsConstraints(new Constraint<>(carbsBeforeConstraints)).value(); @@ -188,10 +193,12 @@ public class ActionStringHandler { return; } - boolean useBG = Boolean.parseBoolean(act[2]); - boolean useBolusIOB = Boolean.parseBoolean(act[3]); - boolean useBasalIOB = Boolean.parseBoolean(act[4]); - int percentage = Integer.parseInt(act[5]); + boolean useBG = SP.getBoolean(R.string.key_wearwizard_bg, true); + boolean useBolusIOB = SP.getBoolean(R.string.key_wearwizard_bolusiob, true); + boolean useBasalIOB = SP.getBoolean(R.string.key_wearwizard_basaliob, true); + boolean useCOB = SP.getBoolean(R.string.key_wearwizard_cob, true); + boolean useTrend = SP.getBoolean(R.string.key_wearwizard_trend, false); + int percentage = Integer.parseInt(act[2]); Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { @@ -205,9 +212,16 @@ public class ActionStringHandler { return; } + CobInfo cobInfo = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "Wizard wear"); + if (useCOB && (cobInfo == null || cobInfo.displayCob == null)) { + sendError("Unknown COB! BG reading missing or recent app restart?"); + return; + } + DecimalFormat format = new DecimalFormat("0.00"); + DecimalFormat formatInt = new DecimalFormat("0"); BolusWizard bolusWizard = new BolusWizard(); - bolusWizard.doCalc(profile, null, carbsAfterConstraints, 0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, false); + bolusWizard.doCalc(profile, null, carbsAfterConstraints, useCOB?cobInfo.displayCob:0d, useBG ? bgReading.valueToUnits(profile.getUnits()) : 0d, 0d, percentage, useBolusIOB, useBasalIOB, false, useTrend); Double insulinAfterConstraints = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolusWizard.calculatedTotalInsulin)).value(); if (insulinAfterConstraints - bolusWizard.calculatedTotalInsulin != 0) { @@ -232,11 +246,15 @@ public class ActionStringHandler { rMessage += "\n_____________"; rMessage += "\nCalc (IC:" + DecimalFormatter.to1Decimal(bolusWizard.ic) + ", " + "ISF:" + DecimalFormatter.to1Decimal(bolusWizard.sens) + "): "; rMessage += "\nFrom Carbs: " + format.format(bolusWizard.insulinFromCarbs) + "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"; if (useBolusIOB) rMessage += "\nBolus IOB: " + format.format(bolusWizard.insulingFromBolusIOB) + "U"; if (useBasalIOB) rMessage += "\nBasal IOB: " + format.format(bolusWizard.insulingFromBasalsIOB) + "U"; + if (useTrend) + rMessage += "\nFrom 15' trend: " + format.format(bolusWizard.insulinFromTrend) + "U"; if (percentage != 100) { rMessage += "\nPercentage: " + format.format(bolusWizard.totalBeforePercentageAdjustment) + "U * " + percentage + "% -> ~" + format.format(bolusWizard.calculatedTotalInsulin) + "U"; } @@ -283,7 +301,7 @@ public class ActionStringHandler { //if pump is not busy: try to fetch data final PumpInterface pump = MainApp.getConfigBuilder().getActivePump(); if (pump.isBusy()) { - rMessage += MainApp.instance().getString(R.string.pumpbusy); + rMessage += MainApp.gs(R.string.pumpbusy); } else { rMessage += "trying to fetch data from pump."; @@ -513,15 +531,15 @@ public class ActionStringHandler { } if (!result.isChangeRequested()) { - ret += MainApp.sResources.getString(R.string.nochangerequested) + "\n"; + ret += MainApp.gs(R.string.nochangerequested) + "\n"; } else if (result.rate == 0 && result.duration == 0) { - ret += MainApp.sResources.getString(R.string.canceltemp) + "\n"; + ret += MainApp.gs(R.string.canceltemp) + "\n"; } else { - ret += MainApp.sResources.getString(R.string.rate) + ": " + DecimalFormatter.to2Decimal(result.rate) + " U/h " + + ret += MainApp.gs(R.string.rate) + ": " + DecimalFormatter.to2Decimal(result.rate) + " U/h " + "(" + DecimalFormatter.to2Decimal(result.rate / ConfigBuilderPlugin.getActivePump().getBaseBasalRate() * 100) + "%)\n" + - MainApp.sResources.getString(R.string.duration) + ": " + DecimalFormatter.to0Decimal(result.duration) + " min\n"; + MainApp.gs(R.string.duration) + ": " + DecimalFormatter.to0Decimal(result.duration) + " min\n"; } - ret += "\n" + MainApp.sResources.getString(R.string.reason) + ": " + result.reason; + ret += "\n" + MainApp.gs(R.string.reason) + ": " + result.reason; return ret; } @@ -586,18 +604,18 @@ public class ActionStringHandler { //check for validity if (percentage < Constants.CPP_MIN_PERCENTAGE || percentage > Constants.CPP_MAX_PERCENTAGE) { - msg += String.format(MainApp.sResources.getString(R.string.valueoutofrange), "Profile-Percentage") + "\n"; + msg += String.format(MainApp.gs(R.string.valueoutofrange), "Profile-Percentage") + "\n"; } if (timeshift < 0 || timeshift > 23) { - msg += String.format(MainApp.sResources.getString(R.string.valueoutofrange), "Profile-Timeshift") + "\n"; + msg += String.format(MainApp.gs(R.string.valueoutofrange), "Profile-Timeshift") + "\n"; } final Profile profile = MainApp.getConfigBuilder().getProfile(); if (profile == null) { - msg += MainApp.sResources.getString(R.string.notloadedplugins) + "\n"; + msg += MainApp.gs(R.string.notloadedplugins) + "\n"; } if (!"".equals(msg)) { - msg += MainApp.sResources.getString(R.string.valuesnotstored); + msg += MainApp.gs(R.string.valuesnotstored); String rTitle = "STATUS"; String rAction = "statusmessage"; WearPlugin.getPlugin().requestActionConfirmation(rTitle, msg, rAction); @@ -634,7 +652,7 @@ public class ActionStringHandler { @Override public void run() { if (!result.success) { - sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) + + sendError(MainApp.gs(R.string.treatmentdeliveryerror) + "\n" + result.comment); } @@ -652,7 +670,7 @@ public class ActionStringHandler { @Override public void run() { if (!result.success) { - sendError(MainApp.sResources.getString(R.string.treatmentdeliveryerror) + + sendError(MainApp.gs(R.string.treatmentdeliveryerror) + "\n" + result.comment); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java index dcda0bc0aa..7282ac0763 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/WearPlugin.java @@ -158,7 +158,7 @@ public class WearPlugin extends PluginBase { @Subscribe public void onStatusEvent(final EventBolusRequested ev) { - String status = String.format(MainApp.sResources.getString(R.string.bolusrequested), ev.getAmount()); + String status = String.format(MainApp.gs(R.string.bolusrequested), ev.getAmount()); Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_BOLUSPROGRESS); intent.putExtra("progresspercent", 0); intent.putExtra("progressstatus", status); @@ -172,9 +172,9 @@ public class WearPlugin extends PluginBase { String status; if (ev.result.success) { - status = MainApp.sResources.getString(R.string.success); + status = MainApp.gs(R.string.success); } else { - status = MainApp.sResources.getString(R.string.nosuccess); + status = MainApp.gs(R.string.nosuccess); } Intent intent = new Intent(ctx, WatchUpdaterService.class).setAction(WatchUpdaterService.ACTION_SEND_BOLUSPROGRESS); intent.putExtra("progresspercent", 100); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java index a92738d336..696b8b0b57 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Wear/wearintegration/WatchUpdaterService.java @@ -37,12 +37,12 @@ import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.db.BgReading; import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.TemporaryBasal; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Treatments.Treatment; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; -import info.nightscout.androidaps.plugins.IobCobCalculator.AutosensData; -import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSDeviceStatus; import info.nightscout.androidaps.plugins.Overview.OverviewPlugin; @@ -213,7 +213,7 @@ public class WatchUpdaterService extends WearableListenerService implements final DataMap dataMap = dataMapSingleBG(lastBG, glucoseStatus); if (dataMap == null) { - ToastUtils.showToastInUiThread(this, getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(this, MainApp.gs(R.string.noprofile)); return; } @@ -330,7 +330,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (!graph_bgs.isEmpty()) { DataMap entries = dataMapSingleBG(last_bg, glucoseStatus); if (entries == null) { - ToastUtils.showToastInUiThread(this, getString(R.string.noprofile)); + ToastUtils.showToastInUiThread(this, MainApp.gs(R.string.noprofile)); return; } final ArrayList dataMaps = new ArrayList<>(graph_bgs.size()); @@ -477,7 +477,8 @@ public class WatchUpdaterService extends WearableListenerService implements if (!predArray.isEmpty()) { for (BgReading bg : predArray) { - predictions.add(predictionMap(bg.date, bg.value)); + if (bg.value < 40) continue; + predictions.add(predictionMap(bg.date, bg.value, bg.getPredectionColor())); } } } @@ -520,10 +521,11 @@ public class WatchUpdaterService extends WearableListenerService implements return dm; } - private DataMap predictionMap(long timestamp, double sgv) { + private DataMap predictionMap(long timestamp, double sgv, int color) { DataMap dm = new DataMap(); dm.putLong("timestamp", timestamp); dm.putDouble("sgv", sgv); + dm.putInt("color", color); return dm; } @@ -579,7 +581,7 @@ public class WatchUpdaterService extends WearableListenerService implements if (googleApiClient.isConnected()) { Profile profile = MainApp.getConfigBuilder().getProfile(); - String status = MainApp.instance().getString(R.string.noprofile); + String status = MainApp.gs(R.string.noprofile); String iobSum, iobDetail, cobString, currentBasal, bgiString; iobSum = iobDetail = cobString = currentBasal = bgiString = ""; if (profile != null) { @@ -591,7 +593,7 @@ public class WatchUpdaterService extends WearableListenerService implements iobSum = DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); iobDetail = "(" + DecimalFormatter.to2Decimal(bolusIob.iob) + "|" + DecimalFormatter.to2Decimal(basalIob.basaliob) + ")"; - cobString = generateCOBString(); + cobString = IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "WatcherUpdaterService").generateCOBString(); currentBasal = generateBasalString(treatmentsInterface); //bgi @@ -662,14 +664,14 @@ public class WatchUpdaterService extends WearableListenerService implements String status = ""; if (profile == null) { - status = MainApp.sResources.getString(R.string.noprofile); + status = MainApp.gs(R.string.noprofile); return status; } LoopPlugin activeloop = LoopPlugin.getPlugin(); if (!activeloop.isEnabled(PluginType.LOOP)) { - status += getString(R.string.disabledloop) + "\n"; + status += MainApp.gs(R.string.disabledloop) + "\n"; lastLoopStatus = false; } else { lastLoopStatus = true; @@ -714,17 +716,6 @@ public class WatchUpdaterService extends WearableListenerService implements return basalStringResult; } - @NonNull - private String generateCOBString() { - - String cobStringResult = "--"; - AutosensData autosensData = IobCobCalculatorPlugin.getPlugin().getLastAutosensData("WatcherUpdaterService"); - if (autosensData != null) { - cobStringResult = (int) autosensData.cob + "g"; - } - return cobStringResult; - } - @Override public void onDestroy() { if (googleApiClient != null && googleApiClient.isConnected()) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java index 5ce277e399..03c6c48a1a 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/XDripStatusline/StatuslinePlugin.java @@ -25,6 +25,8 @@ import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.TreatmentsInterface; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.IobCobCalculator.CobInfo; +import info.nightscout.androidaps.plugins.IobCobCalculator.IobCobCalculatorPlugin; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DecimalFormatter; @@ -111,7 +113,7 @@ public class StatuslinePlugin extends PluginBase { LoopPlugin loopPlugin = LoopPlugin.getPlugin(); if (!loopPlugin.isEnabled(PluginType.LOOP)) { - status += ctx.getString(R.string.disabledloop) + "\n"; + status += MainApp.gs(R.string.disabledloop) + "\n"; lastLoopStatus = false; } else if (loopPlugin.isEnabled(PluginType.LOOP)) { lastLoopStatus = true; @@ -130,7 +132,7 @@ public class StatuslinePlugin extends PluginBase { IobTotal bolusIob = treatmentsInterface.getLastCalculationTreatments().round(); treatmentsInterface.updateTotalIOBTempBasals(); IobTotal basalIob = treatmentsInterface.getLastCalculationTempBasals().round(); - status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob); + status += DecimalFormatter.to2Decimal(bolusIob.iob + basalIob.basaliob)+"U"; if (mPrefs.getBoolean("xdripstatus_detailediob", true)) { @@ -146,6 +148,7 @@ public class StatuslinePlugin extends PluginBase { double bgi = -(bolusIob.activity + basalIob.activity) * 5 * profile.getIsf(); status += " " + ((bgi >= 0) ? "+" : "") + DecimalFormatter.to2Decimal(bgi); + status += " " + IobCobCalculatorPlugin.getPlugin().getCobInfo(false, "StatuslinePlugin").generateCOBString(); return status; } diff --git a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java index a514a85815..9085e3f762 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/CommandQueue.java @@ -81,7 +81,7 @@ public class CommandQueue { private QueueThread thread = null; private PumpEnactResult executingNowError() { - return new PumpEnactResult().success(false).enacted(false).comment(MainApp.sResources.getString(R.string.executingrightnow)); + return new PumpEnactResult().success(false).enacted(false).comment(MainApp.gs(R.string.executingrightnow)); } public boolean isRunning(Command.CommandType type) { @@ -205,7 +205,7 @@ public class CommandQueue { // returns true if command is queued public boolean tempBasalAbsolute(double absoluteRate, int durationInMinutes, boolean enforceNew, Profile profile, Callback callback) { - if (isRunning(Command.CommandType.TEMPBASAL)) { + if (!enforceNew && isRunning(Command.CommandType.TEMPBASAL)) { if (callback != null) callback.result(executingNowError()).run(); return false; @@ -226,7 +226,7 @@ public class CommandQueue { // returns true if command is queued public boolean tempBasalPercent(Integer percent, int durationInMinutes, boolean enforceNew, Profile profile, Callback callback) { - if (isRunning(Command.CommandType.TEMPBASAL)) { + if (!enforceNew && isRunning(Command.CommandType.TEMPBASAL)) { if (callback != null) callback.result(executingNowError()).run(); return false; @@ -268,7 +268,7 @@ public class CommandQueue { // returns true if command is queued public boolean cancelTempBasal(boolean enforceNew, Callback callback) { - if (isRunning(Command.CommandType.TEMPBASAL)) { + if (!enforceNew && isRunning(Command.CommandType.TEMPBASAL)) { if (callback != null) callback.result(executingNowError()).run(); return false; @@ -314,10 +314,10 @@ public class CommandQueue { } if (!MainApp.isEngineeringModeOrRelease()) { - Notification notification = new Notification(Notification.NOT_ENG_MODE_OR_RELEASE, MainApp.sResources.getString(R.string.not_eng_mode_or_release), Notification.URGENT); + Notification notification = new Notification(Notification.NOT_ENG_MODE_OR_RELEASE, MainApp.gs(R.string.not_eng_mode_or_release), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); if (callback != null) - callback.result(new PumpEnactResult().success(false).comment(MainApp.sResources.getString(R.string.not_eng_mode_or_release))).run(); + callback.result(new PumpEnactResult().success(false).comment(MainApp.gs(R.string.not_eng_mode_or_release))).run(); return false; } @@ -327,10 +327,10 @@ public class CommandQueue { for (Profile.BasalValue basalValue : basalValues) { if (basalValue.value < pump.getPumpDescription().basalMinimumRate) { - Notification notification = new Notification(Notification.BASAL_VALUE_BELOW_MINIMUM, MainApp.sResources.getString(R.string.basalvaluebelowminimum), Notification.URGENT); + Notification notification = new Notification(Notification.BASAL_VALUE_BELOW_MINIMUM, MainApp.gs(R.string.basalvaluebelowminimum), Notification.URGENT); MainApp.bus().post(new EventNewNotification(notification)); if (callback != null) - callback.result(new PumpEnactResult().success(false).comment(MainApp.sResources.getString(R.string.basalvaluebelowminimum))).run(); + callback.result(new PumpEnactResult().success(false).comment(MainApp.gs(R.string.basalvaluebelowminimum))).run(); return false; } } diff --git a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java index 8ec61932c8..a5ad59ca0b 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/QueueThread.java @@ -55,7 +55,7 @@ public class QueueThread extends Thread { PumpInterface pump = ConfigBuilderPlugin.getActivePump(); if (pump == null) { log.debug("QUEUE: pump == null"); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.pumpNotInitialized))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.pumpNotInitialized))); SystemClock.sleep(1000); continue; } @@ -63,7 +63,7 @@ public class QueueThread extends Thread { if (!pump.isConnected() && secondsElapsed > Constants.PUMP_MAX_CONNECTION_TIME_IN_SECONDS) { MainApp.bus().post(new EventDismissBolusprogressIfRunning(null)); - MainApp.bus().post(new EventPumpStatusChanged(MainApp.sResources.getString(R.string.connectiontimedout))); + MainApp.bus().post(new EventPumpStatusChanged(MainApp.gs(R.string.connectiontimedout))); log.debug("QUEUE: timed out"); pump.stopConnecting(); diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java index cab7d23311..2be3831ace 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandBolus.java @@ -34,6 +34,7 @@ public class CommandBolus extends Command { } public String status() { - return "BOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U"; + return (detailedBolusInfo.insulin > 0 ? "BOLUS " + DecimalFormatter.to1Decimal(detailedBolusInfo.insulin) + "U " : "") + + (detailedBolusInfo.carbs > 0 ? "CARBS " + DecimalFormatter.to0Decimal(detailedBolusInfo.carbs) + "g" : "" ); } } diff --git a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java index 8a8bc41dfa..03764dee0b 100644 --- a/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java +++ b/app/src/main/java/info/nightscout/androidaps/queue/commands/CommandSetProfile.java @@ -47,7 +47,7 @@ public class CommandSetProfile extends Command { if (r.enacted && profileSwitch.source == Source.NIGHTSCOUT) { SmsCommunicatorPlugin smsCommunicatorPlugin = MainApp.getSpecificPlugin(SmsCommunicatorPlugin.class); if (smsCommunicatorPlugin != null && smsCommunicatorPlugin.isEnabled(PluginType.GENERAL)) { - smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.sResources.getString(R.string.profile_set_ok)); + smsCommunicatorPlugin.sendNotificationToAllNumbers(MainApp.gs(R.string.profile_set_ok)); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java new file mode 100644 index 0000000000..3dbec90b4f --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/receivers/ChargingStateReceiver.java @@ -0,0 +1,32 @@ +package info.nightscout.androidaps.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.BatteryManager; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.events.EventChargingState; + +public class ChargingStateReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + EventChargingState event = grabChargingState(context); + + if (event != null) + MainApp.bus().post(event); + } + + public EventChargingState grabChargingState(Context context) { + BatteryManager bm = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE); + + int status = bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS); + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING + || status == BatteryManager.BATTERY_STATUS_FULL; + + EventChargingState event = new EventChargingState(isCharging); + return event; + } + +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java new file mode 100644 index 0000000000..4e01066bf9 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/receivers/NetworkChangeReceiver.java @@ -0,0 +1,62 @@ +package info.nightscout.androidaps.receivers; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.wifi.SupplicantState; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.support.annotation.Nullable; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.events.EventNetworkChange; + +public class NetworkChangeReceiver extends BroadcastReceiver { + + private static Logger log = LoggerFactory.getLogger(NetworkChangeReceiver.class); + + @Override + public void onReceive(final Context context, final Intent intent) { + EventNetworkChange event = grabNetworkStatus(context); + if (event != null) + MainApp.bus().post(event); + } + + @Nullable + public EventNetworkChange grabNetworkStatus(final Context context) { + EventNetworkChange event = new EventNetworkChange(); + + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm == null) return null; + NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); + + if (activeNetwork != null) { + if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { + event.wifiConnected = true; + WifiManager wifiManager = (WifiManager) MainApp.instance().getApplicationContext().getSystemService(Context.WIFI_SERVICE); + if (wifiManager != null) { + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + if (wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) { + event.ssid = wifiInfo.getSSID(); + } + log.debug("NETCHANGE: Wifi connected. SSID: " + event.ssid); + } + } + + if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { + event.mobileConnected = true; + event.roaming = activeNetwork.isRoaming(); + log.debug("NETCHANGE: Mobile connected. Roaming: " + event.roaming); + } + } else { + log.debug("NETCHANGE: Disconnected."); + } + + return event; + } +} \ No newline at end of file diff --git a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java index 6709b304d9..0f7164b690 100644 --- a/app/src/main/java/info/nightscout/utils/DecimalFormatter.java +++ b/app/src/main/java/info/nightscout/utils/DecimalFormatter.java @@ -46,13 +46,13 @@ public class DecimalFormatter { } public static String toPumpSupportedBolus(double value) { - return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.01 + return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05 ? to2Decimal(value) : to1Decimal(value); } public static DecimalFormat pumpSupportedBolusFormat() { - return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.01 + return ConfigBuilderPlugin.getActivePump().getPumpDescription().bolusStep <= 0.05 ? new DecimalFormat("0.00") : new DecimalFormat("0.0"); } diff --git a/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java b/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java index b8eb49e98e..c2fbbf581e 100644 --- a/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java +++ b/app/src/main/java/info/nightscout/utils/ImportExportPrefs.java @@ -33,7 +33,7 @@ import info.nightscout.androidaps.events.EventAppExit; public class ImportExportPrefs { private static Logger log = LoggerFactory.getLogger(ImportExportPrefs.class); static File path = new File(Environment.getExternalStorageDirectory().toString()); - static final File file = new File(path, MainApp.sResources.getString(R.string.app_name) + "Preferences"); + static final File file = new File(path, MainApp.gs(R.string.app_name) + "Preferences"); private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { @@ -59,7 +59,7 @@ public class ImportExportPrefs { public static void exportSharedPreferences(final Activity c) { new AlertDialog.Builder(c) - .setMessage(MainApp.sResources.getString(R.string.export_to) + " " + file + " ?") + .setMessage(MainApp.gs(R.string.export_to) + " " + file + " ?") .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -73,9 +73,9 @@ public class ImportExportPrefs { } pw.close(); fw.close(); - ToastUtils.showToastInUiThread(c, MainApp.sResources.getString(R.string.exported)); + ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.exported)); } catch (FileNotFoundException e) { - ToastUtils.showToastInUiThread(c, MainApp.sResources.getString(R.string.filenotfound) + " " + file); + ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file); log.error("Unhandled exception", e); } catch (IOException e) { log.error("Unhandled exception", e); @@ -88,7 +88,7 @@ public class ImportExportPrefs { public static void importSharedPreferences(final Activity c) { new AlertDialog.Builder(c) - .setMessage(MainApp.sResources.getString(R.string.import_from) + " " + file + " ?") + .setMessage(MainApp.gs(R.string.import_from) + " " + file + " ?") .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -113,7 +113,7 @@ public class ImportExportPrefs { } reader.close(); editor.commit(); - OKDialog.show(c, MainApp.sResources.getString(R.string.setting_imported), MainApp.sResources.getString(R.string.restartingapp), new Runnable() { + OKDialog.show(c, MainApp.gs(R.string.setting_imported), MainApp.gs(R.string.restartingapp), new Runnable() { @Override public void run() { log.debug("Exiting"); @@ -126,7 +126,7 @@ public class ImportExportPrefs { } }); } catch (FileNotFoundException e) { - ToastUtils.showToastInUiThread(c, MainApp.sResources.getString(R.string.filenotfound) + " " + file); + ToastUtils.showToastInUiThread(c, MainApp.gs(R.string.filenotfound) + " " + file); log.error("Unhandled exception", e); } catch (IOException e) { log.error("Unhandled exception", e); diff --git a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java index cc1a22355a..5556cae935 100644 --- a/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java +++ b/app/src/main/java/info/nightscout/utils/LocalAlertUtils.java @@ -26,21 +26,21 @@ public class LocalAlertUtils { private static Logger log = LoggerFactory.getLogger(LocalAlertUtils.class); public static long missedReadingsThreshold() { - return T.mins(SP.getInt(MainApp.sResources.getString(R.string.key_missed_bg_readings_threshold), 30)).msecs(); + return T.mins(SP.getInt(MainApp.gs(R.string.key_missed_bg_readings_threshold), 30)).msecs(); } private static long pumpUnreachableThreshold() { - return T.mins(SP.getInt(MainApp.sResources.getString(R.string.key_pump_unreachable_threshold), 30)).msecs(); + return T.mins(SP.getInt(MainApp.gs(R.string.key_pump_unreachable_threshold), 30)).msecs(); } public static void checkPumpUnreachableAlarm(Date lastConnection, boolean isStatusOutdated) { boolean alarmTimeoutExpired = lastConnection.getTime() + pumpUnreachableThreshold() < System.currentTimeMillis(); boolean nextAlarmOccurrenceReached = SP.getLong("nextPumpDisconnectedAlarm", 0L) < System.currentTimeMillis(); - if (Config.APS && SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_pump_unreachable_alert), true) + if (Config.APS && SP.getBoolean(MainApp.gs(R.string.key_enable_pump_unreachable_alert), true) && isStatusOutdated && alarmTimeoutExpired && nextAlarmOccurrenceReached && !LoopPlugin.getPlugin().isDisconnected()) { log.debug("Generating pump unreachable alarm. lastConnection: " + DateUtil.dateAndTimeString(lastConnection) + " isStatusOutdated: " + isStatusOutdated); - Notification n = new Notification(Notification.PUMP_UNREACHABLE, MainApp.sResources.getString(R.string.pump_unreachable), Notification.URGENT); + Notification n = new Notification(Notification.PUMP_UNREACHABLE, MainApp.gs(R.string.pump_unreachable), Notification.URGENT); n.soundId = R.raw.alarm; SP.putLong("nextPumpDisconnectedAlarm", System.currentTimeMillis() + pumpUnreachableThreshold()); MainApp.bus().post(new EventNewNotification(n)); @@ -91,10 +91,10 @@ public class LocalAlertUtils { public static void checkStaleBGAlert() { BgReading bgReading = DatabaseHelper.lastBg(); - if (SP.getBoolean(MainApp.sResources.getString(R.string.key_enable_missed_bg_readings_alert), false) + if (SP.getBoolean(MainApp.gs(R.string.key_enable_missed_bg_readings_alert), false) && bgReading != null && bgReading.date + missedReadingsThreshold() < System.currentTimeMillis() && SP.getLong("nextMissedReadingsAlarm", 0l) < System.currentTimeMillis()) { - Notification n = new Notification(Notification.BG_READINGS_MISSED, MainApp.sResources.getString(R.string.missed_bg_readings), Notification.URGENT); + Notification n = new Notification(Notification.BG_READINGS_MISSED, MainApp.gs(R.string.missed_bg_readings), Notification.URGENT); n.soundId = R.raw.alarm; SP.putLong("nextMissedReadingsAlarm", System.currentTimeMillis() + missedReadingsThreshold()); MainApp.bus().post(new EventNewNotification(n)); diff --git a/app/src/main/java/info/nightscout/utils/LogDialog.java b/app/src/main/java/info/nightscout/utils/LogDialog.java index b98582c05f..7e2468774e 100644 --- a/app/src/main/java/info/nightscout/utils/LogDialog.java +++ b/app/src/main/java/info/nightscout/utils/LogDialog.java @@ -25,7 +25,7 @@ public class LogDialog { String logCat = "no logs"; final String processId = Integer.toString(android.os.Process.myPid()); try { - Process process = Runtime.getRuntime().exec("logcat -d " + MainApp.sResources.getString(R.string.app_name) + ":D"); + Process process = Runtime.getRuntime().exec("logcat -d " + MainApp.gs(R.string.app_name) + ":D"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); StringBuilder log = new StringBuilder(); String line; @@ -46,11 +46,11 @@ public class LogDialog { try { AlertDialog alertDialog = new AlertDialog.Builder(context) .setMessage(msg) - .setPositiveButton(MainApp.sResources.getString(R.string.copy_to_clipboard), new DialogInterface.OnClickListener() { + .setPositiveButton(MainApp.gs(R.string.copy_to_clipboard), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setPrimaryClip(ClipData.newPlainText(null, msg)); - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.copied_to_clipboard)); + ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.copied_to_clipboard)); } }) .setNegativeButton(android.R.string.cancel, null) diff --git a/app/src/main/java/info/nightscout/utils/NSUpload.java b/app/src/main/java/info/nightscout/utils/NSUpload.java index 3cd252f19a..2e5506f9c6 100644 --- a/app/src/main/java/info/nightscout/utils/NSUpload.java +++ b/app/src/main/java/info/nightscout/utils/NSUpload.java @@ -55,7 +55,7 @@ public class NSUpload { if (temporaryBasal.pumpId != 0) data.put("pumpId", temporaryBasal.pumpId); data.put("created_at", DateUtil.toISOString(temporaryBasal.date)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); if (originalExtendedAmount != null) data.put("originalExtendedAmount", originalExtendedAmount); // for back synchronization Bundle bundle = new Bundle(); @@ -93,7 +93,7 @@ public class NSUpload { if (temporaryBasal.pumpId != 0) data.put("pumpId", temporaryBasal.pumpId); data.put("created_at", DateUtil.toISOString(temporaryBasal.date)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); Bundle bundle = new Bundle(); bundle.putString("action", "dbAdd"); bundle.putString("collection", "treatments"); @@ -115,7 +115,7 @@ public class NSUpload { JSONObject data = new JSONObject(); data.put("eventType", CareportalEvent.TEMPBASAL); data.put("created_at", DateUtil.toISOString(time)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); if (isFakedTempBasal) data.put("isFakedTempBasal", isFakedTempBasal); if (pumpId != 0) @@ -147,7 +147,7 @@ public class NSUpload { if (extendedBolus.pumpId != 0) data.put("pumpId", extendedBolus.pumpId); data.put("created_at", DateUtil.toISOString(extendedBolus.date)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); Bundle bundle = new Bundle(); bundle.putString("action", "dbAdd"); bundle.putString("collection", "treatments"); @@ -173,7 +173,7 @@ public class NSUpload { data.put("enteredinsulin", 0); data.put("relative", 0); data.put("created_at", DateUtil.toISOString(time)); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); if (pumpId != 0) data.put("pumpId", pumpId); Bundle bundle = new Bundle(); @@ -301,7 +301,7 @@ public class NSUpload { data.put("percentage", profileSwitch.percentage); } data.put("created_at", DateUtil.toISOString(profileSwitch.date)); - data.put("enteredBy", MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", MainApp.gs(R.string.app_name)); uploadCareportalEntryToNS(data); } catch (JSONException e) { log.error("Unhandled exception", e); @@ -325,7 +325,7 @@ public class NSUpload { data.put("targetTop", Profile.fromMgdlToUnits(tempTarget.high, profile.getUnits())); data.put("created_at", DateUtil.toISOString(tempTarget.date)); data.put("units", profile.getUnits()); - data.put("enteredBy", MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", MainApp.gs(R.string.app_name)); uploadCareportalEntryToNS(data); } catch (JSONException e) { log.error("Unhandled exception", e); @@ -346,7 +346,7 @@ public class NSUpload { data.put("percentage", profileSwitch.percentage); } data.put("created_at", DateUtil.toISOString(profileSwitch.date)); - data.put("enteredBy", MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", MainApp.gs(R.string.app_name)); if (profileSwitch._id != null) { Context context = MainApp.instance().getApplicationContext(); Bundle bundle = new Bundle(); @@ -420,7 +420,7 @@ public class NSUpload { data.put("eventType", "OpenAPS Offline"); data.put("duration", durationInMinutes); data.put("created_at", DateUtil.toISOString(new Date())); - data.put("enteredBy", "openaps://" + MainApp.instance().getString(R.string.app_name)); + data.put("enteredBy", "openaps://" + MainApp.gs(R.string.app_name)); Bundle bundle = new Bundle(); bundle.putString("action", "dbAdd"); bundle.putString("collection", "treatments"); @@ -496,7 +496,7 @@ public class NSUpload { try { data.put("eventType", "Note"); data.put("created_at", DateUtil.toISOString(new Date())); - data.put("notes", MainApp.sResources.getString(R.string.androidaps_start)+" - "+ Build.MANUFACTURER + " "+ Build.MODEL); + data.put("notes", MainApp.gs(R.string.androidaps_start)+" - "+ Build.MANUFACTURER + " "+ Build.MODEL); } catch (JSONException e) { log.error("Unhandled exception", e); } diff --git a/app/src/main/java/info/nightscout/utils/NumberPicker.java b/app/src/main/java/info/nightscout/utils/NumberPicker.java index 64239cbaee..102abedc7d 100644 --- a/app/src/main/java/info/nightscout/utils/NumberPicker.java +++ b/app/src/main/java/info/nightscout/utils/NumberPicker.java @@ -199,7 +199,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener, value += step * multiplier; if (value > maxValue) { value = maxValue; - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.youareonallowedlimit)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit)); stopUpdating(); } updateEditText(); @@ -209,7 +209,7 @@ public class NumberPicker extends LinearLayout implements View.OnKeyListener, value -= step * multiplier; if (value < minValue) { value = minValue; - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.youareonallowedlimit)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.youareonallowedlimit)); stopUpdating(); } updateEditText(); diff --git a/app/src/main/java/info/nightscout/utils/OKDialog.java b/app/src/main/java/info/nightscout/utils/OKDialog.java index 3212e6b1fd..5185049678 100644 --- a/app/src/main/java/info/nightscout/utils/OKDialog.java +++ b/app/src/main/java/info/nightscout/utils/OKDialog.java @@ -25,7 +25,7 @@ public class OKDialog { AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme)); builder.setTitle(title); builder.setMessage(message); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if (runnable != null) { @@ -46,7 +46,7 @@ public class OKDialog { AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(activity, R.style.AppTheme)); builder.setTitle(title); builder.setMessage(message); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); if (runnable != null) { diff --git a/app/src/main/java/info/nightscout/utils/PasswordProtection.java b/app/src/main/java/info/nightscout/utils/PasswordProtection.java index 1af10eb2d2..2a15dc7311 100644 --- a/app/src/main/java/info/nightscout/utils/PasswordProtection.java +++ b/app/src/main/java/info/nightscout/utils/PasswordProtection.java @@ -37,7 +37,7 @@ public class PasswordProtection { alertDialogBuilder.setView(promptsView); final TextView label = (TextView) promptsView.findViewById(R.id.passwordprompt_text); - label.setText(MainApp.sResources.getString(stringID)); + label.setText(MainApp.gs(stringID)); final EditText userInput = (EditText) promptsView.findViewById(R.id.passwordprompt_pass); // set dialog message @@ -50,7 +50,7 @@ public class PasswordProtection { if (password.equals(enteredPassword)) { if (ok != null) ok.run(); } else { - ToastUtils.showToastInUiThread(context, MainApp.sResources.getString(R.string.wrongpassword)); + ToastUtils.showToastInUiThread(context, MainApp.gs(R.string.wrongpassword)); if (fail != null) fail.run(); } } diff --git a/app/src/main/java/info/nightscout/utils/SP.java b/app/src/main/java/info/nightscout/utils/SP.java index df45996fc2..d5a40e19f5 100644 --- a/app/src/main/java/info/nightscout/utils/SP.java +++ b/app/src/main/java/info/nightscout/utils/SP.java @@ -21,7 +21,7 @@ public class SP { } static public String getString(int resourceID, String defaultValue) { - return sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getString(MainApp.gs(resourceID), defaultValue); } static public String getString(String key, String defaultValue) { @@ -30,7 +30,7 @@ public class SP { static public boolean getBoolean(int resourceID, Boolean defaultValue) { try { - return sharedPreferences.getBoolean(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getBoolean(MainApp.gs(resourceID), defaultValue); } catch (Exception e) { return defaultValue; } @@ -45,7 +45,7 @@ public class SP { } static public Double getDouble(int resourceID, Double defaultValue) { - return SafeParse.stringToDouble(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + return SafeParse.stringToDouble(sharedPreferences.getString(MainApp.gs(resourceID), defaultValue.toString())); } static public Double getDouble(String key, Double defaultValue) { @@ -54,9 +54,9 @@ public class SP { static public int getInt(int resourceID, Integer defaultValue) { try { - return sharedPreferences.getInt(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getInt(MainApp.gs(resourceID), defaultValue); } catch (Exception e) { - return SafeParse.stringToInt(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + return SafeParse.stringToInt(sharedPreferences.getString(MainApp.gs(resourceID), defaultValue.toString())); } } @@ -70,9 +70,9 @@ public class SP { static public long getLong(int resourceID, Long defaultValue) { try { - return sharedPreferences.getLong(MainApp.sResources.getString(resourceID), defaultValue); + return sharedPreferences.getLong(MainApp.gs(resourceID), defaultValue); } catch (Exception e) { - return SafeParse.stringToLong(sharedPreferences.getString(MainApp.sResources.getString(resourceID), defaultValue.toString())); + return SafeParse.stringToLong(sharedPreferences.getString(MainApp.gs(resourceID), defaultValue.toString())); } } @@ -92,7 +92,7 @@ public class SP { static public void putBoolean(int resourceID, boolean value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putBoolean(MainApp.sResources.getString(resourceID), value); + editor.putBoolean(MainApp.gs(resourceID), value); editor.apply(); } @@ -104,7 +104,7 @@ public class SP { static public void putLong(int resourceID, long value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putLong(MainApp.sResources.getString(resourceID), value); + editor.putLong(MainApp.gs(resourceID), value); editor.apply(); } @@ -116,13 +116,13 @@ public class SP { static public void putInt(int resourceID, int value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putInt(MainApp.sResources.getString(resourceID), value); + editor.putInt(MainApp.gs(resourceID), value); editor.apply(); } static public void putString(int resourceID, String value) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(MainApp.sResources.getString(resourceID), value); + editor.putString(MainApp.gs(resourceID), value); editor.apply(); } @@ -134,7 +134,7 @@ public class SP { static public void remove(int resourceID) { SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.remove(MainApp.sResources.getString(resourceID)); + editor.remove(MainApp.gs(resourceID)); editor.apply(); } diff --git a/app/src/main/java/info/nightscout/utils/Translator.java b/app/src/main/java/info/nightscout/utils/Translator.java index 75ee881c21..98fdd32779 100644 --- a/app/src/main/java/info/nightscout/utils/Translator.java +++ b/app/src/main/java/info/nightscout/utils/Translator.java @@ -12,51 +12,51 @@ public class Translator { switch (text) { case "BG Check": - return MainApp.sResources.getString(R.string.careportal_bgcheck); + return MainApp.gs(R.string.careportal_bgcheck); case "Snack Bolus": - return MainApp.sResources.getString(R.string.careportal_snackbolus); + return MainApp.gs(R.string.careportal_snackbolus); case "Meal Bolus": - return MainApp.sResources.getString(R.string.careportal_mealbolus); + return MainApp.gs(R.string.careportal_mealbolus); case "Correction Bolus": - return MainApp.sResources.getString(R.string.careportal_correctionbolus); + return MainApp.gs(R.string.careportal_correctionbolus); case "Carb Correction": - return MainApp.sResources.getString(R.string.careportal_carbscorrection); + return MainApp.gs(R.string.careportal_carbscorrection); case "Combo Bolus": - return MainApp.sResources.getString(R.string.careportal_combobolus); + return MainApp.gs(R.string.careportal_combobolus); case "Announcement": - return MainApp.sResources.getString(R.string.careportal_announcement); + return MainApp.gs(R.string.careportal_announcement); case "Note": - return MainApp.sResources.getString(R.string.careportal_note); + return MainApp.gs(R.string.careportal_note); case "Question": - return MainApp.sResources.getString(R.string.careportal_question); + return MainApp.gs(R.string.careportal_question); case "Exercise": - return MainApp.sResources.getString(R.string.careportal_exercise); + return MainApp.gs(R.string.careportal_exercise); case "Site Change": - return MainApp.sResources.getString(R.string.careportal_pumpsitechange); + return MainApp.gs(R.string.careportal_pumpsitechange); case "Sensor Start": - return MainApp.sResources.getString(R.string.careportal_cgmsensorstart); + return MainApp.gs(R.string.careportal_cgmsensorstart); case "Sensor Change": - return MainApp.sResources.getString(R.string.careportal_cgmsensorinsert); + return MainApp.gs(R.string.careportal_cgmsensorinsert); case "Insulin Change": - return MainApp.sResources.getString(R.string.careportal_insulincartridgechange); + return MainApp.gs(R.string.careportal_insulincartridgechange); case "Temp Basal Start": - return MainApp.sResources.getString(R.string.careportal_tempbasalstart); + return MainApp.gs(R.string.careportal_tempbasalstart); case "Temp Basal End": - return MainApp.sResources.getString(R.string.careportal_tempbasalend); + return MainApp.gs(R.string.careportal_tempbasalend); case "Profile Switch": - return MainApp.sResources.getString(R.string.careportal_profileswitch); + return MainApp.gs(R.string.careportal_profileswitch); case "Temporary Target": - return MainApp.sResources.getString(R.string.careportal_temporarytarget); + return MainApp.gs(R.string.careportal_temporarytarget); case "Temporary Target Cancel": - return MainApp.sResources.getString(R.string.careportal_temporarytargetcancel); + return MainApp.gs(R.string.careportal_temporarytargetcancel); case "OpenAPS Offline": - return MainApp.sResources.getString(R.string.careportal_openapsoffline); + return MainApp.gs(R.string.careportal_openapsoffline); case "Finger": - return MainApp.sResources.getString(R.string.glucosetype_finger); + return MainApp.gs(R.string.glucosetype_finger); case "Sensor": - return MainApp.sResources.getString(R.string.glucosetype_sensor); + return MainApp.gs(R.string.glucosetype_sensor); case "Manual": - return MainApp.sResources.getString(R.string.manual); + return MainApp.gs(R.string.manual); } return text; } diff --git a/app/src/main/java/info/nightscout/utils/XdripCalibrations.java b/app/src/main/java/info/nightscout/utils/XdripCalibrations.java index 662b7a0c8f..66ec6bd3df 100644 --- a/app/src/main/java/info/nightscout/utils/XdripCalibrations.java +++ b/app/src/main/java/info/nightscout/utils/XdripCalibrations.java @@ -28,17 +28,17 @@ public class XdripCalibrations { public static void confirmAndSendCalibration(final Double bg, Context parentContext) { if (parentContext != null) { - String confirmMessage = String.format(MainApp.sResources.getString(R.string.send_calibration), bg); + String confirmMessage = String.format(MainApp.gs(R.string.send_calibration), bg); AlertDialog.Builder builder = new AlertDialog.Builder(parentContext); - builder.setTitle(MainApp.sResources.getString(R.string.confirmation)); + builder.setTitle(MainApp.gs(R.string.confirmation)); builder.setMessage(confirmMessage); - builder.setPositiveButton(MainApp.sResources.getString(R.string.ok), new DialogInterface.OnClickListener() { + builder.setPositiveButton(MainApp.gs(R.string.ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { sendIntent(bg); } }); - builder.setNegativeButton(MainApp.sResources.getString(R.string.cancel), null); + builder.setNegativeButton(MainApp.gs(R.string.cancel), null); builder.show(); } } @@ -55,12 +55,12 @@ public class XdripCalibrations { context.sendBroadcast(intent); List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(intent, 0); if (q.size() < 1) { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.xdripnotinstalled)); - log.debug(MainApp.sResources.getString(R.string.xdripnotinstalled)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.xdripnotinstalled)); + log.debug(MainApp.gs(R.string.xdripnotinstalled)); return false; } else { - ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.sResources.getString(R.string.calibrationsent)); - log.debug(MainApp.sResources.getString(R.string.calibrationsent)); + ToastUtils.showToastInUiThread(MainApp.instance().getApplicationContext(), MainApp.gs(R.string.calibrationsent)); + log.debug(MainApp.gs(R.string.calibrationsent)); return true; } } diff --git a/app/src/main/res/layout/activity_historybrowse.xml b/app/src/main/res/layout/activity_historybrowse.xml index 88946033f4..1d52560eff 100644 --- a/app/src/main/res/layout/activity_historybrowse.xml +++ b/app/src/main/res/layout/activity_historybrowse.xml @@ -96,6 +96,13 @@ android:paddingTop="5dp" app:srcCompat="@drawable/ic_arrow_drop_down_white_24dp" /> + + - - @@ -193,8 +187,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:orientation="horizontal" - android:paddingTop="5dp"> + android:orientation="horizontal"> - + - + + + @@ -299,8 +299,8 @@ + android:orientation="horizontal" + android:paddingRight="5dp"> + + + + + + diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 9bda35856c..3929d73dfc 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -578,7 +578,6 @@ Потвърждаване, че КЗ е достъпна в Найтскаут и данните за помпата се качват там Раздели IOB от болус и от базал на часовника Покажи подробен IOB - AndroidAPS Активирай профила АКТИВНОСТ И ОБРАТНА ВРЪЗКА ХРАНА И БОЛУС diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index acd0a5df3a..d4b1a0f9dc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -193,7 +193,7 @@ Provedeno Licenční ujednání ROZUMÍM A POTVRZUJI - hodin zpět + před %.1fh Nenalezen bluetooth adaptér Procent Obnovit profil @@ -484,7 +484,7 @@ Vzdálený příkaz není povolen K pozastavení smyčky na %d minut odpověz SMS s kódem %s Chybná doba trvání - Logovat spuštění aplikace do NS + Zaznamenávat spuštění aplikace do NS Ukončuji aplikaci, aby se nastavení projevilo. Inzulín Rychlý inzulín @@ -814,7 +814,7 @@ Podkategorie Kategorie Bolus bude pouze zaznamenán - Automaticky doplňovat chybějící glykémie z NS + Automaticky doplňovat chybějící glykémie z NS Hypoglykémie Citlivost Odchylky @@ -841,4 +841,99 @@ Přepnutí profilu chybí. Proveďte přepnutí profilu nebo ho aktivujte na záložce lokálního profilu Počet bolusů Počet dočasných bazálů + Varování W31: Nízký stav zásobníku + Varování W32: Nízký stav baterie + Varování W33: Chybný datum/čas + Varování W34: Konec záruky + Varování W36: Ukončení dočasného bazálu + Varování W38: Bolus přerušen + Údržba M20: Není vložený zásobník + Údržba M21: Zásobník prázdný + Údržba M22: Prázdná baterie + Údržba M23: Automatické vypnutí + Údržba M24: Okluze + Údržba M26: Výměna zásobníku nekompletní + Údržba M27: Stažení dat selhalo + Údržba M28: Vypršení pozastavení + Údržba M29: Nenastaven typ baterie + Údržba M30: Nenastaven typ zásobníku + Chyba E6: Mechanická chyba + Chyba E7: Chyba elektroniky + Chyba E10: Chyba převíjení + Chyba E13: Chyba jazyka + MM640g + %.2f U/h + Pumpa nedostupná. Bolus nebyl podán + Bolus zastaven + Zastavování bolusu + Pumpa zastavena + Pumpa spuštěna + Pumpa pozastavena + Maximální počet minut bazálu, ke kterým se limituje SMB + Úprava cílové glykémie pomocí Autosens + Trvání dočasného cíle při hypoglykémii + Cílová glykémie při hypoglykémii + m + h + Výukový cíl %d nespuštěn + Novorapid, Novolog, Humalog + Výukový cíl %d nedokončen + Pumpa nepodporuje dočasné bazály + Z pumpy nepřečten žádný platný bazál + Uzavřená smyčka zakázána v nastavení + Autosens zakázán v nastavení + SMB zakázáno v nastavení + Max bazál omezen na %.2f U/h: %s + limit pumpy + pořadována kladná hodnota + maximální násobek bazálu + mazimální násobek nejvyššího bazálu + Odeslán bolus během posledních 3 minut, SMB přeskočeno + Bazál nastaven správně + Bazál omezen na %d%%: %s + Bolus omezen na %.1f U: %s + Max IOB omezeno na %.1f U: %s + Sacharidy omezeny na %d g: %s + IOB omezeno na %.1f U: %s + maximální hodnota v nastavení + pevný limit + nebezpečné použití + Načtení stavu selhalo + Zaznamenat výmenu setu + Zaznamenat výmenu inzulínu + \"SMB vždy\" a \"po jídle\" zakázáno protože zdroj glykémie nepodporuje rozšířené filtrování + SBM není povoleno v otevřené smyčce + Jídlo + reset + Čekání na synchronizaci času (%d s) + Odpojeno (%d m) + Automatické vkládání péče + Automaticky vloží výměnu inzulínu, setu, baterie a alarmů pumpy do NS + Maximální celkové IOB, které OpenAPS nemůže překročit [U] + Tato hodnota je v kontextu OpenAPS nazývána Max IOB. OpenAPS nikdy nepřidá inzulín, pokud je současné IOB větší než tato hodnota + Maximální doba absorbce sacharidů [h] + Doba, po které jsou všechny sacharidy považovány za strávené. Zbylé budou oříznuty + Čas + Zobrazovat kolonku poznámky v dialozích ošetření + Požadováno: %.2fU Doručeno: %.2fU Chyba: %d + První přídavek izulínu + Druhý přídavek inzulínu + Třetí přídavek inzulínu + První přídavek sacharidů + Druhý přídavek sacharidů + Třetí přídavek sacharidů + CGM + Používat pouze WiFi + WiFi SSID + Pouze při nabíjení + Nastavení připojení + Povolené SSID (oddělené středníkem) + Povolit připojení pro roamingu + Max hodnota autosens + Min hodnota autosens + Dělitel \"bolus snooze\" + Max násobitel denního nejvyššiho bazálu + Max násobitel současného bazálu + --- + Doplňování glykémíí z NS diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a07ec4b40c..b078523a63 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -174,8 +174,8 @@ Absolut Bolus fehlgeschlagen TBR abbrechen - Temoräres Ziel - Temoräres Ziel abbrechen + Temporäres Ziel + Temporäres Ziel abbrechen Kommentar Verbunden Verbinden @@ -331,7 +331,6 @@ Aktivität Erwachsener Erweiterte Einstellungen - AndroidAPS BAS Basal-Schritt Wert der Basalrate unter Minimum. Profil nicht gesetzt! @@ -552,7 +551,7 @@ Anzahl der vergangenen Stunden, die verwendet werden, um die Sensitivität zu erkennen (Zeit, in der KH resorbiert werden, ist nicht berücksichtigt) Entscheide anhand von dieser Erfahrung, wie hoch max Basal sein sollte, und übernehme den Wert in die Pumpen- und AAPS-Einstellungen Erprobe den Closed Loop Modus mit max IOB = 0 für ein paar Tage, ohne zu viele Unterzuckerungen zu haben - Starte den Closed Loop Modus mit Abschaltung bei niedrigen Werte + Starte den Closed Loop Modus mit Abschaltung bei niedrigen Werten Verwende es ein paar Tage und zumindest eine Nacht ohne Niedrig-Alarme (UZ), bevor du den BZ-Zielbereich senkst Fein-Einstellung des Closed-Loops, Erhöhen von max IOB über 0 und langsames Heruntersetzen des Zielbereichs Eine Woche erfolgreiches Loopen am Tag mit regelmäßiger Kohlenhydrat-Eingabe @@ -735,4 +734,7 @@ Zeit/Datum des abgegebenen Boluses auf der Pumpe erscheint falsch, IOB ist wahrscheinlich nicht korrekt. Bitte prüfe Zeit/Datum der Pumpe. Anzahl TBRs Anzahl Boluse + Pumpe gestoppt + Pumpe gestartet + Pumpe pausiert diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6cb7a1a252..7c23e3513d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -1,6 +1,5 @@ - AndroidAPS Ασφάλεια Θεραπειών Μέγιστο Επιτρεπτό bolus[U] Μέγιστο Επιτρεπτό υδατ.[g] diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1fc2769177..c737dfa5aa 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -358,7 +358,6 @@ Número de teléfono inválido Esperando bomba Italian - AndroidAPS hollandes Griego Ruso @@ -474,9 +473,9 @@ Adulto Por favor elige edad del paciente para emplear limites de seguridad Glimp - Aparato parece no soportar optimisacion de bateria whitelisting! + Aparato parece no soportar optimizacion de bateria whitelisting! Por favor permita Permission - %s necesita optimisacion de bateria whitelisting para funcionar bien + %s necesita optimizacion de bateria whitelisting para funcionar bien Loop desactivado desactivado (%d m) Superbolus (%d m) @@ -518,8 +517,8 @@ xds Mostrar BGI agregar BGI a status line - No upload to NS - Todos los datos mandados a NS son borrados. AAPS esta conectado to NS pero no hay cambios en NS + datos no mandados a NS + Todos los datos mandados a NS son borrados. AAPS esta conectado a NS pero no hay cambios en NS Nivel base Nivel bolo Bolo prolongado @@ -564,7 +563,7 @@ UPLD BAS EXT - Pantalle proteccion + Pantalla proteccion Cierre Al activar autosens recuerda editar todos carbohidratos comidos. Si no, sensividad será calculada incorrectamente !!! Sensitivity WeightedAverage @@ -577,7 +576,7 @@ ACTIVITY Y FEEDBACK CARBS Y BOLUS CGM Y OPENAPS - PUMP + BOMBA Valor base [U/h] Duracion [min] IOB Curve Peak Time @@ -593,13 +592,13 @@ Coneccion OK Coneccion fuera de tiempo CONECTANDO - aparato no enconrado + aparato no encontrado Deposito vacio Alerta de control de BG Insulina restante en deposito DanaRS Dana - Bomba sleccionada + Bomba seleccionada Conectar bomba nueva Velocidad bolo Poner paso base a 0.01 U/h @@ -615,7 +614,7 @@ recibiendo estado de bolo prolongado recibiendo estado bolo recibiendo estado bolo temporal - recibiendo ah´justes bomba + recibiendo ajustes bomba recibiendo hora bomba usar otra vez Control desde reloj @@ -629,9 +628,9 @@ Pr Grasa ]]> - Esperande terminar bolo. Faltan %d seg. + Esperando terminar bolo. Faltan %d seg. Processando - "Iniciando emisioin bolo " + "Iniciando emision bolo " Orden se esta efectuando en este momento control de la bomba corigido bomba no alcanzable @@ -703,7 +702,7 @@ Se necesita actualizar reloj de la bomba Alerta TBR cancelada, advertencia acceptada - Emision del bolo fallado. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automaticamente. + Emision del bolo fallada. Ningún bolo se ha emitido. Para asegurarse, por favor controle la bomba para evitar bolo doble. Para evitar bugs no se reinician bolos automaticamente. "Solo %.2f U del bolo mandado de %.2f U ha sido emitido por causa de un error. Por favorn controla la bomba para confirmar y toma acciones apropiadas. " "Fallo de emitir bolo y de controlar historical de la bomba.Por favor controla manualmente y crea un record en Careportal si el bolo ha sido emitido. " Reestablecido coneccion fallada. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index cedf15bd5e..1db4265171 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,6 +1,5 @@ - AndroidAPS Traitements de sécurité Bolus max. autorisé [U] Glucides max. autorisés [g] diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3c738259b3..5d572ed93a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -457,6 +457,5 @@ Profilo NS Profilo Basale aggiornato nel Micro Impostazione Profilo Basale fallito - AndroidAPS diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 55d0d9ba64..dd14859672 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -677,7 +677,6 @@ COB berekening ]]> ]]> - AndroidAPS BG beschikbaar op gekozen bron Enkel positief Enkel negatief diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index d04b486b95..9a57c5f366 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -521,7 +521,6 @@ состояние xdrip (часы) xds разрешенный предел достигнут - AndroidAPS Ожидаемое время усваивания всех углеводов пищи в часах Максимальное время усваимости пищи Настройки усваиваемости diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 47bd827e0a..9d9539ec20 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -2,58 +2,60 @@ Avbryt Glimp - MM640g + Minimed 640g Absolut - Åtgärd - ACT + Åtgärder + Act Aktivitet Vuxen Avancerade inställningar - Starta om telefonen eller AndroidAPS from systeminställningar - Använd alltid kort medel delta istället för enkel delta + Starta om telefonen eller AndroidAPS från systeminställningar, annars kommer Android APS inte kunna logga fel (viktigt att kunna spåra och verifiera att algoritmerna fungerar korrekt)! + Använd alltid kort medeldelta istället för enkel delta Användbart när ofiltrerade källor som xDrip ger brusvärden AndroidAPS startar - Snart daglig max av insulin - APS Mode + Maximal daglig dos snart nådd + APS-läge + Medeldelta Basal - Basal E/tim - Basal steg - Basal understiger min.nivå. Ingen profil satt - Pump Batteri Urladdat + Basal: + Basalsteg + Basal saknas i profil. Använder standardvärde. + BR + Basal understiger miniminivå. Profilen sattes inte. + Basalprofil: + Pumpbatteri urladdat Bolus - Bolus Steg - Bolus spärr aktiverad - Bolus %.2fU korrekt tillförd - Ger %.2fU - Kommer att ge %.2fU + Bolussteg + Bolusspärr aktiverad + Bolus %.2f enheter korrekt tillförd + Ger %.2f enheter + Kommer att tillföra %.2f enheter Knapp 1 Knapp 2 Knapp 3 Kalibrering skickad till xDrip - Avbryt Temp Basal + Avbryt temp basal Kolhydrater - Kohydrat spärr aktiverad + Kolhydratsspärr aktiverad Careportal Meddelande - BG Kontroll - Kanyl ålder - Kolhydrat korrektion - CGM Sensor Insättning - CGM Sensor Start - Combo Bolus - Korrektion Bolus + BG-kontroll + Kanylålder + Byte CGM-sensor + CGM-sensor start + Kombinationsbolus + Korrektionsbolus Träning - Insulin Ålder - Insulin Reservoir Byte - Måltids Bolus + Insulinålder + Byte insulinreservoar + Måltidsbolus Absolut - Kolhydrater - KH tid + KH + KH-tid Duration Infört av Tid för händelse - Händelse typ - Glukos sort + Händelsetyp Insulin Mätare Notering @@ -63,197 +65,209 @@ Sensor Delad Notering - OpenAPS Offline - Pump Batteri Ålder - Profil Byte - Pump Kanyl Byte + OpenAPS offline + Pumpbatteri ålder + Byt profil + Byte pumpkanyl Fråga CP - Snack Bolus - Temp Basal Slut - Temp Basal Start - Temp Mål BG - Temp Mål BG Slut + Mellanmålsbolus + Temp basal slut + Temp basal start + Temp mål + Temp mål avbrutet Ändra inmatning Barn - Ta bort kö - Rensa inmatningar + Cirkadisk Profil Procent + CPP + Töm kö + Töm logg Closed Loop COB Kommentar Konfigurationsverktyg APS BG Källa - Begränsningar + Begränsningar Generell Insulin Loop - Nightscout version: + Nightscoutversion: Profil Pump - KONF - Åtgärd - Bekräftelse - Sammankopplad - Sammankopplar - Sammankoppling till pump förlorad - Begränsning aktiverad - Begränsning Överträdelse - Kopierad till Clipboard - Kopiera till Clipboard + Konf + Tempbasaler + Behandlingar + Bekräfta + Ansluten + Ansluter + Anslutningsfel pump + Begränsning nådd + Begränsning nådd + Kopierat till Urklipp + Kopiera till Urklipp Korr - CZ - Alarm + larm basal tim - Bluetooth Status + Bluetoothstatus DanaR Bluetooth Pump kolhydrat - Enheter/Dag - Avaktivera EasyUI mode in pump - Aktivera förlängd bolus i pump - Fel - Glukos - Historia + Enheter per dag + Avaktivera EasyUI mode in pumpen + Aktivera förlängd bolus i pumpen + fel + glukos + Historik Larm - Basal Timmar + Basaltimmar Bolusar Kolhydrater - Sammankopplar för %d s + Ansluter (%d s) Daglig insulinmängd Fel Glukos - Påfyllnad + Påfyllning Stoppa - Ladda om - Fel på inlagd data + Hämta + Fel på inmatad data Pump IOB - Sista bolus - Lösenord Pump - DanaR pump inställningar - Påfyllnad + Senaste bolus + Lösenord pump + DanaR pumpinställningar + påfyllning Kumulativ TDD Datum Exponentiellt viktad TDD - Gammal Data Vg tryck \"Ladda om\" + Gammal data. Tryck på Hämta. Kvot - Använd förlängd bolus med >200% - Värde ej korrekt angivet - Se profil - Se förlängd bolus som % + Använd förlängd bolus för att ange >200% + Misslyckades med inställning + Visa profil + Visa förlängd bolus som % DanaR Korea - DanaR profil inställningar - DIA (h) + DanaR profilinställningar + DIA [tim] Insulinets verkningstid (DIA) DanaR - DANA + Dana dagar - Deutsch - Ge nu + Synkronisera nu Delta - Vald enhet ej funnen - DIA - Loop Frånkopplad - Frånkoppla pump i 1 h + DEV + Vald enhet kan inte nås + DIA: + Loop frånkopplad + Koppla ifrån pump i 1 h Stäng av loop Frånkopplad - Frånkopplar - Frånkoppla pump i 2 h - Frånkoppla pump i 15 min - Frånkoppla pump i 30 min - Frånkoppla pump i 3 h + Kopplar ifrån + Koppla ifrån pump i 10 h + Koppla ifrån pump i 2 h + Koppla ifrån pump i 30 min + Koppla ifrån pump i 3 h TA BORT + Ignorera profilbyten + Alla profilbyten ignoreras och aktiv profil används alltid + Visa inte detta igen Duration Äta snart - English + Ändra grundbasal: + Startad Starta loop Aktivera superbolus i kalkylatorn - Aktivera superbolus funktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN + Aktiverar superbolusfunktionen i kalkylatorn. Aktivera inte innan du förstått hur den fungerar. DEN KAN ORSAKA ÖVERDOSERING AV INSULIN OM INSIKT SAKNAS OM FUNKTIONEN! Aktiverad - Licensavtal för Slutanvändare + Licensavtal för slutanvändare JAG FÖRSTÅR OCH GODKÄNNER - Ange ny behandling + Ange ny behandling: Denna kolumn får ej vara tom - Endast siffror får användas - Endast siffror är tillåtna inom %1$s - %2$s - Ej giltigt telefonnummer - Spanska + Endast siffror tillåtna. + Endast siffror mellan %1$s - %2$s är tillåtna. + Ogiltigt telefonnummer Utför Exportera inställningar till Inställningar exporterade - FörlängdBolus - Lyckades ej uppdatera basalprofil - Snabbverkande Insulin + Förlängd bolus + Lyckades inte uppdatera basalprofilen + Snabbverkande Insulin (gammal beräkningsmodell) Novorapid, Novolog, Humalog, Apidra - Data ej funnen - Fyll/Förfyll standard insulin mängd - Vg försäkra dig om att mängd motsvarar det som är specificerat för just ditt infusionsset - Hämtar pump status + Hittade inte filen + Standardvärden för prime/fyll. + Försäkra dig om att mängden motsvarar det som är specificerat för just ditt infusionsset. + Hämtar pumpstatus Glukos Finger Sensor - HÖG markering + HÖG-markering timmar + %.1f tim sedan Importera inställningar från - Startar… - Ogiltig profil !!! + Startar... + Ogiltig profil! IOB - Italienska - Koreanska Språk - Lokal Profil + Lokal profil LP Loop APS - Efter avklarade begränsningar - LOOP + Efter begränsningar + Inställning i pump + Loop LOOP STOPPAD PGA BEGRÄNSNINGAR - Superbolus (%d m - Loop avstängd - LÅG markering - Svagt Batteri - Manual + Loop meny + Superbolus (%d min) + Loop pausad + LÅG-markering + Svagt batteri + Manuell Avbryt Måltid - Fattas + Saknas Om - Exit + Backup + Avsluta Exportera inställningar Importera inställningar Inställningar Uppdatera behandlingar från NS - Återställ Databaser - Visa log + Återställ databaserna + Visa logg + Testa alarm Nightscout INGEN APS VALD - Ingen Bluetooth adapter funnen + Ingen Bluetooth-adapter funnen Ingen ändring behövs - Ingen profil laddad ännu från NS + Ingen profil laddad från Nightscout ännu Ingen profil vald INGEN PROFIL VALD misslyckat - vg kontrollera telefonen Ej tillgängligt - NSCLIENT har inga skrivrättigheter. Fel API secret? + NS Client har inga skrivrättigheter. Fel API secret? Alarm inställningar - Medge lokal sändning till andra appar (ex xDrip) - Aktivera lokal Broadcasts - Markera app start till NS - Ingen uppladdning till NS - Ingen data sänds till NS. AAPS kommunicerar med NS men inga ändringar görs i NS + Slå på sändning av data till alla appar i telefonen (ex xDrip). + Aktivera lokala broadcasts + Markera app start till Nightscout + Ingen uppladdning till Nightscout + Ingen data sänds till Nightscout. AAPS ansluter till Nightscout men inga ändringar görs i Nightscout. Använd alltid absoluta värden i basal - Endast uppladdning till NS (avaktiverad sync) - Endast uppladdning till NS. Fungerar ej med SGV om inte lokal källa som xDrip används. Inte effektiv med Profiler om NS-Profiler används + Endast uppladdning till Nightscout + Endast uppladdning till Nightscout. Kommer inte få BG-data om inte lokal källa som xDrip används. Kommer heller inte att kunna hämta basalprofiler från Nightscout. Hög Låg Gammal data - Ange NS API sectet (min 12 tecken) + NSClient + Ange enhetens namn + Enhetens namn + Ange NS API secret (min 12 tecken) NS API secret NSClient är inte installerad. Data förlorad! Nightscout URL - Enter Nightscout URL + Ange Nightscout URL URL: NSClient NSCI NS API secret + Aktiv profil Basal DIA IC @@ -261,9 +275,9 @@ Målvärde Enheter OAPS - Mål/Syfte - Kontrollera att BG syns i NS, och att pump insulin data laddas upp - Ställa in utseende och övervakning, för att sedan kunna analysera basaler och kvoter + Mål + Kontrollera att BG syns i Nightscout och att insulindata från pumpen laddas upp + Ställer in utseende och övervakning för att sedan kunna analysera basaler och kvoter Du har nått din tillåtna gräns xds xDrip Status (klocka) @@ -274,44 +288,49 @@ Fel lösenord Visa BGI Visa BGI i statusfält - WEAR - Wear inställningar + Wear + Inställningar för Wear Visa detaljerad IOB Visa IOB med bolus och basal på klocka Wear Väntar på resultat + Väntar på pump. Klicka för att uppdatera. Väntar på pump - Virtuell - Ladda upp till NS + Virtuell pump + Synlig + Ladda upp status till Nightscout Temp basal - VPUMP - Virtuell pump inställningar + SQL-fel + vPump + Inställningar för Virtuell pump OK - Reservoir - Sista kontakt - Programversion + Reservoar + Senast ansluten + Firmwareversion Förlängd bolus Batteri - Grund basal hastighet - Virtuell Pump - Uppladdning - Uppdaterar basal hastigheter - Version av NS som inte stöds + Profilens basalhastighet + Virtuell pump + Laddar upp + Uppdaterar basalhastigheter + Upp + Version av Nightscout som inte stöds Version av NSClient som inte stöds Lås upp inställningar Enheter: Säkerhet vid behandling - Max tillåtna KH (g) + Max tillåtna KH [g] Max tillåten bolus [E] - E + E + TOTAL Korr COB KH Bolus IOB - 15min trend + 15 min trend BG Basal IOB - TREAT + Beh Insulin KH Total IOB: @@ -321,226 +340,571 @@ KH: Aktivitet: Behandlingar - Bolus ej tillförd - TempMål + Fel vid bolusleverans + TT + Temp mål + TB Dur: Kvot: Ins: Total IOB: IOB: - Tempbasal ej tillförd - Tempbasal + Fel vid justering av tempbasal + Temp basal Tonåring - Mål gränser: - Stäng av loop i 3 h - Stäng av loop i 2 h - Stäng av loop i 1 h - Stäng av loop i 10 h + Mål saknas i profil. Använder standardvärde. + Målområde: + Pausa loop i 3 h + Pausa loop i 2 h + Pausa loop i 1 h + Pausa loop i 10 h Superbolus Lyckad - Stoppar temp basal - Stoppar förlängd bolus + Avbryter temp basal + Avbryter förlängd bolus Status: Fel duration: Okänt kommando eller fel svar - Temp basal %.2fU/h for %d min startad - Fel vid Temp basal start - Gick ej att avbryta temp basal + Tempbasal %.2f enheter/tim i %d min startad + Fel vid start av temp basal + Misslyckades med att avbryta temp basal Temp basal avbruten - För att avbryta loop i %d minuter svara med kod %s + För att pausa loop i %d minuter, svara med kod %s SMS - Tillåt fjärrkommandon via SMS - Fjärrkommandon tillåts ej - Kalibrering från andra källor godkänns ej + Tillåt fjärrstyrning via SMS + Kalibrering från andra källor inte tillåtna Fjärrbolus är inte tillåtet Fjärrkommandon för att ändra basaler tillåts ej - Ej godkänd för SMS - Loop avstängd - Loop åter startad + Saknar rättighet att skicka SMS + Loop pausad + Loop återupptagen Loop är aktiverad Loop är avstängd Loop är aktiverat Loop är avstängd - Icke giltigt telefonnummer för SMS - Kalibrering skickad. xDrip måste tillåta att ta emot kalibrering i inställningarna - För att skicka kalibrering %.2f svar med kod %s + Ogiltigt telefonnummer för SMS + Kalibrering skickad. xDrip måste tillåta att ta emot kalibrering i inställningarna. + För att skicka kalibrering %.2f, svara med kod %s xDrip tar inte emot kalibreringar - För att ge bolus %.2fU svar med kod %s - Bolus ej given - Bolus %.2fU tillförd - För att stoppa temp basal svara med kod %s - För att starta basal %.2fU/h svara med kod %s + För att ge bolus %.2f enheter, svara med kod %s + Bolus avbruten + Bolus %.2f enheter tillförd + För att stoppa temp basal, svara med kod %s + För att starta basal %.2f enheter/tim, svara med kod %s +XXXXXXXXXX;+YYYYYYYYYY - Tillåtna telefonnummer - SMS Tjänst + Godkända telefonnummer + SMS-tjänst Senaste BG: Enkel profil Visa kö Lösenord för inställningar - Ställ in förlängd bolus - inställningar importerade + Ställer in förlängd bolus + Inställningar importerade Ställ in ny förlängd bolus: - Acceptera ny temp basal: + Acceptera ny tempbasal: Skicka kalibrering %.1f till xDrip? + SKICKA Spara Säkerhet Återuppta Resultat - Gå ur applikationen för att starta inställning + Avslutar appen för att inställningarna ska läsas in. Omstart - Vill du verkligen återställa databasen? - Återsänd all Data + Vill du verkligen återställa databaserna? + Uppdatera all data Ta bort sparad data: Ladda om profil - Uppdatera händelser från NS + Uppdatera händelser från Nightscout Orsak + RAT Hastighet - Kalkylator inställningar + Kalkylatorinställningar Kalkylator Kö: - Pump stoppad + Pump pausad. Klicka för ladda om status. + Pump pausad Pump avstängd Pumpfel Pump upptagen - Pump inte igångsatt, ingen profil vald - Pump inte startad + Pump inte initierad, ingen profil vald. + Pump inte initierad Pump - NSPROFIL - NS Profil - ProfilByte - Basal profil i pump uppdaterad - Ny basal profil misslyckades + NSProfil + NS profil + Profilbyte + Basalprofilen uppdaterad i pumpen + Lyckades inte sätta basalprofilen Profil Prime/Fyll - Gränsvärden för Visualisering - Högt och lågt värde för graf i översikten och i smartwatch - Vg ge tillåtelse + Gränsvärden för visualisering + Högt och lågt värde för grafen i Översikt och i smartwatch Procent + Procentfaktor med vilken basalprofilen kommer att bli multiplicerad. Pausad Vg ange personens ålder för inställningar av gränser Personens ålder - TempBasal - Hemma + Temp basal + Hem Ta bort - Editera - % (100% = current) - Stoppa Förlängd Bolus - Förlängd Bolus + Ändra + % (100% = profilens värde) + Stoppa förlängd bolus + Förlängd bolus Lägg till Giltig: KH: - Knapp text: + Knapptext: Kalibrering Kalibrering Kalkylator STOPP NEDTRYCKT Stoppad Stopp - Kommer tillföra %.2fU + Kommer tillföra %.2f enheter Tillförd - Bolus + Bolus Översikt Andra - Ny behandlingsrekommendation tillgänglig + Ny rekommendation tillgänglig Open Loop - Värde %s är utanför gränserna - %.2f begränsad till %.2f + Värde %s är utanför gränserna + %.2f begränsad till %.2f Kör nu - Fråga + Beräknat behov Profil - Ingen glukos data tillänglig - Måltids data + Ingen pump tillgänglig + Ingen profil tillänglig + Ingen glukosdata tillänglig + Måltidsdata Maximal basal IOB som OpenAPS kan ge [E] Detta värde kallas Max IOB i OpenAPS. Det är ställt till noll från start. Efter flera dagar till veckor, beroende på hur du känner, kan du välja att justera denna. - Max E/h som Temp Basal kan ställas in på + Max enheter per timme som temp basal kan sättas till Detta värde kallas max basal inom OpenAPS - Senaste körning + Senast körd Senast startad IOB data Ange värden - Status Glukos + Glukosstatus Plug in är avaktiverad Nuvarande temp - Autosens data + Autosensdata OpenAPS MA - Använd AMA autosens funktioner - Inställt värde: 3.0 Detta är grundinställning för KH.absorption per 5 min. 3 mg/dl/5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat" - Inställt värde: 3 Detta är en grundsten i OpenAPS säkerhetsaspekt. Detta begränsar din basal till att vara 3x din största basalhastighet. Du behöver ofta inte ändra detta värde, Läs på och förstå skilnaden på 3x nuvarande och 3x daglig max som säkerhetsinställningar. + Använd AMA autosens + Standardvärde: 3.0 mg/dl/5 min Detta är grundinställning för KH-absorption per 5 min. Detta styr hur snabbt COB minskar, dvs hur snabbt programmet kalkylerar att KH tagits upp, och påverkar BG framöver när BG faller mer än väntat, eller inte stiger som väntat. + Standardvärde: 3 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 3x din största basalhastighet. Du behöver oftast inte ändra detta värde. Läs på och förstå skillnaden mellan 3x nuvarande och 3x daglig max som säkerhetsinställningar. Viktigt! Normalt behöver du inte ändra dessa värden. Vg KLICKA HÄR och LÄS texten och försäkra dig om att du FÖRSTÅTT innan du ändrar dessa värden. - Inställt värde: 4 Detta är andra delen i grunden för säkerhet i OpenAPS, dvs kring 3x och 4 x daglig och nuvarnde basaler. Detta värde innebär att din nuvarande basal, oberoende av din max basalhastighet, kan aldrig bli högre än 4x nuvarande basal. Detta för att undvika att man farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. - Inställt värde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2). - Antal timmar för beräkning av känslighet (KH absorptionstid är exkluderad) - Intervall för autosens (h) - Inställt värde: 0.7 Detta är den andra delen av autosens säkerhetsaspekt, den sätter en gräns på hur lågt autosens kan justera basaler, och hur högt den kan justera ISF och BG mål - Inställt värde: 1.2 Detta är inställt värde för hur mycket autosens kan multiplicera uppåt (snart även autotune) dvs max 20%, med 1.2 kan alltså autosens öka dina basaler med max 20%, denna gräns gäller alltså hur högt autosens kan justera dina basaler men även hur lågt den kan justera ISF och hur lågt den kan sätta BG mål. - Inställt värde: sant Detta för att tillåta autosens justera BG målvärden, tillsammans med ISF och basaler + Standardvärde: 2 Bolus snooze är aktivt efter att du givit en måltidsbolus, detta för att inte loop ska lågtempa när du just ätit. I detta exempel och grundvärde är 2; innebär att DIA på 3 tim kommer bolus snooze kommer att fasas ut under 1,5 tim (3DIA/2). + Antal timmar för beräkning av känslighet (Absorptionstid för KH är exkluderad). + Intervall för autosens [tim] + Standardvärde: 1.2 Med standarvärdet 1.2 kan autosens justera upp dina basaler, kvoter etc med upp till 20% för att kompensera för t ex tillfällig insulinresistens. + Standardvärde: sant Detta för att tillåta autosens justera BG målvärden, ISF och basaler. OpenAPS AMA - OAPS OpenAPS Öppna inställningar på Wear - Pågående rapportering + Konstant infonotis i telefonen GAMMAL DATA OK Ocklusion - M/S - Pump status tillgänglig i NS - Mål/syfte + Mål + Pumpstatus tillgängligt i Nightscout + Mål: Minimal duration Manuell aktivering Spärr: Godkänn Starta - BG är tillängligt i NS - Aktiverar extra funktioner som kan användas dagitd, såsom avancerad måltids assist - Justerar basaler och ration om det behövs, aktivera sedan auto-sens - 1 veckas framgångsrik dagtids looping där alla måltider lagts in + BG är tillängligt i Nightscout + Aktiverar extra funktioner som kan användas dagtid, såsom avancerad måltidsassistans, AMA + Justerar basaler och kvoter om det behövs. Aktivera sedan autosens. + 1 veckas lyckad looping dagtid, där alla måltider lagts in. Finjustering av closed loop, gradvis ökande IOB och minskande önskat BG målvärde - Kör några dagar, och åtminstone en natt utan larm för lågt BG, innan du sänker BG målvärde + Kör några dagar och åtminstone en natt utan larm för lågt BG innan du sänker målvärdet för BG. Börja använda closed loop med aktiverad funktion att stänga av vid lågt BG Aktivera closed loop med max IOB=0 i några dagar till dess systemet inte stänger av pga lågt BG för många gånger - Förstå din open loop, och hur den föreslår temp basaler - Utifrån vad du nu lärt dig, besluta vilken max basal du vil ha, ställ in det både i inställningar i APS och i den pump. + Förstå din open loop och hur den föreslår temp basaler + Utifrån vad du nu lärt dig, besluta vilken max basal du vil ha. Ställ in det både i inställningarna i APS och i din pump. Starta med open loop - Starta Open loop och använd det några dagar, försök att ge många föreslagna temp basaler + Starta med open loop och använd det några dagar. Försök att ge många föreslagna temp basaler. Tid i timmar när alla KH väntas vara absorberade - Måltids max absorptions tid (h) - Absorptions inställningar - Bulgariska + Max absorptions tid för en måltid [tim] + Absorptionsinställningar PUMP - Batteribyte Pump - Sensor ålder - SAGE - Värden sparas inte - Möjligen felvärde om man använder bolus för att priming/fyllning! - Grekiska + Byte pumpbatteri + Sensorålder + måste vara aktiverad för att kunna skicka värden till pumpen. + Värden sparades inte! + Kan visa fel om man använder bolus för priming/fyllning! + Ändra grund-IC: + Ändra grund-ISF: MUST NOT BE USED TO MAKE MEDICAL DECISIONS. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + ISF saknas i profilen. Använder standardvärde. Lås skärm Lås mmol/l - %dmin sedan + %d min sedan mg/dl OK MDI NSClient Autoscroll - Basal typ + http://openaps.readthedocs.io/en/latest/docs/walkthrough/phase-3/beyond-low-glucose-suspend.html + Basaltyp SENS Genom att slå på Autosens funktionen, kom ihåg att skriva in alla KH. Annars kommer programmet göra fel i beräkningar av känslighet (ISF)!! Sensitivity AAPS Sensitivity Oref0 Sensitivity WeightedAverage - Ställa in temp basal + Ställer in temp basal SP BG: Basal: Bolus: Delta: IOB: - %dmin sedan - Gammal data tröskelvärde - Bråttom gammal data tröskelvärde - Bråttom hög - Bråttom låg - Bråttom gammal data + %d min sedan + Tröskelvärde för \"Gammal data\" [min] + Tröskelvärde för \"Väldigt gammal data\" [min] + Akut hög + Akut låg + Väldigt gammal data AndroidAPS + TT + Basal [%] + BG-källa + Svenska + Laddade upp totalt %d värden + Aktiverar ytterligare funktioner för användning dagtid, t ex SMB. + Otillåtet fjärrkommando + Tid (i timmar) som profilen kommer att förskjutas. + Ändra inställningen från E/d till E/tim i pumpen + Kort medeldelta + Långt medeldelta + Antal dagar + Vikt + Total grundbasal + Förkorta namnen på flikarna + Deltainställningar + Modell: %02X Protokoll: %02X Kod: %02X + "Standardvärde: 4 Detta är en grundsten i OpenAPS säkerhet. Detta begränsar dina tempbasaler till maximalt 4x din nuvarande basal, oberoende av din max basalhastighet. Detta för att undvika att man av misstag gör farliga inställningar. Om man når taket i denna inställning så kanske ändringar i andra inställningar behövs. De flesta behöver inte ändra denna inställning. " + Standardvärde: 0.7 Med standardvärdet 0.7 kan autosens justera ner dina basaler, kvoter etc med upp till 30% för att kompensera för t ex tillfällig hög insulinkänslighet. + "Det kommer att användas för att ange \"Inmatat av: \". " + Enheten verkar inte stöda vitlistning av appar för batteriförbrukning + Tillåt + %s behöver kunna kringgå batterisparfunktionerna för att fungera korrekt + Pausad (%d min) + Snabbverkande insulin (förlängd) + KH-kvot (IC) saknas i profilen. Använder standardvärde. + För närvarande satt till %f + Enhet + Uppladdare + Känslighetsmätning + Alla profiler laddades inte! + Notiser från Översikten + Sänd notiser från Översikten som bekräftelsemeddelanden på Wear. + Basal [E/tim] + Peaktid för IOB-kurvan + Peaktid [min] + Rapid-Acting Oref (ny beräkningsmodell) + Ultra-Rapid Oref (ny beräkningsmodell) + %s tim DIA är för kort. Använder %s istället! + Aktivera profil + Datum + OGILTIG + Väntar på parkoppling med pump + Parkoppling OK + Parkoppling tog för lång tid + PARKOPPLAR + Ingen enhet funnen ännu + Tom reservoar + Varning om blodsockermätning + "Återstående mängd insulin " + Vald pump + Parkoppla ny pump + Bolushastighet + Sätt basalsteg till 0.01 enheter per timme + Serienummer + Procent + Tidsförskjutning + Standardvärde för Temp-mål + Äta snart, duration + Äta snart, mål + Aktivitet, duration + Aktivitet, mål + Hämtar status för förlängd bolus + Hämtar status för bolus + Hämtar status för tempbasal + Hämtar pumpinställningar + Hämtar tid och datum i pumpen + återanvänd + Kontroller från klockan + Sätt tempmål och ange behandlingar från klockan. + Anslutningen tog för lång tid + Mat + g + kJ + En + Pr + Fett + Väntar på att bolus ska slutföras. %d sek återstår. + Behandlar + Påbörjar bolus + Kommandot kör just nu + Pumpdrivrutin justerad + Pumpen kan inte nås + BG-värden saknas + Använd systemnotiser för larm och information + Lokala larm + Varna om BG-data saknas + Varna om pumpen inte går att nå + Pumpen ses som ej nåbar efter [min] + Akut larm + Bluetooth-övervakare + Startar om bluetooth på telefonen om anslutning till pumpen misslyckas. Detta hjälper på en del telefoner där bluetooth ibland hänger sig. + Lada upp BG-data till Nightscout + Uppladdningsinställningar för G5 + Visa detaljerad delta + Visa delta med en extra decimal + Osupportad firmware i pumpen + Skicka BG-data till xDrip+ + Välj 640g/Eversense data som datakälla i xDrip+ + Basalvärdet ersatt med det lägsta tillåtna + Använd BG + Använd bolus-IOB + Använd basal-IOB + Använd BG-trend + Använd superbolus + Ja + Nej + Endast positiva + Endast negativa + Använd COB + Använd tempmål + Loop påslagen + APS vald + NSClient har skrivrättigheter + Closed loop påslagen + Max IOB är korrekt angivet + BG tillgängligt från vald källa + Basalerna är inte satta på hel timme: %s + Ogiltig profil: %s + Programmerar bolus i pump + Uppdatera + Läge + Aktivitet + Ingen anslutning på %d min + %d%% (%d min återstår) + Initierar + Frånkopplad + Pausad pga fel + Pausad av användaren + Körs + Avbryter tempbasal + Sätter tempbasal (%d%% / %d min) + Ger bolus (%.1f enheter) + Uppdaterar + Aldrig + Önskad åtgärd stöds inte av pumpen + Osäker användning: Förlängd- eller kombibolus är aktiv. Loop mode är satt till att bromsa vid lågt BG i 6 timmar. Endast normala bolusar tillåtna i loopläge. + Osäker användning: Pumpen använder en annan basalprofil än den första. Loop avstängd. Välj den första profilen på pumpen och uppdatera. + En bolus med samma mängd efterfrågades inom den senaste minuten. För att förhindra att råka ge dubbla bolusar av misstag och ev programfel är detta inte tillåtet. + Nu + Läser historik från pumpen + Larm + Sätter basalprofil + Låg nivå i insulinreservoaren + Pumpbatteriet är svagt + Pumpen visar felet: E%d: %s + För att läsa pumpens historik, tryck och håll in ALERTS-knappen. VARNING: detta kan aktivera en bugg som orsakar att pumpen vägrar ansluta och kräver att en knapp trycks in på pumpen för att återgå. Det bör därför undvikas. + "För att läsa pumpens historik, tryck och håll in TDDS-knappen. VARNING: detta kan aktivera en bugg som orsakar att pumpen vägrar ansluta och kräver att en knapp trycks in på pumpen för att återgå. Det bör därför undvikas. " + Minimum: %3.1f enheter + Genomsnitt: %3.1f enheter + Maximum: %3.1f enheter + Låg + Tom + Normal + Pumpens klocka behöver ställas om + Historik + Varning + "Detta kommer att läsa pumpens fulla historik och status. Allt i Mitt Data och basalprogrammen. Bolusar och tempbasaler kommer att läggas till under Behandlingar om de inte redan finns där. Detta kan orsaka att vissa saker läggs in dubbelt eftersom pumpens klocka inte är så exakt. Detta bör inte göras medan loopen är ogång, utan bara när behov uppstår. Om du ändå vill göra detta, tryck och håll in den här knappen igen. VARNING: detta kan aktivera en bugg som orsakar att pumpen vägrar ansluta och kräver att en knapp trycks in på pumpen för att återgå. Det bör därför undvikas. " + Är du helt säker på att du vill läsa all pumphistorik och är medveten om konsekvenserna? + Varningen om avbruten tempbasal bekräftad + Bolus avbruten. Det verkar som om ingen bolus gavs. För att vara säker, vänligen kontrollera pumpen för att undvika dubbel bolus och prova sedan vid behov igen. För att förhindra fel orsakade av mjukvaran, försöker inte mjukvaran igen automatiskt. + Endast %.2f enheter %.2f gavs pga ett fel. Vänligen verifiera på pumpen och vidta nödvändiga åtgärder. + Leverans av bolus och verifiering av historiken misslyckades. Vänligen kontrollera på pumpen och lägg till bolusen manuellt under Careportal om den gått fram. + Återansluter efter att ha tappat kontakten + Inte tillräckligt med insulin i reservoaren för att ge bolus + Förlängd bolus misslyckad + KH-korrektion + E + Begränsningar + Temp basal satt i pump + Behandling + Bolus avbruten + Avbryter bolus + %.2f begränsat till %.2f + Värdet %s är utanför hård begränsning + Pumpen kunde inte nås. Bolus ej levererad. + Ändrad + PUMP STOPPAD + Status uppdaterad + sedan + med + Aktiv temp basal + min kvar + Loggbok + Senast utförda åtgärd + återstår över + total med + direkt med + Håll alltid ansluten + Stoppa temp basal på riktigt (skapar pumplarm) istället för att sätta till 90% i en minut + REDO + SYNKRONISERAR + UPPTAGEN + SYNKRONISERAD + STARTAR + behöver + Inte ansluten till hjälp-app! + Hjälp-app verkar inte vara installerad! + Inkompatibel hjälp-app. Vi behöver version + Okänd + Inväntar kodverifiering + Kod ej godkänd + Ej godkänd + Inkompatibel + sek + min + tim + dag + vecka + %ds går ut %s + Statistik + Anslut på förhand + Anslut automatiskt när AAPS är öppet, innan något pumpkommando är skickat, för att snabba upp kommunikationen + Rekommenderas inte, då det drar mycket batteri + Använd alltid SMB + Använd alltid SMB oberoende av bolus. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5. + Använd SMB efter kolhydrater + Använd SMB i 6 timmar efter kolhydrater, även med 0 COB. Endast möjligt med en bra filtrerad BG-källa, t ex Dexcom G5. + Använd SMB med kolhydrater (COB) + Använd SMB medan du har kolhydrater aktiva (COB) + Använd SMB när Temp mål är satt + Använd SMB när temp mål är satt, t ex Äta snart eller Träning + Använd SMB även när ett högt temp mål är satt + Använd SMB även när ett högt temp mål är satt (över 5,5 mmol) + Låt temp basalen gå + Tysta + Kolhydrater + Knappar + Insulin + Skicka kalibrering till xDrip+ eller öppna kalibreringsrutan i G5-appen + Öppnar xDrip+. Tillbaka-knappen återgår till AAPS + "Mängd kolhydrater att lägga till när man trycker på knappen " + Mängd insulin att lägga till när man trycker på knappen + Kunde inte starta CGM-appen. Kontrollera att den är installerad. + Historikläsare + Notis vid SMB + Visa SMB på klockan som en standardbolus. + Skapa notiser vid fel + Skapa notiser i Nightscout vid fel eller lokala meddelanden (även synliga i Careportal/Behandlingar) + Visa BG-prognos på klockan. + Prognos + Dataval + Uppladdning till Fabric + Tillåt automatisk rapportering av appkrascher och användningsinformation till utvecklarna via fabric.io-tjänsten. + Vänligen uppdatera din G5-app till en supportad version + Starta Tränings-TT + Starta Äta snart-TT + Ge ingen bolus, logga bara + Kategori + Underkategori + Bolusen sparas bara i loggboken + Hämta saknade BG från NS + SMB satt i pump + Känslighet + Avvikelser + Aktiva KH + Aktivt insulin + Basaler + Ingen åtgärd vald. Inget ändras. + Starta Hypo-TT + Du kör nu dev-versionen. Closed Loop inte tillåtet. + Engineering Mode aktiverat + Engineering Mode inte aktiverat och appen körs inte som release + %.2f E/h + Läser basalprofil + Pumphistoriken ändrad efter att boluskalkylen gjordes. Bolusen har inte levererats. Vänligen gör en ny kalkyl vid behov. Om samma mängd insulin krävs, vänligen vänta två minuter eftersom appen begränsar likadana bolusar av säkerhetsskäl. + Bolusen levererad, men det gick inte att lägga till den i loggen. Detta kan hända om två små bolusar ges inom två minuter. Vänligen kontrollera pumpens historik och Careportal och lägg till om det saknas. Se till att inte lägga till två bolusar med samma mängd och samma tid. + Avböjer hög tempbasal eftersom kalkylen inte innefattade nyligen ändrad historik + Uppdaterar pumpsstatus + Basalen på pumpen är ändrad och kommer att uppdateras inom kort + Basalen ändrad i pumpen, men det gick inte att läsa till vad + Letar efter förändringar i historiken + Flera bolusar med samma mängd insulin importerades just. Endast en kan läggas till i Careportal. Vänligen kontrollera pumpen och gör ändringar i Careportal manuellt vid behov. Observera att man bara kan ha en bolus per klockslag. + Den senaste bolusen är äldre än 24 timmar eller i framtiden. Vänligen konttrollera tid och datum i pumpen. + Tid/datum för bolusen verkar fel. IOB är troligen missvisande. Vänligen kontrollera tid och datum i pumpen. + Profilbyte saknas. Vänligen gör ett profilbyte eller tryck Aktivera profil under Lokal Profil. + Antal bolus + Antal temp basal + Mål %d inte startat + Mål %d inte nått + Pumpen är inte kapabel till temp basal + Ingen giltig data om temp basaler fanns i pumpen + Closed Loop inaktiverat i Inställningar + Autosens inaktiverat i Inställningar + SMB inaktiverat i Inställningar + Begränsar max basal till %.2f E/h pga %s + pumpbegränsning + det måste vara ett positivt värde + multiplikator för max basal + multiplikator för daglig max basal + En bolus gavs för mindre än 3 min sedan. Hoppar över SMB + Basal justerad korrekt + Begränsar max procent hastighet till %d%% pga %s + Begränsar bolus till %.1f enheter pga %s + Begränsar max IOB till %.1f pga %s + Begränsar kolhydrater till %d g pga %s + Begränsar IOB till %.1f pga %s + maxvärde i Inställningar + hård begränsning + osäker användning + Statuskontroll misslyckad + Logga byte av kanyl + Logga byte a insulinreservoar + SMB Alltid På och SMB Efter Kolhydrater är inaktiverat pga att den aktiva BG-källan inte stöder avancerad filtrering + SMB inte tillåtet i Open Loop + Mat + Återställ + Väntar på tidssynkronisering (%d sek) + Frånkopplad (%d min) + Automatisk loggning i Careportal + Ladda upp insulin-, kanyl- och batteribyten samt pumplarm till Nightscout + Max IOB som OpenAPS inte kan överstiga [E] + Det här värdet kallas Max IOB av OpenAPS. Om denna mängd insulin on board (IOB) nås, kan inte OpenAPS lägga till mer. + Pump stoppad + Pump startad + Pump pausad + Max absorptionstid för kolhydrater [tim] + Efter denna tid anses alla kolhydrater vara absorberade. Om det fortfarande finns COB, kommer dessa att tas bort ur beräkningen. + Tid + Visa noteringsrutan i behandlingsdialogerna + Angivet: %.2f enheter. Levererat: %.2f enheter. Felkod: %d + Första snabbknabben för insulin + Andra snabbknabben för insulin + Tredje snabbknabben för insulin + Första snabbknabben för kolhydrater + Andra snabbknabben för kolhydrater + Tredje snabbknabben för kolhydrater + Använd endast WiFi + Anslutningsinställningar + Tillåtna SSID (separerade med semikolon) + Tillåt anslutning vid Roaming + Multiplikator för max daglig basal (max_daily) + Multiplikator för nuvarande basal (max_current) + - + Free-Peak Oref (ny beräkningsmodell) + Hypo + Hypo längd [min] + Mål vid Hypo + Insulinresistent vuxen diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 658222722a..5e81ef6513 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,12 +2,14 @@ #ff00ff #00ffff - #FFFB8C00 + #1e88e5 #FFFFCC03 - #8BC34A + #FFFB8C00 #ffea00 - #ff9500 + #00ffff #FFFFFF + #FFFFFF00 + #FFFF00FF #00FF00 #FF0000 #FFFF00 @@ -50,7 +52,7 @@ #ca77dd #de7550 - #1b5e20 + #25912e #47c8ff #FFDD7792 diff --git a/app/src/main/res/values/insight_alerts.xml b/app/src/main/res/values/insight_alerts.xml index d78c448898..606868528e 100644 --- a/app/src/main/res/values/insight_alerts.xml +++ b/app/src/main/res/values/insight_alerts.xml @@ -4,8 +4,8 @@ Warning W32: Battery low Warning W33: Invalid time/date Warning W34: End of warranty - Warning W36: TBR cancelled - Warning W38: Bolus canelled + Warning W36: TBR canceled + Warning W38: Bolus canceled Warning W39: Loantime warning Maintenance M20: Cartridge not inserted diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 769f826e8f..08b6d042a4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -432,13 +432,14 @@ Profile Default value: 3 This is a key OpenAPS safety cap. What this does is limit your basals to be 3x (in this people) your biggest basal rate. You likely will not need to change this, but you should be aware that’s what is discussed about “3x max daily; 4x current” for safety caps. Default value: 4 This is the other half of the key OpenAPS safety caps, and the other half of “3x max daily; 4x current” of the safety caps. This means your basal, regardless of max basal set on your pump, cannot be any higher than this number times the current level of your basal. This is to prevent people from getting into dangerous territory by setting excessively high max basals before understanding how the algorithm works. Again, the default is 4x; most people will never need to adjust this and are instead more likely to need to adjust other settings if they feel like they are “running into” this safety cap. - autosens_max + autosens_max Default value: 1.2\nThis is a multiplier cap for autosens (and soon autotune) to set a 20% max limit on how high the autosens ratio can be, which in turn determines how high autosens can adjust basals, how low it can adjust ISF, and how low it can set the BG target. - autosens_min + autosens_min Default value: 0.7\nThe other side of the autosens safety limits, putting a cap on how low autosens can adjust basals, and how high it can adjust ISF and BG targets. - autosens_adjust_targets + autosens_adjust_targets + Autosens adjust targets too Default value: true\nThis is used to allow autosens to adjust BG targets, in addition to ISF and basals. - bolussnooze_dia_divisor + bolussnooze_dia_divisor Default value: 2\nBolus snooze is enacted after you do a meal bolus, so the loop won’t counteract with low temps when you’ve just eaten. The example here and default is 2; so a 3 hour DIA means that bolus snooze will be gradually phased out over 1.5 hours (3DIA/2). min_5m_carbimpact Default value: 3.0 This is a setting for default carb absorption impact per 5 minutes. The default is an expected 3mg/dl/5min. This affects how fast COB are decayed, and how much carb absorption is assumed in calculating future predicted BG, when BG is falling more than expected, or not rising as much as expected. @@ -619,6 +620,8 @@ Sensitivity AAPS Absorption settings absorption_maxtime + absorption_cutoff + Meal max absorption time [h] Time in hours where is expected all carbs from meal will be absorbed rangetodisplay @@ -707,7 +710,7 @@ Getting extended bolus status Getting bolus status Getting temporary basal status - Gettings pump settings + Getting pump settings Getting pump time reuse Controls from Watch @@ -923,7 +926,7 @@ Category Subcategory Bolus will be recorded only - Autobackfill missig BGs from NS + Autobackfill missig BGs from NS ns_autobackfill SMB set by pump Sensitivity @@ -979,7 +982,7 @@ Limiting IOB to %.1f U because of %s max value in preferences hard limit - treatmentssafety_maxcarbs + treatmentssafety_maxcarbs unsafe usage openapsama_useautosens Read status failed @@ -997,20 +1000,62 @@ openapsmb_max_iob Maximum total IOB OpenAPS can\'t go over [U] This value is called Max IOB in OpenAPS context\nOpenAPS will not add more insulin if current IOB is greater than this value + Pump stopped + Pump started + Pump paused + Meal max absorption time [h] + Time at which any meal is considered absorbed. Remaining carbs will be cut off. Time - show_notes_entry_dialogs + show_notes_entry_dialogs Show notes field in treatment dialogs - SetupWizardActivity Next Prev Skip - DUMMY\nCONTENT Setup Wizard Next Prev Skip FINISH Select your language - language + language + openapsama_min_5m_carbimpact + Asked: %.2fU Delivered: %.2fU Error code: %d + First insulin increment + Second insulin increment + Third insulin increment + First carbs increment + Second carbs increment + Third carbs increment + CGM + ns_wifionly + ns_wifi_ssids + ns_allowroaming + ns_chargingonly + Use WiFi connection only + WiFi SSID + Only if charging + Connection settings + Allowed SSIDs (semicolon separated) + Allow connection in roaming + always_use_shortavg + Max autosens ratio + Min autosens ratio + Bolus snooze dia divisor + Max daily safety multiplier + Current basal safety multiplier + n/a + Autobackfill BG + Wizard Settings + wearwizard_bg + wearwizard_trend + wearwizard_cob + wearwizard_bolusiob + wearwizard_basaliob + Calculations included in the Wizard result: + Display Settings + General Settings + + DUMMY\nCONTENT + diff --git a/app/src/main/res/xml/pref_absorption_aaps.xml b/app/src/main/res/xml/pref_absorption_aaps.xml index f86a21ec88..6996f27aaf 100644 --- a/app/src/main/res/xml/pref_absorption_aaps.xml +++ b/app/src/main/res/xml/pref_absorption_aaps.xml @@ -1,26 +1,25 @@ + - + + + android:title="@string/openapsama_autosens_period" + validate:maxNumber="24" + validate:minNumber="4" + validate:testType="numericRange" /> + + + + + + + + + diff --git a/app/src/main/res/xml/pref_absorption_oref0.xml b/app/src/main/res/xml/pref_absorption_oref0.xml index b2c77c022a..d951366d27 100644 --- a/app/src/main/res/xml/pref_absorption_oref0.xml +++ b/app/src/main/res/xml/pref_absorption_oref0.xml @@ -1,21 +1,68 @@ + + + validate:floatmaxNumber="12.0" + validate:floatminNumber="0.1" + validate:testType="floatNumericRange" /> + + + + + + + + + + + diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml deleted file mode 100644 index 260e2c5135..0000000000 --- a/app/src/main/res/xml/pref_advanced.xml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/xml/pref_danar.xml b/app/src/main/res/xml/pref_danar.xml index 51c5003ec9..d7b321bbaa 100644 --- a/app/src/main/res/xml/pref_danar.xml +++ b/app/src/main/res/xml/pref_danar.xml @@ -1,7 +1,7 @@ + - + android:title="@string/danar_password_title"/> + android:entryValues="@array/danaSpeedValues" + android:key="@string/key_danars_bolusspeed" + android:title="@string/bolusspeed" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_danarkorean.xml b/app/src/main/res/xml/pref_danarkorean.xml index e57a211a16..d902f23bfd 100644 --- a/app/src/main/res/xml/pref_danarkorean.xml +++ b/app/src/main/res/xml/pref_danarkorean.xml @@ -1,27 +1,44 @@ + + - + android:title="@string/danar_password_title" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_danars.xml b/app/src/main/res/xml/pref_danars.xml index 6513ba4290..ec85bfd523 100644 --- a/app/src/main/res/xml/pref_danars.xml +++ b/app/src/main/res/xml/pref_danars.xml @@ -1,33 +1,47 @@ - + + - + + android:selectable="false" + android:summary="" + android:title="@string/selectedpump" /> - + android:title="@string/danar_password_title"/> + android:entryValues="@array/danaSpeedValues" + android:key="@string/key_danars_bolusspeed" + android:title="@string/bolusspeed" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_danarv2.xml b/app/src/main/res/xml/pref_danarv2.xml index 45906e8615..a5c1254275 100644 --- a/app/src/main/res/xml/pref_danarv2.xml +++ b/app/src/main/res/xml/pref_danarv2.xml @@ -1,7 +1,7 @@ + + android:title="@string/danar_password_title" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_datachoices.xml b/app/src/main/res/xml/pref_datachoices.xml new file mode 100644 index 0000000000..692a67b070 --- /dev/null +++ b/app/src/main/res/xml/pref_datachoices.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/pref_insightpump.xml b/app/src/main/res/xml/pref_insightpump.xml index aee9976391..ead03ec31f 100644 --- a/app/src/main/res/xml/pref_insightpump.xml +++ b/app/src/main/res/xml/pref_insightpump.xml @@ -1,27 +1,47 @@ + + + + + + + + + + + + + + + + + + + + - - - - + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_nsclientinternal.xml b/app/src/main/res/xml/pref_nsclientinternal.xml index f6972cd179..2241463e1a 100644 --- a/app/src/main/res/xml/pref_nsclientinternal.xml +++ b/app/src/main/res/xml/pref_nsclientinternal.xml @@ -1,9 +1,8 @@ - + + - - - - - - - + android:title="@string/nsalarm_urgenthigh" /> + android:title="@string/nsalarm_high" /> - + android:title="@string/nsalarm_low" /> + android:title="@string/nsalarm_urgentlow" /> + android:title="@string/nsalarm_staledata" /> + validate:maxNumber="120" + validate:minNumber="15" + validate:testType="numericRange" /> + android:title="@string/nsalarm_urgentstaledata" /> + validate:maxNumber="180" + validate:minNumber="30" + validate:testType="numericRange" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/pref_openapsama.xml b/app/src/main/res/xml/pref_openapsama.xml index 944f057919..aac00aee60 100644 --- a/app/src/main/res/xml/pref_openapsama.xml +++ b/app/src/main/res/xml/pref_openapsama.xml @@ -7,26 +7,86 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_openapsma.xml b/app/src/main/res/xml/pref_openapsma.xml index 79393f614a..f5492ad590 100644 --- a/app/src/main/res/xml/pref_openapsma.xml +++ b/app/src/main/res/xml/pref_openapsma.xml @@ -1,20 +1,53 @@ - + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_openapssmb.xml b/app/src/main/res/xml/pref_openapssmb.xml index 1bdad6392c..c2eee2bc62 100644 --- a/app/src/main/res/xml/pref_openapssmb.xml +++ b/app/src/main/res/xml/pref_openapssmb.xml @@ -4,57 +4,67 @@ + + + + + + android:title="@string/enablesmbwithcob" /> + + android:title="@string/enablesmbwithtemptarget" /> + + android:title="@string/enablesmbwithhightemptarget" /> + + android:title="@string/enablesmbalways" /> + + android:title="@string/enablesmbaftercarbs" /> + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml index 7d2ecc4282..5d08cd671e 100644 --- a/app/src/main/res/xml/pref_overview.xml +++ b/app/src/main/res/xml/pref_overview.xml @@ -1,120 +1,150 @@ + + + + android:title="@string/treatments" /> + + android:title="@string/overview_calculator_label" /> + android:title="@string/configbuilder_insulin" /> + - + + - + + + android:inputType="numberDecimal|numberSigned" + android:key="@string/key_insulin_button_increment_3" + android:maxLines="20" + android:selectAllOnFocus="true" + android:singleLine="true" + android:title="@string/thirdinsulinincrement" + validate:floatmaxNumber="5.0" + validate:floatminNumber="-5.0" + validate:testType="floatNumericRange" /> + android:title="@string/carbs" /> + - + + - + + + android:inputType="numberSigned" + android:key="@string/key_carbs_button_increment_3" + android:maxLines="20" + android:selectAllOnFocus="true" + android:singleLine="true" + android:title="@string/thirdcarbsincrement" + validate:maxNumber="50" + validate:minNumber="-50" + validate:testType="numericRange" /> + android:summary="@string/show_cgm_button_summary" + android:title="@string/cgm" /> + + android:summary="@string/show_calibration_button_summary" + android:title="@string/overview_calibration" /> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_quickwizard.xml b/app/src/main/res/xml/pref_quickwizard.xml deleted file mode 100644 index d10e40a7e4..0000000000 --- a/app/src/main/res/xml/pref_quickwizard.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/pref_wear.xml b/app/src/main/res/xml/pref_wear.xml index 0dce661482..46cbfd7e22 100644 --- a/app/src/main/res/xml/pref_wear.xml +++ b/app/src/main/res/xml/pref_wear.xml @@ -13,35 +13,78 @@ android:summary="@string/wearcontrol_summary" android:title="@string/wearcontrol_title" /> - + - + - + - + - + + + + + + + + + + + + + + + + diff --git a/app/src/test/java/info/nightscout/MainAppTest.java b/app/src/test/java/info/nightscout/MainAppTest.java index 7aa50158f2..7bb58797be 100644 --- a/app/src/test/java/info/nightscout/MainAppTest.java +++ b/app/src/test/java/info/nightscout/MainAppTest.java @@ -76,7 +76,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsList(PluginType.PUMP).size()); } @@ -87,7 +87,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsVisibleInList(PluginType.PUMP).size()); } @@ -98,7 +98,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsListByInterface(PumpInterface.class).size()); } @@ -109,7 +109,7 @@ public class MainAppTest { if (Config.NSCLIENT || Config.G5UPLOADER) expected = 1; // VirtualPump only else - expected = 6; + expected = 7; Assert.assertEquals(expected, mainApp.getSpecificPluginsVisibleInListByInterface(PumpInterface.class, PluginType.PUMP).size()); } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java index a4119e97e3..ca47477905 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/ConstraintsObjectives/ObjectivesFragmentTest.java @@ -35,25 +35,10 @@ public class ObjectivesFragmentTest { objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); // started - // time calculation is false, requirements met is false + // time calculation is true, requirements met is true objectiveStartedTime = 10; durationInDays = 0; requirementsMet = true; - assertEquals(2, fragment.modifyVisibility(currentPosition, prevObjectiveAccomplishedTime, - objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); - - // started - // time calculation is false, requirements met is true - objectiveStartedTime = 10; - durationInDays = 999999; - requirementsMet = true; - assertEquals(2, fragment.modifyVisibility(currentPosition, prevObjectiveAccomplishedTime, - objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); - - // started, after duration, requirements met --> show verify - objectiveStartedTime = Long.MAX_VALUE; - durationInDays = 0; - requirementsMet = true; assertEquals(3, fragment.modifyVisibility(currentPosition, prevObjectiveAccomplishedTime, objectiveStartedTime, durationInDays, objectiveAccomplishedTime, requirementsMet, enableFakeValue)); diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java new file mode 100644 index 0000000000..70e8d2c9b7 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/NSClientInternal/NsClientReceiverDelegateTest.java @@ -0,0 +1,123 @@ +package info.nightscout.androidaps.plugins.NSClientInternal; + +import android.content.Context; +import com.squareup.otto.Bus; + +import org.junit.Before; +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.R; +import info.nightscout.androidaps.events.EventChargingState; +import info.nightscout.androidaps.events.EventNetworkChange; +import info.nightscout.utils.SP; + +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({MainApp.class, SP.class, Context.class}) +public class NsClientReceiverDelegateTest { + + private NsClientReceiverDelegate sut; + + @Before + public void prepare() { + AAPSMocker.mockMainApp(); + AAPSMocker.mockApplicationContext(); + + Bus bus = MainApp.bus(); + Context context = MainApp.instance().getApplicationContext(); + + sut = new NsClientReceiverDelegate(context, bus); + } + + @Test + public void testCalculateStatusChargingState() { + PowerMockito.mockStatic(SP.class); + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(false); + EventChargingState ev = new EventChargingState(true); + assertTrue(sut.calculateStatus(ev)); + ev = new EventChargingState(false); + assertTrue(sut.calculateStatus(ev)); + + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(true); + ev = new EventChargingState(true); + assertTrue(sut.calculateStatus(ev)); + ev = new EventChargingState(false); + assertTrue(!sut.calculateStatus(ev)); + } + + @Test + public void testCalculateStatusNetworkState() { + PowerMockito.mockStatic(SP.class); + // wifiOnly = false + // allowRoaming = false as well + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(false); + when(SP.getString(anyInt(), anyString())).thenReturn(""); + EventNetworkChange ev = new EventNetworkChange(); + ev.ssid = ""; + + ev.mobileConnected = true; + ev.wifiConnected = true; + assertTrue(sut.calculateStatus(ev)); + ev.wifiConnected = false; + assertTrue(sut.calculateStatus(ev)); + + // wifiOnly = true + // allowRoaming = true as well + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(true); + ev.wifiConnected = true; + assertTrue(sut.calculateStatus(ev)); + ev.wifiConnected = false; + assertTrue(!sut.calculateStatus(ev)); + + // wifiOnly = false + // allowRoaming = false as well + when(SP.getBoolean(anyInt(), anyBoolean())).thenReturn(false); + ev.wifiConnected = false; + ev.roaming = true; + assertTrue(!sut.calculateStatus(ev)); + + // wifiOnly = false + // allowRoaming = true + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(false); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(true); + ev.wifiConnected = false; + ev.roaming = true; + assertTrue(sut.calculateStatus(ev)); + + // wifiOnly = true + // allowRoaming = true + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(true); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(true); + ev.wifiConnected = false; + ev.roaming = true; + assertTrue(!sut.calculateStatus(ev)); + + // wifiOnly = true + // allowRoaming = true + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(true); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(true); + ev.wifiConnected = true; + ev.roaming = true; + assertTrue(sut.calculateStatus(ev)); + + // wifiOnly = false + // allowRoaming = false + when(SP.getBoolean(R.string.key_ns_wifionly, false)).thenReturn(false); + when(SP.getBoolean(R.string.key_ns_allowroaming, true)).thenReturn(false); + ev.wifiConnected = true; + ev.roaming = true; + assertTrue(sut.calculateStatus(ev)); + } +} diff --git a/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java b/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java index 8f20d77282..4f258ee074 100644 --- a/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java +++ b/wear/src/main/java/info/nightscout/androidaps/data/BgWatchData.java @@ -1,5 +1,7 @@ package info.nightscout.androidaps.data; +import java.util.Objects; + /** * Created by emmablack on 1/7/15. */ @@ -8,12 +10,14 @@ public class BgWatchData implements Comparable{ public double high; public double low; public long timestamp; + public int color; - public BgWatchData(double aSgv, double aHigh, double aLow, long aTimestamp) { + public BgWatchData(double aSgv, double aHigh, double aLow, long aTimestamp, int aColor) { this.sgv = aSgv; this.high = aHigh; this.low = aLow; this.timestamp = aTimestamp; + this.color = aColor; } public BgWatchData(){ @@ -25,12 +29,14 @@ public class BgWatchData implements Comparable{ if(! (that instanceof BgWatchData)){ return false; } + if (this.color != ((BgWatchData) that).color) + return false; return this.timestamp == ((BgWatchData) that).timestamp; } @Override - public int hashCode(){ - return (int) (timestamp%Integer.MAX_VALUE); + public int hashCode() { + return Objects.hash(timestamp, color); } @Override diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java index 7701b17d25..5c16063bb2 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/actions/WizardActivity.java @@ -32,9 +32,6 @@ public class WizardActivity extends ViewSelectorActivity { PlusMinusEditText editCarbs; PlusMinusEditText editPercentage; - boolean useBG; - boolean includeBolusIOB; - boolean includeBasalIOB; boolean hasPercentage; @@ -63,7 +60,7 @@ public class WizardActivity extends ViewSelectorActivity { private class MyGridViewPagerAdapter extends GridPagerAdapter { @Override public int getColumnCount(int arg0) { - return hasPercentage?6:5; + return hasPercentage?3:2; } @Override @@ -86,79 +83,7 @@ public class WizardActivity extends ViewSelectorActivity { setLabelToPlusMinusView(view, "carbs"); container.addView(view); return view; - } else if(col == 1){ - final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_toggle_item, container, false); - final TextView textView = (TextView) view.findViewById(R.id.label); - textView.setText("include BG?"); - - final ImageView togglebutton = (ImageView) view.findViewById(R.id.togglebutton); - if(useBG){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - togglebutton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - useBG = !useBG; - if(useBG){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - } - }); - container.addView(view); - return view; - } else if(col == 2){ - final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_toggle_item, container, false); - final TextView textView = (TextView) view.findViewById(R.id.label); - textView.setText("Bolus IOB?"); - - final ImageView togglebutton = (ImageView) view.findViewById(R.id.togglebutton); - if(includeBolusIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - togglebutton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - includeBolusIOB = !includeBolusIOB; - if(includeBolusIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - } - }); - container.addView(view); - return view; - } else if(col == 3){ - final View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.action_toggle_item, container, false); - final TextView textView = (TextView) view.findViewById(R.id.label); - textView.setText("Basal IOB?"); - - final ImageView togglebutton = (ImageView) view.findViewById(R.id.togglebutton); - if(includeBasalIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - togglebutton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - includeBasalIOB = !includeBasalIOB; - if(includeBasalIOB){ - togglebutton.setImageResource(R.drawable.ic_toggle_on); - } else { - togglebutton.setImageResource(R.drawable.ic_toggle_off); - } - } - }); - container.addView(view); - return view; - } else if(col == 4 && hasPercentage){ + } else if(col == 1 && hasPercentage){ final View view = getInflatedPlusMinusView(container); if (editPercentage == null) { editPercentage = new PlusMinusEditText(view, R.id.amountfield, R.id.plusbutton, R.id.minusbutton, 100d, 50d, 150d, 1d, new DecimalFormat("0"), false); @@ -184,10 +109,7 @@ public class WizardActivity extends ViewSelectorActivity { if (editPercentage != null) percentage = SafeParse.stringToInt(editPercentage.editText.getText().toString()); - String actionstring = "wizard " + SafeParse.stringToInt(editCarbs.editText.getText().toString()) - + " " + useBG - + " " + includeBolusIOB - + " " + includeBasalIOB + String actionstring = "wizard2 " + SafeParse.stringToInt(editCarbs.editText.getText().toString()) + " " + percentage; ListenerService.initiateAction(WizardActivity.this, actionstring); finish(); diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java index 34dce7dd11..da627f93ab 100644 --- a/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/menus/MainMenuActivity.java @@ -46,8 +46,8 @@ public class MainMenuActivity extends MenuListActivity { Vector menuitems = new Vector(); menuitems.add("TempT"); - menuitems.add("Bolus"); if(showWizard) menuitems.add("Wizard"); + menuitems.add("Bolus"); menuitems.add("Settings"); menuitems.add("Status"); if (showPrimeFill) menuitems.add("Prime/Fill"); diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java index ce8c931078..b61bdc866b 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BIGChart.java @@ -428,6 +428,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre BgWatchData bwd = new BgWatchData(); bwd.timestamp = prediction.getLong("timestamp"); bwd.sgv = prediction.getDouble("sgv"); + bwd.color = prediction.getInt("color"); predictionList.add(bwd); } } @@ -649,13 +650,15 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre double high = entry.getDouble("high"); double low = entry.getDouble("low"); long timestamp = entry.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = entry.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } } else { double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); long timestamp = dataMap.getLong("timestamp"); + int color = dataMap.getInt("color", 0); final int size = bgDataList.size(); if (size > 0) { @@ -663,7 +666,7 @@ public class BIGChart extends WatchFace implements SharedPreferences.OnSharedPre return; // Ignore duplicates. } - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } for (int i = 0; i < bgDataList.size(); i++) { diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java index 3c980a713f..47ea3dbf08 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BaseWatchFace.java @@ -604,13 +604,15 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen double high = entry.getDouble("high"); double low = entry.getDouble("low"); long timestamp = entry.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = entry.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } } else { double sgv = dataMap.getDouble("sgvDouble"); double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); long timestamp = dataMap.getLong("timestamp"); + int color = dataMap.getInt("color", 0); final int size = bgDataList.size(); if (size > 0) { @@ -618,7 +620,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen return; // Ignore duplicates. } - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } for (int i = 0; i < bgDataList.size(); i++) { @@ -689,6 +691,7 @@ public abstract class BaseWatchFace extends WatchFace implements SharedPreferen BgWatchData bwd = new BgWatchData(); bwd.timestamp = prediction.getLong("timestamp"); bwd.sgv = prediction.getDouble("sgv"); + bwd.color = prediction.getInt("color"); predictionList.add(bwd); } } diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java index 7d50d7ff4c..4a401489d9 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/BgGraphBuilder.java @@ -10,7 +10,9 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.TimeZone; import info.nightscout.androidaps.data.BasalWatchData; @@ -173,13 +175,12 @@ public class BgGraphBuilder { } } + addPredictionLines(lines); lines.add(basalLine((float) minChart, factor, highlight)); lines.add(bolusLine((float) minChart)); lines.add(bolusInvalidLine((float) minChart)); lines.add(carbsLine((float) minChart)); lines.add(smbLine((float) minChart)); - lines.add(predictionLine()); - return lines; } @@ -275,29 +276,30 @@ public class BgGraphBuilder { } - private Line predictionLine() { - - List pointValues = new ArrayList(); - + private void addPredictionLines(List lines) { + Map> values = new HashMap<>(); long endTime = getPredictionEndTime(); - for (BgWatchData bwd: predictionsList) { - if(bwd.timestamp <= endTime) { - pointValues.add(new PointValue(fuzz(bwd.timestamp), (float) bwd.sgv)); + for (BgWatchData bwd : predictionsList) { + if (bwd.timestamp <= endTime) { + double value = bwd.sgv < 300 ? bwd.sgv : 300; + if (!values.containsKey(bwd.color)) { + values.put(bwd.color, new ArrayList<>()); + } + values.get(bwd.color).add(new PointValue(fuzz(bwd.timestamp), (float) value)); } } - Line line = new Line(pointValues); - line.setColor(Color.MAGENTA); - line.setHasLines(false); - int size = pointSize/2; - size = (size>0)?size:1; - line.setPointRadius(size); - line.setHasPoints(true); - return line; + for (Map.Entry> entry : values.entrySet()) { + Line line = new Line(entry.getValue()); + line.setColor(entry.getKey()); + line.setHasLines(false); + int size = pointSize / 2; + size = (size > 0) ? size : 1; + line.setPointRadius(size); + line.setHasPoints(true); + lines.add(line); + } } - - - public Line highValuesLine() { Line highValuesLine = new Line(highValues); highValuesLine.setColor(highColor); diff --git a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java index 3c479f3f86..4b6922fb90 100644 --- a/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java +++ b/wear/src/main/java/info/nightscout/androidaps/watchfaces/CircleWatchface.java @@ -573,7 +573,8 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh double high = dataMap.getDouble("high"); double low = dataMap.getDouble("low"); long timestamp = dataMap.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = dataMap.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } else if (!sharedPrefs.getBoolean("animation", false)) { // don't load history at once if animations are set (less resource consumption) Log.d("addToWatchSet", "entries.size(): " + entries.size()); @@ -583,7 +584,8 @@ public class CircleWatchface extends WatchFace implements SharedPreferences.OnSh double high = entry.getDouble("high"); double low = entry.getDouble("low"); long timestamp = entry.getLong("timestamp"); - bgDataList.add(new BgWatchData(sgv, high, low, timestamp)); + int color = entry.getInt("color", 0); + bgDataList.add(new BgWatchData(sgv, high, low, timestamp, color)); } } else