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