mirror of
https://github.com/SimpleMobileTools/Simple-Clock.git
synced 2025-04-25 07:28:47 +02:00
trigger some reminders when the Timer expires
This commit is contained in:
parent
a21ba3852c
commit
49937ede5c
@ -25,7 +25,9 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name=".activities.MainActivity"/>
|
<activity
|
||||||
|
android:name=".activities.MainActivity"
|
||||||
|
android:launchMode="singleTop"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.SettingsActivity"
|
android:name=".activities.SettingsActivity"
|
||||||
@ -60,6 +62,8 @@
|
|||||||
|
|
||||||
<receiver android:name=".receivers.AlarmReceiver"/>
|
<receiver android:name=".receivers.AlarmReceiver"/>
|
||||||
|
|
||||||
|
<receiver android:name=".receivers.TimerReceiver"/>
|
||||||
|
|
||||||
<receiver android:name=".receivers.BootCompletedReceiver">
|
<receiver android:name=".receivers.BootCompletedReceiver">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
||||||
|
@ -2,6 +2,7 @@ package com.simplemobiletools.clock.dialogs
|
|||||||
|
|
||||||
import android.app.TimePickerDialog
|
import android.app.TimePickerDialog
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.media.AudioManager
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import com.simplemobiletools.clock.R
|
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.colorLeftDrawable(textColor)
|
||||||
edit_alarm_sound.text = alarm.soundTitle
|
edit_alarm_sound.text = alarm.soundTitle
|
||||||
edit_alarm_sound.setOnClickListener {
|
edit_alarm_sound.setOnClickListener {
|
||||||
SelectAlarmSoundDialog(activity, alarm.soundUri) {
|
SelectAlarmSoundDialog(activity, alarm.soundUri, AudioManager.STREAM_ALARM) {
|
||||||
alarm.soundTitle = it.title
|
alarm.soundTitle = it.title
|
||||||
alarm.soundUri = it.uri
|
alarm.soundUri = it.uri
|
||||||
edit_alarm_sound.text = it.title
|
edit_alarm_sound.text = it.title
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.simplemobiletools.clock.dialogs
|
package com.simplemobiletools.clock.dialogs
|
||||||
|
|
||||||
import android.media.AudioManager
|
|
||||||
import android.media.MediaPlayer
|
import android.media.MediaPlayer
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.support.v7.app.AlertDialog
|
import android.support.v7.app.AlertDialog
|
||||||
@ -14,7 +13,7 @@ import com.simplemobiletools.clock.models.AlarmSound
|
|||||||
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
||||||
import kotlinx.android.synthetic.main.dialog_select_alarm_sound.view.*
|
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 view = activity.layoutInflater.inflate(R.layout.dialog_select_alarm_sound, null)
|
||||||
private val alarms = activity.getAlarms()
|
private val alarms = activity.getAlarms()
|
||||||
private var mediaPlayer = MediaPlayer()
|
private var mediaPlayer = MediaPlayer()
|
||||||
@ -29,7 +28,7 @@ class SelectAlarmSoundDialog(val activity: SimpleActivity, val currentUri: Strin
|
|||||||
setOnClickListener {
|
setOnClickListener {
|
||||||
mediaPlayer.stop()
|
mediaPlayer.stop()
|
||||||
mediaPlayer = MediaPlayer().apply {
|
mediaPlayer = MediaPlayer().apply {
|
||||||
setAudioStreamType(AudioManager.STREAM_ALARM)
|
setAudioStreamType(audioStream)
|
||||||
setDataSource(context, Uri.parse(alarmSound.uri))
|
setDataSource(context, Uri.parse(alarmSound.uri))
|
||||||
prepare()
|
prepare()
|
||||||
start()
|
start()
|
||||||
@ -47,7 +46,7 @@ class SelectAlarmSoundDialog(val activity: SimpleActivity, val currentUri: Strin
|
|||||||
.setNegativeButton(R.string.cancel, null)
|
.setNegativeButton(R.string.cancel, null)
|
||||||
.create().apply {
|
.create().apply {
|
||||||
activity.setupDialogStuff(view, this)
|
activity.setupDialogStuff(view, this)
|
||||||
window.volumeControlStream = AudioManager.STREAM_ALARM
|
window.volumeControlStream = audioStream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,20 +1,35 @@
|
|||||||
package com.simplemobiletools.clock.fragments
|
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.graphics.Color
|
||||||
|
import android.media.AudioManager
|
||||||
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import android.support.v4.app.Fragment
|
import android.support.v4.app.Fragment
|
||||||
|
import android.support.v4.app.NotificationCompat
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.simplemobiletools.clock.R
|
import com.simplemobiletools.clock.R
|
||||||
|
import com.simplemobiletools.clock.activities.MainActivity
|
||||||
import com.simplemobiletools.clock.activities.SimpleActivity
|
import com.simplemobiletools.clock.activities.SimpleActivity
|
||||||
import com.simplemobiletools.clock.dialogs.MyTimePickerDialogDialog
|
import com.simplemobiletools.clock.dialogs.MyTimePickerDialogDialog
|
||||||
import com.simplemobiletools.clock.dialogs.SelectAlarmSoundDialog
|
import com.simplemobiletools.clock.dialogs.SelectAlarmSoundDialog
|
||||||
import com.simplemobiletools.clock.extensions.colorLeftDrawable
|
import com.simplemobiletools.clock.extensions.colorLeftDrawable
|
||||||
import com.simplemobiletools.clock.extensions.config
|
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.extensions.*
|
||||||
|
import com.simplemobiletools.commons.helpers.isLollipopPlus
|
||||||
|
import com.simplemobiletools.commons.helpers.isOreoPlus
|
||||||
import kotlinx.android.synthetic.main.fragment_timer.view.*
|
import kotlinx.android.synthetic.main.fragment_timer.view.*
|
||||||
|
|
||||||
class TimerFragment : Fragment() {
|
class TimerFragment : Fragment() {
|
||||||
@ -60,7 +75,7 @@ class TimerFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
timer_sound.setOnClickListener {
|
timer_sound.setOnClickListener {
|
||||||
SelectAlarmSoundDialog(activity as SimpleActivity, config.timerSoundUri) {
|
SelectAlarmSoundDialog(activity as SimpleActivity, config.timerSoundUri, AudioManager.STREAM_SYSTEM) {
|
||||||
config.timerSoundTitle = it.title
|
config.timerSoundTitle = it.title
|
||||||
config.timerSoundUri = it.uri
|
config.timerSoundUri = it.uri
|
||||||
timer_sound.text = it.title
|
timer_sound.text = it.title
|
||||||
@ -150,10 +165,62 @@ class TimerFragment : Fragment() {
|
|||||||
|
|
||||||
view.timer_time.text = formattedDuration
|
view.timer_time.text = formattedDuration
|
||||||
if (diff == 0) {
|
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 {
|
private val updateRunnable = object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
if (isRunning) {
|
if (isRunning) {
|
||||||
|
@ -17,6 +17,7 @@ const val EDITED_TIME_ZONE_SEPARATOR = ":"
|
|||||||
const val ALARM_ID = "alarm_id"
|
const val ALARM_ID = "alarm_id"
|
||||||
const val DEFAULT_ALARM_MINUTES = 480
|
const val DEFAULT_ALARM_MINUTES = 480
|
||||||
const val DAY_MINUTES = 1440
|
const val DAY_MINUTES = 1440
|
||||||
|
const val TIMER_NOTIF_ID = 9999
|
||||||
|
|
||||||
const val SORT_BY_LAP = 1
|
const val SORT_BY_LAP = 1
|
||||||
const val SORT_BY_LAP_TIME = 2
|
const val SORT_BY_LAP_TIME = 2
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -6,9 +6,12 @@
|
|||||||
<string name="label">Label</string>
|
<string name="label">Label</string>
|
||||||
<string name="no_days_selected">No days selected</string>
|
<string name="no_days_selected">No days selected</string>
|
||||||
<string name="alarm">Alarm</string>
|
<string name="alarm">Alarm</string>
|
||||||
|
<string name="timer">Timer</string>
|
||||||
<string name="lap">Lap</string>
|
<string name="lap">Lap</string>
|
||||||
<string name="stopwatch_stopped">Stopwatch has been stopped</string>
|
<string name="stopwatch_stopped">Stopwatch has been stopped</string>
|
||||||
<string name="timer_stopped">Timer has been stopped</string>
|
<string name="timer_stopped">Timer has been stopped</string>
|
||||||
|
<string name="max_reminder_length">Max reminder length</string>
|
||||||
|
<string name="time_expired">Time expired</string>
|
||||||
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="clock_tab">Relógio</string>
|
<string name="clock_tab">Relógio</string>
|
||||||
|
@ -6,9 +6,12 @@
|
|||||||
<string name="label">Štítok</string>
|
<string name="label">Štítok</string>
|
||||||
<string name="no_days_selected">Neboli označené žiadne dni</string>
|
<string name="no_days_selected">Neboli označené žiadne dni</string>
|
||||||
<string name="alarm">Budík</string>
|
<string name="alarm">Budík</string>
|
||||||
|
<string name="timer">Časovač</string>
|
||||||
<string name="lap">Okruh</string>
|
<string name="lap">Okruh</string>
|
||||||
<string name="stopwatch_stopped">Stopky boli zastavené</string>
|
<string name="stopwatch_stopped">Stopky boli zastavené</string>
|
||||||
<string name="timer_stopped">Časovač bol zastavený</string>
|
<string name="timer_stopped">Časovač bol zastavený</string>
|
||||||
|
<string name="max_reminder_length">Maximálna dĺžka upozorňovania</string>
|
||||||
|
<string name="time_expired">Čas vypršal</string>
|
||||||
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="clock_tab">Okno s časom</string>
|
<string name="clock_tab">Okno s časom</string>
|
||||||
|
@ -6,9 +6,12 @@
|
|||||||
<string name="label">Label</string>
|
<string name="label">Label</string>
|
||||||
<string name="no_days_selected">No days selected</string>
|
<string name="no_days_selected">No days selected</string>
|
||||||
<string name="alarm">Alarm</string>
|
<string name="alarm">Alarm</string>
|
||||||
|
<string name="timer">Timer</string>
|
||||||
<string name="lap">Lap</string>
|
<string name="lap">Lap</string>
|
||||||
<string name="stopwatch_stopped">Stopwatch has been stopped</string>
|
<string name="stopwatch_stopped">Stopwatch has been stopped</string>
|
||||||
<string name="timer_stopped">Timer has been stopped</string>
|
<string name="timer_stopped">Timer has been stopped</string>
|
||||||
|
<string name="max_reminder_length">Max reminder length</string>
|
||||||
|
<string name="time_expired">Time expired</string>
|
||||||
|
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<string name="clock_tab">Clock tab</string>
|
<string name="clock_tab">Clock tab</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user