From 48e4a041f8d3bd977e510c091e9df3e29c4adbca Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 20 Sep 2018 17:23:36 +0100 Subject: [PATCH 01/90] - First changes for CustomActions - changed PumpInterface to add CustomActions - added class CustomActions and CustomActionType - changed all PumpImplementations to use new methods - started changing ActionsFragment (most should be done) --- .../androidaps/interfaces/PumpInterface.java | 9 ++ .../plugins/Actions/ActionsFragment.java | 121 ++++++++++++++++++ .../plugins/Actions/defs/CustomAction.java | 43 +++++++ .../Actions/defs/CustomActionType.java | 11 ++ .../plugins/PumpCombo/ComboPlugin.java | 13 ++ .../PumpDanaR/AbstractDanaRPlugin.java | 14 ++ .../plugins/PumpDanaRS/DanaRSPlugin.java | 14 ++ .../plugins/PumpInsight/InsightPlugin.java | 12 ++ .../androidaps/plugins/PumpMDI/MDIPlugin.java | 14 ++ .../PumpVirtual/VirtualPumpPlugin.java | 14 ++ app/src/main/res/layout/actions_fragment.xml | 1 + 11 files changed, 266 insertions(+) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 614c6033d3..2f8e92dcc7 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -2,9 +2,13 @@ package info.nightscout.androidaps.interfaces; import org.json.JSONObject; +import java.util.List; + import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.Profile; import info.nightscout.androidaps.data.PumpEnactResult; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; /** * Created by mike on 04.06.2016. @@ -57,4 +61,9 @@ public interface PumpInterface { PumpEnactResult loadTDDs(); + + List getCustomActions(); + + PumpEnactResult executeCustomAction(CustomActionType customActionType); + } 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 ea17a30218..6a8422b2dd 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 @@ -9,10 +9,16 @@ import android.support.v4.app.FragmentManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import com.crashlytics.android.answers.CustomEvent; import com.squareup.otto.Subscribe; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import info.nightscout.androidaps.Config; import info.nightscout.androidaps.activities.HistoryBrowseActivity; import info.nightscout.androidaps.MainApp; @@ -25,6 +31,8 @@ import info.nightscout.androidaps.events.EventInitializationChanged; import info.nightscout.androidaps.events.EventRefreshOverview; import info.nightscout.androidaps.events.EventTempBasalChange; import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.Actions.dialogs.FillDialog; import info.nightscout.androidaps.plugins.Actions.dialogs.NewExtendedBolusDialog; import info.nightscout.androidaps.plugins.Actions.dialogs.NewTempBasalDialog; @@ -49,6 +57,7 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL return actionsPlugin; } + View actionsFragmentView; SingleClickButton profileSwitch; SingleClickButton tempTarget; SingleClickButton extendedBolus; @@ -90,6 +99,8 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL history.setOnClickListener(this); tddStats.setOnClickListener(this); + actionsFragmentView = view; + updateGUI(); return view; } catch (Exception e) { @@ -194,11 +205,121 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().supportsTDDs) tddStats.setVisibility(View.GONE); else tddStats.setVisibility(View.VISIBLE); + + checkCustomActions(); + } }); } + private String activePumpName; + private Map currentCustomActions = new HashMap<>(); + private List customButtons = new ArrayList<>(); + + View.OnClickListener customActionsListener = v -> { + + SingleClickButton btn = (SingleClickButton)v; + + CustomAction customAction = this.currentCustomActions.get(btn.getText().toString()); + + ConfigBuilderPlugin.getActivePump().executeCustomAction(customAction.getCustomActionType()); + + }; + + + + private void checkCustomActions() { + + PumpInterface activePump = ConfigBuilderPlugin.getActivePump(); + + if (activePump==null) { + removeCustomActions(); + return; + } + + String newPump = activePump.getClass().getSimpleName(); + + if (newPump.equals(activePumpName)) + return; + + removeCustomActions(); + + // add new actions + List customActions = activePump.getCustomActions(); + + if (customActions!=null) + { + + LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); + + for (CustomAction customAction : customActions) { + // TODO + + + SingleClickButton btn = new SingleClickButton(MainApp.instance().getApplicationContext()); + btn.setText(customAction.getName()); + + //btn.setTextAppearance(R.style.buttonStyle); + + + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.5f); + layoutParams.setMargins(10, 3, 10, 3); + + btn.setLayoutParams(layoutParams); + btn.setOnClickListener(customActionsListener); + + + ll.addView(btn); + + this.currentCustomActions.put(customAction.getName(), customAction); + this.customButtons.add(btn); + + + // TODO add to map + + +// + + + + + + } + } + + activePumpName = newPump; + } + + private void removeCustomActions() { + + if (currentCustomActions.size()==0) + return; + + LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); + + for (SingleClickButton customButton : customButtons) { + ll.removeView(customButton); + } + + customButtons.clear(); + currentCustomActions.clear(); + } + + @Override public void onClick(View view) { FragmentManager manager = getFragmentManager(); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java new file mode 100644 index 0000000000..f32959cc33 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomAction.java @@ -0,0 +1,43 @@ +package info.nightscout.androidaps.plugins.Actions.defs; + +/** + * Created by andy on 9/20/18. + */ + +public class CustomAction { + + private String name; + private String iconName; + private CustomActionType customActionType; + + + public String getName() { + + return name; + } + + public void setName(String name) { + + this.name = name; + } + + public String getIconName() { + + return iconName; + } + + public void setIconName(String iconName) { + + this.iconName = iconName; + } + + public CustomActionType getCustomActionType() { + + return customActionType; + } + + public void setCustomActionType(CustomActionType customActionType) { + + this.customActionType = customActionType; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java new file mode 100644 index 0000000000..640371bf9c --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/Actions/defs/CustomActionType.java @@ -0,0 +1,11 @@ +package info.nightscout.androidaps.plugins.Actions.defs; + +/** + * Created by andy on 9/20/18. + */ + +public interface CustomActionType { + + String getKey(); + +} 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 f6f1de2ad0..54d6a6d621 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 @@ -39,6 +39,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; @@ -1374,4 +1376,15 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint maxIob.setIfSmaller(0d, String.format(MainApp.gs(R.string.limitingmaxiob), 0d, MainApp.gs(R.string.unsafeusage)), this); return maxIob; } + + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } \ No newline at end of file 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 c50e635eb8..31cb635fec 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 @@ -8,6 +8,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; +import java.util.List; import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; @@ -27,6 +28,8 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.Overview.events.EventDismissNotification; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; @@ -467,4 +470,15 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte } // TODO: daily total constraint + + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 e3c8f9de94..9610a07e75 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 @@ -16,6 +16,8 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -36,6 +38,8 @@ import info.nightscout.androidaps.interfaces.ProfileInterface; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.DetailedBolusInfoStorage; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; @@ -806,4 +810,14 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte return loadHistory(RecordTypes.RECORD_TYPE_DAILY); } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 c72da31fdf..b1ac8a065b 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 @@ -32,6 +32,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderFragment; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; @@ -932,4 +934,14 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai return insulin; } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 27651a7cfb..b40c40acca 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 @@ -5,6 +5,8 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; @@ -17,6 +19,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.utils.DateUtil; @@ -239,4 +243,14 @@ public class MDIPlugin extends PluginBase implements PumpInterface { return deviceID(); } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + } 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 a21b1ca22b..670ee2397b 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 @@ -9,6 +9,8 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + import info.nightscout.androidaps.BuildConfig; import info.nightscout.androidaps.Config; import info.nightscout.androidaps.MainApp; @@ -26,6 +28,8 @@ import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpDescription; import info.nightscout.androidaps.interfaces.PumpInterface; import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.Actions.defs.CustomAction; +import info.nightscout.androidaps.plugins.Actions.defs.CustomActionType; import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; @@ -140,6 +144,16 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { return new PumpEnactResult(); } + @Override + public List getCustomActions() { + return null; + } + + @Override + public PumpEnactResult executeCustomAction(CustomActionType customActionType) { + return null; + } + @Override public boolean isInitialized() { return true; diff --git a/app/src/main/res/layout/actions_fragment.xml b/app/src/main/res/layout/actions_fragment.xml index 3b322b26dd..04f2a9e5d3 100644 --- a/app/src/main/res/layout/actions_fragment.xml +++ b/app/src/main/res/layout/actions_fragment.xml @@ -9,6 +9,7 @@ android:layout_height="wrap_content"> From e2ddb484983d44b1cf500e8ae258ee1ab14f3c2a Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Thu, 20 Sep 2018 18:04:06 +0100 Subject: [PATCH 02/90] Some extension on VirtualPump for testing. --- .../plugins/Actions/ActionsFragment.java | 9 +++--- .../plugins/Actions/defs/CustomAction.java | 16 ++++++---- .../PumpVirtual/VirtualPumpFragment.java | 30 +++++++++++++++++++ 3 files changed, 44 insertions(+), 11 deletions(-) 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 6a8422b2dd..dd48054738 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 @@ -254,15 +254,15 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); for (CustomAction customAction : customActions) { - // TODO - SingleClickButton btn = new SingleClickButton(MainApp.instance().getApplicationContext()); - btn.setText(customAction.getName()); + btn.setText(MainApp.gs(customAction.getName())); + // TODO style and drawableTop //btn.setTextAppearance(R.style.buttonStyle); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.5f); layoutParams.setMargins(10, 3, 10, 3); @@ -273,11 +273,10 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL ll.addView(btn); - this.currentCustomActions.put(customAction.getName(), customAction); + this.currentCustomActions.put(MainApp.gs(customAction.getName()), customAction); this.customButtons.add(btn); - // TODO add to map // Date: Sat, 13 Oct 2018 16:50:47 +0200 Subject: [PATCH 03/90] prepare new classes --- .../info/nightscout/androidaps/logging/L.java | 2 + .../plugins/SmsCommunicator/AuthRequest.java | 54 +++++++++++++++ .../plugins/SmsCommunicator/Sms.java | 51 +++++++++++++++ .../plugins/SmsCommunicator/SmsAction.java | 16 +++++ .../SmsCommunicatorFragment.java | 65 +++++++------------ .../SmsCommunicatorPlugin.java | 59 ++++------------- 6 files changed, 158 insertions(+), 89 deletions(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/AuthRequest.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java diff --git a/app/src/main/java/info/nightscout/androidaps/logging/L.java b/app/src/main/java/info/nightscout/androidaps/logging/L.java index c44d2516c2..d47ba313af 100644 --- a/app/src/main/java/info/nightscout/androidaps/logging/L.java +++ b/app/src/main/java/info/nightscout/androidaps/logging/L.java @@ -95,6 +95,7 @@ public class L { public static final String PROFILE = "PROFILE"; public static final String CONFIGBUILDER = "CONFIGBUILDER"; public static final String UI = "UI"; + public static final String SMS = "SMS"; private static void initialize() { logElements = new ArrayList<>(); @@ -117,6 +118,7 @@ public class L { logElements.add(new LogElement(PUMPBTCOMM, false)); logElements.add(new LogElement(PUMPCOMM, true)); logElements.add(new LogElement(PUMPQUEUE, true)); + logElements.add(new LogElement(SMS, true)); logElements.add(new LogElement(UI, true)); } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/AuthRequest.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/AuthRequest.java new file mode 100644 index 0000000000..c5dde0f644 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/AuthRequest.java @@ -0,0 +1,54 @@ +package info.nightscout.androidaps.plugins.SmsCommunicator; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.Constants; +import info.nightscout.androidaps.logging.L; +import info.nightscout.utils.DateUtil; + +class AuthRequest { + private static Logger log = LoggerFactory.getLogger(L.SMS); + + private Sms requester; + private String confirmCode; + private Runnable action; + + private long date; + + private boolean processed; + + AuthRequest(SmsCommunicatorPlugin plugin, Sms requester, String requestText, String confirmCode, SmsAction action) { + this.requester = requester; + this.confirmCode = confirmCode; + this.action = action; + + this.date = DateUtil.now(); + + plugin.sendSMS(new Sms(requester.phoneNumber, requestText)); + } + + void action(String codeReceived) { + if (processed) { + if (L.isEnabled(L.SMS)) + log.debug("Already processed"); + return; + } + if (!confirmCode.equals(codeReceived)) { + if (L.isEnabled(L.SMS)) + log.debug("Wrong code"); + return; + } + if (DateUtil.now() - date < Constants.SMS_CONFIRM_TIMEOUT) { + processed = true; + if (L.isEnabled(L.SMS)) + log.debug("Processing confirmed SMS: " + requester.text); + if (action != null) + action.run(); + return; + } + if (L.isEnabled(L.SMS)) + log.debug("Timed out SMS: " + requester.text); + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java new file mode 100644 index 0000000000..a2e56c833d --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java @@ -0,0 +1,51 @@ +package info.nightscout.androidaps.plugins.SmsCommunicator; + +import android.telephony.SmsMessage; + +class Sms { + String phoneNumber; + String confirmCode; // move + String text; + long date; //move + boolean received = false; + boolean sent = false; + boolean processed = false; + + double bolusRequested = 0d; + double tempBasal = 0d; + double calibrationRequested = 0d; + int duration = 0; + + Sms(SmsMessage message) { + phoneNumber = message.getOriginatingAddress(); + text = message.getMessageBody(); + date = message.getTimestampMillis(); + received = true; + } + + Sms(String phoneNumber, String text) { + this.phoneNumber = phoneNumber; + this.text = text; + sent = true; + } + + Sms(String phoneNumber, String text, long date) { + this.phoneNumber = phoneNumber; + this.text = text; + this.date = date; + sent = true; + } + + Sms(String phoneNumber, String text, long date, String confirmCode) { + this.phoneNumber = phoneNumber; + this.text = text; + this.date = date; + this.confirmCode = confirmCode; + sent = true; + } + + public String toString() { + return "SMS from " + phoneNumber + ": " + text; + } +} + diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java new file mode 100644 index 0000000000..6b0daf9f2d --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java @@ -0,0 +1,16 @@ +package info.nightscout.androidaps.plugins.SmsCommunicator; + +abstract class SmsAction implements Runnable { + Double d; + Integer i; + + SmsAction() {} + + SmsAction(Double d) { + this.d = d; + } + + SmsAction(Integer i) { + this.i = i; + } +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java index 3f218063ef..0289437124 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsCommunicatorFragment.java @@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.SmsCommunicator; import android.app.Activity; import android.os.Bundle; -import android.support.v4.app.Fragment; import android.text.Html; import android.view.LayoutInflater; import android.view.View; @@ -12,9 +11,6 @@ import android.widget.TextView; import com.squareup.otto.Subscribe; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.Collections; import java.util.Comparator; @@ -22,14 +18,8 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.Common.SubscriberFragment; import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui; import info.nightscout.utils.DateUtil; -import info.nightscout.utils.FabricPrivacy; -/** - * A simple {@link Fragment} subclass. - */ public class SmsCommunicatorFragment extends SubscriberFragment { - private static Logger log = LoggerFactory.getLogger(SmsCommunicatorFragment.class); - TextView logView; public SmsCommunicatorFragment() { @@ -39,18 +29,11 @@ public class SmsCommunicatorFragment extends SubscriberFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - try { - View view = inflater.inflate(R.layout.smscommunicator_fragment, container, false); + View view = inflater.inflate(R.layout.smscommunicator_fragment, container, false); - logView = (TextView) view.findViewById(R.id.smscommunicator_log); + logView = (TextView) view.findViewById(R.id.smscommunicator_log); - updateGUI(); - return view; - } catch (Exception e) { - FabricPrivacy.logException(e); - } - - return null; + return view; } @Subscribe @@ -58,35 +41,31 @@ public class SmsCommunicatorFragment extends SubscriberFragment { updateGUI(); } - @Override protected void updateGUI() { Activity activity = getActivity(); if (activity != null) - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - class CustomComparator implements Comparator { - public int compare(SmsCommunicatorPlugin.Sms object1, SmsCommunicatorPlugin.Sms object2) { - return (int) (object1.date - object2.date); - } + activity.runOnUiThread(() -> { + class CustomComparator implements Comparator { + public int compare(Sms object1, Sms object2) { + return (int) (object1.date - object2.date); } - Collections.sort(SmsCommunicatorPlugin.getPlugin().messages, new CustomComparator()); - int messagesToShow = 40; - - int start = Math.max(0, SmsCommunicatorPlugin.getPlugin().messages.size() - messagesToShow); - - String logText = ""; - for (int x = start; x < SmsCommunicatorPlugin.getPlugin().messages.size(); x++) { - SmsCommunicatorPlugin.Sms sms = SmsCommunicatorPlugin.getPlugin().messages.get(x); - if (sms.received) { - logText += DateUtil.timeString(sms.date) + " <<< " + (sms.processed ? "● " : "○ ") + sms.phoneNumber + " " + sms.text + "
"; - } else if (sms.sent) { - logText += DateUtil.timeString(sms.date) + " >>> " + (sms.processed ? "● " : "○ ") + sms.phoneNumber + " " + sms.text + "
"; - } - } - logView.setText(Html.fromHtml(logText)); } + Collections.sort(SmsCommunicatorPlugin.getPlugin().messages, new CustomComparator()); + int messagesToShow = 40; + + int start = Math.max(0, SmsCommunicatorPlugin.getPlugin().messages.size() - messagesToShow); + + String logText = ""; + for (int x = start; x < SmsCommunicatorPlugin.getPlugin().messages.size(); x++) { + Sms sms = SmsCommunicatorPlugin.getPlugin().messages.get(x); + if (sms.received) { + logText += DateUtil.timeString(sms.date) + " <<< " + (sms.processed ? "● " : "○ ") + sms.phoneNumber + " " + sms.text + "
"; + } else if (sms.sent) { + logText += DateUtil.timeString(sms.date) + " >>> " + (sms.processed ? "● " : "○ ") + sms.phoneNumber + " " + sms.text + "
"; + } + } + logView.setText(Html.fromHtml(logText)); }); } } 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 1d36eea817..c18f678235 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 @@ -21,8 +21,6 @@ import java.util.List; import info.nightscout.androidaps.Constants; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; -import info.nightscout.androidaps.services.Intents; import info.nightscout.androidaps.data.DetailedBolusInfo; import info.nightscout.androidaps.data.GlucoseStatus; import info.nightscout.androidaps.data.IobTotal; @@ -37,16 +35,19 @@ import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.interfaces.PluginDescription; import info.nightscout.androidaps.interfaces.PluginType; import info.nightscout.androidaps.interfaces.PumpInterface; +import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.ConfigBuilder.ConfigBuilderPlugin; +import info.nightscout.androidaps.plugins.ConfigBuilder.ProfileFunctions; import info.nightscout.androidaps.plugins.Loop.LoopPlugin; +import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.androidaps.plugins.Overview.events.EventNewNotification; import info.nightscout.androidaps.plugins.Overview.notifications.Notification; import info.nightscout.androidaps.plugins.SmsCommunicator.events.EventSmsCommunicatorUpdateGui; import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.queue.Callback; +import info.nightscout.androidaps.services.Intents; import info.nightscout.utils.DecimalFormatter; import info.nightscout.utils.FabricPrivacy; -import info.nightscout.androidaps.plugins.NSClientInternal.NSUpload; import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; import info.nightscout.utils.T; @@ -56,7 +57,7 @@ import info.nightscout.utils.XdripCalibrations; * Created by mike on 05.08.2016. */ public class SmsCommunicatorPlugin extends PluginBase { - private static Logger log = LoggerFactory.getLogger(SmsCommunicatorPlugin.class); + private static Logger log = LoggerFactory.getLogger(L.SMS); private static SmsCommunicatorPlugin smsCommunicatorPlugin; @@ -70,46 +71,7 @@ public class SmsCommunicatorPlugin extends PluginBase { private List allowedNumbers = new ArrayList<>(); - class Sms { - String phoneNumber; - String text; - long date; - boolean received = false; - boolean sent = false; - boolean processed = false; - - String confirmCode; - double bolusRequested = 0d; - double tempBasal = 0d; - double calibrationRequested = 0d; - int duration = 0; - - Sms(SmsMessage message) { - phoneNumber = message.getOriginatingAddress(); - text = message.getMessageBody(); - date = message.getTimestampMillis(); - received = true; - } - - Sms(String phoneNumber, String text, long date) { - this.phoneNumber = phoneNumber; - this.text = text; - this.date = date; - sent = true; - } - - Sms(String phoneNumber, String text, long date, String confirmCode) { - this.phoneNumber = phoneNumber; - this.text = text; - this.date = date; - this.confirmCode = confirmCode; - sent = true; - } - - public String toString() { - return "SMS from " + phoneNumber + ": " + text; - } - } + private AuthRequest messageToConfirm = null; private Sms cancelTempBasalWaitingForConfirmation = null; private Sms tempBasalWaitingForConfirmation = null; @@ -443,6 +405,10 @@ public class SmsCommunicatorPlugin extends PluginBase { } break; default: // expect passCode here + if (messageToConfirm != null) { + messageToConfirm.action(splited[0]); + messageToConfirm = null; + } if (bolusWaitingForConfirmation != null && !bolusWaitingForConfirmation.processed && bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - bolusWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) { bolusWaitingForConfirmation.processed = true; @@ -561,12 +527,13 @@ public class SmsCommunicatorPlugin extends PluginBase { } } - private void sendSMS(Sms sms) { + void sendSMS(Sms sms) { SmsManager smsManager = SmsManager.getDefault(); sms.text = stripAccents(sms.text); if (sms.text.length() > 140) sms.text = sms.text.substring(0, 139); try { - log.debug("Sending SMS to " + sms.phoneNumber + ": " + sms.text); + if (L.isEnabled(L.SMS)) + log.debug("Sending SMS to " + sms.phoneNumber + ": " + sms.text); smsManager.sendTextMessage(sms.phoneNumber, null, sms.text, null, null); messages.add(sms); } catch (IllegalArgumentException e) { From 903504d72dedeb688641623c935b6cba399ad85d Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 14 Oct 2018 10:55:11 +0200 Subject: [PATCH 04/90] SMSPlugin refactor & cleanup --- .../plugins/SmsCommunicator/Sms.java | 26 +- .../plugins/SmsCommunicator/SmsAction.java | 12 +- .../SmsCommunicatorPlugin.java | 293 ++++++++---------- 3 files changed, 143 insertions(+), 188 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java index a2e56c833d..ec77f03923 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/Sms.java @@ -2,20 +2,16 @@ package info.nightscout.androidaps.plugins.SmsCommunicator; import android.telephony.SmsMessage; +import info.nightscout.utils.DateUtil; + class Sms { String phoneNumber; - String confirmCode; // move String text; - long date; //move + long date; boolean received = false; boolean sent = false; boolean processed = false; - double bolusRequested = 0d; - double tempBasal = 0d; - double calibrationRequested = 0d; - int duration = 0; - Sms(SmsMessage message) { phoneNumber = message.getOriginatingAddress(); text = message.getMessageBody(); @@ -26,21 +22,7 @@ class Sms { Sms(String phoneNumber, String text) { this.phoneNumber = phoneNumber; this.text = text; - sent = true; - } - - Sms(String phoneNumber, String text, long date) { - this.phoneNumber = phoneNumber; - this.text = text; - this.date = date; - sent = true; - } - - Sms(String phoneNumber, String text, long date, String confirmCode) { - this.phoneNumber = phoneNumber; - this.text = text; - this.date = date; - this.confirmCode = confirmCode; + this.date = DateUtil.now(); sent = true; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java index 6b0daf9f2d..6e991c8370 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/SmsCommunicator/SmsAction.java @@ -1,16 +1,16 @@ package info.nightscout.androidaps.plugins.SmsCommunicator; abstract class SmsAction implements Runnable { - Double d; - Integer i; + Double aDouble; + Integer anInteger; SmsAction() {} - SmsAction(Double d) { - this.d = d; + SmsAction(Double aDouble) { + this.aDouble = aDouble; } - SmsAction(Integer i) { - this.i = i; + SmsAction(Integer anInteger) { + this.anInteger = anInteger; } } 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 6c9c662098..64f7e01d0c 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 @@ -73,11 +73,6 @@ public class SmsCommunicatorPlugin extends PluginBase { private AuthRequest messageToConfirm = null; - private Sms cancelTempBasalWaitingForConfirmation = null; - private Sms tempBasalWaitingForConfirmation = null; - private Sms bolusWaitingForConfirmation = null; - private Sms calibrationWaitingForConfirmation = null; - private Sms suspendWaitingForConfirmation = null; private Date lastRemoteBolusTime = new Date(0); ArrayList messages = new ArrayList<>(); @@ -158,9 +153,6 @@ public class SmsCommunicatorPlugin extends PluginBase { log.debug(receivedSms.toString()); String[] splited = receivedSms.text.split("\\s+"); - Double amount; - Double tempBasal; - int duration = 0; String passCode; boolean remoteCommandsAllowed = SP.getBoolean(R.string.key_smscommunicator_remotecommandsallowed, false); @@ -192,9 +184,8 @@ public class SmsCommunicatorPlugin extends PluginBase { + 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, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bg")); break; case "LOOP": if (splited.length > 1) @@ -210,7 +201,7 @@ public class SmsCommunicatorPlugin extends PluginBase { MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_STOP")); 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, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } }); } @@ -223,7 +214,7 @@ public class SmsCommunicatorPlugin extends PluginBase { if (loopPlugin != null && !loopPlugin.isEnabled(PluginType.LOOP)) { loopPlugin.setPluginEnabled(PluginType.LOOP, true); reply = MainApp.gs(R.string.smscommunicator_loophasbeenenabled); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_START")); } receivedSms.processed = true; @@ -240,7 +231,7 @@ public class SmsCommunicatorPlugin extends PluginBase { } else { reply = MainApp.gs(R.string.smscommunicator_loopisdisabled); } - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } receivedSms.processed = true; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Status")); @@ -250,28 +241,48 @@ public class SmsCommunicatorPlugin extends PluginBase { MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_RESUME")); NSUpload.uploadOpenAPSOffline(0); reply = MainApp.gs(R.string.smscommunicator_loopresumed); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply)); FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume")); break; case "SUSPEND": + int duration = 0; if (splited.length >= 3) duration = SafeParse.stringToInt(splited[2]); duration = Math.max(0, duration); duration = Math.min(180, duration); if (duration == 0) { reply = MainApp.gs(R.string.smscommunicator_wrongduration); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } else if (remoteCommandsAllowed) { passCode = generatePasscode(); reply = String.format(MainApp.gs(R.string.smscommunicator_suspendreplywithcode), duration, passCode); receivedSms.processed = true; - resetWaitingMessages(); - sendSMS(suspendWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode)); - suspendWaitingForConfirmation.duration = duration; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Suspend")); + messageToConfirm = new AuthRequest(this, receivedSms, reply, passCode, new SmsAction(duration) { + @Override + public void run() { + ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelTempBasal(true, new Callback() { + @Override + public void run() { + if (result.success) { + LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + anInteger * 60L * 1000); + NSUpload.uploadOpenAPSOffline(anInteger * 60); + MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED")); + 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)); + } else { + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); + reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); + } + } + }); + + } + }); } else { reply = MainApp.gs(R.string.smscommunicator_remotecommandnotallowed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } break; } @@ -285,7 +296,7 @@ public class SmsCommunicatorPlugin extends PluginBase { MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0); reply = "TERATMENTS REFRESH " + q.size() + " receivers"; - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); receivedSms.processed = true; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Treatments_Refresh")); break; @@ -299,7 +310,7 @@ public class SmsCommunicatorPlugin extends PluginBase { MainApp.instance().getApplicationContext().sendBroadcast(restartNSClient); List q = MainApp.instance().getApplicationContext().getPackageManager().queryBroadcastReceivers(restartNSClient, 0); reply = "NSCLIENT RESTART " + q.size() + " receivers"; - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); receivedSms.processed = true; FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Nsclient_Restart")); break; @@ -314,11 +325,11 @@ public class SmsCommunicatorPlugin extends PluginBase { if (result.success) { if (pump != null) { String reply = pump.shortStatus(true); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply)); } } else { String reply = MainApp.gs(R.string.readstatusfailed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } } }); @@ -332,32 +343,65 @@ public class SmsCommunicatorPlugin extends PluginBase { passCode = generatePasscode(); reply = String.format(MainApp.gs(R.string.smscommunicator_basalstopreplywithcode), passCode); receivedSms.processed = true; - resetWaitingMessages(); - sendSMS(cancelTempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode)); - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal")); + messageToConfirm = new AuthRequest(this, receivedSms, reply, passCode, new SmsAction() { + @Override + public void run() { + ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelTempBasal(true, new Callback() { + @Override + public void run() { + if (result.success) { + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcanceled); + reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply)); + } else { + String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); + reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); + } + } + }); + } + }); } else { reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } } else { - tempBasal = SafeParse.stringToDouble(splited[1]); + Double tempBasal = SafeParse.stringToDouble(splited[1]); Profile profile = ProfileFunctions.getInstance().getProfile(); if (profile == null) { reply = MainApp.gs(R.string.noprofile); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } else { tempBasal = MainApp.getConstraintChecker().applyBasalConstraints(new Constraint<>(tempBasal), profile).value(); if (remoteCommandsAllowed) { passCode = generatePasscode(); reply = String.format(MainApp.gs(R.string.smscommunicator_basalreplywithcode), tempBasal, passCode); receivedSms.processed = true; - resetWaitingMessages(); - sendSMS(tempBasalWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode)); - tempBasalWaitingForConfirmation.tempBasal = tempBasal; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Basal")); + messageToConfirm = new AuthRequest(this, receivedSms, reply, passCode, new SmsAction(tempBasal) { + @Override + public void run() { + Profile profile = ProfileFunctions.getInstance().getProfile(); + if (profile != null) + ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalAbsolute(aDouble, 30, true, profile, new Callback() { + @Override + public void run() { + if (result.success) { + String reply = String.format(MainApp.gs(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); + reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply)); + } else { + String reply = MainApp.gs(R.string.smscommunicator_tempbasalfailed); + reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); + } + } + }); + } + }); } else { reply = MainApp.gs(R.string.smscommunicator_remotebasalnotallowed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } } } @@ -366,41 +410,74 @@ public class SmsCommunicatorPlugin extends PluginBase { case "BOLUS": if (System.currentTimeMillis() - lastRemoteBolusTime.getTime() < Constants.remoteBolusMinDistance) { reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } else if (ConfigBuilderPlugin.getPlugin().getActivePump().isSuspended()) { reply = MainApp.gs(R.string.pumpsuspended); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } else if (splited.length > 1) { - amount = SafeParse.stringToDouble(splited[1]); - amount = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(amount)).value(); - if (amount > 0d && remoteCommandsAllowed) { + Double bolus = SafeParse.stringToDouble(splited[1]); + bolus = MainApp.getConstraintChecker().applyBolusConstraints(new Constraint<>(bolus)).value(); + if (bolus > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.gs(R.string.smscommunicator_bolusreplywithcode), amount, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_bolusreplywithcode), bolus, passCode); receivedSms.processed = true; - resetWaitingMessages(); - sendSMS(bolusWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode)); - bolusWaitingForConfirmation.bolusRequested = amount; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Bolus")); + messageToConfirm = new AuthRequest(this, receivedSms, reply, passCode, new SmsAction(bolus) { + @Override + public void run() { + DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); + detailedBolusInfo.insulin = aDouble; + detailedBolusInfo.source = Source.USER; + ConfigBuilderPlugin.getPlugin().getCommandQueue().bolus(detailedBolusInfo, new Callback() { + @Override + public void run() { + PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump(); + if (result.success) { + SystemClock.sleep(T.secs(15).msecs()); // wait some time to get history + 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)); + } else { + SystemClock.sleep(T.secs(60).msecs()); // wait some time to get history + String reply = MainApp.gs(R.string.smscommunicator_bolusfailed); + if (pump != null) + reply += "\n" + pump.shortStatus(true); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); + } + } + }); + } + }); } else { reply = MainApp.gs(R.string.smscommunicator_remotebolusnotallowed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } } break; case "CAL": if (splited.length > 1) { - amount = SafeParse.stringToDouble(splited[1]); - if (amount > 0d && remoteCommandsAllowed) { + Double cal = SafeParse.stringToDouble(splited[1]); + if (cal > 0d && remoteCommandsAllowed) { passCode = generatePasscode(); - reply = String.format(MainApp.gs(R.string.smscommunicator_calibrationreplywithcode), amount, passCode); + reply = String.format(MainApp.gs(R.string.smscommunicator_calibrationreplywithcode), cal, passCode); receivedSms.processed = true; - resetWaitingMessages(); - sendSMS(calibrationWaitingForConfirmation = new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis(), passCode)); - calibrationWaitingForConfirmation.calibrationRequested = amount; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Cal")); + messageToConfirm = new AuthRequest(this, receivedSms, reply, passCode, new SmsAction() { + @Override + public void run() { + boolean result = XdripCalibrations.sendIntent(aDouble); + if (result) { + String reply = MainApp.gs(R.string.smscommunicator_calibrationsent); + sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply)); + } else { + String reply = MainApp.gs(R.string.smscommunicator_calibrationfailed); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); + } + } + }); } else { reply = MainApp.gs(R.string.smscommunicator_remotecalibrationnotallowed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, reply)); } } break; @@ -408,105 +485,9 @@ public class SmsCommunicatorPlugin extends PluginBase { if (messageToConfirm != null) { messageToConfirm.action(splited[0]); messageToConfirm = null; - } - if (bolusWaitingForConfirmation != null && !bolusWaitingForConfirmation.processed && - bolusWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - bolusWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) { - bolusWaitingForConfirmation.processed = true; - DetailedBolusInfo detailedBolusInfo = new DetailedBolusInfo(); - detailedBolusInfo.insulin = bolusWaitingForConfirmation.bolusRequested; - detailedBolusInfo.source = Source.USER; - ConfigBuilderPlugin.getPlugin().getCommandQueue().bolus(detailedBolusInfo, new Callback() { - @Override - public void run() { - PumpInterface pump = ConfigBuilderPlugin.getPlugin().getActivePump(); - if (result.success) { - SystemClock.sleep(T.secs(15).msecs()); // wait some time to get history - 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, System.currentTimeMillis())); - } else { - SystemClock.sleep(T.secs(60).msecs()); // wait some time to get history - String reply = MainApp.gs(R.string.smscommunicator_bolusfailed); - if (pump != null) - reply += "\n" + pump.shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } - } - }); - } else if (tempBasalWaitingForConfirmation != null && !tempBasalWaitingForConfirmation.processed && - tempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - tempBasalWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) { - tempBasalWaitingForConfirmation.processed = true; - Profile profile = ProfileFunctions.getInstance().getProfile(); - if (profile != null) - ConfigBuilderPlugin.getPlugin().getCommandQueue().tempBasalAbsolute(tempBasalWaitingForConfirmation.tempBasal, 30, true, profile, new Callback() { - @Override - public void run() { - if (result.success) { - String reply = String.format(MainApp.gs(R.string.smscommunicator_tempbasalset), result.absolute, result.duration); - reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } else { - String reply = MainApp.gs(R.string.smscommunicator_tempbasalfailed); - reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } - } - }); - } else if (cancelTempBasalWaitingForConfirmation != null && !cancelTempBasalWaitingForConfirmation.processed && - cancelTempBasalWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - cancelTempBasalWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) { - cancelTempBasalWaitingForConfirmation.processed = true; - ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelTempBasal(true, new Callback() { - @Override - public void run() { - if (result.success) { - String reply = MainApp.gs(R.string.smscommunicator_tempbasalcanceled); - reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } else { - String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); - reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } - } - }); - } else if (calibrationWaitingForConfirmation != null && !calibrationWaitingForConfirmation.processed && - calibrationWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - calibrationWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) { - calibrationWaitingForConfirmation.processed = true; - boolean result = XdripCalibrations.sendIntent(calibrationWaitingForConfirmation.calibrationRequested); - if (result) { - reply = MainApp.gs(R.string.smscommunicator_calibrationsent); - sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } else { - reply = MainApp.gs(R.string.smscommunicator_calibrationfailed); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } - } else if (suspendWaitingForConfirmation != null && !suspendWaitingForConfirmation.processed && - suspendWaitingForConfirmation.confirmCode.equals(splited[0]) && System.currentTimeMillis() - suspendWaitingForConfirmation.date < Constants.SMS_CONFIRM_TIMEOUT) { - suspendWaitingForConfirmation.processed = true; - final int dur = suspendWaitingForConfirmation.duration; - ConfigBuilderPlugin.getPlugin().getCommandQueue().cancelTempBasal(true, new Callback() { - @Override - public void run() { - if (result.success) { - LoopPlugin.getPlugin().suspendTo(System.currentTimeMillis() + dur * 60L * 1000); - NSUpload.uploadOpenAPSOffline(dur * 60); - MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_SUSPENDED")); - 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, System.currentTimeMillis())); - } else { - String reply = MainApp.gs(R.string.smscommunicator_tempbasalcancelfailed); - reply += "\n" + ConfigBuilderPlugin.getPlugin().getActivePump().shortStatus(true); - sendSMS(new Sms(receivedSms.phoneNumber, reply, System.currentTimeMillis())); - } - } - }); } else { - sendSMS(new Sms(receivedSms.phoneNumber, MainApp.gs(R.string.smscommunicator_unknowncommand), System.currentTimeMillis())); + sendSMS(new Sms(receivedSms.phoneNumber, MainApp.gs(R.string.smscommunicator_unknowncommand))); } - resetWaitingMessages(); break; } } @@ -516,7 +497,7 @@ public class SmsCommunicatorPlugin extends PluginBase { public void sendNotificationToAllNumbers(String text) { for (int i = 0; i < allowedNumbers.size(); i++) { - Sms sms = new Sms(allowedNumbers.get(i), text, System.currentTimeMillis()); + Sms sms = new Sms(allowedNumbers.get(i), text); sendSMS(sms); } } @@ -556,14 +537,6 @@ public class SmsCommunicatorPlugin extends PluginBase { return passCode; } - private void resetWaitingMessages() { - tempBasalWaitingForConfirmation = null; - cancelTempBasalWaitingForConfirmation = null; - bolusWaitingForConfirmation = null; - calibrationWaitingForConfirmation = null; - suspendWaitingForConfirmation = null; - } - private static String stripAccents(String s) { s = Normalizer.normalize(s, Normalizer.Form.NFD); s = s.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); From cc25520770001974ee0c6749b64b8203b39f51b7 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 14 Oct 2018 11:58:19 +0200 Subject: [PATCH 05/90] ignore SMS starting # --- .../plugins/SmsCommunicator/SmsCommunicatorPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 64f7e01d0c..0fc392fc8a 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 @@ -482,7 +482,9 @@ public class SmsCommunicatorPlugin extends PluginBase { } break; default: // expect passCode here - if (messageToConfirm != null) { + if (splited[0].startsWith("#")) { + // user text .... ignore + } else if (messageToConfirm != null) { messageToConfirm.action(splited[0]); messageToConfirm = null; } else { From 26cb25893ecb8acb37f66b4c7b81dfaa82a501d5 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Sun, 14 Oct 2018 12:01:14 +0200 Subject: [PATCH 06/90] remove fabric logging for SMS --- .../plugins/SmsCommunicator/SmsCommunicatorPlugin.java | 9 --------- 1 file changed, 9 deletions(-) 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 0fc392fc8a..a6fde68028 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 @@ -7,7 +7,6 @@ import android.os.SystemClock; import android.telephony.SmsManager; import android.telephony.SmsMessage; -import com.crashlytics.android.answers.CustomEvent; import com.squareup.otto.Subscribe; import org.slf4j.Logger; @@ -47,7 +46,6 @@ import info.nightscout.androidaps.plugins.Treatments.TreatmentsPlugin; import info.nightscout.androidaps.queue.Callback; import info.nightscout.androidaps.services.Intents; import info.nightscout.utils.DecimalFormatter; -import info.nightscout.utils.FabricPrivacy; import info.nightscout.utils.SP; import info.nightscout.utils.SafeParse; import info.nightscout.utils.T; @@ -206,7 +204,6 @@ public class SmsCommunicatorPlugin extends PluginBase { }); } receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Stop")); break; case "ENABLE": case "START": @@ -218,7 +215,6 @@ public class SmsCommunicatorPlugin extends PluginBase { MainApp.bus().post(new EventRefreshOverview("SMS_LOOP_START")); } receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Start")); break; case "STATUS": loopPlugin = MainApp.getSpecificPlugin(LoopPlugin.class); @@ -234,7 +230,6 @@ public class SmsCommunicatorPlugin extends PluginBase { sendSMS(new Sms(receivedSms.phoneNumber, reply)); } receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Status")); break; case "RESUME": LoopPlugin.getPlugin().suspendTo(0); @@ -242,7 +237,6 @@ public class SmsCommunicatorPlugin extends PluginBase { NSUpload.uploadOpenAPSOffline(0); reply = MainApp.gs(R.string.smscommunicator_loopresumed); sendSMSToAllNumbers(new Sms(receivedSms.phoneNumber, reply)); - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Loop_Resume")); break; case "SUSPEND": int duration = 0; @@ -298,7 +292,6 @@ public class SmsCommunicatorPlugin extends PluginBase { reply = "TERATMENTS REFRESH " + q.size() + " receivers"; sendSMS(new Sms(receivedSms.phoneNumber, reply)); receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Treatments_Refresh")); break; } break; @@ -312,7 +305,6 @@ public class SmsCommunicatorPlugin extends PluginBase { reply = "NSCLIENT RESTART " + q.size() + " receivers"; sendSMS(new Sms(receivedSms.phoneNumber, reply)); receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Nsclient_Restart")); break; } break; @@ -334,7 +326,6 @@ public class SmsCommunicatorPlugin extends PluginBase { } }); receivedSms.processed = true; - FabricPrivacy.getInstance().logCustom(new CustomEvent("SMS_Pump")); break; case "BASAL": if (splited.length > 1) { From 8b3b1e67ea30e826f64a2a7b12f62732ba03caaa Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Wed, 20 Feb 2019 22:57:31 +0000 Subject: [PATCH 07/90] First implementation --- .../androidaps/interfaces/PumpInterface.java | 2 +- .../plugins/Actions/ActionsFragment.java | 93 +++++++------------ .../plugins/PumpCombo/ComboPlugin.java | 4 +- .../PumpDanaR/AbstractDanaRPlugin.java | 5 +- .../plugins/PumpDanaRS/DanaRSPlugin.java | 4 +- .../plugins/PumpInsight/InsightPlugin.java | 4 +- .../androidaps/plugins/PumpMDI/MDIPlugin.java | 4 +- .../PumpVirtual/VirtualPumpPlugin.java | 4 +- 8 files changed, 45 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java index 2f8e92dcc7..777ae113c4 100644 --- a/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java +++ b/app/src/main/java/info/nightscout/androidaps/interfaces/PumpInterface.java @@ -64,6 +64,6 @@ public interface PumpInterface { List getCustomActions(); - PumpEnactResult executeCustomAction(CustomActionType customActionType); + void executeCustomAction(CustomActionType customActionType); } 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 dd48054738..69fd805dec 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 @@ -3,6 +3,7 @@ package info.nightscout.androidaps.plugins.Actions; import android.app.Activity; import android.content.Intent; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -68,6 +69,9 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL SingleClickButton tddStats; SingleClickButton history; + private Map pumpCustomActions = new HashMap<>(); + private List pumpCustomButtons = new ArrayList<>(); + public ActionsFragment() { super(); } @@ -203,119 +207,84 @@ public class ActionsFragment extends SubscriberFragment implements View.OnClickL else tempTarget.setVisibility(View.VISIBLE); - if (!ConfigBuilderPlugin.getActivePump().getPumpDescription().supportsTDDs) tddStats.setVisibility(View.GONE); - else tddStats.setVisibility(View.VISIBLE); + if (!pump.getPumpDescription().supportsTDDs) + tddStats.setVisibility(View.GONE); + else + tddStats.setVisibility(View.VISIBLE); - checkCustomActions(); + checkPumpCustomActions(); } }); } - private String activePumpName; - private Map currentCustomActions = new HashMap<>(); - private List customButtons = new ArrayList<>(); - - View.OnClickListener customActionsListener = v -> { + View.OnClickListener pumpCustomActionsListener = v -> { SingleClickButton btn = (SingleClickButton)v; - CustomAction customAction = this.currentCustomActions.get(btn.getText().toString()); + CustomAction customAction = this.pumpCustomActions.get(btn.getText().toString()); ConfigBuilderPlugin.getActivePump().executeCustomAction(customAction.getCustomActionType()); }; + private void checkPumpCustomActions() { - private void checkCustomActions() { + PumpInterface activePump = ConfigBuilderPlugin.getPlugin().getActivePump(); - PumpInterface activePump = ConfigBuilderPlugin.getActivePump(); + removePumpCustomActions(); - if (activePump==null) { - removeCustomActions(); + if (activePump == null) { return; } - String newPump = activePump.getClass().getSimpleName(); - - if (newPump.equals(activePumpName)) - return; - - removeCustomActions(); - - // add new actions List customActions = activePump.getCustomActions(); - if (customActions!=null) - { + if (customActions != null && customActions.size()>0) { - LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); + LinearLayout ll = actionsFragmentView.findViewById(R.id.action_buttons_layout); for (CustomAction customAction : customActions) { - SingleClickButton btn = new SingleClickButton(MainApp.instance().getApplicationContext()); + SingleClickButton btn = new SingleClickButton(getContext(), null, android.R.attr.buttonStyle); btn.setText(MainApp.gs(customAction.getName())); - // TODO style and drawableTop - //btn.setTextAppearance(R.style.buttonStyle); - - - LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0.5f); - layoutParams.setMargins(10, 3, 10, 3); + layoutParams.setMargins(20, 8, 20, 8); // 10,3,10,3 btn.setLayoutParams(layoutParams); - btn.setOnClickListener(customActionsListener); + btn.setOnClickListener(pumpCustomActionsListener); + Drawable top = getResources().getDrawable(R.drawable.icon_actions_profileswitch); + btn.setCompoundDrawablesWithIntrinsicBounds(null, top, null, null); ll.addView(btn); - this.currentCustomActions.put(MainApp.gs(customAction.getName()), customAction); - this.customButtons.add(btn); - - - - -// - - - - + this.pumpCustomActions.put(MainApp.gs(customAction.getName()), customAction); + this.pumpCustomButtons.add(btn); } } - activePumpName = newPump; } - private void removeCustomActions() { - if (currentCustomActions.size()==0) + private void removePumpCustomActions() { + + if (pumpCustomActions.size()==0) return; - LinearLayout ll = (LinearLayout)actionsFragmentView.findViewById(R.id.action_buttons_layout); + LinearLayout ll = actionsFragmentView.findViewById(R.id.action_buttons_layout); - for (SingleClickButton customButton : customButtons) { + for (SingleClickButton customButton : pumpCustomButtons) { ll.removeView(customButton); } - customButtons.clear(); - currentCustomActions.clear(); + pumpCustomButtons.clear(); + pumpCustomActions.clear(); } 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 54d6a6d621..34882bc14c 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 @@ -1383,8 +1383,8 @@ public class ComboPlugin extends PluginBase implements PumpInterface, Constraint } @Override - public PumpEnactResult executeCustomAction(CustomActionType customActionType) { - return null; + public void executeCustomAction(CustomActionType customActionType) { + } } \ No newline at end of file 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 31cb635fec..d293dab80c 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 @@ -476,9 +476,10 @@ public abstract class AbstractDanaRPlugin extends PluginBase implements PumpInte return null; } + @Override - public PumpEnactResult executeCustomAction(CustomActionType customActionType) { - return null; + public void executeCustomAction(CustomActionType customActionType) { + } } 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 9610a07e75..76adba94d8 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 @@ -816,8 +816,8 @@ public class DanaRSPlugin extends PluginBase implements PumpInterface, DanaRInte } @Override - public PumpEnactResult executeCustomAction(CustomActionType customActionType) { - return null; + public void executeCustomAction(CustomActionType customActionType) { + } } 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 b1ac8a065b..387b66791d 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 @@ -940,8 +940,8 @@ public class InsightPlugin extends PluginBase implements PumpInterface, Constrai } @Override - public PumpEnactResult executeCustomAction(CustomActionType customActionType) { - return null; + public void executeCustomAction(CustomActionType customActionType) { + } } 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 b40c40acca..0d9260837c 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 @@ -249,8 +249,8 @@ public class MDIPlugin extends PluginBase implements PumpInterface { } @Override - public PumpEnactResult executeCustomAction(CustomActionType customActionType) { - return null; + public void executeCustomAction(CustomActionType customActionType) { + } } 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 670ee2397b..9eabfd0cac 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 @@ -150,8 +150,8 @@ public class VirtualPumpPlugin extends PluginBase implements PumpInterface { } @Override - public PumpEnactResult executeCustomAction(CustomActionType customActionType) { - return null; + public void executeCustomAction(CustomActionType customActionType) { + } @Override From 6cd37520c30c46d7fd7e61f899f5acb0a6136c1b Mon Sep 17 00:00:00 2001 From: Tebbe Ubben Date: Mon, 4 Mar 2019 23:21:26 +0100 Subject: [PATCH 08/90] Fix #1661 --- .../androidaps/plugins/pump/insight/LocalInsightPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java index 238ffbe8ab..1ef940aeb9 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/pump/insight/LocalInsightPlugin.java @@ -715,6 +715,7 @@ public class LocalInsightPlugin extends PluginBase implements PumpInterface, Con @Override public PumpEnactResult setExtendedBolus(Double insulin, Integer durationInMinutes) { PumpEnactResult result = cancelExtendedBolusOnly(); + if (result.success) result = setExtendedBolusOnly(insulin, durationInMinutes); try { fetchStatus(); readHistory(); From e342f4e2ae03164bde0b173af55a593efa65a828 Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Mon, 4 Mar 2019 23:13:55 +0000 Subject: [PATCH 09/90] d --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d1e1e8a47c..4409852b76 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # AndroidAPS +ddd + * Check the wiki: http://wiki.androidaps.org * Everyone who’s been looping with AndroidAPS needs to fill out the form after 3 days of looping https://docs.google.com/forms/d/14KcMjlINPMJHVt28MDRupa4sz4DDIooI4SrW0P3HSN8/viewform?c=0&w=1 From fda43c423def635a297995dcb444b2916c9133ee Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Mon, 4 Mar 2019 23:23:51 +0000 Subject: [PATCH 10/90] - Change wear versions to highest --- wear/build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wear/build.gradle b/wear/build.gradle index cf846f51ae..276a921b7f 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -1,7 +1,8 @@ apply plugin: 'com.android.application' ext { - wearableVersion = "2.0.1" + wearableVersion = "2.4.0" + playServicesWearable = "16.0.1" } def generateGitBuild = { -> @@ -89,7 +90,7 @@ dependencies { //compile "com.ustwo.android:clockwise-wearable:1.0.2" compileOnly "com.google.android.wearable:wearable:${wearableVersion}" implementation "com.google.android.support:wearable:${wearableVersion}" - implementation "com.google.android.gms:play-services-wearable:7.3.0" + implementation "com.google.android.gms:play-services-wearable:${playServicesWearable}" implementation(name:"ustwo-clockwise-debug", ext:"aar") implementation "com.android.support:support-v4:27.0.1" implementation 'com.android.support:wear:27.0.1' From 056ad650cdec4dbbb91198f50bbc46b3db32e06d Mon Sep 17 00:00:00 2001 From: Andy Rozman Date: Tue, 5 Mar 2019 01:05:16 +0000 Subject: [PATCH 11/90] - changed wear versions - added some code to listener - added some log entries --- wear/build.gradle | 4 +- wear/src/main/AndroidManifest.xml | 20 +++- .../androidaps/data/ListenerService.java | 101 ++++++++++++++++-- .../interaction/utils/WearUtil.java | 19 ++++ 4 files changed, 133 insertions(+), 11 deletions(-) create mode 100644 wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearUtil.java diff --git a/wear/build.gradle b/wear/build.gradle index 276a921b7f..1dd07ff1a5 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'com.android.application' ext { - wearableVersion = "2.4.0" - playServicesWearable = "16.0.1" + wearableVersion = "2.0.1" + playServicesWearable = "9.4.0" } def generateGitBuild = { -> diff --git a/wear/src/main/AndroidManifest.xml b/wear/src/main/AndroidManifest.xml index e6750c515d..119b83a3f5 100644 --- a/wear/src/main/AndroidManifest.xml +++ b/wear/src/main/AndroidManifest.xml @@ -168,12 +168,28 @@ + - + + + + + + + + + + + + + + + + + - diff --git a/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java b/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java index 52dfc97ad1..326d154079 100644 --- a/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java +++ b/wear/src/main/java/info/nightscout/androidaps/data/ListenerService.java @@ -7,16 +7,19 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.SystemClock; import android.preference.PreferenceManager; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationManagerCompat; +import android.util.Log; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.wearable.ChannelApi; import com.google.android.gms.wearable.DataEvent; import com.google.android.gms.wearable.DataEventBuffer; import com.google.android.gms.wearable.DataMap; @@ -33,12 +36,15 @@ import info.nightscout.androidaps.R; import info.nightscout.androidaps.interaction.actions.AcceptActivity; import info.nightscout.androidaps.interaction.actions.CPPActivity; import info.nightscout.androidaps.interaction.utils.SafeParse; +import info.nightscout.androidaps.interaction.utils.WearUtil; + /** * Created by emmablack on 12/26/14. */ public class ListenerService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks, - GoogleApiClient.OnConnectionFailedListener { + GoogleApiClient.OnConnectionFailedListener, ChannelApi.ChannelListener { + private static final String WEARABLE_DATA_PATH = "/nightscout_watch_data"; private static final String WEARABLE_RESEND_PATH = "/nightscout_watch_data_resend"; private static final String WEARABLE_CANCELBOLUS_PATH = "/nightscout_watch_cancel_bolus"; @@ -67,19 +73,35 @@ public class ListenerService extends WearableListenerService implements GoogleAp private static final String ACTION_RESEND_BULK = "com.dexdrip.stephenblack.nightwatch.RESEND_BULK_DATA"; + GoogleApiClient googleApiClient; private long lastRequest = 0; private DismissThread confirmThread; private DismissThread bolusprogressThread; + private static final String TAG = "ListenerService"; + + private DataRequester mDataRequester = null; public class DataRequester extends AsyncTask { Context mContext; + String path; + byte[] payload; - DataRequester(Context context) { - mContext = context; +// DataRequester(Context context) { +// mContext = context; +// } + + + + DataRequester(Context context, String thispath, byte[] thispayload) { + path = thispath; + payload = thispayload; + Log.d(TAG, "DataRequester DataRequester: " + thispath + " lastRequest:" + lastRequest); } + + @Override protected Void doInBackground(Void... params) { if (googleApiClient.isConnected()) { @@ -154,6 +176,9 @@ public class ListenerService extends WearableListenerService implements GoogleAp @Override protected Void doInBackground(Void... params) { + + forceGoogleApiConnect(); + if (googleApiClient.isConnected()) { NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(googleApiClient).await(); @@ -176,7 +201,7 @@ public class ListenerService extends WearableListenerService implements GoogleAp } public void requestData() { - new DataRequester(this).execute(); + sendData(WEARABLE_RESEND_PATH, null); } public void cancelBolus() { @@ -191,7 +216,48 @@ public class ListenerService extends WearableListenerService implements GoogleAp new MessageActionTask(this, WEARABLE_INITIATE_ACTIONSTRING_PATH, actionstring).execute(); } - public void googleApiConnect() { + + private synchronized void sendData(String path, byte[] payload) { + if (path == null) return; + if (mDataRequester != null) { + Log.d(TAG, "sendData DataRequester != null lastRequest:" + WearUtil.dateTimeText(lastRequest)); + if (mDataRequester.getStatus() != AsyncTask.Status.FINISHED) { + Log.d(TAG, "sendData Should be canceled? Let run 'til finished."); + //mDataRequester.cancel(true); + } + //mDataRequester = null; + } + + Log.d(TAG, "sendData: execute lastRequest:" + WearUtil.dateTimeText(lastRequest)); + mDataRequester = (DataRequester) new DataRequester(this, path, payload).execute(); + + +// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { +// Log.d(TAG, "sendData SDK < M call execute lastRequest:" + WearUtil.dateTimeText(lastRequest)); +// mDataRequester = (DataRequester) new DataRequester(this, path, payload).execute(); +// } else { +// Log.d(TAG, "sendData SDK >= M call executeOnExecutor lastRequest:" + WearUtil.dateTimeText(lastRequest)); +// // TODO xdrip executor +// mDataRequester = (DataRequester) new DataRequester(this, path, payload).executeOnExecutor(xdrip.executor); +// } + } + + + private void googleApiConnect() { + if (googleApiClient != null) { + // Remove old listener(s) + try { + Wearable.ChannelApi.removeListener(googleApiClient, this); + } catch (Exception e) { + // + } + try { + Wearable.MessageApi.removeListener(googleApiClient, this); + } catch (Exception e) { + // + } + } + googleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) @@ -201,6 +267,20 @@ public class ListenerService extends WearableListenerService implements GoogleAp } + + private void forceGoogleApiConnect() { + if ((googleApiClient != null && !googleApiClient.isConnected() && !googleApiClient.isConnecting()) || googleApiClient == null) { + try { + Log.d(TAG, "forceGoogleApiConnect: forcing google api reconnection"); + googleApiConnect(); + Thread.sleep(2000); + } catch (InterruptedException e) { + // + } + } + } + + @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null && ACTION_RESEND.equals(intent.getAction())) { @@ -261,8 +341,10 @@ public class ListenerService extends WearableListenerService implements GoogleAp if (event.getType() == DataEvent.TYPE_CHANGED) { - String path = event.getDataItem().getUri().getPath(); + + Log.d(TAG, "Path: {}" + path + ", Event=" + event); + if (path.equals(OPEN_SETTINGS)) { Intent intent = new Intent(this, AAPSPreferences.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); @@ -480,6 +562,9 @@ public class ListenerService extends WearableListenerService implements GoogleAp @Override public void onConnected(Bundle bundle) { + Log.d(TAG, "onConnected call requestData"); + + Wearable.ChannelApi.addListener(googleApiClient, this); requestData(); } @@ -499,8 +584,10 @@ public class ListenerService extends WearableListenerService implements GoogleAp if (googleApiClient != null && googleApiClient.isConnected()) { googleApiClient.disconnect(); } + if (googleApiClient != null) { Wearable.MessageApi.removeListener(googleApiClient, this); + Wearable.ChannelApi.removeListener(googleApiClient, this); } - } + } } diff --git a/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearUtil.java b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearUtil.java new file mode 100644 index 0000000000..ca63749888 --- /dev/null +++ b/wear/src/main/java/info/nightscout/androidaps/interaction/utils/WearUtil.java @@ -0,0 +1,19 @@ +package info.nightscout.androidaps.interaction.utils; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + * Created by andy on 3/5/19. + */ + +public class WearUtil { + + + public static String dateTimeText(long timeInMs) { + Date d = new Date(timeInMs); + return "" + d.getDay() + "." + d.getMonth() + "." + d.getYear() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); + } + + +} From 3c106e7285971f762c624df049ac24aae377edbd Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 5 Mar 2019 19:53:18 +0100 Subject: [PATCH 12/90] New Crowdin translations (#1655) * New translations strings.xml (Dutch) * New translations strings.xml (Russian) * New translations strings.xml (Russian) * New translations strings.xml (Romanian) * New translations insight_alert_codes.xml (Romanian) * New translations insight_alert_descriptions.xml (Romanian) * New translations insight_alert_titles.xml (Romanian) * New translations insight_exceptions.xml (Romanian) * New translations strings.xml (Czech) * New translations strings.xml (Czech) * New translations strings.xml (Portuguese) * New translations strings.xml (Portuguese, Brazilian) * New translations strings.xml (Portuguese) --- app/src/main/res/values-cs/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 2 + app/src/main/res/values-pt/strings.xml | 1114 ++++++++++++++++- .../res/values-ro/insight_alert_codes.xml | 29 +- .../values-ro/insight_alert_descriptions.xml | 24 +- .../res/values-ro/insight_alert_titles.xml | 29 +- .../main/res/values-ro/insight_exceptions.xml | 14 +- app/src/main/res/values-ro/strings.xml | 50 + app/src/main/res/values-ru/strings.xml | 2 + 9 files changed, 1261 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 0c0dab5161..7a0db0dbdc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -1139,6 +1139,8 @@ Vytvořit událost \"Výměna senzoru\" v NS automaticky po spuštění senzoru Tomato (MiaoMiao) Tomato + Změna letního času za méně než 24 hodin + Změna letního času za méně než 3 hodiny - Uzavřená smyčka zastavena %1$d den %1$d dnů diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 4461ded91d..212ff279f1 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1140,6 +1140,8 @@ Stel in en gebruik tijdelijk en standaard tijdelijke streefdoelen (bv. bij sport Noteer automatisch \"Sensor Wissel\" in NS bij starten van sensor Tomato (MiaoMiao) Tomato + Zomer/wintertijd omschakeling binnen 24 uur + Zomer/wintertijd omschakeling in minder dan 3 uur - Closed loop gedeactiveerd %1$d dag %1$d dag diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 70489fbc5e..ef6cbff39f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,3 +1,1115 @@ - + + Segurança de tratamentos + Max bolus permitido [U] + Max hidratos permitidos [g] + Preferências + Atualizar tratamentos do NS + Reinicializar base de dados + Quer realmente reiniciar a base de dados? + Sair + Usar bolus prolongado de >200% + Dispositivo Bluetooth DanaR + Usar sempre valores absolutos de basal + Por favor, reinicie o seu telefone ou reinicie o AndroidAPS a partir das Configurações do Sistema \ncaso contrário, o AndroidAPS não terá registro (importante para controlar e verificar se os algoritmos estão a funcionar corretamente)! + Alguns botões para aceder rapidamente a funções comuns + Inserir as entradas avançadas do livro de registo. + Usado para configurar os plugins ativos + Programa de aprendizagem + Exibe as predefinições de comida definidas no Nightscout + Predefinição de Insulina Humalog e NovoRapid / NovoLog + Predefinição de Insulina Fiasp + Permite definir o pico de atividade da insulina e deve ser usado somente por usuários avançados + Ativar ou desativar a aplicação que desencadeia o loop. + Sincroniza os seus dados com o Nightscout + Estado do algoritmo em 2016 + Estado do algoritmo em 2017 + Algoritmo mais recente para usuários avançados + Exibe o estado atual do seu loop e botões para ações mais comuns + Mostra uma notificação em curso com um breve resumo do que o seu loop está a fazer + Definir um perfil que está disponível offline. + Fornece o perfil definido no Nightscout + Definir um perfil com apenas um bloco de tempo. + Integração para bombas Accu-Chek Combo, requer ter o ruffy instalado + Integração para bombas DANA Diabecare R + Integração para bombas DANA Diabecare R Coreanas + Integração para as bombas DANA Diabecare R com firmware atualizado + Integração para bombas DANA Diabecare RS + Integração para bombas Accu-Chek Insight, requer ter o SightRemote instalado + Integração para as pessoas que fazem múltiplas injeções diárias para a sua terapia de diabetes + Integração para as bombas que não têm qualquer driver ainda (Open Loop) + A sensibilidade é calculada da mesma forma que Oref0, mas você pode especificar o período de tempo para o passado. A absorção mínima de hidratos de carbono é calculada a partir do tempo máximo de absorção de hidratos de carbono das preferências. + A sensibilidade é calculada a partir de dados de 24h no passado e os carboidratos (se não absorvidos) são cortados após o tempo especificado nas preferências. + A sensibilidade é calculada a partir de dados de 8h no passado e os hidratos de carbono (se não absorvidos) são cortados após o tempo especificado nas preferências. O plug-in também calcula o UAM. + A sensibilidade é calculada como uma média ponderada de desvios. Desvios mais recentes têm maior peso. A absorção mínima de hidratos de carbono é calculada a partir do tempo máximo de absorção de hidratos de carbono das preferências. Este algoritmo é o mais rápido em seguir as mudanças de sensibilidade. + Receber valores de Glucose da aplicação Dexcom G5 modificada. + Receber valores de Glicose da aplicação Dexcom G6 modificada. + Receber valores de Glicose da aplicação Eversense modificada. + Receber valores Glucose do Glimp. + Receber valores de Glucose do 600SeriesAndroidUploader. + Descarrega dados de Glucose do Nightscout + Receber valores de Glucose do xDrip. + Guarda todos os tratamentos que foram feitos + Monitorizar e controlar o AndroidAPS usando o seu relógio WearOS. + Mostrar informações sobre o loop no watchface do xDrip+. + Controlar remotamente o AndroidAPS usando comandos SMS. + Iniciar + Verificar + Unidades + DIA + IC + ISF + Basal + Alvo + SEM PERFIL DEFINIDO + Insulina: + Hidratos de Carbono: + IOB: + IOB: + Actividade: + IOB Total: + Actividade Total IOB: + Dur: + Rácio: + Ins: + IOB: + IOB Total: + Insulina + Hidratos + GLIC + TT + Hidratos + Corr + U + Bólus IOB + Executar agora + BOMBA VIRTUAL + Taxa Basal de base + Basal temp + Bólus estendido + Bateria + Reservatório + OK + Última execução + Parâmetros de entrada + Status de Glicose + Temp actual + Dados de IOB + Perfil + Dados de refeição + Resultado + Sem dados de glucose disponíveis + Nenhuma alteração solicitada + Pedido + Rácio + Duração + Motivo + Glucose + Delta + Delta: + Configurador + Objetivos + OpenAPS MA + Visão geral + Perfil NS + Perfil simples + Basal Temporária + Tratamentos + Bomba virtual + Careportal + Bomba + Qual a bomba que gostaria de usar com AndroidAPS? + Tratamentos + Qual o plugin que deve ser usado para os tratamentos? + Perfil + Que perfil deverá ser usado pelo AndroidAPS? + APS + Qual é o algoritmo do APS que deve fazer ajustes na terapia? + Geral + Estes são alguns plugins gerais que pode achar úteis. + Que restrições são aplicadas? + dias + Restrições + Loop + Loop + Utilize isto para ativar a integração loop do AndroidAPS. + APS + Depois das restrições processadas + Basal temporária definida pela bomba + Ultima execução + OK + Cancelar + NÃO EXISTE NENHUM APS SELECIONADO OU RESULTADO FORNECIDO + Segurança + Plugin está desativado + Violação das restrições + Erro na entrega do bolus + Erro na entrega da basal temporária + Valor da Basal [%] + % (100% = atual) + Aceitar nova basal temporária: + Tratamento + Calculadora + Restrição aplicada! + Confirmação + Introduzir novo tratamento: + Bolus + Bolus: + Basal + Basal: + Hidratos de Carbono + Altere o seu input! + Configure um novo bolus prolongado: + Origem dos valores de Glucose + De onde deve o AndroidAPS obter os dados? + xDrip + Modo APS + Closed Loop + Open Loop + Loop Desactivado + Desactivar Loop + Activar Loop + Disponível nova sugestão + Versão não suportada do NSCliente + Versão sem suporte do Nightscout + NSCliente em falta. Perdido registo! + Glic disponível no NS + Status da Bomba está disponível no NS + Execução manual + LOOP DESATIVADO POR RESTRIÇÕES + Basal IOB + Restrição de bólus aplicada + Restrição de hidratos de carbono aplicada + Verificar Glic + Anúncio + Nota + Pergunta + Exercício + Alteração do local do cateter + Colocação do Sensor CGM + Início do Sensor CGM + Mudança de Cartucho de Insulina + Troca de Perfil + Bólus Lanche + Bólus Refeição + Bólus Correcção + Bólus Combo + Início Temp Basal + Fim Temp Basal + Correcção Hidratos + OpenAPS Offline + Tipo de evento + Outro + Medidor + Sensor + Hidratos de Carbono + Insulina + Tempo Hidratos + Dividir + Duração + Percentagem + Absoluto + Notas + Tempo do evento + Perfil + Introduzido por + Tipo de glicose + Sem perfil carregado do NS + BasalTemp + Bólus estendido + Versão Nightscout: + Em falta + Preferências exportadas + Exportar configurações para + Importar configurações de + Configurações importadas + Ficheiro não encontrado + Exportar configurações + Importar configurações + Max U/hr em que uma Temp Basal pode ser definida + Este valor é chamado max basal no contexto do OpenAPS + Basal Máxima IOB que OpenAPS pode dar [U] + Este valor é denominado Max IOB em contexto OpenAPS \nEste é o valor máximo de insulina em [U] que APS pode dar de uma vez. + Dispensar + DanaR + A ligar + Ligado + Desligado + Definições bomba DanaR + Condições de Utilização + NÃO DEVE SER USADO PARA FAZER DECISÕES MÉDICAS. NÃO HÁ NENHUMA GARANTIA PARA O PROGRAMA, NA EXTENSÃO PERMITIDA PELA LEGISLAÇÃO APLICÁVEL. EXCETO QUANDO DE OUTRA FORMA, POR ESCRITO, OS TITULARES DOS DIREITOS DE AUTOR E / OU OUTRAS PARTES FORNECEM O PROGRAMA “TAL COMO ESTÁ”, SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO, ÀS GARANTIAS IMPLÍCITAS DE COMERCIALIZAÇÃO E ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. TODO O RISCO QUANTO À QUALIDADE E DESEMPENHO DO PROGRAMA É COM VOCÊ. CASO O PROGRAMA SEJA DEFEITUOSO, VOCÊ ASSUME O CUSTO DE TODOS OS SERVIÇOS, REPAROS OU CORREÇÕES NECESSÁRIOS. + EU ENTENDO E CONCORDO + Guardar + Nenhum dispositivo bluetooth encontrado + Dispositivo seleccionado não foi encontrado + Erro de conexão da bomba + IOB Bomba + Unidades diárias + Último bólus + %.1fh atrás + Entrada Inválida + Valor não definido corretamente + Recarregar perfil + Ver perfil + Executado + Commentário + Sucesso + Percentagem + Absoluto + Cancelar basal temp + Comunicador SMS + À espera de resultado + Número de telefones permitidos + +XXXXXXXXXX;+YYYYYYYYYY + Para dar bolus %1$.2fU responder com código %2$s + Para enviar calibração %1$.2f responder com código %2$s + Bólus falhado + Bólus %.2fU enviado com êxito + Vai ser enviado %.2fU + Bólus %.2fU enviado com êxito + A enviar %.2fU + Permitir comandos remotos via SMS + Bólus remoto não permitido + Dedo + Sensor + Manual + Alvo temporário + Cancelar alvo temporário + Definições perfil DanaR + DIA [h] + Duração da Insulina Activa + Falha a actualizar perfil da basal + Recarregar + A enviar + E bólus + DS Bólus + DE Bólus + erro + recarregar + hora basal + glicose + hidratos de carbono + alarme + Total de %1$d registos carregados + S bolus + Alarmes + Horas de Basal + Bolus + Hidratos de Carbono + Insulina diária + Erros + Glicose + Reabastecimento + Suspender + A ligar durante %1$d s + Senha da bomba + Senha da bomba incorrecta! + A bomba está ocupada + Entregue + Parado + O bolus parou + A parar o bolus + Oclusão + Parar + STOP PRESSIONADO + À espera da bomba + Vai ser enviado %.2fU + Configuração da visualização e monitoramento, e análise de rácios e basals + Verificar se a BG está disponível no Nightscout, e se os dados de insulina da bomba estão a ser carregados + A iniciar um open loop + Utilizar em modo de open loop por alguns dias e dar manualmente muitas basais temporárias. Configurar e usar alvos temporários e alvos padrão temporários (por exemplo, para atividade ou tratamentos de hipo com Hcs) + Compreender o seu open loop, incluindo as suas recomendações de basais temporárias + Com base nessa experiência, decidir qual deve ser a basal máxima e configurá-la na bomba e nas preferências + Começaro close loop com Suspensão por Baixa Glicose + Utilizar em close loop com IOB máx = 0 por alguns dias sem muitas situações de Suspensão por Baixa Glicose + Ajustar o close loop, levantar a IOB máxima acima de 0 e reduzir gradualmente os alvos de valor glicémico + Utilizar por alguns dias e pelo menos uma noite sem alarmes de valores glicémicos baixos, antes de baixar os valores + Ajustar as basals e os rácios se necessário e em seguida habilitar o auto-sens + 1 semana de looping durante o dia com sucesso com entrada de hidratos de carbono regular + Ativando recursos adicionais para uso durante o dia, como assistente avançado de refeição + Ativando recursos adicionais para uso durante o dia, como SMB + Deverá ler a wiki e aumentar a IOB máx para que os SMBs funcionem devidamente! Inicialmente poderá considerar maxIOB= média dos bolus + 3 x a basal máxima + Atingiu o limite autorizado + Nenhum perfil seleccionado + Loop foi desactivado + Loop foi activado + Loop desactivado + Loop activado + %1$.2f limitado a %2$.2f + O valor %s está fora dos limites permitidos + A configuração remota de basal não é permitida + O comando remoto não é permitido + Para começar basal %1$.2fU/h responda com código %2$s + Para suspender o loop por %1$d minutos resposta com código %2$s + Basal temporária %1$.2fU/h para %2$d min iniciada com êxito + Início basal temp falhou + Para parar a basal temporaria responda com o código %s + Basal temp cancelada + Não foi possivel cancelar a basal temp + Comando desconhecido ou resposta errada + Assistente Rápido + Definições do Assistente Rápido + Texto do botão: + Hidratos: + Válido: + Adicionar + Editar + Remover + Refeição + Corr + Acções + AndroidAPS iniciado + Envio NS apenas (sincronização desactivada) + Apenas upload para NS. Não é eficaz em SGV a menos que uma fonte local como xDrip esteja selecionada. Não é eficaz em perfis enquanto NS-Profiles é usado. + Bomba não inicializada! + Bomba não inicializada, perfil não definido! + Purgar/Preencher + Por favor certifique-se que o valor corresponde ao especificado para o seu conjunto de infusão! + Outro + Purgar/Preencher os valores standard. + Botão 1 + Botão 2 + Botão 3 + Unidades: + mg/dL + mmol/L + DIA: + Intervalo Alvo: + Intervalo para visualização + Marca Alto e Baixo para os gráficos em Sumário e Smartwatch + Marca Baixo + Marca ALTO + Wear + Reenviar Todos os Dados + Abrir Definições em Wear + Erro Bomba + Bateria fraca + Encerrar Bomba + Bateria da Bomba Descarregada + DanaR Coreana + Valor da Basal: + Não foi possivel configurar o perfil de basal + Perfil Basal actualizado na bomba + Desactivar modo EasyUI na bomba + Habilitar bolus estendido na bomba + Mudar de modo U/d para U/h na bomba + Valor da basal abaixo do mínimo. Perfil não definido! + GLIC: + Ultima Gli: + MDI + MM640g + Notificação em curso + DADOS ANTIGOS + %1$d min atrás + %1$dmin atrás + Perfil local + OpenAPS AMA + Delta médio curto + Delta médio longo + Array de %1$d elementos.\nValor actual: + Dados Autosens + Script debug + Usar função Autosens + Actualizar tratamentos do NS + Apagar tratamentos do futuro + Comer brevemente + Hipo + Actividade + Remover registo: + Estatísticas DanaR + Dose diária acumulativa + Dose diária exponencialmente ponderada + Basal + Bólus + TDD + Data + Rácio + # Dias + Peso + Possivelmente impreciso se foram usados bolus para purgar/preencher! + Dados antigos, pressione \"Recarregar\" + Basal Diária Total + Basal diária * 2 + A inicializar ... + ACÇ + CONF + LOOP + PS + OAPS + PL + DANA + Início + BOMBAV + NSPerfil + TRATA + CP + OBJ + WEAR + SMS + Abreviar títulos dos separadores + Usar sempre delta médio curto em vez de delta simples + Útil quando há ruído nos dados de fontes sem filtro como o xDrip. + Configurações Avançadas + Modelo: %1$02X Protocolo: %2$02X Código: %3$02X + Perfil + Valor padrão: 3 Por segurança é o valor limite estabelecido por OpenAPS. O que faz é limitar a basal a x3 a basal mázima. Se necessário modificar este valor, por favor ter em conta que os dados apontam para que os limites de segurança sejam - 3 x max diario ou 4x valor actual (qual seja menor) como valores máximos. + Valor padrão: 4 Esta é a outra parte dos valores limites de segurança - 3 x max diário ou 4x valor actual - do OpenAPS. Isto define que não importa o valor da basal máxima definido na bomba, o valor máximo da basal temporária não pode ser maior que 4 x o valor da basal definida na bomba. O objectivo é evitar que sejam determinadas basais temporárias demasiado elevadas antes que se perceba como o algoritmo funciona. 4x é um valor que a maior parte das pessoas nunca necessitará de alterar pois o mais provável é necessitar de alterar outras definições para não necessitar de \"ultrapassar\" este limite de segurança. + Valor predefinido: 1.2\n Este é um multiplicador para autosens (e em breve autotune) que coloca um limite máximo de 20% aos rácios superiores e inferiores de autosens, o que por sua vez calcula o quão alto autosens pode ajustar a basal, quão pode baixar o Factor de Sensibilidade (ISF) e baixar o valor alvo de glucose no sangue (BG). + Valor padrão: 0.7\nO outro lado dos limites de segurança do autosens. Coloca um tecto no quão baixo autosens pode ajustar as basais, e quão alto pode ajustar os valores de ISF e valor alvo de glucose no sangue (BG). + Autosens também ajusta os alvos + Valor padrão: true\nÉ usado para permitir que autosens possa ajustar os valores alvo de glucose no sangue (BG), além de ISF e basais. + Valor padrão: 2\nBolus Snooze (pausa após bolus) é executado depois de realizar um bolus por refeição Desta maneira o algoritmo não irá contrariar com temporárias baixas logo depois da refeição. O valor padrão é 2; Então uma duração de acção da insulina (DIA) de 5h significa que o Bolus Snooze irá ser gradualmente reduzido ao longo de 2,5 horas = 5/2 = DIA/Valor padrão. + Valor padrão: 3.0 para detecção avançada de refeições (AMA) ou 8.0 para super micro bolus (SMB). Esta é a configuração padrão para o calculo de quanto varia a cada 5 min a glucose no sangue (BG) devido à absorção de hidratos de carbono. O padrão é 3mg/ dl / 5min. Isso afeta a rapidez com que decaem as calorias no corpo (COB), e quantos hidratos de carbono terão de ser considerados no cálculo da previsão de BG, quando é que a BG está baixando mais do que espectável ou não subindo como espectável. + Atenção!\n Normalmente não é necessário modificar os valores abaixo. Por favor PRESSIONE AQUI e LEIA o texto para garantir que ENTENDE as consequenciais antes de alterar algum destes valores. + Apenas dígitos numéricos são permitidos. + Apenas são permitidos valores entre %1$s e %2$s. + Este campo não deve estar vazio + Número de telefone não é válido + SMS número de telefone inválido + Calibração + Enviar calibração %.1f para o xDrip? + xDrip+ não está instalado + Calibração enviada para o xDrip + Calibração remota não permitida + Calibração enviada. Recepção têm de estar activada no xDrip. + O xDrip não esta a receber as calibrações + Bomba suspensa + A obter estado bomba + Definindo basal temp + A parar basal temp + Configurando bolus prolongado + Parando bolus prolongado + Atualizar valores das basais + A desligar + A Executar + Definições da bomba virtual + Enviar estado para NS + Senha incorrecta + Senha para definições + Desbloquear configurações + Aproximação do limite diario de insulina + NSCliente + NSCI + URL: + Rolar automático + Reiniciar + NSCliente + Nightscout URL + Introduza o Nightscout URL + NS API secret + NS API secret + Insira NS API secret (min 12 caract.) + Entregar agora + Limpar fila de espera + Mostrar file de espera + Fila de espera: + Estado: + Em pausa + Limpar Registo + Cliente NS sem permissões para alterar dados. Tem a senha API correta? + Definições Wear + Mostrar IOB detalhada + Dividir IOB entre IOB de bolus e de basal na face do relógio + sem efeito - por favor verifique no telemóvel + Indisponível + Idade do Paciente + Criança + Adolescente + Adulto + Adulto resistente insulina + Por favor seleccione a idade do diabético para definir os limites de segurança + Glimp + %s necessita de autorizar a não optimização da bateria para assegurar a performance necessária + Loop suspenso + Suspendido (%1$d m) + Superbólus (%1$d m) + Suspender loop por 1h + Suspender loop por 2h + Suspender loop por 3h + Suspender loop por 10h + Desligar bomba por 15 min + Desligar bomba por 30 min + Desligar bomba por 1 h + Desligar bomba por 2 h + Desligar bomba por 3 h + Retomar + Re-ligar a Bomba + Duração errada + Loop suspenso + Loop retomado + Tendência 15 min + COB + Superbólus + Registar inicio da app no NS + A sair da aplicação para aplicar as configurações. + DanaRv2 + Insulina + Qual o tipo de insulina que está a utilizar? + Insulina de ação rapida + Novorapid, Novolog, Humalog + Fiasp + INS + Activar superbólus no assistente + Habilite a funcionalidade de superbolus no assistente. Não habilite até que aprenda o funcionamento. PODE CAUSAR OVERDOSE DE INSULINA SE USAR INDISCRIMINADAMENTE! + Mostrar luzes de estado no ecrã principal + IOB + COB + Firmware + Última ligação + Estado Bluetooth + Acerca + Falta de permissão SMS + Falta permissão do estado do telefone + Estado xDrip (relógio) + Linha estado xDrip (relógio) + xds + Mostrar BGI + Adicionar BGI à linha de status + Sem envio para NS + Todos os dados enviados para NS são descartados. AAPS está conectado ao NS, mas não é feita nenhuma alteração no NS + Valor da Basal + Incremento de bolus + BólusEstendido + AlvoTemp + Cancelar Bólus Estendido + Idade Sensor + Idade Canula + Idade Insulina + horas + Tipo de Basal + Perfil inválido !!! + TrocaPerfil + Idade bateria bomba + Troca bateria bomba + Opções Alarme + Urgência hiperglicemia + Alto + Baixo + Urgência hipoglicemia + Dados Obsoletos + Dados obsoletos urgentes + Tempo limite para dados obsoletos [min] + Tempo limite para Urgência por dados obsoletos [min] + Intervalo para autosens [h] + Quantidade de horas observadas para a deteção de sensibilidade (o tempo de absorção dos hidratos de carbono é excluído) + Bomba + OpenAPS + Uploader + Detecção sensibilidade + Que algoritmo de sensibilidade deve ser usado? + SENS + Sensibilidade Oref0 + Sensibilidade Oref1 + Sensibilidade AAPS + Configurações de absorção + Tempo máx. absorção refeição [h] + Tempo em horas, espectável para que todos os hidratos de carbono da refeição sejam absorvidos + Visualizar bólus estendido com % + SAGE + IAGE + CAGE + PBAGE + OAPS + UPLD + BAS + EST + Manter ecrã ligado + Impedir Android de desligar o ecrã. Isto irá consumir muita bateria quando não ligado ao carregador. + Ao activar a função Autosense lembre-se de introduzir todos os hidratos de carbono (carbs) que comeu. Caso contra contrário os desvios de carbs serão erroneamente identificados como uma variação da sensibilidade!! + Média ponderada da Sensibilidade + OK + Cancelar + Nem todos perfis foram carregados! + Valores não guardados! + Activar partilha para outras aplicações (como xDrip). + Activar partilha local. + ACTIVIDADE & FEEDBACK + HIDRATOS & BÓLUS + CGM & OPENAPS + BOMBA + Valor da Basal [U/h] + Duração [min] + OpenAPS SMB + SMB + Activar UAM + Activar SMB + Use Super Micro Boluses em vez de basal temp para uma acção mais rápida + Detecção de refeições não Introduzidas + Tempo Pico da curva de IOB + Tempo Pico [min] + Oref Pico-Livre + Oref Acção Rápida + Ultra-Rapid Oref + Duração de Acção da Insulina (DIA) de %1$f demasiado curto - corrigido para %2$f! + Activar perfil + Data + INVÁLIDO + Aguardando emparelhamento na bomba + Emparelhamento OK + Tempo emparelhamento excedido + A EMPARELHAR + Nenhum dispositivo encontrado até agora + Reservatório vazio + Alerta medição da glicemia + Nível de insulina restante + DanaRS + Dana + Bomba seleccionada + Emparelhar nova bomba + Velocidade Bólus + Coloque o incremento da basal em 0.01 U/h + Número de série + Percentagem + Alteração Turno + Alvo-Temp padrão + duração comerbreve + alvo comerbreve + duração actividade + alvo actividade + duração hipo + alvo hipo + Purge/Encha + Procurando o status do bolus estendido + A obter estado bólus + A obter o status da basal temporária + A obter as definições da bomba + A obter hora bomba + reutilizar + Controles do Relógio + Definir Alvo-Temp and inserir Tratamentos do relógio. + Ligação expirou + Alimentos + g + m + h + ]]> + kJ + En + Pr + Gor + ]]> + A aguardar o final do bolus. Restam %1$d sec. + A processar acção + A iniciar administração de bolus + Comando será executado agora + Controlador bomba corrigido + Bomba inacessível + Leituras Glic. perdidas + Usar as notificações do sistema para alertas e notificações + Alertas local + Alerta caso nenhuma glicemia seja recebida + Alerta caso não seja possivel alcançar a bomba + Limite para bomba inacessível [min] + Alarme Urgente + INFO + Bluetooth + Watchdog BT + Desliga o bluetooth do telefone durante um segundo se nenhuma conexão com bomba for possível. Este parâmetro pode ser util em alguns telefones, onde a pilha bluetooth congela. + Aplicação DexcomG5 (com patch) + Aplicação DexcomG6 (com patch) + Aplicação Eversense (com patch) + Enviar dados Glic. para NS + Configurações de upload de BG + Mostrar Delta detalho + Mostrar delta com mais um ponto decimal + Limite de minutos de basal para SMB + Firmware bomba não suportado + Enviar dados Glic. para xDrip+ + Seleccionar 640g/Eversense como fonte no xDrip+ + Glic NSCliente + Valor da basal alterado para o valor mínimo suportado: %s + Valor da basal alterado para o valor máximo suportado: %s + Cálculos Glic + Cálculo de Bólus IOB + Cálculo de Basal IOB + Cálculo tendência + Cálculo de superbolus + Sim + Não + Positivo apenas + Negativo apenas + Cálculo COB + Cálculo alvo temporário + Loop activado + APS seleccionado + NSCLiente tem permissão de escrita + Modo fechado ativado + IOB máxima definida correctamente + Glicemia disponivel desde a fonte selecionada + Valores das basais não definidos por horas: %s + Perfil inválido: %s + A programar a bomba para injectar o bolus + Actualizar + Estado + Actividade + Sem conexão há %1$d min + %1$d%% (%2$d min restantes) + A iniciar + Suspenso devido ao erro + Suspenso pelo utilizador + A correr + Cancelar TBR + A definir TBR (%1$d%% / %2$d min) + Injectando (%.1f U) + A actualizar + Operação solicitada não suportada pela bomba + Ultilização nao segura: bolus estendudos ou multionda estão activos. Modo do loop foi alterado para apenas suspender em limite inferior por 6h. Apenas são suportados bolus normais em modo loop + Utilização insegura: A bomba utiliza uma perfil de basal diferente do primeiro. O loop foi desactivado. Seleccionar o primeiro perfil da bomba e reinicie. + Um bolus com o mesmo valor foi introduzido nos 2 últimos minutos. Para evitar introduções acidentais e segurança contra bugs existentes o bolus foi cancelado. + Agora + A ler histórico bomba + histórico bomba + A definir perfil basal + Nível cartucho da bomba está baixo + Bateria da bomba está fraca + A bomba está a dar o erro E%1$d: %2$s + Baixo + Vazio + Normal + Necesário actualizar relógio da bomba + Aviso + Basal Temporária CANCELADA. O aviso foi confirmado + Não foi possivel establecer comunicação com a bomba. Nenhum bolus foi administrado. + Administração de bolus falhou. Nenhum bolus parece ter sido administrado. Para confirmar, por favor verifique a bomba de forma a evitar uma dupla administração de bolus e programe novamente o bolus. De forma a evitar qualquer problema, os bolus não são reprogramados de forma automatica. + Apenas %1$.2f U do bolus de %2$.2f U foi injectado de devido a um erro. Por favor verifique a bomba e tome as medidas necessárias. + A injeção do bolus e a verificação do histórico da bomba falharam, por favor verifique a bomba. Se o bolus foi injetado será adicionado ao histórico de tratamentos durante a próxima conexão com a bomba. + Não há insulina suficiente no reservatório para bolus + Erro na entrega Bólus Estendido + Visão + Bomba Insight + Estado + Alterado + BOMBA PARADA + Estado Actualizado + atrás + com + TBR activa + min restante + Diário + Última Acção Terminada + min + a restar mais de + total com + atenção com + Ficar sempre ligada + PARADO + A SINCRONIZAR + OCUPADO + SINCRONIZADO + INICIANDO + necessita + Nãp conectado com a aplicação acompanhante! + Aplicação acompanhante aparentemente não instalada! + Aplicação acompanhante incompatível. Versão necessitada + Desconhecido + A aguardar por código de confirmação + Codigo rejeitado + Associação de aplicação + Não autorizado + Incompativel + segundo + minuto + hora + dia + semana + s + %1$ds expira %2$s + Estado manter ligado + Estatísticas + Ligar preventivamente + Conectar automaticamente quando se inicia o AndroidAPS, antes que seja efectuado qualquer comando, de maneira a reduzir o atraso na conexão + Não é recomendado devido ao gasto de bateria + SMB sempre activado + SMB sempre activo independentemente dos bolus. Possível apenas quando o medidor tive um bom filtro de dados como o G5 + Activar SMB após hidratos + SMB activo por 6h após carbs, mesmo com 0 COB. Possível apenas quando o medidor tive um bom filtro de dados como o G5 + Activar SMB com COB + Activar SMB quando tem COB activo. + SMB activo com valores alvo temporários + SMB activo quando há valor alvo temporário activo (exercício, etc) + SMB activo com alvos temporários elevados + SMB activo com alvos temporários elevados em curso (exercicio) + Permitir basal temp correr + Silêncio + Insulina + Hidratos + Botões + Enviar calibrações para o xDrip+ ou abrir sistema de calibração do G5 + Abre xDrip+, botão retorcer volta ao AAPS + Número de carboidratos a adicionar quando o botão é premido + Unidades de insulina a adicionar quando o botão é premido + Não foi possível lançar aplicação de monitorização contínua. Por favor verifique que está instalada. + CGM + Navegador do histórico + Notificar no SMB + Mostrar SMB no relogio como bolus normal. + Criar anúncios dos erros + Criar um anúncio no Nightscout para caixas de diálogo de erro e alertas locais (também podem ser visualizados em Careportal sob tratamentos) + Mostrar a predições na face do relogio. + Previsão + Escolha de Dados + Envio Fabric + Permitir que seja enviado automaticamente à equipa de desenvolvimento o report de crashes e das funções utilizadas, utilizando o serviço fabric.io. + Por favor atualize as sua aplicação Dexcom para uma versão suportada + Iniciar atividade TT + Iniciar Comer em breve TT + TT + Sem bólus, registar apenas + Categoria + Subcategoria + O bolus apenas será gravado + Preencher glicemias em falta com NS + SMB definido pela bomba + Sensibilidade + Desvios + Carboidratos a bordo + Insulina a bordo + Basais + Nenhuma acção seleccionada, nada irá acontecer + Começar TT Hipo + A correr a versão dev. O Loop fechado está desabilitado. + Modo engenheiro activado + Modo de engenharia não habilitado e não no na versão mestra + %.2f U/h + A ler perfil basal + O histórico da bomba foi alterado após o cálculo do bolo ter sido realizado. O bolus não foi injectado. Por favor, verifique se bolus ainda é necessário. + O bolus foi injectado, mas não foi possível adicionar ao histórico. Isto é possível se dois bolus do mesmo valor baixo foram administrados nos últimos dois minutos. Por favor verifique o histórico da bomba e use o Careportal para adicionar os dados em falta caso necessário. Cuidado para não adicionar dados com o mesmo valor no mesmo minuto. + A rejeitar a temporal alta uma vez que o cálculo não considerou as mudanças do histórico da bomba + A actualizar estado bomba + O rácio da basal foi alterado na bomba e vai ser actualizado em breve + Rácio da basal foi alterado na bomba, mas a leitura falhou + A verificar se há alterações de histórico + Bólus múltiplos, com a mesma quantidade e no mesmo minuto acabaram de ser importados. Apenas um registo pôde ser adicionado aos tratamentos. Por favor confirma na bomba e adicione o registo de bólus manualmente, utilizando o separador do Careportal. Tenha em atenção que deve criar um bólus com um tempo em que nã oexistem outros registos de bólus. + \n\nhttp://www.androidaps.org\nhttp://www.androidaps.de (de)\n\nfacebook:\nhttp://facebook.androidaps.org\nhttp://facebook.androidaps.de (de) + O último bólus tem mais de 24 horas ou está no futuro. Por favor verifique se a data está definida correctamente na bomba. + Hora/data da entrega do bólus na bomba parece errado, IOB aparentemente está incorrecto. Verifique hora/data na bomba. + TrocaPerfil em falta. Por favor faça uma troca de perfil ou pressione \"Activar Perfil\" em PerfilLocal. + Contagem Bólus + Contagem TBR + Objetivo %1$d não iniciado + Objetivo %1$d não concluido + A bomba não é capaz de basais temporárias + Nenhum valor de basal temporaria valido foi lido da bomba + Loop fecchado disabilitado nas preferências + Autosens desabilitado nas preferências + SMB desactivado nas configurações + UAM desactivado nas configurações + UAM desactivado porque confia no plugin de sensibilidade Oref1 + A basal max está limitada a %1$.2f U/h por %2$s + limite bomba + deve ser valor positivo + multiplicador de basal máx + multiplicador de basal máx diária + Um bolus foi injectado nos últimos 3 minutos, saltando SMB + Basal correctamente definida + A limitar rácio percentagem máx para %1$d%% porque %2$s + A limitar bólus para %1$.1f U porque %2$s + A limitar bólus estendido para %1$.1f U porque %2$s + A limitar IOB máx. para %1$.1f U porque %2$s + A limitar hidratos para %1$d g porque %2$s + A limitar IOB para %1$.1f U porque %2$s + valor máx nas preferências + limite rígido + uso não seguro + Erro na leitura de estado + Registar mudança de sítio + Registar mudança cartucho + SMB sempre e depois dos hidratos desactivado por fonte da Glicemia activa não suportar filtro avançado + SMB não permitido no modo open loop + Alimentos + repor + À espera da sincronização da hora (%1$d sec) + Desligado (%1$d m) + Eventos careportal automáticos + Automaticamente envia mudança de insulina, canula, pilha e alarmes da bomba para o NightScout + Máximo total IOS OpenAPS não pode superar [U] + Este valor é chamado de Max IOB em contexto de OpenAPS\nOpenAPS não adicionará mais insulina se o IOB atual for maior que este valor + Bomba parada + Bomba iniciada + Bomba suspensa + Tempo máx. absorção refeição [h] + Hora em que qualquer refeição é considerada absorvida. Restantes hidratos de carbono serão cortados. + Hora + Mostrar campo de notas na janela de tratamentos + Seguinte + Anterior + Assistente de Configuração + TERMINAR + Selecione o seu Idioma + Pedido: %1$.2fU Entregue: %2$.2fU Código Erro: %3$s + Primeiro incremento insulina + Segundo incremento insulina + Terceiro incremento insulina + Primeiro incremento hidratos + Segundo incremento hidratos + Terceiro incremento hidratos + CGM + Utilize apenas uma conexão WiFi + WiFi SSID + Apenas quando estiver a carregar + Definições de ligação + SSIDs permitidos (separada por ponto e vírgula) + Permitir ligação em roaming + Rácio máx. autosens + Rácio min. autosens + Pausa bólus divisor DIA + Multiplicador máx. diário de segurança + Multiplicador actual de segurança basal + n/a + Tipo da Bomba Virtual + Definição da Bomba + Bólus: Passo=%1$s\nBólus Estendido: [Passo=%2$s, Duração=%3$smin -%4$sh] \nBasal: Passo=%5$s\ nTBR: %6$s (por %7$s), Duração=%8$smin-%9$sh\n%10$s + * Somente valores discretos nos intervalos são suportados como granularidade para basal/bolus na bomba virtual. + Preenchimentoauto Glicemia + Definições do Assistente Rápido + Resultado cálculos incluídos no Assistente: + Mostrar Configurações + Configurações gerais + Activar NSCliente + Bem-vindo ao assistente de configuração. Vai guiá-lo(a) através do processo de instalação\n + Configurações da bomba + Ler estado + Alterações devem ser feitas no NS + Saltar assistente de configuração + Pressione o botão abaixo para activar o AndroidAPS para sugerir/fazer alterações basais + Pressione o botão abaixo para activar os Objectivos. Veja o separador Objetivos, depois de concluir este assistente, para tornar o AndroidAPS completamente funcional.\n + Activar Objectivos + Configurar plugin APS + Configurar plugin Sensibilidade + Plugin de Sensibilidade é usado para detecção de sensibilidade e cálculos COB. Para mais info visite: + https://github.com/MilosKozak/AndroidAPS/wiki/Sensitivity-detection-and-COB + NSCliente gere a ligação ao Nightscout. Pode saltar esta parte mas não será possível passar os objectivos até que o configure. + Lembre-se: novos perfis de insulina requerem diâmetro de pelo menos 5h. DIA 5–6h no novo perfil é igual ao diâmetro 3h nos antigos perfis de insulina. + Configure a fonte das glicemias + Por favor seleccione a fonte do perfil. Se o paciente é uma criança deverá utilizar perfil NS. Se ninguém o está a seguir no Nightscout provavelmente preferirá um perfil Local. Lembre-se que apenas está a escolher a fonte de perfil. Para o utilizar terá que o activar executando \"Troca Perfil\" + Seleccione um dos algoritmos disponíveis. Eles são classificados do mais antigo para o mais recente. Algoritmo mais recente é geralmente mais forte e mais agressivo. Assim, se você é novo looper, poderá provavelmente começar com AMA e não com a versão mais recente. Não se esqueça de ler a documentação de OpenAPS e configurá-lo antes de usar. + Iniciar primeiro objectivo + Permissão + Pedir permissão + Aplicação requer permissão de localização para pesquisa BT + Aplicação necessita da permissão de armazenamento para ser capaz de armazenar ficheiros de registo + Pedido + Configurar plugin Insulina + Sair + Opções do utilizador + Formato hora + Botão rolamento + Sinal ao pressionar botão + Alarme + Som + Vibrar + Ambos + Desligar LCD [s] + Desligar luz de fundo [s] + Unidades de Glucose + Desligar(horas) + Reservatório baixo (Unidades) + Gravar opções para a bomba + Ligado + Desligado + Abrir a navegação + Fechar a navegação + Preferências plugin + Terminado, parabéns! + Incompleto + Tempo decorrido + %1$d. Objectivo + Poctech + Receber valores Glucose da app Poctech + Alto alvotempo aumenta sensibilidade + = 100]]> + Baixo alvotemp baixa sensibilidade + + Configuração da bomba inválida, verifique a documentação e se o menu de informações rápidas está nomeado de QUICK INFO utilizando o programa de configuração 360. + Personalizado + Grande diferença Horária + Grande diferença horária:\n A diferença de hora para a bomba é superior a 1.5h.\nPor favor ajuste manualmente a hora na bomba e certifique-se que a leitura do histórico da bomba não provoca problemas.\nSe possível apague o histórico da bomba antes de modificar a hora ou desabilite o loop durante toda a duração de acção da insulina (DIA) depois da ultima entrada no histórico da bomba ou mais um DIA desde o momento da correcção, qual delas seja a que mantenha o loop aberto durante mais tempo. + Limpar AndroidAPS iniciado + Configurações encontradas + Atenção: Se conectar à sua bomba física e activar o perfil, o AndroidAPS irá copiar as definições desse perfil para as definições da bomba, apagando o memorizado na bomba. Por favor verifique que o que preencheu no perfil da app tem os mesmos valores que estão na bomba. Em caso contrario pressione imediatamente cancelar e corrija antes de voltar a ligar à bomba. + Dados tratamento incompletos + Configurações de manutenção + Email + E-mail Inválido + Nr. de registos a enviar + Manutenção + MANU + Fornece várias funções para manutenção (ex. envio de relatórios, eliminação de relatórios). + Enviar Logs por e-mail + Eliminar registos + Um tratamento (insulina: %1$.2f, hidratos: %2$d, às: %3$s) não ficou gravado. Por favor verifique se foi realmente efectuado e se sim adicione manualmente aos tratamentos. + eCarbs: %1$d g (%2$d h), atraso: %3$d m + Sem dados Autosens disponíveis + Definições de registo + Repor definições por defeito + Erro de funcionamento do NSCliente. Pondere reiniciar o NS e NSCliente. + AS + Disponível %1$s disponível + Fuso horário + Modo APS preferido + Total + Calc + Cumprimento + Enviar os ficheiros de registo do dia de hoje para os programadores. Situação inesperada. + Transgressão Bólus máx + Erro no comando + Erro velocidade + Transgressão limite insulina + Pedido de mudança mínima [%] + A app mostrará um pedido de alteração apenas se a mudança for superior a este valor. O valor padrão é 20% + Emparelhe a sua bomba com o seu telefone! + A pesquisar dispositivos… + Por favor aguarde… + Emparelhamento concluído + Emparelhamento Insight + Accu-Chek Insight + %1$.2fU / %2$.2fU entregue + %1$s: %2$s + Tubo mudado + Hora da bomba actualizada + Confirmar + Silêncio + Alerta da Bomba + Alterações do modo de funcionamento de registo + Alertas de registo + Ativar a emulação TBR + Número de série + Lançar versão de software + Versão de software do processador de interface do utilizador + Versão do software do processador de PC + Versão do software do processador MD tel + Versão de software do processador de segurança + Endereço Bluetooth + Data de fabrico + Eliminar emparelhamento + Informações de emparelhamento + Actualizar Estado + Iniciar Bomba + Parar Bomba + Modo de funcionamento + Estado + A recuperar + Não emparelhado + Última ligação + Iniciado + Parado + Bólus estendido + Bólus Multi-Onda + == ∑ %1$s U + U/h + g/U + /U + + %1$d dia + %1$d dias + + + %1$d hora + %1$d hora + + + %1$d minuto + %1$d minutos + + diff --git a/app/src/main/res/values-ro/insight_alert_codes.xml b/app/src/main/res/values-ro/insight_alert_codes.xml index 70489fbc5e..7a0672c764 100644 --- a/app/src/main/res/values-ro/insight_alert_codes.xml +++ b/app/src/main/res/values-ro/insight_alert_codes.xml @@ -1,3 +1,30 @@ - + + Reamintire R1 + Reamintire R2 + Reamintire R3 + Reamintire R4 + Reamintire R7 + Avertizare W31 + Avertizare W32 + Avertizare W33 + Avertizare W34 + Avertizare W36 + Avertizare W38 + Avertizare W39 + Mentenanță M20 + Mentenanță M21 + Mentenanță M22 + Mentenanță M23 + Mentenanță M24 + Mentenanță M25 + Mentenanță M26 + Mentenanță M27 + Mentenanță M28 + Mentenanță M29 + Mentenanță M30 + Eroare E6 + Eroare E10 + Eroare E13 + diff --git a/app/src/main/res/values-ro/insight_alert_descriptions.xml b/app/src/main/res/values-ro/insight_alert_descriptions.xml index 70489fbc5e..27c312c420 100644 --- a/app/src/main/res/values-ro/insight_alert_descriptions.xml +++ b/app/src/main/res/values-ro/insight_alert_descriptions.xml @@ -1,3 +1,25 @@ - + + %1$d%%\nDurata: %2$s h]]> + %1$s U]]> + Schimbați bateria. + Setați ora/data. + Contactați departamentul de suport Accu-Chek. + %1$d%%
Durată: %2$s h]]>
+ %1$s U
Livrat: %2$s U]]>
+ Introduceți cartușul. + Schimbați cartușul. + Schimbați bateria. + Verificați starea pompei pe ecranul acesteia. + Schimbați setul de infuzie. + Contactați departamentul de suport Accu-Chek. + Schimbați cartușul. + Reporniţi descărcarea datelor. + Verificați starea pompei pe ecranul acesteia. + Setaţi tipul de baterie. + Setaţi tipul de rezervor. + Schimbați bateria și rezervorul. + Schimbați rezervorul. + Schimbați limba. +
diff --git a/app/src/main/res/values-ro/insight_alert_titles.xml b/app/src/main/res/values-ro/insight_alert_titles.xml index 70489fbc5e..d9a08d287f 100644 --- a/app/src/main/res/values-ro/insight_alert_titles.xml +++ b/app/src/main/res/values-ro/insight_alert_titles.xml @@ -1,3 +1,30 @@ - + + Livrează bolus + Bolus ratat + Ceas alarmă + Schimbă setul de infuzie + RBT compet + Rezervor aproape golit + Baterie aproape golită + Timp/dată incorecte + Perioada de garanție a expirat + RBT anulat + Bolus anulat + Perioada de închiriere se apropie de sfârșit + Rezervorul nu a fost instalat + Rezervor gol + Baterie epuizată + Oprire automată - pompa stopată + Ocluzie + Perioada de închiriere epuizată - nu se mai execută operațiuni + Schimbarea rezervorului nu este completă + Descărcarea datelor a eșuat + Modul de pauză a expirat + Tipul de baterie nu a fost stabilit + Tipul de rezervor nu a fost stabilit + Eroare mecanică + Eroare de derulare + Eroare de limbaj + diff --git a/app/src/main/res/values-ro/insight_exceptions.xml b/app/src/main/res/values-ro/insight_exceptions.xml index 70489fbc5e..cf5266943c 100644 --- a/app/src/main/res/values-ro/insight_exceptions.xml +++ b/app/src/main/res/values-ro/insight_exceptions.xml @@ -1,3 +1,15 @@ - + + Conexiune eșuată + Conexiune pierdută + Asociere respinsă + Crearea asocierii a eșuat + Timpul a expirat + Numărul maxim de bolusuri care sunt livrate în același timp + Nu există RBT activă de anulat + Nu există RBT activă de schimbat + Nu există un bolus care să fie anulat + Pompa este deja în starea solicitată + Mod de folosire nepermis + diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 6c9608b027..792d7cb4eb 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -44,6 +44,8 @@ Sensibilitatea este calculată folosind datele din ultimele 8 ore, iar cabohidrații (când nu sunt absorbiți) sunt ignorați după timpul specificat în preferințe. Se calculează, de asemenea, UAM. Sensibilitatea este calculată ca o medie ponderată a deviațiilor. Deviațiile noi au o importanță mai mare. Absorbția minimă de carbohidrați este calculată în funcție de parametrul absorbție maximă de carbohidrați, stabilit în preferințe. Acest algoritm este cel mai rapid atunci când sensibilitatea la insulină este fluctuantă. Primește valorile glicemiei din aplicația Dexcom G5 modificată. + Primește valorile glicemiei din aplicația Dexcom G6 modificată. + Primește valorile glicemiei din aplicația Eversense modificată. Primește valorile glicemiei din aplicația Glimp. Primește valorile glicemiei din aplicația 600SeriesAndroidUploader (Medtronic). Descarcă datele despre glicemii din Nightscout @@ -408,6 +410,7 @@ Matrice de %1$d elemente.\nValoarea curentă: Date Autosens Depanare script + Folosește opțiunea de autosensibilitate Sincronizează cu NS Ștergerea tratamentelor înregistrate în viitor Masă în curând @@ -531,6 +534,7 @@ Deconectează pompa pentru 2h Deconectează pompa pentru 3h Restabilește + Reconectaţi pompa Durată greșită Buclă suspendată Buclă restabilită @@ -548,6 +552,12 @@ INS Activează superbolus în asistent Activează funcționalitatea de superbolus în asistentul de buclă. Nu activați până nu înțelegeți ce face cu adevărat. DACĂ ESTE FOLOSIT ÎN NECUNOȘTINȚĂ DE CAUZĂ POATE DUCE LA SUPRADOZĂ DE INSULINĂ! + Afișați indicatorii luminoși ai pompei pe ecranul de start + Activați indicatori pentru CAGE, IAGE, SAGE, nivel baterie și rezervor pe ecranul principal. + Pragul de avertisment pentru insulina din rezervor [U] + Pragul critic al nivelului insulinei în rezervor [U] + Pragul de avertizare nivel baterie [%] + Pragul critic al nivelului baterie [%] IOB COB Firmware @@ -702,7 +712,10 @@ BT Watchdog Oprește bluetooth-ul telefonului pentru o secundă dacă nu se poate conecta la pompă. Aceasta poate ajuta în cazul telefoanelor cu bluetooth incompatitibil. App DexcomG5 (cu patch) + Aplicația G6 (modificată) + Aplicația Eversense (modificată) Încarcă date glicemie în NS + Setări înregistrare glicemie Arată variație detaliată Arată variație cu încă o zecimală Max minute de bazală la care să se limiteze SMB @@ -768,6 +781,7 @@ Nu s-a reușit livrarea bolusului și citirea istoricului pompei, verificați pompa. Dacă a fost totuși livrat un bolus, acesta va fi adăugat în lista tratamentelor în timpul următoarei conexiuni cu pompa. Nu este suficientă insulină în rezervor Eroare de livrare a bolusului extins + Obiectiv Pompă Insight Stare Schimbat @@ -842,6 +856,7 @@ Alegeri date Încărcare \"fabric\" Permite trimiterea de rapoarte automate de eroare și de date despre folosire către dezvoltatori prin serviciul fabric.io. + Actualizați aplicația Dexcom la o versiune acceptată Start TT activitate Start TT mănânc-în-curând TT @@ -1007,6 +1022,7 @@ Obiectiv %1$d Poctech Citire a valorii glicemiei din aplicația Poctech + Înregistrează valorile glicemiei din aplicația Tomato (dispozitiv MiaoMIao) Ținte temporare mai mari cresc sensibilitatea = 100]]> Țintele temporare joase scad sensibilitatea @@ -1049,6 +1065,40 @@ Cerere de schimbare minimală [%] Bucla va afişa o nouă cerere de schimbare doar dacă schimbarea are o valoare decât aceasta. Valoarea implicită este 20% Vă rog să conectați pompa cu telefonul! + Căutare dispozitive… + Așteptați… + Asociere reușită + Sunt identice codurile afișate aici și cele de pe pompă? + Asociere Insight + Accu-Chek Insight + Livrat %1$.2fU / %2$.2fU + %1$s:%2$s + Canulă schimbată + Timpul din pompă a fost actualizat + Confirmă + Liniște + Alertă a pompei + Înregistrează schimbările locului de inserție + Înregistrează schimbările canulei + Înregistrează schimbările bateriei + Înregistrează schimbările modului de operare + Înregistrează alertele + Activează emularea RBT + Folosește bolus extins în locul RBT pentru a trece de limita de 250% + Întârziere a deconectării [s] + Număr de serie + Versiunea de software + Versiunea softwareului procesor UI + Versiunea software procesor PC + Versiunea software procesor MD tel + Versiunea software procesor siguranță + Versiunea BT info + Adresa Bluetooth + Indexul sistem ID + Data fabricării + Șterge asocierea + Informații despre asociere + Reîmprospătare stare %1$d zi %1$d zi diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 51378f2b2c..3c717cd826 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1141,4 +1141,6 @@ Context | Edit Context
Автоматически создать событие \"Замена сенсора\" в NS при запуске сенсора Томато (MiaoMiao) Томато + Переход на летнее/зимнее время через 24 часа или менее + Переход на летнее/зимнее время менее чем через 3 часа - замкнутый цикл отключен From 5cf9516012b97069d661cacae509e143e64aef53 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 5 Mar 2019 20:44:51 +0100 Subject: [PATCH 13/90] fix gradle files --- app/build.gradle | 4 ++-- wear/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3dbe684a74..7addcfda0b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -99,7 +99,7 @@ android { applicationId "info.nightscout.androidaps" dimension "standard" resValue "string", "app_name", "AndroidAPS" - versionName version + "-pumpcontrol" + versionName version manifestPlaceholders = [ appIcon: "@mipmap/ic_launcher", appIconRound: "@mipmap/ic_launcher_round" @@ -109,7 +109,7 @@ android { applicationId "info.nightscout.aapspumpcontrol" dimension "standard" resValue "string", "app_name", "Pumpcontrol" - versionName version + versionName version + "-pumpcontrol" manifestPlaceholders = [ appIcon: "@mipmap/ic_pumpcontrol", appIconRound: "@null" diff --git a/wear/build.gradle b/wear/build.gradle index cf846f51ae..01863a3b67 100644 --- a/wear/build.gradle +++ b/wear/build.gradle @@ -56,9 +56,9 @@ android { versionName version } pumpcontrol { - applicationId "info.nightscout.androidaps" + applicationId "info.nightscout.aapspumpcontrol" dimension "standard" - versionName version + versionName version + "-pumpcontrol" } nsclient { applicationId "info.nightscout.nsclient" From 7f3924a7cbc26828bbd92b0d14ccce61c84eaf11 Mon Sep 17 00:00:00 2001 From: AdrianLxM Date: Tue, 5 Mar 2019 21:06:14 +0100 Subject: [PATCH 14/90] fix version check --- .../info/nightscout/androidaps/utils/VersionChecker.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/utils/VersionChecker.java b/app/src/main/java/info/nightscout/androidaps/utils/VersionChecker.java index ea5c15cbec..fd636b4596 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/VersionChecker.java +++ b/app/src/main/java/info/nightscout/androidaps/utils/VersionChecker.java @@ -43,7 +43,6 @@ public class VersionChecker { if (inputStream != null) { String result = findLine(inputStream); if (result != null) { - result = result.replace("version", "").replace("\"", "").replace("\\s+", "").trim(); int compare = result.compareTo(BuildConfig.VERSION_NAME.replace("\"", "")); if (compare == 0) { log.debug("Version equal to master"); @@ -75,14 +74,14 @@ public class VersionChecker { private static String findLine(InputStream inputStream) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; - String regex = "(.*)version(.*)\"(\\d+)\\.(\\d+)\"(.*)"; + String regex = "(.*)version(.*)\"(((\\d+)\\.)+(\\d+))\"(.*)"; Pattern p = Pattern.compile(regex); while ((line = bufferedReader.readLine()) != null) { Matcher m = p.matcher(line); if (m.matches()) { log.debug("+++ " + line); - return line; + return m.group(3); } else { log.debug("--- " + line); } From 6c19e91abcadb6ce13dd5a4847190c67c26bb5d7 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 5 Mar 2019 21:26:30 +0100 Subject: [PATCH 15/90] bump 2.1.2 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 7addcfda0b..52ca877595 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,7 +63,7 @@ android { targetSdkVersion 25 multiDexEnabled true versionCode 1500 - version "2.1.1" + version "2.1.2" buildConfigField "String", "VERSION", '"' + version + '"' buildConfigField "String", "BUILDVERSION", '"' + generateGitBuild() + '-' + generateDate() + '"' buildConfigField "String", "HEAD", '"' + generateGitBuild() + '"' From 02db9b681d5116954910bc5f0ba05938df2034f7 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 5 Mar 2019 23:12:35 +0100 Subject: [PATCH 16/90] fix MidnightTime crash + tests --- .../androidaps/utils/MidnightTime.java | 31 +++++----- .../androidaps/utils/MidnightTimeTest.java | 62 +++++++++++++++++++ 2 files changed, 79 insertions(+), 14 deletions(-) create mode 100644 app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java diff --git a/app/src/main/java/info/nightscout/androidaps/utils/MidnightTime.java b/app/src/main/java/info/nightscout/androidaps/utils/MidnightTime.java index d3d75feda3..668ca02e96 100644 --- a/app/src/main/java/info/nightscout/androidaps/utils/MidnightTime.java +++ b/app/src/main/java/info/nightscout/androidaps/utils/MidnightTime.java @@ -5,7 +5,7 @@ import android.util.LongSparseArray; import java.util.Calendar; public class MidnightTime { - private static LongSparseArray times = new LongSparseArray(); + private static final LongSparseArray times = new LongSparseArray<>(); private static long hits = 0; private static long misses = 0; @@ -20,20 +20,23 @@ public class MidnightTime { } public static long calc(long time) { - Long m = (Long) times.get(time); - if (m != null) { - ++hits; - return m; + Long m; + synchronized (times) { + m = times.get(time); + if (m != null) { + ++hits; + return m; + } + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(time); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.SECOND, 0); + c.set(Calendar.MILLISECOND, 0); + m = c.getTimeInMillis(); + times.append(time, m); + ++misses; } - Calendar c = Calendar.getInstance(); - c.setTimeInMillis(time); - c.set(Calendar.HOUR_OF_DAY, 0); - c.set(Calendar.MINUTE, 0); - c.set(Calendar.SECOND, 0); - c.set(Calendar.MILLISECOND, 0); - m = c.getTimeInMillis(); - times.append(time, m); - ++misses; return m; } diff --git a/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java b/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java new file mode 100644 index 0000000000..4770c658fc --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java @@ -0,0 +1,62 @@ +package info.nightscout.androidaps.utils; + + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.Calendar; +import java.util.Date; + +import info.AAPSMocker; +import info.nightscout.androidaps.MainApp; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Created by mike on 20.11.2017. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Calendar.class}) +public class MidnightTimeTest { + + @Test + public void calc() { + // We get real midnight + long now = DateUtil.now(); + Assert.assertTrue(now >= MidnightTime.calc()); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(MidnightTime.calc()); + Assert.assertEquals(c.get(Calendar.HOUR_OF_DAY), 0); + Assert.assertEquals(c.get(Calendar.MINUTE), 0); + Assert.assertEquals(c.get(Calendar.SECOND), 0); + Assert.assertEquals(c.get(Calendar.MILLISECOND), 0); + } + + @Test + public void calc_time() { + // We get real midnight + long now = DateUtil.now(); + long midnight = MidnightTime.calc(now); + Assert.assertTrue(now >= midnight); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(MidnightTime.calc(now)); + Assert.assertEquals(c.get(Calendar.HOUR_OF_DAY), 0); + Assert.assertEquals(c.get(Calendar.MINUTE), 0); + Assert.assertEquals(c.get(Calendar.SECOND), 0); + Assert.assertEquals(c.get(Calendar.MILLISECOND), 0); + // Assure we get the same time from cache + Assert.assertEquals(midnight, MidnightTime.calc(now)); + } + + @Test + public void log() { + long now = DateUtil.now(); + MidnightTime.calc(now); + Assert.assertEquals(MidnightTime.log(), "Hits: 0 misses: 1 stored: 0"); + } +} From 1a73d6053553b3479fefea7804c8331687afe631 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Tue, 5 Mar 2019 23:29:55 +0100 Subject: [PATCH 17/90] fix tests --- .../java/info/nightscout/androidaps/utils/MidnightTimeTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java b/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java index 4770c658fc..a15efa6c24 100644 --- a/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java +++ b/app/src/test/java/info/nightscout/androidaps/utils/MidnightTimeTest.java @@ -57,6 +57,6 @@ public class MidnightTimeTest { public void log() { long now = DateUtil.now(); MidnightTime.calc(now); - Assert.assertEquals(MidnightTime.log(), "Hits: 0 misses: 1 stored: 0"); + Assert.assertTrue(MidnightTime.log().startsWith("Hits:")); } } From 605601bcc643ce7da3b39ec09411d4a0aca8c0c8 Mon Sep 17 00:00:00 2001 From: harisp Date: Wed, 6 Mar 2019 12:10:28 +0100 Subject: [PATCH 18/90] Run loop when TemporyTarget is changed --- .../androidaps/plugins/aps/loop/LoopPlugin.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java index 7ee7cf0348..3296d3d9d5 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/aps/loop/LoopPlugin.java @@ -34,6 +34,7 @@ import info.nightscout.androidaps.db.DatabaseHelper; import info.nightscout.androidaps.db.Source; import info.nightscout.androidaps.db.TemporaryBasal; import info.nightscout.androidaps.events.EventNewBG; +import info.nightscout.androidaps.events.EventTempTargetChange; import info.nightscout.androidaps.interfaces.APSInterface; import info.nightscout.androidaps.interfaces.Constraint; import info.nightscout.androidaps.interfaces.PluginBase; @@ -175,6 +176,14 @@ public class LoopPlugin extends PluginBase { return loopSuspendedTill; } + @Subscribe + public void onStatusEvent(final EventTempTargetChange ev) { + new Thread(() -> LoopPlugin.getPlugin().invoke("EventTempTargetChange", true)).start(); + FabricPrivacy.getInstance().logCustom(new CustomEvent("TT_Loop_Run")); + } + + + public void suspendTo(long endTime) { loopSuspendedTill = endTime; isSuperBolus = false; From 92cbe45341ed75a52cc3923e14b7c5d20513b533 Mon Sep 17 00:00:00 2001 From: Tanja Schmidt Date: Wed, 6 Mar 2019 19:00:11 +0100 Subject: [PATCH 19/90] Fixed status noticication for charging/uncharging: check battery not power state. --- .../general/nsclient/NsClientReceiverDelegate.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java index 07d76d90fe..8eeee8c43c 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/nsclient/NsClientReceiverDelegate.java @@ -48,9 +48,7 @@ class NsClientReceiverDelegate { bus.post(event); context.registerReceiver(chargingStateReceiver, - new IntentFilter(Intent.ACTION_POWER_CONNECTED)); - context.registerReceiver(chargingStateReceiver, - new IntentFilter(Intent.ACTION_POWER_DISCONNECTED)); + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); EventChargingState eventChargingState = chargingStateReceiver.grabChargingState(context); if (eventChargingState != null) @@ -97,7 +95,7 @@ class NsClientReceiverDelegate { } void processStateChange() { - boolean newAllowedState = allowedChargingState && allowedNetworkState; + boolean newAllowedState = allowedChargingState && allowedNetworkState; if (newAllowedState != allowed) { allowed = newAllowedState; bus.post(new EventPreferenceChange(R.string.key_nsclientinternal_paused)); @@ -109,7 +107,9 @@ class NsClientReceiverDelegate { boolean newAllowedState = true; - if (!ev.isCharging && chargingOnly) newAllowedState = false; + if (!ev.isCharging && chargingOnly) { + newAllowedState = false; + } return newAllowedState; } From a5d1905be894ca885453ca188f9e658bf93b6988 Mon Sep 17 00:00:00 2001 From: Tanja Schmidt Date: Mon, 30 Jul 2018 18:51:36 +0200 Subject: [PATCH 20/90] Allow some objectives to go back. --- .../objectives/ObjectivesFragment.java | 18 ++++++++++++++++++ .../objectives/objectives/Objective.java | 4 ++++ .../objectives/objectives/Objective4.java | 5 +++++ app/src/main/res/layout/objectives_item.xml | 7 +++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 35 insertions(+) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.java index 9f1ac748d5..08c063c437 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/ObjectivesFragment.java @@ -120,6 +120,7 @@ public class ObjectivesFragment extends SubscriberFragment { public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Objective objective = ObjectivesPlugin.getPlugin().getObjectives().get(position); holder.title.setText(MainApp.gs(R.string.nth_objective, position + 1)); + holder.revert.setVisibility(View.INVISIBLE); if (objective.getObjective() != 0) { holder.objective.setVisibility(View.VISIBLE); holder.objective.setText(MainApp.gs(objective.getObjective())); @@ -145,6 +146,9 @@ public class ObjectivesFragment extends SubscriberFragment { holder.verify.setVisibility(View.VISIBLE); holder.verify.setEnabled(objective.isCompleted() || enableFake.isChecked()); holder.start.setVisibility(View.GONE); + if(objective.isRevertable()) { + holder.revert.setVisibility(View.VISIBLE); + } holder.progress.setVisibility(View.VISIBLE); holder.progress.removeAllViews(); for (Objective.Task task : objective.getTasks()) { @@ -169,8 +173,20 @@ public class ObjectivesFragment extends SubscriberFragment { scrollToCurrentObjective(); startUpdateTimer(); }); + holder.revert.setOnClickListener((view) -> { + objective.setAccomplishedOn(null); + objective.setStartedOn(null); + if (position > 0) { + Objective prevObj = ObjectivesPlugin.getObjectives().get(position - 1); + prevObj.setAccomplishedOn(null); + } + notifyDataSetChanged(); + scrollToCurrentObjective(); + }); } + + @Override public int getItemCount() { return ObjectivesPlugin.getPlugin().getObjectives().size(); @@ -185,6 +201,7 @@ public class ObjectivesFragment extends SubscriberFragment { public LinearLayout progress; public Button verify; public Button start; + public Button revert; public ViewHolder(View itemView) { super(itemView); @@ -195,6 +212,7 @@ public class ObjectivesFragment extends SubscriberFragment { progress = itemView.findViewById(R.id.objective_progress); verify = itemView.findViewById(R.id.objective_verify); start = itemView.findViewById(R.id.objective_start); + revert = itemView.findViewById(R.id.objective_back); } } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java index a1935c2ec6..83abe15688 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective.java @@ -42,6 +42,10 @@ public abstract class Objective { return true; } + public boolean isRevertable() { + return false; + } + public boolean isAccomplished() { return accomplishedOn != null; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective4.java b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective4.java index 5708565ebe..1bbb4ef7c2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective4.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/constraints/objectives/objectives/Objective4.java @@ -25,4 +25,9 @@ public class Objective4 extends Objective { } }); } + + @Override + public boolean isRevertable() { + return true; + } } diff --git a/app/src/main/res/layout/objectives_item.xml b/app/src/main/res/layout/objectives_item.xml index b6029e5842..283195db23 100644 --- a/app/src/main/res/layout/objectives_item.xml +++ b/app/src/main/res/layout/objectives_item.xml @@ -65,6 +65,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/objectives_button_start" /> + +