diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 62f5a052..2a620c05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -100,6 +100,8 @@ + + diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/App.kt b/app/src/main/kotlin/com/simplemobiletools/clock/App.kt index 28c692e2..4a97278e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/App.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/App.kt @@ -12,9 +12,13 @@ import androidx.lifecycle.OnLifecycleEvent import androidx.lifecycle.ProcessLifecycleOwner import com.facebook.stetho.Stetho import com.simplemobiletools.clock.extensions.* +import com.simplemobiletools.clock.helpers.Stopwatch +import com.simplemobiletools.clock.helpers.Stopwatch.State import com.simplemobiletools.clock.models.TimerEvent import com.simplemobiletools.clock.models.TimerState +import com.simplemobiletools.clock.services.StopwatchStopService import com.simplemobiletools.clock.services.TimerStopService +import com.simplemobiletools.clock.services.startStopwatchService import com.simplemobiletools.clock.services.startTimerService import com.simplemobiletools.commons.extensions.checkUseEnglish import org.greenrobot.eventbus.EventBus @@ -49,6 +53,9 @@ class App : Application(), LifecycleObserver { startTimerService(this) } } + if (Stopwatch.state == State.RUNNING) { + startStopwatchService(this) + } } @OnLifecycleEvent(Lifecycle.Event.ON_START) @@ -62,6 +69,9 @@ class App : Application(), LifecycleObserver { } } } + if (Stopwatch.state == State.RUNNING) { + EventBus.getDefault().post(StopwatchStopService) + } } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt index c5b58b33..2f521c72 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt @@ -159,6 +159,12 @@ fun Context.getOpenTimerTabIntent(timerId: Int): PendingIntent { return PendingIntent.getActivity(this, timerId, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) } +fun Context.getOpenStopwatchTabIntent(): PendingIntent { + val intent = getLaunchIntent() ?: Intent(this, SplashActivity::class.java) + intent.putExtra(OPEN_TAB, TAB_STOPWATCH) + return PendingIntent.getActivity(this, OPEN_STOPWATCH_TAB_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) +} + fun Context.getAlarmIntent(alarm: Alarm): PendingIntent { val intent = Intent(this, AlarmReceiver::class.java) intent.putExtra(ALARM_ID, alarm.id) diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt index 9ae1035f..aed5b533 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt @@ -34,10 +34,12 @@ const val DEFAULT_MAX_TIMER_REMINDER_SECS = 60 const val PICK_AUDIO_FILE_INTENT_ID = 9994 const val REMINDER_ACTIVITY_INTENT_ID = 9995 const val OPEN_ALARMS_TAB_INTENT_ID = 9996 +const val OPEN_STOPWATCH_TAB_INTENT_ID = 9993 const val UPDATE_WIDGET_INTENT_ID = 9997 const val OPEN_APP_INTENT_ID = 9998 const val ALARM_NOTIF_ID = 9998 const val TIMER_RUNNING_NOTIF_ID = 10000 +const val STOPWATCH_RUNNING_NOTIF_ID = 10001 const val OPEN_TAB = "open_tab" const val TAB_CLOCK = 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/services/StopwatchService.kt b/app/src/main/kotlin/com/simplemobiletools/clock/services/StopwatchService.kt new file mode 100644 index 00000000..19615c1c --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/services/StopwatchService.kt @@ -0,0 +1,116 @@ +package com.simplemobiletools.clock.services + +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Context +import android.content.Intent +import android.os.IBinder +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.extensions.getFormattedDuration +import com.simplemobiletools.clock.extensions.getOpenStopwatchTabIntent +import com.simplemobiletools.clock.helpers.STOPWATCH_RUNNING_NOTIF_ID +import com.simplemobiletools.clock.helpers.Stopwatch +import com.simplemobiletools.clock.helpers.Stopwatch.State +import com.simplemobiletools.clock.helpers.Stopwatch.UpdateListener +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class StopwatchService : Service() { + + private val bus = EventBus.getDefault() + private lateinit var notificationManager: NotificationManager + private lateinit var notificationBuilder: NotificationCompat.Builder + private var isStopping = false + + override fun onCreate() { + super.onCreate() + bus.register(this) + notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationBuilder = getServiceNotificationBuilder( + getString(R.string.app_name), + getString(R.string.stopwatch) + ) + } + + override fun onBind(intent: Intent?): IBinder? = null + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + super.onStartCommand(intent, flags, startId) + isStopping = false + startForeground( + STOPWATCH_RUNNING_NOTIF_ID, + notificationBuilder.build() + ) + Stopwatch.addUpdateListener(updateListener) + return START_NOT_STICKY + } + + override fun onDestroy() { + super.onDestroy() + bus.unregister(this) + Stopwatch.removeUpdateListener(updateListener) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: StopwatchStopService) { + isStopping = true + stopForeground(true) + } + + private fun getServiceNotificationBuilder( + title: String, + contentText: String + ): NotificationCompat.Builder { + val channelId = "simple_alarm_stopwatch" + val label = getString(R.string.stopwatch) + val importance = NotificationManager.IMPORTANCE_DEFAULT + NotificationChannel(channelId, label, importance).apply { + setSound(null, null) + notificationManager.createNotificationChannel(this) + } + return NotificationCompat.Builder(this, channelId) + .setContentTitle(title) + .setContentText(contentText) + .setSmallIcon(R.drawable.ic_stopwatch_vector) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setSound(null) + .setOngoing(true) + .setAutoCancel(true) + .setContentIntent(getOpenStopwatchTabIntent()) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + } + + private fun updateNotification(totalTime: Long) { + val formattedDuration = totalTime.getFormattedDuration() + notificationBuilder.setContentTitle(formattedDuration) + .setContentText(getString(R.string.stopwatch)) + notificationManager.notify( + STOPWATCH_RUNNING_NOTIF_ID, + notificationBuilder.build() + ) + } + + private val updateListener = object : UpdateListener { + override fun onUpdate(totalTime: Long, lapTime: Long, useLongerMSFormat: Boolean) { + if (!isStopping) { + updateNotification(totalTime) + } + } + + override fun onStateChanged(state: State) { + if (state == State.STOPPED) { + stopForeground(STOP_FOREGROUND_REMOVE) + } + } + } +} + +fun startStopwatchService(context: Context) { + ContextCompat.startForegroundService(context, Intent(context, StopwatchService::class.java)) +} + +object StopwatchStopService diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index b33af9f8..c94b2769 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -6,6 +6,7 @@ Etiket Gün seçilməyib Sayğac + Stopwatch Dövrə Saniyəölçən dayandı Sayğaç dayandı diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 611df770..a9a6e281 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -6,6 +6,7 @@ Štítek Nebyly označeny žádné dny Časovač + Stopwatch Mezičas Stopky byly zastaveny Časovač byl zastaven diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 4242b4bb..d428573e 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -6,6 +6,7 @@ Label Dim diwrnodau wedi\'u dewis Amserydd + Stopwatch Lap Cafodd y stopwats ei stopio Cafodd yr amserydd ei stopio diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index a182c237..7051e8a1 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -6,6 +6,7 @@ Etiket Der er ikke valgt nogen dage Æggeur + Stopwatch Mellemtid Stopuret er standset Æggeuret er standset diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 468ceceb..ae54f537 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -7,6 +7,7 @@ Label Keine Tage ausgewählt Timer + Stopwatch Runde Die Stoppuhr wurde angehalten Der Timer wurde angehalten @@ -47,4 +48,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f57f2a55..1a7556c1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -7,6 +7,7 @@ Ετικέτα Δεν έχουν επιλεγεί ημέρες Χρονόμετρο + Stopwatch Γύρος Ο χρονοδιακόπτης σταμάτησε Το χρονόμετρο σταμάτησε diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index c54bdec9..20cf8ba1 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -6,6 +6,7 @@ Etiqueta Ningún día seleccionado Temporizador + Stopwatch Vuelta El cronómetro s eha detenido El temporizador se ha detenido diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index c49eeb09..ebe1ef1a 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -7,6 +7,7 @@ Silt Ühtegi päeva pole valitud Taimer + Stopwatch Ringi aeg Stopper on kinni Taimer on peatunud diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 5a5255c5..e6a50184 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -6,6 +6,7 @@ Etiketa Ez duzu egunik hautatu Tenporizagailua + Stopwatch Bira Kronometroa gelditu da Tenporizagailua gelditu da diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 0ba0a200..53453fbe 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -6,6 +6,7 @@ Tunniste Ei päiviä valittuna Ajastin + Stopwatch Kierrosaika Sekuntikello pysäytetty Ajastin on pysäytetty diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index fe45eb0c..b5ac3128 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -7,6 +7,7 @@ Titre Aucun jour sélectionné Minuterie + Stopwatch Tour Chronomètre arrêté La minuterie a été arrêtée @@ -47,4 +48,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 94411e2e..d23cd5eb 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -7,6 +7,7 @@ Etiqueta Ningún día seleccionado Temporizador + Stopwatch Volta Cronómetro parado Temporizador parado diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 463117ad..7e65c687 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -6,6 +6,7 @@ Oznaka Nije odabran nijedan dan Brojač + Stopwatch Krug Štoperica je zaustavljena Brojač je zaustavljen diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 8585c077..6103c582 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -6,6 +6,7 @@ Címke Nincs nap kiválasztva Időzítő + Stopwatch Kör A stopper leállt Az időzítő leállt diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 341df767..bf440177 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -6,6 +6,7 @@ Label Tidak ada hari yang dipilih Timer + Stopwatch Putaran Stopwatch telah berhenti Timer telah berhenti diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7a2f0ff9..2b28c3d1 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -7,6 +7,7 @@ Etichetta Nessun giorno selezionato Contaminuti + Stopwatch Parziale Il cronometro è stato fermato Il contaminuti è stato fermato @@ -68,4 +69,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e075b56b..6787259f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -6,6 +6,7 @@ ラベル 曜日が選択されていません タイマー + Stopwatch ラップ ストップウォッチが停止しました タイマーが停止しました diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bd430873..bed92dbf 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -6,6 +6,7 @@ Etiketė Nepasirinkta nė vienos dienos Laikmatis + Stopwatch Etapas Chronometras buvo sustabdytas Laikmatis buvo sustabdytas diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index b387a8a0..e7bee390 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -6,6 +6,7 @@ അടിക്കുറിപ്പ് ദിവസങ്ങളൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല ടൈമർ + Stopwatch ലാപ്‌ Stopwatch has been stopped സ്റ്റോപ്പ് വാച്ച് നിർത്തി diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index ec01888c..fdd1a72d 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -6,6 +6,7 @@ Påskrift Ingen dager valgte Timer + Stopwatch Runde Stoppeklokke er stoppet Timer er stoppet diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 0a09122e..d598ad26 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -6,6 +6,7 @@ Label Geen dagen geselecteerd Timer + Stopwatch Ronde Stopwatch is gestopt Timer is gestopt diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d8a3a4f5..9cf4a979 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -7,6 +7,7 @@ Etykieta Nie wybrano dni Minutnik + Stopwatch Okrążenie Stoper został zatrzymany Minutnik został zatrzymany @@ -49,4 +50,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 55723c58..c4659f7a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -6,6 +6,7 @@ Legenda Nenhum dia selecionado Temporizador + Stopwatch Volta Cronómetro parado Temporizador parado diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c49105f3..f90d63ab 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -6,6 +6,7 @@ Etichetă Nici o zi selectată Temporizator + Stopwatch O tură Cronometrul a fost oprit Temporizatorul a fost oprit diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b680eeaa..2080c00f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -7,6 +7,7 @@ Метка Дни не выбраны Таймер + Секундомер Круг Секундомер остановлен Таймер остановлен diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e35f1851..6d753d16 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -6,6 +6,7 @@ Štítok Neboli označené žiadne dni Časovač + Stopwatch Okruh Stopky boli zastavené Časovač bol zastavený diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 742ec096..593937fa 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -7,6 +7,7 @@ Etikett Inga dagar har valts Timer + Stopwatch Varv Stoppuret har stoppats Timern har stoppats @@ -70,4 +71,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7d596d0b..534fa606 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -7,6 +7,7 @@ Etiket Hiçbir gün seçilmedi Zamanlayıcı + Stopwatch Tur Kronometre durduruldu Zamanlayıcı durduruldu @@ -70,4 +71,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 15236698..d3cbf20a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -6,6 +6,7 @@ Мітка Дні не обрано Таймер + Секундомір Інтервал Секундомір зупинено Таймер зупинено diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 63c319cb..a0bc5931 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -7,6 +7,7 @@ 标签 未选择哪一天 定时器 + Stopwatch 分段 秒表已停止 定时器已停止 @@ -69,4 +70,4 @@ Haven't found some strings? There's more at https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res --> - \ No newline at end of file + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2c1dcd52..de949af8 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -6,6 +6,7 @@ 標籤 未選擇哪一天 計時器 + Stopwatch 分段 碼錶已停止 計時器已停止 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1d3bd959..078e1f83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ Label No days selected Timer + Stopwatch Lap Stopwatch has been stopped Timer has been stopped