From 1840ddabb350355b104ec30405d0375bef666587 Mon Sep 17 00:00:00 2001 From: Milos Kozak Date: Mon, 22 Apr 2019 12:42:19 +0200 Subject: [PATCH] TriggerTempTarget --- .../info/nightscout/androidaps/MainApp.java | 2 +- .../dialogs/ChooseTriggerDialog.java | 2 + .../automation/elements/ComparatorExists.java | 89 ++++++++++++ .../triggers/TriggerTempTarget.java | 131 ++++++++++++++++++ app/src/main/res/values/strings.xml | 3 + .../elements/ComparatorExistsTest.java | 34 +++++ .../triggers/TriggerTempTargetTest.java | 96 +++++++++++++ 7 files changed, 356 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExists.java create mode 100644 app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTarget.java create mode 100644 app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExistsTest.java create mode 100644 app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTargetTest.java diff --git a/app/src/main/java/info/nightscout/androidaps/MainApp.java b/app/src/main/java/info/nightscout/androidaps/MainApp.java index 0c2a3cf792..99d042ca13 100644 --- a/app/src/main/java/info/nightscout/androidaps/MainApp.java +++ b/app/src/main/java/info/nightscout/androidaps/MainApp.java @@ -181,7 +181,7 @@ public class MainApp extends Application { if (Config.OTHERPROFILES) pluginsList.add(LocalProfilePlugin.getPlugin()); pluginsList.add(TreatmentsPlugin.getPlugin()); if (Config.SAFETY) pluginsList.add(SafetyPlugin.getPlugin()); - if (Config.SAFETY) pluginsList.add(VersionCheckerPlugin.INSTANCE); + //if (Config.SAFETY) pluginsList.add(VersionCheckerPlugin.INSTANCE); if (Config.SAFETY) pluginsList.add(StorageConstraintPlugin.getPlugin()); if (Config.APS) pluginsList.add(ObjectivesPlugin.getPlugin()); pluginsList.add(SourceXdripPlugin.getPlugin()); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/ChooseTriggerDialog.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/ChooseTriggerDialog.java index 0fb618a1fb..ccf4ba2069 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/ChooseTriggerDialog.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/dialogs/ChooseTriggerDialog.java @@ -22,6 +22,7 @@ import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerBg; import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerIob; import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerProfilePercent; import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerRecurringTime; +import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTempTarget; import info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTime; public class ChooseTriggerDialog extends DialogFragment { @@ -36,6 +37,7 @@ public class ChooseTriggerDialog extends DialogFragment { add(new TriggerBg()); add(new TriggerIob()); add(new TriggerProfilePercent()); + add(new TriggerTempTarget()); }}; private Unbinder mUnbinder; diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExists.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExists.java new file mode 100644 index 0000000000..040f96dff3 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExists.java @@ -0,0 +1,89 @@ +package info.nightscout.androidaps.plugins.general.automation.elements; + +import android.support.annotation.StringRes; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.LinearLayout; +import android.widget.Spinner; + +import java.util.ArrayList; +import java.util.List; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; + +public class ComparatorExists extends Element { + public enum Compare { + EXISTS, + NOT_EXISTS; + + public @StringRes + int getStringRes() { + switch (this) { + case EXISTS: + return R.string.exists; + case NOT_EXISTS: + return R.string.notexists; + default: + return R.string.unknown; + } + } + + public static List labels() { + List list = new ArrayList<>(); + for (Compare c : Compare.values()) { + list.add(MainApp.gs(c.getStringRes())); + } + return list; + } + } + + private Compare compare = Compare.EXISTS; + + public ComparatorExists() { + super(); + } + + public ComparatorExists(ComparatorExists another) { + super(); + compare = another.getValue(); + } + + @Override + public void addToLayout(LinearLayout root) { + Spinner spinner = new Spinner(root.getContext()); + ArrayAdapter spinnerArrayAdapter = new ArrayAdapter<>(root.getContext(), android.R.layout.simple_spinner_item, Compare.labels()); + spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(spinnerArrayAdapter); + LinearLayout.LayoutParams spinnerParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ); + spinnerParams.setMargins(0, MainApp.dpToPx(4), 0, MainApp.dpToPx(4)); + spinner.setLayoutParams(spinnerParams); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + compare = Compare.values()[position]; + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + spinner.setSelection(compare.ordinal()); + root.addView(spinner); + + } + + public Compare getValue() { + return compare; + } + + public ComparatorExists setValue(Compare compare) { + this.compare = compare; + return this; + } + +} diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTarget.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTarget.java new file mode 100644 index 0000000000..d6b66e6ea7 --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTarget.java @@ -0,0 +1,131 @@ +package info.nightscout.androidaps.plugins.general.automation.triggers; + +import android.support.v4.app.FragmentManager; +import android.widget.LinearLayout; + +import com.google.common.base.Optional; + +import org.json.JSONException; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.db.TempTarget; +import info.nightscout.androidaps.logging.L; +import info.nightscout.androidaps.plugins.general.automation.elements.Comparator; +import info.nightscout.androidaps.plugins.general.automation.elements.ComparatorExists; +import info.nightscout.androidaps.plugins.general.automation.elements.InputInsulin; +import info.nightscout.androidaps.plugins.general.automation.elements.Label; +import info.nightscout.androidaps.plugins.general.automation.elements.LayoutBuilder; +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; +import info.nightscout.androidaps.utils.DateUtil; +import info.nightscout.androidaps.utils.JsonHelper; +import info.nightscout.androidaps.utils.T; + +public class TriggerTempTarget extends Trigger { + private static Logger log = LoggerFactory.getLogger(L.AUTOMATION); + + private ComparatorExists comparator = new ComparatorExists(); + + public TriggerTempTarget() { + super(); + } + + private TriggerTempTarget(TriggerTempTarget triggerTempTarget) { + super(); + comparator = new ComparatorExists(triggerTempTarget.comparator); + lastRun = triggerTempTarget.lastRun; + } + + public ComparatorExists getComparator() { + return comparator; + } + + @Override + public synchronized boolean shouldRun() { + TempTarget tt = TreatmentsPlugin.getPlugin().getTempTargetFromHistory(); + + if (lastRun > DateUtil.now() - T.mins(5).msecs()) + return false; + + if (tt == null && comparator.getValue() == ComparatorExists.Compare.NOT_EXISTS) { + if (L.isEnabled(L.AUTOMATION)) + log.debug("Ready for execution: " + friendlyDescription()); + return true; + } + + if (tt != null && comparator.getValue() == ComparatorExists.Compare.EXISTS) { + if (L.isEnabled(L.AUTOMATION)) + log.debug("Ready for execution: " + friendlyDescription()); + return true; + } + + return false; + } + + @Override + public synchronized String toJSON() { + JSONObject o = new JSONObject(); + try { + o.put("type", TriggerTempTarget.class.getName()); + JSONObject data = new JSONObject(); + data.put("lastRun", lastRun); + data.put("comparator", comparator.getValue().toString()); + o.put("data", data); + } catch (JSONException e) { + e.printStackTrace(); + } + return o.toString(); + } + + @Override + Trigger fromJSON(String data) { + try { + JSONObject d = new JSONObject(data); + lastRun = JsonHelper.safeGetLong(d, "lastRun"); + comparator.setValue(ComparatorExists.Compare.valueOf(JsonHelper.safeGetString(d, "comparator"))); + } catch (Exception e) { + e.printStackTrace(); + } + return this; + } + + @Override + public int friendlyName() { + return R.string.temptarget; + } + + @Override + public String friendlyDescription() { + return MainApp.gs(R.string.temptargetcompared, MainApp.gs(comparator.getValue().getStringRes())); + } + + @Override + public Optional icon() { + return Optional.of(R.drawable.remove); // TODO icon + } + + @Override + public Trigger duplicate() { + return new TriggerTempTarget(this); + } + + TriggerTempTarget lastRun(long lastRun) { + this.lastRun = lastRun; + return this; + } + + TriggerTempTarget comparator(ComparatorExists.Compare compare) { + this.comparator = new ComparatorExists().setValue(compare); + return this; + } + + @Override + public void generateDialog(LinearLayout root, FragmentManager fragmentManager) { + new LayoutBuilder() + .add(comparator) + .build(root); + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b327bdcdcf..f2a9add5cd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1396,6 +1396,9 @@ Profile percentage Percent [%]: Start profile %1$d%% for %2$d min + exists + not exists + Temp target %1$s %1$d day diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExistsTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExistsTest.java new file mode 100644 index 0000000000..ad62bb2835 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/elements/ComparatorExistsTest.java @@ -0,0 +1,34 @@ +package info.nightscout.androidaps.plugins.general.automation.elements; + +import junit.framework.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 info.AAPSMocker; +import info.nightscout.androidaps.MainApp; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({MainApp.class}) +public class ComparatorExistsTest { + + @Test + public void labelsTest() { + Assert.assertEquals(2, ComparatorExists.Compare.labels().size()); + } + + @Test + public void getSetValueTest() { + ComparatorExists c = new ComparatorExists().setValue(ComparatorExists.Compare.NOT_EXISTS); + Assert.assertEquals(ComparatorExists.Compare.NOT_EXISTS, c.getValue()); + } + + @Before + public void prepare() { + AAPSMocker.mockMainApp(); + AAPSMocker.mockStrings(); + } +} \ No newline at end of file diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTargetTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTargetTest.java new file mode 100644 index 0000000000..70dda8723e --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerTempTargetTest.java @@ -0,0 +1,96 @@ +package info.nightscout.androidaps.plugins.general.automation.triggers; + +import com.google.common.base.Optional; +import com.squareup.otto.Bus; + +import org.json.JSONException; +import org.json.JSONObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import info.AAPSMocker; +import info.nightscout.androidaps.MainApp; +import info.nightscout.androidaps.R; +import info.nightscout.androidaps.db.TempTarget; +import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; +import info.nightscout.androidaps.plugins.general.automation.elements.ComparatorExists; +import info.nightscout.androidaps.plugins.treatments.TreatmentsPlugin; +import info.nightscout.androidaps.utils.DateUtil; + +import static org.mockito.ArgumentMatchers.any; +import static org.powermock.api.mockito.PowerMockito.when; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({MainApp.class, Bus.class, ProfileFunctions.class, DateUtil.class, TreatmentsPlugin.class}) +public class TriggerTempTargetTest { + + TreatmentsPlugin treatmentsPlugin; + + long now = 1514766900000L; + + @Test + public void shouldRunTest() { + when(treatmentsPlugin.getTempTargetFromHistory()).thenReturn(null); + + TriggerTempTarget t = new TriggerTempTarget().comparator(ComparatorExists.Compare.EXISTS); + Assert.assertFalse(t.shouldRun()); + t = new TriggerTempTarget().comparator(ComparatorExists.Compare.NOT_EXISTS); + Assert.assertTrue(t.shouldRun()); + + when(treatmentsPlugin.getTempTargetFromHistory()).thenReturn(new TempTarget()); + + t = new TriggerTempTarget().comparator(ComparatorExists.Compare.NOT_EXISTS); + Assert.assertFalse(t.shouldRun()); + t = new TriggerTempTarget().comparator(ComparatorExists.Compare.EXISTS); + Assert.assertTrue(t.shouldRun()); + + t = new TriggerTempTarget().comparator(ComparatorExists.Compare.EXISTS).lastRun(now - 1); + Assert.assertFalse(t.shouldRun()); + + } + + @Test + public void copyConstructorTest() { + TriggerTempTarget t = new TriggerTempTarget().comparator(ComparatorExists.Compare.NOT_EXISTS); + TriggerTempTarget t1 = (TriggerTempTarget) t.duplicate(); + Assert.assertEquals(ComparatorExists.Compare.NOT_EXISTS, t.getComparator().getValue()); + } + + String ttJson = "{\"data\":{\"comparator\":\"EXISTS\",\"lastRun\":0},\"type\":\"info.nightscout.androidaps.plugins.general.automation.triggers.TriggerTempTarget\"}"; + + @Test + public void toJSONTest() { + TriggerTempTarget t = new TriggerTempTarget().comparator(ComparatorExists.Compare.EXISTS); + Assert.assertEquals(ttJson, t.toJSON()); + } + + @Test + public void fromJSONTest() throws JSONException { + TriggerTempTarget t = new TriggerTempTarget().comparator(ComparatorExists.Compare.NOT_EXISTS); + + TriggerTempTarget t2 = (TriggerTempTarget) Trigger.instantiate(new JSONObject(t.toJSON())); + Assert.assertEquals(ComparatorExists.Compare.NOT_EXISTS, t2.getComparator().getValue()); + } + + @Test + public void iconTest() { + Assert.assertEquals(Optional.of(R.drawable.remove), new TriggerTempTarget().icon()); + } + + + @Before + public void mock() { + AAPSMocker.mockMainApp(); + AAPSMocker.mockBus(); + treatmentsPlugin = AAPSMocker.mockTreatmentPlugin(); + + PowerMockito.mockStatic(DateUtil.class); + when(DateUtil.now()).thenReturn(now); + + } +}