From e1217980598cea0d54507325eee707b58e40603b Mon Sep 17 00:00:00 2001 From: Tim Vroom Date: Sun, 31 Dec 2023 14:56:34 +0100 Subject: [PATCH] Add day automation --- .../plugins/automation/AutomationPlugin.kt | 2 + .../plugins/automation/di/AutomationModule.kt | 2 + .../plugins/automation/triggers/Trigger.kt | 1 + .../plugins/automation/triggers/TriggerDay.kt | 77 +++++++++++++++++++ .../main/res/drawable/ic_calendar_days.xml | 10 +++ .../src/main/res/values/strings.xml | 1 + .../automation/triggers/TriggerDayTest.kt | 38 +++++++++ .../automation/triggers/TriggerTestBase.kt | 3 + 8 files changed, 134 insertions(+) create mode 100644 plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerDay.kt create mode 100644 plugins/automation/src/main/res/drawable/ic_calendar_days.xml create mode 100644 plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerDayTest.kt diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt index b3cb5532a32..55e9e4b138b 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/AutomationPlugin.kt @@ -53,6 +53,7 @@ import app.aaps.plugins.automation.triggers.TriggerBg import app.aaps.plugins.automation.triggers.TriggerBolusAgo import app.aaps.plugins.automation.triggers.TriggerCOB import app.aaps.plugins.automation.triggers.TriggerConnector +import app.aaps.plugins.automation.triggers.TriggerDay import app.aaps.plugins.automation.triggers.TriggerDelta import app.aaps.plugins.automation.triggers.TriggerHeartRate import app.aaps.plugins.automation.triggers.TriggerIob @@ -386,6 +387,7 @@ class AutomationPlugin @Inject constructor( TriggerRecurringTime(injector), TriggerTimeRange(injector), TriggerBg(injector), + TriggerDay(injector), TriggerDelta(injector), TriggerIob(injector), TriggerCOB(injector), diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt index de98e008736..032fa9f35f7 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/di/AutomationModule.kt @@ -34,6 +34,7 @@ import app.aaps.plugins.automation.triggers.TriggerBg import app.aaps.plugins.automation.triggers.TriggerBolusAgo import app.aaps.plugins.automation.triggers.TriggerCOB import app.aaps.plugins.automation.triggers.TriggerConnector +import app.aaps.plugins.automation.triggers.TriggerDay import app.aaps.plugins.automation.triggers.TriggerDelta import app.aaps.plugins.automation.triggers.TriggerDummy import app.aaps.plugins.automation.triggers.TriggerHeartRate @@ -74,6 +75,7 @@ abstract class AutomationModule { @ContributesAndroidInjector abstract fun triggerBolusAgoInjector(): TriggerBolusAgo @ContributesAndroidInjector abstract fun triggerCOBInjector(): TriggerCOB @ContributesAndroidInjector abstract fun triggerConnectorInjector(): TriggerConnector + @ContributesAndroidInjector abstract fun triggerDayInjector(): TriggerDay @ContributesAndroidInjector abstract fun triggerDeltaInjector(): TriggerDelta @ContributesAndroidInjector abstract fun triggerDummyInjector(): TriggerDummy @ContributesAndroidInjector abstract fun triggerHeartRateInjector(): TriggerHeartRate diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt index 97a710cea81..3e1c169bbb2 100644 --- a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/Trigger.kt @@ -97,6 +97,7 @@ abstract class Trigger(val injector: HasAndroidInjector) { TriggerIob::class.java.simpleName -> TriggerIob(injector).fromJSON(data.toString()) TriggerCOB::class.java.simpleName -> TriggerCOB(injector).fromJSON(data.toString()) TriggerConnector::class.java.simpleName -> TriggerConnector(injector).fromJSON(data.toString()) + TriggerDay::class.java.simpleName -> TriggerDay(injector).fromJSON(data.toString()) TriggerDelta::class.java.simpleName -> TriggerDelta(injector).fromJSON(data.toString()) TriggerDummy::class.java.simpleName -> TriggerDummy(injector).fromJSON(data.toString()) TriggerHeartRate::class.java.simpleName -> TriggerHeartRate(injector).fromJSON(data.toString()) diff --git a/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerDay.kt b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerDay.kt new file mode 100644 index 00000000000..f31b9370f1b --- /dev/null +++ b/plugins/automation/src/main/kotlin/app/aaps/plugins/automation/triggers/TriggerDay.kt @@ -0,0 +1,77 @@ +package app.aaps.plugins.automation.triggers + +import android.widget.LinearLayout +import app.aaps.core.interfaces.logging.LTag +import app.aaps.core.ui.elements.WeekDay +import app.aaps.core.utils.JsonHelper +import app.aaps.plugins.automation.R +import app.aaps.plugins.automation.elements.InputWeekDay +import app.aaps.plugins.automation.elements.LayoutBuilder +import app.aaps.plugins.automation.elements.StaticLabel +import dagger.android.HasAndroidInjector +import org.json.JSONObject +import java.util.Calendar +import java.util.Objects +import java.util.Optional + +class TriggerDay(injector: HasAndroidInjector) : Trigger(injector) { + + val days = InputWeekDay() + + constructor(injector: HasAndroidInjector, triggerDay: TriggerDay) : this(injector) { + if (days.weekdays.size >= 0) + System.arraycopy(triggerDay.days.weekdays, 0, days.weekdays, 0, triggerDay.days.weekdays.size) + } + + override fun shouldRun(): Boolean { + val scheduledDayOfWeek = Calendar.getInstance()[Calendar.DAY_OF_WEEK] + if (days.isSet(Objects.requireNonNull(WeekDay.DayOfWeek.fromCalendarInt(scheduledDayOfWeek)))) { + aapsLogger.debug(LTag.AUTOMATION, "Ready for execution: " + friendlyDescription()) + return true + } + aapsLogger.debug(LTag.AUTOMATION, "NOT ready for execution: " + friendlyDescription()) + return false + } + + override fun dataJSON(): JSONObject { + val data = JSONObject() + for (i in days.weekdays.indices) { + data.put(WeekDay.DayOfWeek.entries[i].name, days.weekdays[i]) + } + return data + } + + override fun fromJSON(data: String): Trigger { + val o = JSONObject(data) + for (i in days.weekdays.indices) { + days.weekdays[i] = JsonHelper.safeGetBoolean(o, WeekDay.DayOfWeek.entries[i].name) + } + + return this + } + + override fun friendlyName(): Int = R.string.day + + override fun friendlyDescription(): String { + val sb = StringBuilder() + sb.append(rh.gs(R.string.every)) + sb.append(" ") + var counter = 0 + for (i in days.getSelectedDays()) { + if (counter++ > 0) sb.append(",") + sb.append(rh.gs(Objects.requireNonNull(WeekDay.DayOfWeek.fromCalendarInt(i)).shortName)) + } + return if (counter == 0) rh.gs(R.string.never) else sb.toString() + } + + override fun icon(): Optional = Optional.of(R.drawable.ic_calendar_days) + + override fun duplicate(): Trigger = TriggerDay(injector, this) + + override fun generateDialog(root: LinearLayout) { + LayoutBuilder() + .add(StaticLabel(rh, R.string.day, this)) + .add(days) + .build(root) + } +} \ No newline at end of file diff --git a/plugins/automation/src/main/res/drawable/ic_calendar_days.xml b/plugins/automation/src/main/res/drawable/ic_calendar_days.xml new file mode 100644 index 00000000000..44e32ba0ec8 --- /dev/null +++ b/plugins/automation/src/main/res/drawable/ic_calendar_days.xml @@ -0,0 +1,10 @@ + + + diff --git a/plugins/automation/src/main/res/values/strings.xml b/plugins/automation/src/main/res/values/strings.xml index 85b667dea97..73e40d81a40 100644 --- a/plugins/automation/src/main/res/values/strings.xml +++ b/plugins/automation/src/main/res/values/strings.xml @@ -89,6 +89,7 @@ HR %1$s %2$.0f IOB [U]: Dist [m]: + Day Recurring time Every Never diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerDayTest.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerDayTest.kt new file mode 100644 index 00000000000..3ab9e0568fb --- /dev/null +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerDayTest.kt @@ -0,0 +1,38 @@ +package app.aaps.plugins.automation.triggers + +import app.aaps.core.ui.elements.WeekDay +import com.google.common.truth.Truth.assertThat +import org.json.JSONObject +import org.junit.jupiter.api.Test +import org.skyscreamer.jsonassert.JSONAssert + +class TriggerDayTest : TriggerTestBase() { + + @Test fun shouldRunTest() { + var t = TriggerDay(injector) + t.days[WeekDay.DayOfWeek.MONDAY] = true + assertThat(t.shouldRun()).isFalse() + + // scheduled 1 min before + t = TriggerDay(injector) + t.days[WeekDay.DayOfWeek.SUNDAY] = true + assertThat(t.shouldRun()).isTrue() + } + + private var dayJson = + "{\"data\":{\"WEDNESDAY\":false,\"MONDAY\":false,\"THURSDAY\":false,\"SUNDAY\":true,\"TUESDAY\":false,\"FRIDAY\":false,\"SATURDAY\":false,\"type\":\"TriggerRecurringDay\"}" + + @Test + fun toJSONTest() { + val t = TriggerDay(injector) + t.days[WeekDay.DayOfWeek.SUNDAY] = true + JSONAssert.assertEquals(dayJson, t.toJSON(), true) + } + + @Test + fun fromJSONTest() { + val t = TriggerDay(injector) + val t2 = TriggerDummy(injector).instantiate(JSONObject(t.toJSON())) as TriggerDay + assertThat(t2.days.getSelectedDays()).contains(WeekDay.DayOfWeek.SUNDAY) + } +} diff --git a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerTestBase.kt b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerTestBase.kt index 6931f0a04e3..865d5efe020 100644 --- a/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerTestBase.kt +++ b/plugins/automation/src/test/kotlin/app/aaps/plugins/automation/triggers/TriggerTestBase.kt @@ -44,6 +44,9 @@ open class TriggerTestBase : TestBaseWithProfile() { if (it is TriggerBg) { it.profileFunction = profileFunction } + if (it is TriggerDay) { + it.dateUtil = dateUtil + } if (it is TriggerTime) { it.dateUtil = dateUtil }