From 49937ede5c12e2bb2e44efc926038a4b35221db2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 11 Mar 2018 11:17:19 +0100 Subject: [PATCH] trigger some reminders when the Timer expires --- app/src/main/AndroidManifest.xml | 6 +- .../clock/dialogs/EditAlarmDialog.kt | 3 +- .../clock/dialogs/SelectAlarmSoundDialog.kt | 7 +- .../clock/fragments/TimerFragment.kt | 71 ++++++++++++++++++- .../clock/helpers/Constants.kt | 1 + .../clock/receivers/TimerReceiver.kt | 13 ++++ app/src/main/res/values-pt/strings.xml | 3 + app/src/main/res/values-sk/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + 9 files changed, 102 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/clock/receivers/TimerReceiver.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b8915816..88dd0f30 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,7 +25,9 @@ - + + + diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/EditAlarmDialog.kt b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/EditAlarmDialog.kt index 0d58e55e..a998147c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/EditAlarmDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/EditAlarmDialog.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.clock.dialogs import android.app.TimePickerDialog import android.graphics.drawable.Drawable +import android.media.AudioManager import android.support.v7.app.AlertDialog import android.widget.TextView import com.simplemobiletools.clock.R @@ -29,7 +30,7 @@ class EditAlarmDialog(val activity: SimpleActivity, val alarm: Alarm, val callba edit_alarm_sound.colorLeftDrawable(textColor) edit_alarm_sound.text = alarm.soundTitle edit_alarm_sound.setOnClickListener { - SelectAlarmSoundDialog(activity, alarm.soundUri) { + SelectAlarmSoundDialog(activity, alarm.soundUri, AudioManager.STREAM_ALARM) { alarm.soundTitle = it.title alarm.soundUri = it.uri edit_alarm_sound.text = it.title diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/SelectAlarmSoundDialog.kt b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/SelectAlarmSoundDialog.kt index afa771d1..5dc4c4fa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/SelectAlarmSoundDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/SelectAlarmSoundDialog.kt @@ -1,6 +1,5 @@ package com.simplemobiletools.clock.dialogs -import android.media.AudioManager import android.media.MediaPlayer import android.net.Uri import android.support.v7.app.AlertDialog @@ -14,7 +13,7 @@ import com.simplemobiletools.clock.models.AlarmSound import com.simplemobiletools.commons.extensions.setupDialogStuff import kotlinx.android.synthetic.main.dialog_select_alarm_sound.view.* -class SelectAlarmSoundDialog(val activity: SimpleActivity, val currentUri: String, val callback: (alarmSound: AlarmSound) -> Unit) { +class SelectAlarmSoundDialog(val activity: SimpleActivity, val currentUri: String, val audioStream: Int, val callback: (alarmSound: AlarmSound) -> Unit) { private val view = activity.layoutInflater.inflate(R.layout.dialog_select_alarm_sound, null) private val alarms = activity.getAlarms() private var mediaPlayer = MediaPlayer() @@ -29,7 +28,7 @@ class SelectAlarmSoundDialog(val activity: SimpleActivity, val currentUri: Strin setOnClickListener { mediaPlayer.stop() mediaPlayer = MediaPlayer().apply { - setAudioStreamType(AudioManager.STREAM_ALARM) + setAudioStreamType(audioStream) setDataSource(context, Uri.parse(alarmSound.uri)) prepare() start() @@ -47,7 +46,7 @@ class SelectAlarmSoundDialog(val activity: SimpleActivity, val currentUri: Strin .setNegativeButton(R.string.cancel, null) .create().apply { activity.setupDialogStuff(view, this) - window.volumeControlStream = AudioManager.STREAM_ALARM + window.volumeControlStream = audioStream } } diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt index 2489a22c..2e5efaf7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/TimerFragment.kt @@ -1,20 +1,35 @@ package com.simplemobiletools.clock.fragments +import android.annotation.SuppressLint +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.content.Context +import android.content.Intent import android.graphics.Color +import android.media.AudioManager +import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.SystemClock import android.support.v4.app.Fragment +import android.support.v4.app.NotificationCompat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.activities.MainActivity import com.simplemobiletools.clock.activities.SimpleActivity import com.simplemobiletools.clock.dialogs.MyTimePickerDialogDialog import com.simplemobiletools.clock.dialogs.SelectAlarmSoundDialog import com.simplemobiletools.clock.extensions.colorLeftDrawable import com.simplemobiletools.clock.extensions.config +import com.simplemobiletools.clock.helpers.TIMER_NOTIF_ID +import com.simplemobiletools.clock.receivers.TimerReceiver import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.isLollipopPlus +import com.simplemobiletools.commons.helpers.isOreoPlus import kotlinx.android.synthetic.main.fragment_timer.view.* class TimerFragment : Fragment() { @@ -60,7 +75,7 @@ class TimerFragment : Fragment() { } timer_sound.setOnClickListener { - SelectAlarmSoundDialog(activity as SimpleActivity, config.timerSoundUri) { + SelectAlarmSoundDialog(activity as SimpleActivity, config.timerSoundUri, AudioManager.STREAM_SYSTEM) { config.timerSoundTitle = it.title config.timerSoundUri = it.uri timer_sound.text = it.title @@ -150,10 +165,62 @@ class TimerFragment : Fragment() { view.timer_time.text = formattedDuration if (diff == 0) { - + val pendingIntent = getNotificationClickIntent(context!!) + val notification = getNotification(context!!, pendingIntent) + val notificationManager = context!!.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.notify(TIMER_NOTIF_ID, notification) } } + @SuppressLint("NewApi") + private fun getNotification(context: Context, pendingIntent: PendingIntent): Notification { + val channelId = "timer_channel" + if (isOreoPlus()) { + val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + val name = context.resources.getString(R.string.timer) + val importance = NotificationManager.IMPORTANCE_HIGH + NotificationChannel(channelId, name, importance).apply { + enableLights(true) + lightColor = context.getAdjustedPrimaryColor() + enableVibration(context.config.timerVibrate) + notificationManager.createNotificationChannel(this) + } + } + + val builder = NotificationCompat.Builder(context) + .setContentTitle(context.getString(R.string.timer)) + .setContentText(context.getString(R.string.time_expired)) + .setSmallIcon(R.drawable.ic_timer) + .setContentIntent(pendingIntent) + .setPriority(Notification.PRIORITY_HIGH) + .setDefaults(Notification.DEFAULT_LIGHTS) + .setAutoCancel(true) + .setSound(Uri.parse(context.config.timerSoundUri), AudioManager.STREAM_SYSTEM) + .setChannelId(channelId) + .addAction(R.drawable.ic_cross, context.getString(R.string.dismiss), getTimerPendingIntent(context)) + + if (isLollipopPlus()) { + builder.setVisibility(Notification.VISIBILITY_PUBLIC) + } + + if (context.config.timerVibrate) { + val vibrateArray = LongArray(120) { 500 } + builder.setVibrate(vibrateArray) + } + + return builder.build() + } + + private fun getTimerPendingIntent(context: Context): PendingIntent { + val intent = Intent(context, TimerReceiver::class.java) + return PendingIntent.getBroadcast(context, TIMER_NOTIF_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) + } + + private fun getNotificationClickIntent(context: Context): PendingIntent { + val intent = Intent(context, MainActivity::class.java) + return PendingIntent.getActivity(context, TIMER_NOTIF_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) + } + private val updateRunnable = object : Runnable { override fun run() { if (isRunning) { 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 52f69ca8..e772f848 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt @@ -17,6 +17,7 @@ const val EDITED_TIME_ZONE_SEPARATOR = ":" const val ALARM_ID = "alarm_id" const val DEFAULT_ALARM_MINUTES = 480 const val DAY_MINUTES = 1440 +const val TIMER_NOTIF_ID = 9999 const val SORT_BY_LAP = 1 const val SORT_BY_LAP_TIME = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/receivers/TimerReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/clock/receivers/TimerReceiver.kt new file mode 100644 index 00000000..b066cbca --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/receivers/TimerReceiver.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.clock.receivers + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.simplemobiletools.clock.extensions.hideNotification +import com.simplemobiletools.clock.helpers.TIMER_NOTIF_ID + +class TimerReceiver : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + context.hideNotification(TIMER_NOTIF_ID) + } +} diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 49d1407c..eb853209 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -6,9 +6,12 @@ Label No days selected Alarm + Timer Lap Stopwatch has been stopped Timer has been stopped + Max reminder length + Time expired Relógio diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 2379aa36..15a31c18 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -6,9 +6,12 @@ Štítok Neboli označené žiadne dni Budík + Časovač Okruh Stopky boli zastavené Časovač bol zastavený + Maximálna dĺžka upozorňovania + Čas vypršal Okno s časom diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df40e31c..42cf145e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,9 +6,12 @@ Label No days selected Alarm + Timer Lap Stopwatch has been stopped Timer has been stopped + Max reminder length + Time expired Clock tab