From 14dc7395e08d86e72678f9382e77daa200a2236a Mon Sep 17 00:00:00 2001 From: Roumen Georgiev Date: Wed, 4 Dec 2019 16:42:47 +0200 Subject: [PATCH] Created enum for mode & tests --- ...nputSelect.java => InputLocationMode.java} | 92 +++++++++++-------- .../automation/elements/InputOption.java | 2 + .../automation/triggers/TriggerLocation.java | 52 +++-------- .../triggers/TriggerLocationTest.java | 34 ++++++- 4 files changed, 96 insertions(+), 84 deletions(-) rename app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/{InputSelect.java => InputLocationMode.java} (51%) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputSelect.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputLocationMode.java similarity index 51% rename from app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputSelect.java rename to app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputLocationMode.java index c57ed4c94a..9cd39e9ac2 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputSelect.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputLocationMode.java @@ -5,42 +5,68 @@ import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; +import androidx.annotation.StringRes; + import java.util.ArrayList; import java.util.List; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; -public class InputSelect extends Element { +public class InputLocationMode extends Element { + public enum Mode { + INSIDE, + OUTSIDE, + GOING_IN, + GOING_OUT; + + public @StringRes + int getStringRes() { + switch (this) { + case INSIDE: + return R.string.location_inside; + case OUTSIDE: + return R.string.location_outside; + default: + return R.string.unknown; + } + } + + public static List labels() { + List list = new ArrayList<>(); + for (Mode c : Mode.values()) { + list.add(MainApp.gs(c.getStringRes())); + } + return list; + } + + public Mode fromString(String wanted){ + for (Mode c : Mode.values()) { + if(c.toString() == wanted) + return c; + } + return null; + } + } + + private Mode mode; private InputOption selected; - private ArrayList options; - public InputSelect() { + public InputLocationMode() { super(); + mode = Mode.INSIDE; } - public InputSelect(ArrayList options) { + public InputLocationMode(InputLocationMode another) { super(); - this.options = options; - } - - public InputSelect(ArrayList options, InputOption selected) { - super(); - this.options = options; - this.selected = selected; - } - - public InputSelect(InputSelect another) { - super(); - options = another.options; - selected = another.selected; + this.mode = another.mode; } @Override public void addToLayout(LinearLayout root) { ArrayAdapter adapter = new ArrayAdapter<>(root.getContext(), - R.layout.spinner_centered, labels()); + R.layout.spinner_centered, Mode.labels()); Spinner spinner = new Spinner(root.getContext()); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); @@ -53,41 +79,27 @@ public class InputSelect extends Element { spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView parent, View view, int position, long id) { - setValue(options.get(position)); +// mode = Mode.values()[position]; + setValue(Mode.values()[position]); } @Override public void onNothingSelected(AdapterView parent) { } }); - spinner.setSelection(selected == null ? 0 : options.indexOf(selected)); + spinner.setSelection(this.getValue().ordinal()); root.addView(spinner); + } - public String getValue() { - return selected == null ? null : selected.getValue(); + public Mode getValue() { + return mode; } - public InputSelect setValue(InputOption selected) { - this.selected = selected; + public InputLocationMode setValue(Mode mode) { + this.mode = mode; return this; } - public InputSelect setValue(String selected) { - for (InputOption o: options) { - if (o.getValue().equals(selected)) { - this.selected = o; - break; - } - } - return this; - } - private List labels() { - List list = new ArrayList<>(); - for (InputOption o : options) { - list.add(MainApp.gs(o.getStringRes())); - } - return list; - } } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputOption.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputOption.java index 3c4dbd67a2..b0bcbcc70d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputOption.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/elements/InputOption.java @@ -6,6 +6,8 @@ public class InputOption { public InputOption(int stringRes, String value) { this.stringRes = stringRes; + if (value == null) + this.value = ""; this.value = value; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.java b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.java index 9367a3b985..03b27732d1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocation.java @@ -3,7 +3,6 @@ package info.nightscout.androidaps.plugins.general.automation.triggers; import android.location.Location; import android.widget.LinearLayout; -import androidx.annotation.NonNull; import androidx.fragment.app.FragmentManager; import com.google.common.base.Optional; @@ -14,16 +13,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.logging.L; import info.nightscout.androidaps.plugins.general.automation.elements.InputButton; import info.nightscout.androidaps.plugins.general.automation.elements.InputDouble; -import info.nightscout.androidaps.plugins.general.automation.elements.InputOption; -import info.nightscout.androidaps.plugins.general.automation.elements.InputSelect; +import info.nightscout.androidaps.plugins.general.automation.elements.InputLocationMode; import info.nightscout.androidaps.plugins.general.automation.elements.InputString; import info.nightscout.androidaps.plugins.general.automation.elements.LabelWithElement; import info.nightscout.androidaps.plugins.general.automation.elements.LayoutBuilder; @@ -36,16 +32,11 @@ import info.nightscout.androidaps.utils.T; public class TriggerLocation extends Trigger { private static Logger log = LoggerFactory.getLogger(L.AUTOMATION); - private static final ArrayList modes = new ArrayList<>(Arrays.asList( - new InputOption(R.string.location_inside, MainApp.gs(R.string.location_inside)), - new InputOption(R.string.location_outside, MainApp.gs(R.string.location_outside)) - )); - InputDouble latitude = new InputDouble(0d, -90d, +90d, 0.000001d, new DecimalFormat("0.000000")); InputDouble longitude = new InputDouble(0d, -180d, +180d, 0.000001d, new DecimalFormat("0.000000")); InputDouble distance = new InputDouble(200d, 0, 100000, 10d, new DecimalFormat("0")); - // Default mode selected is 1 - inside area - InputSelect modeSelected = new InputSelect(modes); + // Default mode selected is 0 - inside area + InputLocationMode modeSelected = new InputLocationMode(); InputString name = new InputString(); @@ -67,7 +58,7 @@ public class TriggerLocation extends Trigger { latitude = new InputDouble(triggerLocation.latitude); longitude = new InputDouble(triggerLocation.longitude); distance = new InputDouble(triggerLocation.distance); - modeSelected = new InputSelect(modes); + modeSelected = new InputLocationMode(triggerLocation.modeSelected); lastRun = triggerLocation.lastRun; name = triggerLocation.name; } @@ -85,8 +76,8 @@ public class TriggerLocation extends Trigger { a.setLatitude(latitude.getValue()); a.setLongitude(longitude.getValue()); double calculatedDistance = location.distanceTo(a); - if (((stringToMode(modeSelected.getValue()) == 1d) && (calculatedDistance < distance.getValue())) || - ((stringToMode(modeSelected.getValue()) == 2d) && (calculatedDistance > distance.getValue()))) { + if (((modeSelected.getValue().ordinal()) == 1d) && (calculatedDistance < distance.getValue()) || + ((modeSelected.getValue().ordinal() == 2d) && (calculatedDistance > distance.getValue()))) { if (L.isEnabled(L.AUTOMATION)) log.debug("Ready for execution: " + friendlyDescription()); return true; @@ -104,12 +95,13 @@ public class TriggerLocation extends Trigger { data.put("longitude", longitude.getValue()); data.put("distance", distance.getValue()); data.put("name", name.getValue()); - data.put("mode", stringToMode(modeSelected.getValue())); + data.put("mode", modeSelected.getValue()); data.put("lastRun", lastRun); o.put("data", data); } catch (JSONException e) { log.error("Unhandled exception", e); } + log.debug("JSON "+o.toString()); return o.toString(); } @@ -121,7 +113,7 @@ public class TriggerLocation extends Trigger { longitude.setValue(JsonHelper.safeGetDouble(d, "longitude")); distance.setValue(JsonHelper.safeGetDouble(d, "distance")); name.setValue(JsonHelper.safeGetString(d, "name")); - modeSelected.setValue(modeToString(JsonHelper.safeGetDouble(d, "mode"))); + modeSelected.setValue(InputLocationMode.Mode.valueOf(JsonHelper.safeGetString(d, "mode"))); lastRun = JsonHelper.safeGetLong(d, "lastRun"); } catch (Exception e) { log.error("Unhandled exception", e); @@ -170,8 +162,9 @@ public class TriggerLocation extends Trigger { return this; } - TriggerLocation setMode(double value) { - modeSelected.setValue(modeToString(value)); + TriggerLocation setMode(InputLocationMode.Mode value) { + + modeSelected.setValue(value); return this; } @@ -188,25 +181,4 @@ public class TriggerLocation extends Trigger { .build(root); } - public double stringToMode(String selected) { - if (selected == null) - return 1d; - if (selected.equals(MainApp.gs(R.string.location_inside))) - return 1d; - else if (selected.equals(MainApp.gs(R.string.location_outside))) - return 2d; - else return 0d; - } - - public String modeToString(double selectedMode) { - if (selectedMode == 1d) - return MainApp.gs(R.string.location_inside); - else if (selectedMode == 2d) - return MainApp.gs(R.string.location_outside); - else - return MainApp.gs(R.string.location_mode); - - } - - } diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocationTest.java b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocationTest.java index 9e1f713339..53589b4128 100644 --- a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocationTest.java +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/triggers/TriggerLocationTest.java @@ -15,10 +15,15 @@ import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import java.util.ArrayList; +import java.util.Arrays; + import info.AAPSMocker; import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.R; import info.nightscout.androidaps.plugins.configBuilder.ProfileFunctions; +import info.nightscout.androidaps.plugins.general.automation.elements.InputOption; +import info.nightscout.androidaps.plugins.general.automation.elements.InputLocationMode; import info.nightscout.androidaps.services.LocationService; import info.nightscout.androidaps.utils.DateUtil; @@ -31,6 +36,11 @@ public class TriggerLocationTest { long now = 1514766900000L; + private static final ArrayList modes = new ArrayList<>(Arrays.asList( + new InputOption(1, "inside"), + new InputOption(2, "outside") + )); + @Before public void mock() { AAPSMocker.mockMainApp(); @@ -53,11 +63,14 @@ public class TriggerLocationTest { t.latitude.setValue(213); t.longitude.setValue(212); t.distance.setValue(2); + t.modeSelected.setValue(InputLocationMode.Mode.INSIDE); + TriggerLocation t1 = (TriggerLocation) t.duplicate(); - Assert.assertEquals(213d, t.latitude.getValue(), 0.01d); - Assert.assertEquals(212d, t.longitude.getValue(), 0.01d); - Assert.assertEquals(2d, t.distance.getValue(), 0.01d); + Assert.assertEquals(213d, t1.latitude.getValue(), 0.01d); + Assert.assertEquals(212d, t1.longitude.getValue(), 0.01d); + Assert.assertEquals(2d, t1.distance.getValue(), 0.01d); + Assert.assertEquals(InputLocationMode.Mode.INSIDE, t1.modeSelected.getValue()); } @Test @@ -66,6 +79,8 @@ public class TriggerLocationTest { t.latitude.setValue(213); t.longitude.setValue(212); t.distance.setValue(2); + t.modeSelected.setValue(InputLocationMode.Mode.OUTSIDE); + PowerMockito.when(LocationService.getLastLocation()).thenReturn(null); Assert.assertFalse(t.shouldRun()); PowerMockito.when(LocationService.getLastLocation()).thenReturn(mockedLocation()); @@ -78,7 +93,7 @@ public class TriggerLocationTest { Assert.assertFalse(t.shouldRun()); } - String locationJson = "{\"data\":{\"distance\":2,\"lastRun\":0,\"latitude\":213,\"name\":\"\",\"longitude\":212},\"type\":\"info.nightscout.androidaps.plugins.general.automation.triggers.TriggerLocation\"}"; + String locationJson = "{\"data\":{\"mode\":\"OUTSIDE\",\"distance\":2,\"lastRun\":0,\"latitude\":213,\"name\":\"\",\"longitude\":212},\"type\":\"info.nightscout.androidaps.plugins.general.automation.triggers.TriggerLocation\"}"; @Test public void toJSONTest() { @@ -86,6 +101,7 @@ public class TriggerLocationTest { t.latitude.setValue(213); t.longitude.setValue(212); t.distance.setValue(2); + t.modeSelected = t.modeSelected.setValue(InputLocationMode.Mode.OUTSIDE); Assert.assertEquals(locationJson, t.toJSON()); } @@ -95,11 +111,14 @@ public class TriggerLocationTest { t.latitude.setValue(213); t.longitude.setValue(212); t.distance.setValue(2); +// t.setMode(t.stringToMode(new InputSelect(modes).getValue())); + t.modeSelected.setValue(InputLocationMode.Mode.INSIDE); TriggerLocation t2 = (TriggerLocation) Trigger.instantiate(new JSONObject(t.toJSON())); Assert.assertEquals(t.latitude.getValue(), t2.latitude.getValue(), 0.01d); Assert.assertEquals(t.longitude.getValue(), t2.longitude.getValue(), 0.01d); Assert.assertEquals(t.distance.getValue(), t2.distance.getValue(), 0.01d); + Assert.assertEquals(t.modeSelected.getValue(), t2.modeSelected.getValue()); } @Test @@ -139,6 +158,13 @@ public class TriggerLocationTest { Assert.assertEquals(t.distance.getValue(), 2, 0d); } + @Test + public void setModeTest() { + TriggerLocation t = new TriggerLocation(); + t.setMode(InputLocationMode.Mode.INSIDE); + Assert.assertEquals(t.modeSelected.getValue(), InputLocationMode.Mode.INSIDE); + } + @Test public void lastRunTest() { TriggerLocation t = new TriggerLocation();