Handle timer service notifications

This commit is contained in:
Paul Akhamiogu
2021-09-01 21:26:56 +01:00
parent 8474e6a800
commit 9b421b3676
36 changed files with 252 additions and 33 deletions

View File

@ -12,10 +12,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.simplemobiletools.clock.R
import com.simplemobiletools.clock.activities.SimpleActivity
import com.simplemobiletools.clock.dialogs.MyTimePickerDialogDialog
import com.simplemobiletools.clock.extensions.checkAlarmsWithDeletedSoundUri
import com.simplemobiletools.clock.extensions.colorLeftDrawable
import com.simplemobiletools.clock.extensions.config
import com.simplemobiletools.clock.extensions.timerHelper
import com.simplemobiletools.clock.extensions.*
import com.simplemobiletools.clock.helpers.PICK_AUDIO_FILE_INTENT_ID
import com.simplemobiletools.clock.models.Timer
import com.simplemobiletools.clock.models.TimerState
@ -116,11 +113,11 @@ class TimerAdapter(
}
is TimerState.Paused -> {
timer_time.text = timer.state.tick.div(1000F).roundToInt().getFormattedDuration()
timer_time.text = timer.state.tick.getFormattedDuration()
}
is TimerState.Running -> {
timer_time.text = timer.state.tick.div(1000F).roundToInt().getFormattedDuration()
timer_time.text = timer.state.tick.getFormattedDuration()
}
}
}
@ -142,11 +139,12 @@ class TimerAdapter(
private fun updateTimer(timer: Timer, refresh: Boolean = true) {
Log.w(TAG, "updateTimer: $timer")
activity.timerHelper.insertOrUpdateTimer(timer)
activity.timerHelper.insertOrUpdateTimer(timer){
if (refresh) {
onRefresh.invoke()
}
}
}
companion object {
private const val TAG = "TimerAdapter"

View File

@ -1,8 +1,10 @@
package com.simplemobiletools.clock.extensions
import android.text.format.DateFormat
import com.simplemobiletools.commons.extensions.getFormattedDuration
import java.util.*
import java.util.concurrent.TimeUnit
import kotlin.math.roundToInt
fun Long.formatStopwatchTime(useLongerMSFormat: Boolean): String {
val MSFormat = if (useLongerMSFormat) "%03d" else "%01d"
@ -37,5 +39,9 @@ fun Long.timestampFormat(format: String = "dd. MM. yyyy"): String {
return DateFormat.format(format, calendar).toString()
}
fun Long.getFormattedDuration(forceShowHours: Boolean = false): String {
return this.div(1000F).roundToInt().getFormattedDuration(forceShowHours)
}
val Long.secondsToMillis get() = TimeUnit.SECONDS.toMillis(this)
val Long.millisToSeconds get() = TimeUnit.MILLISECONDS.toSeconds(this)

View File

@ -100,17 +100,24 @@ class TimerFragment : Fragment() {
private fun updateViews(position: Int) {
activity?.runOnUiThread {
if (timerAdapter.itemCount > 0) {
val timer = timerAdapter.getItemAt(position)
updateViewStates(timer.state)
view.timer_play_pause.beVisible()
} else {
view.timer_delete.beGone()
view.timer_play_pause.beGone()
view.timer_reset.beGone()
}
}
}
private fun refreshTimers(scrollToLast: Boolean = false) {
private fun refreshTimers(scrollToLatest: Boolean = false) {
activity?.timerHelper?.getTimers { timers ->
Log.d(TAG, "refreshTimers: $timers")
timerAdapter.submitList(timers) {
if (scrollToLast) {
view.timer_view_pager.currentItem = timers.lastIndex
if (scrollToLatest) {
view.timer_view_pager.currentItem = 0
}
updateViews(timer_view_pager.currentItem)
}

View File

@ -43,14 +43,16 @@ class TimerHelper(val context: Context) {
fun insertNewTimer(callback: () -> Unit = {}) {
ensureBackgroundThread {
timerDao.insertOrUpdateTimer(
Timer(id = null,
Timer(
id = null,
seconds = DEFAULT_TIME,
TimerState.Idle,
false,
context.getDefaultAlarmSound(RingtoneManager.TYPE_ALARM).uri,
context.getDefaultAlarmTitle(RingtoneManager.TYPE_ALARM),
"",
DEFAULT_MAX_TIMER_REMINDER_SECS.toString())
System.currentTimeMillis(),
)
)
callback.invoke()

View File

@ -9,7 +9,7 @@ import com.simplemobiletools.clock.models.Timer
@Dao
interface TimerDao {
@Query("SELECT * FROM timers")
@Query("SELECT * FROM timers ORDER BY createdAt DESC")
fun getTimers(): List<Timer>
@Query("SELECT * FROM timers WHERE id=:id")

View File

@ -12,5 +12,5 @@ data class Timer(
val soundUri: String,
val soundTitle: String,
val label: String,
val maxReminderSecs: String,
val createdAt: Long,
)

View File

@ -12,11 +12,15 @@ import android.os.IBinder
import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat
import com.simplemobiletools.clock.R
import com.simplemobiletools.clock.extensions.config
import com.simplemobiletools.clock.extensions.getFormattedDuration
import com.simplemobiletools.clock.extensions.getOpenTimerTabIntent
import com.simplemobiletools.clock.extensions.timerHelper
import com.simplemobiletools.clock.helpers.TIMER_RUNNING_NOTIF_ID
import com.simplemobiletools.clock.models.TimerEvent
import com.simplemobiletools.clock.models.TimerState
import com.simplemobiletools.commons.extensions.getFormattedDuration
import com.simplemobiletools.commons.helpers.isOreoPlus
import kotlin.math.roundToInt
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@ -34,18 +38,43 @@ class TimerService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)
val formattedDuration = config.timerSeconds.getFormattedDuration()
startForeground(TIMER_RUNNING_NOTIF_ID, notification(formattedDuration))
updateNotification()
startForeground(TIMER_RUNNING_NOTIF_ID, notification(getString(R.string.app_name), getString(R.string.timer_notification_msg), -1))
return START_NOT_STICKY
}
private fun updateNotification() {
timerHelper.getTimers { timers ->
val runningTimers = timers.filter { it.state is TimerState.Running }
if (runningTimers.isNotEmpty()) {
val firstTimer = runningTimers.first()
val formattedDuration = (firstTimer.state as TimerState.Running).tick.getFormattedDuration()
val contextText = when {
runningTimers.size > 1 -> {
getString(R.string.timer_multiple_notification_msg, runningTimers.size)
}
firstTimer.label.isNotEmpty() -> {
getString(R.string.timer_single_notification_label_msg, firstTimer.label)
}
else -> {
getString(R.string.timer_single_notification_msg, runningTimers.size)
}
}
startForeground(TIMER_RUNNING_NOTIF_ID, notification(formattedDuration, contextText, firstTimer.id!!))
}
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: TimerStopService) {
stopService()
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: TimerEvent.Refresh) {
updateNotification()
}
private fun stopService() {
if (isOreoPlus()) {
stopForeground(true)
@ -60,7 +89,7 @@ class TimerService : Service() {
}
@TargetApi(Build.VERSION_CODES.O)
private fun notification(formattedDuration: String): Notification {
private fun notification(title: String, contentText: String, firstRunningTimerId: Long): Notification {
val channelId = "simple_alarm_timer"
val label = getString(R.string.timer)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
@ -73,16 +102,19 @@ class TimerService : Service() {
}
val builder = NotificationCompat.Builder(this)
.setContentTitle(label)
.setContentText(formattedDuration)
.setContentTitle(title)
.setContentText(contentText)
.setSmallIcon(R.drawable.ic_timer)
.setContentIntent(this.getOpenTimerTabIntent(0))
.setPriority(Notification.PRIORITY_DEFAULT)
.setSound(null)
.setOngoing(true)
.setAutoCancel(true)
.setChannelId(channelId)
if (firstRunningTimerId != -1L) {
builder.setContentIntent(this.getOpenTimerTabIntent(firstRunningTimerId))
}
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
return builder.build()
}

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Saat bölməsi</string>
<string name="alarm_tab">Siqnal bölməsi</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Záložka hodin</string>
<string name="alarm_tab">Záložka budíku</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Tab cloc</string>
<string name="alarm_tab">Tab larwm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Ur</string>
<string name="alarm_tab">Alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Uhr</string>
<string name="alarm_tab">Wecker</string>

View File

@ -18,6 +18,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Ετικέτα Ρολογιού</string>
<string name="alarm_tab">Ετικέτα Αφύπνισης</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Pestaña de reloj</string>
<string name="alarm_tab">Pestaña de alarma</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Erloju fitxa</string>
<string name="alarm_tab">Alarma fitxa</string>

View File

@ -16,6 +16,12 @@
<string name="swipe_right_to_dismiss">Pyyhkäise oikealle sammuttaaksesi tai vasemmalle torkuttaaksesi.</string>
<string name="sort_by_creation_order">Luontijärjestys</string>
<string name="sort_by_alarm_time">Herätysaika</string>
 
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
 
<!-- Settings -->
<string name="clock_tab">Kello-välilehti</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Horloge</string>
<string name="alarm_tab">Réveil</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Kartica sata</string>
<string name="alarm_tab">Kartica alarma</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Tab jam</string>
<string name="alarm_tab">Tab alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Tab jam</string>
<string name="alarm_tab">Tab alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Scheda orologio</string>
<string name="alarm_tab">Scheda sveglia</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">時計</string>
<string name="alarm_tab">アラーム</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Laikrodžio skirtukas</string>
<string name="alarm_tab">Žadintuvo skirtukas</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">ക്ലോക്ക് ടാബ്</string>
<string name="alarm_tab">അലാറം ടാബ്</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Klokke</string>
<string name="alarm_tab">Alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Aanmaakvolgorde</string>
<string name="sort_by_alarm_time">Alarmtijd</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Tab Klok</string>
<string name="alarm_tab">Tab Alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Zegar</string>
<string name="alarm_tab">Alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Relógio</string>
<string name="alarm_tab">Alarme</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Часы</string>
<string name="alarm_tab">Будильник</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Poradia vytvorenia</string>
<string name="sort_by_alarm_time">Času budíka</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Okno s časom</string>
<string name="alarm_tab">Okno s budíkom</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Fliken Klocka</string>
<string name="alarm_tab">Fliken Alarm</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Saat sekmesi</string>
<string name="alarm_tab">Alarm sekmesi</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Годинник</string>
<string name="alarm_tab">Будильник</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">时钟页面</string>
<string name="alarm_tab">闹钟页面</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">時鐘頁面</string>
<string name="alarm_tab">鬧鐘頁面</string>

View File

@ -17,6 +17,12 @@
<string name="sort_by_creation_order">Creation order</string>
<string name="sort_by_alarm_time">Alarm time</string>
<!--Timer-->
<string name="timer_notification_msg">Timers are running</string>
<string name="timer_multiple_notification_msg">%d timers are running</string>
<string name="timer_single_notification_label_msg">Timer for %s is running</string>
<string name="timer_single_notification_msg">%d timer is running</string>
<!-- Settings -->
<string name="clock_tab">Clock tab</string>
<string name="alarm_tab">Alarm tab</string>