diff --git a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AutomationModule.kt b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AutomationModule.kt index bf54732d93..04aacf5a84 100644 --- a/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AutomationModule.kt +++ b/app/src/main/java/info/nightscout/androidaps/dependencyInjection/AutomationModule.kt @@ -39,6 +39,7 @@ abstract class AutomationModule { @ContributesAndroidInjector abstract fun actionLoopResumeInjector(): ActionLoopResume @ContributesAndroidInjector abstract fun actionLoopSuspendInjector(): ActionLoopSuspend @ContributesAndroidInjector abstract fun actionNotificationInjector(): ActionNotification + @ContributesAndroidInjector abstract fun actionAlarmInjector(): ActionAlarm @ContributesAndroidInjector abstract fun actionProfileSwitchInjector(): ActionProfileSwitch @ContributesAndroidInjector abstract fun actionProfileSwitchPercentInjector(): ActionProfileSwitchPercent @ContributesAndroidInjector abstract fun actionSendSMSInjector(): ActionSendSMS diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt index bd10b77e25..040f01a141 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/AutomationPlugin.kt @@ -239,6 +239,7 @@ class AutomationPlugin @Inject constructor( ActionStartTempTarget(injector), ActionStopTempTarget(injector), ActionNotification(injector), + ActionAlarm(injector), ActionProfileSwitchPercent(injector), ActionProfileSwitch(injector), ActionSendSMS(injector) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionAlarm.kt b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionAlarm.kt new file mode 100644 index 0000000000..1c26cdb8eb --- /dev/null +++ b/app/src/main/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionAlarm.kt @@ -0,0 +1,72 @@ +package info.nightscout.androidaps.plugins.general.automation.actions + +import android.content.Context +import android.content.Intent +import android.widget.LinearLayout +import androidx.annotation.DrawableRes +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.activities.ErrorHelperActivity +import info.nightscout.androidaps.activities.PreferencesActivity +import info.nightscout.androidaps.data.PumpEnactResult +import info.nightscout.androidaps.events.EventRefreshOverview +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +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 +import info.nightscout.androidaps.plugins.general.nsclient.NSUpload +import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotification +import info.nightscout.androidaps.plugins.general.overview.notifications.NotificationUserMessage +import info.nightscout.androidaps.queue.Callback +import info.nightscout.androidaps.utils.JsonHelper +import info.nightscout.androidaps.utils.alertDialogs.WarningDialog +import info.nightscout.androidaps.utils.resources.ResourceHelper +import org.json.JSONObject +import javax.inject.Inject + +class ActionAlarm(injector: HasAndroidInjector) : Action(injector) { + + @Inject lateinit var resourceHelper: ResourceHelper + @Inject lateinit var rxBus: RxBusWrapper + @Inject lateinit var nsUpload: NSUpload + @Inject lateinit var context: Context + + var text = InputString(injector) + + override fun friendlyName(): Int = R.string.alarm + override fun shortDescription(): String = resourceHelper.gs(R.string.alarm_message, text.value) + @DrawableRes override fun icon(): Int = R.drawable.ic_access_alarm_24dp + + override fun doAction(callback: Callback) { + val i = Intent(context, ErrorHelperActivity::class.java) + i.putExtra("soundid", R.raw.modern_alarm) + i.putExtra("status", text.value) + i.putExtra("title", resourceHelper.gs(R.string.alarm)) + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context.startActivity(i) + + callback.result(PumpEnactResult(injector).success(true).comment(R.string.ok))?.run() + } + + override fun toJSON(): String { + val data = JSONObject().put("text", text.value) + return JSONObject() + .put("type", this.javaClass.name) + .put("data", data) + .toString() + } + + override fun fromJSON(data: String): Action { + val o = JSONObject(data) + text.value = JsonHelper.safeGetString(o, "text", "") + return this + } + + override fun hasDialog(): Boolean = true + + override fun generateDialog(root: LinearLayout) { + LayoutBuilder() + .add(LabelWithElement(injector, resourceHelper.gs(R.string.alarm_short), "", text)) + .build(root) + } +} \ No newline at end of file diff --git a/app/src/main/res/raw/modern_alarm.mp3 b/app/src/main/res/raw/modern_alarm.mp3 new file mode 100644 index 0000000000..6b9965ab26 Binary files /dev/null and b/app/src/main/res/raw/modern_alarm.mp3 differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d1d19014f4..7f3ce45b83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1174,7 +1174,9 @@ Notification Notification: %1$s + Alarm: %1$s Msg: + Alarm: Profile percentage Percent [%]: Start profile %1$d%% for %2$d min @@ -1411,5 +1413,6 @@ Filter Unable to create local profile. Profile is invalid. Don\'t kill my app? + Alarm diff --git a/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionAlarmTest.kt b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionAlarmTest.kt new file mode 100644 index 0000000000..aceee54a25 --- /dev/null +++ b/app/src/test/java/info/nightscout/androidaps/plugins/general/automation/actions/ActionAlarmTest.kt @@ -0,0 +1,97 @@ +package info.nightscout.androidaps.plugins.general.automation.actions + +import android.content.Context +import dagger.android.AndroidInjector +import dagger.android.HasAndroidInjector +import info.nightscout.androidaps.R +import info.nightscout.androidaps.TestBase +import info.nightscout.androidaps.data.PumpEnactResult +import info.nightscout.androidaps.plugins.bus.RxBusWrapper +import info.nightscout.androidaps.plugins.general.automation.elements.InputString +import info.nightscout.androidaps.plugins.general.nsclient.NSUpload +import info.nightscout.androidaps.queue.Callback +import info.nightscout.androidaps.utils.resources.ResourceHelper +import org.junit.Assert +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers +import org.mockito.Mock +import org.mockito.Mockito +import org.mockito.Mockito.`when` +import org.powermock.api.mockito.PowerMockito +import org.powermock.core.classloader.annotations.PrepareForTest +import org.powermock.modules.junit4.PowerMockRunner + +@RunWith(PowerMockRunner::class) +@PrepareForTest(NSUpload::class, RxBusWrapper::class) +class ActionAlarmTest : TestBase() { + + @Mock lateinit var resourceHelper: ResourceHelper + @Mock lateinit var rxBus: RxBusWrapper + @Mock lateinit var nsUpload: NSUpload + @Mock lateinit var context: Context + + private lateinit var sut: ActionAlarm + var injector: HasAndroidInjector = HasAndroidInjector { + AndroidInjector { + if (it is ActionAlarm) { + it.resourceHelper = resourceHelper + it.rxBus = rxBus + it.nsUpload = nsUpload + it.context = context + } + if (it is PumpEnactResult) { + it.aapsLogger = aapsLogger + it.resourceHelper = resourceHelper + } + } + } + + @Before + fun setup() { + PowerMockito.mockStatic(NSUpload::class.java) + `when`(resourceHelper.gs(R.string.ok)).thenReturn("OK") + `when`(resourceHelper.gs(R.string.alarm)).thenReturn("Alarm") + `when`(resourceHelper.gs(ArgumentMatchers.eq(R.string.alarm_message), ArgumentMatchers.anyString())).thenReturn("Alarm: %s") + + sut = ActionAlarm(injector) + } + + @Test fun friendlyNameTest() { + Assert.assertEquals(R.string.alarm, sut.friendlyName()) + } + + @Test fun shortDescriptionTest() { + sut.text = InputString(injector, "Asd") + Assert.assertEquals("Alarm: %s", sut.shortDescription()) + } + + @Test fun iconTest() { + Assert.assertEquals(R.drawable.ic_access_alarm_24dp, sut.icon()) + } + + @Test fun doActionTest() { + sut.doAction(object : Callback() { + override fun run() { + Assert.assertTrue(result.success) + } + }) + PowerMockito.verifyStatic(NSUpload::class.java, Mockito.times(1)) + } + + @Test fun hasDialogTest() { + Assert.assertTrue(sut.hasDialog()) + } + + @Test fun toJSONTest() { + sut.text = InputString(injector, "Asd") + Assert.assertEquals("{\"data\":{\"text\":\"Asd\"},\"type\":\"info.nightscout.androidaps.plugins.general.automation.actions.ActionAlarm\"}", sut.toJSON()) + } + + @Test fun fromJSONTest() { + sut.text = InputString(injector, "Asd") + sut.fromJSON("{\"text\":\"Asd\"}") + Assert.assertEquals("Asd", sut.text.value) + } +} \ No newline at end of file