fixed alarm and sleep intents - cancel correctly, don't restart service

remotes/origin/devel
yattoz 2019-12-30 23:08:47 +01:00
parent f8209f2127
commit c77ca30e46
3 changed files with 50 additions and 41 deletions

View File

@ -32,7 +32,6 @@ import androidx.media.AudioManagerCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.google.android.exoplayer2.* import com.google.android.exoplayer2.*
import com.google.android.exoplayer2.metadata.icy.* import com.google.android.exoplayer2.metadata.icy.*
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import fr.forum_thalie.tsumugi.alarm.RadioAlarm import fr.forum_thalie.tsumugi.alarm.RadioAlarm
import fr.forum_thalie.tsumugi.alarm.RadioSleeper import fr.forum_thalie.tsumugi.alarm.RadioSleeper
import fr.forum_thalie.tsumugi.planning.Planning import fr.forum_thalie.tsumugi.planning.Planning
@ -282,17 +281,18 @@ class RadioService : MediaBrowserServiceCompat() {
PlayerStore.instance.isServiceStarted.value = false PlayerStore.instance.isServiceStarted.value = false
PlayerStore.instance.isInitialized = false PlayerStore.instance.isInitialized = false
RadioSleeper.instance.cancelSleep(this, isClosing = true)
PreferenceManager.getDefaultSharedPreferences(this).edit { PreferenceManager.getDefaultSharedPreferences(this).edit {
this.putBoolean("isSleeping", false) this.putBoolean("isSleeping", false)
this.commit() this.commit()
} }
RadioSleeper.instance.cancelSleep(this)
apiTicker.cancel() // stops the timer. apiTicker.cancel() // stops the timer.
Log.d(tag, radioTag + "destroyed") Log.d(tag, radioTag + "destroyed")
// if the service is destroyed, the application had become useless. // if the service is destroyed, the application had become useless.
// exitProcess(0) exitProcess(0)
Process.killProcess(Process.myPid())
} }
// ######################################## // ########################################
@ -351,13 +351,11 @@ class RadioService : MediaBrowserServiceCompat() {
setBufferDurationsMs(minBufferMillis, maxBufferMillis, bufferForPlayback, bufferForPlaybackAfterRebuffer) setBufferDurationsMs(minBufferMillis, maxBufferMillis, bufferForPlayback, bufferForPlaybackAfterRebuffer)
}.createDefaultLoadControl() }.createDefaultLoadControl()
/*
val playerBuilder = SimpleExoPlayer.Builder(this) val playerBuilder = SimpleExoPlayer.Builder(this)
playerBuilder.setLoadControl(loadControl) playerBuilder.setLoadControl(loadControl)
player = playerBuilder.build() player = playerBuilder.build()
*/
player = ExoPlayerFactory.newSimpleInstance(this, DefaultTrackSelector(), loadControl)
player.addMetadataOutput { player.addMetadataOutput {
for (i in 0 until it.length()) { for (i in 0 until it.length()) {

View File

@ -19,29 +19,39 @@ class RadioAlarm {
RadioAlarm() RadioAlarm()
} }
} }
lateinit var alarmIntent: PendingIntent
private lateinit var alarmIntent: PendingIntent
private lateinit var showIntent: PendingIntent
private fun defineIntents(c: Context)
{
alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent ->
intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}")
PendingIntent.getBroadcast(c, 0, intent, 0)
}
showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
intent.putExtra("action", "alarm")
PendingIntent.getActivity(c, 0, intent, 0)
}
}
fun cancelAlarm(c: Context) fun cancelAlarm(c: Context)
{ {
if (::alarmIntent.isInitialized) defineIntents(c)
{
val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.cancel(alarmIntent) alarmManager.cancel(alarmIntent)
} }
}
fun setNextAlarm(c: Context, isForce: Boolean = false, forceTime: Int? = null, forceDays: Set<String>? = null) fun setNextAlarm(c: Context, isForce: Boolean = false, forceTime: Int? = null, forceDays: Set<String>? = null)
{ {
defineIntents(c)
// don't do anything if the preference is set to FALSE, of course. // don't do anything if the preference is set to FALSE, of course.
if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isWakingUp", false) && !isForce) if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isWakingUp", false) && !isForce)
return return
val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent ->
intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}")
PendingIntent.getBroadcast(c, 0, intent, 0)
}
val showIntent = Intent(c, ParametersActivity::class.java).let { intent -> val showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
intent.putExtra("action", ActionOpenParam.ALARM.name) intent.putExtra("action", ActionOpenParam.ALARM.name)
PendingIntent.getActivity(c, 0, intent, 0) PendingIntent.getActivity(c, 0, intent, 0)
@ -95,19 +105,12 @@ class RadioAlarm {
fun snooze(c: Context) fun snooze(c: Context)
{ {
defineIntents(c)
val snoozeString = preferenceStore.getString("snoozeDuration", "10") ?: "10" val snoozeString = preferenceStore.getString("snoozeDuration", "10") ?: "10"
val snoozeMinutes = if (snoozeString == c.getString(R.string.disable)) 0 else Integer.parseInt(snoozeString) val snoozeMinutes = if (snoozeString == c.getString(R.string.disable)) 0 else Integer.parseInt(snoozeString)
if (snoozeMinutes > 0) if (snoozeMinutes > 0)
{ {
val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent ->
intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}")
PendingIntent.getBroadcast(c, 0, intent, 0)
}
val showIntent = Intent(c, ParametersActivity::class.java).let { intent ->
intent.putExtra("action", "alarm")
PendingIntent.getActivity(c, 0, intent, 0)
}
AlarmManagerCompat.setAlarmClock(alarmManager, Calendar.getInstance().timeInMillis + (snoozeMinutes * 60 * 1000), showIntent, alarmIntent) AlarmManagerCompat.setAlarmClock(alarmManager, Calendar.getInstance().timeInMillis + (snoozeMinutes * 60 * 1000), showIntent, alarmIntent)

View File

@ -30,8 +30,21 @@ class RadioSleeper {
private lateinit var sleepIntent: PendingIntent private lateinit var sleepIntent: PendingIntent
private lateinit var fadeOutIntent: PendingIntent private lateinit var fadeOutIntent: PendingIntent
private fun defineIntents(c: Context)
{
sleepIntent = Intent(c, RadioService::class.java).let { intent ->
intent.putExtra("action", Actions.KILL.name)
PendingIntent.getService(c, 99, intent, 0)
}
fadeOutIntent = Intent(c, RadioService::class.java).let { intent ->
intent.putExtra("action", Actions.FADE_OUT.name)
PendingIntent.getService(c, 98, intent, 0)
}
}
fun setSleep(c: Context, isForce: Boolean = false, forceDuration: Long? = null) fun setSleep(c: Context, isForce: Boolean = false, forceDuration: Long? = null)
{ {
defineIntents(c)
// don't do anything if the preference is set to FALSE, of course. // don't do anything if the preference is set to FALSE, of course.
if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isSleeping", false) && !isForce) if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isSleeping", false) && !isForce)
return return
@ -39,19 +52,13 @@ class RadioSleeper {
val minutes: Long = forceDuration ?: Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(c).getString("sleepDuration", "1") ?: "1").toLong() val minutes: Long = forceDuration ?: Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(c).getString("sleepDuration", "1") ?: "1").toLong()
val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
sleepIntent = Intent(c, RadioService::class.java).let { intent ->
intent.putExtra("action", Actions.KILL.name)
PendingIntent.getService(c, 99, intent, 0)
}
val currentMillis = System.currentTimeMillis() val currentMillis = System.currentTimeMillis()
if (minutes > 0) if (minutes > 0)
{ {
AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000), sleepIntent) AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000), sleepIntent)
fadeOutIntent = Intent(c, RadioService::class.java).let { intent ->
intent.putExtra("action", Actions.FADE_OUT.name)
PendingIntent.getService(c, 98, intent, 0)
}
AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000) - (1 * 60 * 1000), fadeOutIntent) AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000) - (1 * 60 * 1000), fadeOutIntent)
sleepAtMillis.value = System.currentTimeMillis() + (minutes * 60 * 1000) - 1 // this -1 allows to round the division for display at the right integer sleepAtMillis.value = System.currentTimeMillis() + (minutes * 60 * 1000) - 1 // this -1 allows to round the division for display at the right integer
Log.d(tag, "set sleep to $minutes minutes") Log.d(tag, "set sleep to $minutes minutes")
@ -59,19 +66,20 @@ class RadioSleeper {
} }
fun cancelSleep(c: Context) fun cancelSleep(c: Context, isClosing: Boolean = false)
{
if (::sleepIntent.isInitialized)
{ {
defineIntents(c)
val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.cancel(sleepIntent) alarmManager.cancel(sleepIntent)
alarmManager.cancel(fadeOutIntent) alarmManager.cancel(fadeOutIntent)
if (!isClosing)
{
val cancelFadeOutIntent = Intent(c, RadioService::class.java).putExtra("action", Actions.CANCEL_FADE_OUT.name) val cancelFadeOutIntent = Intent(c, RadioService::class.java).putExtra("action", Actions.CANCEL_FADE_OUT.name)
c.startService(cancelFadeOutIntent) c.startService(cancelFadeOutIntent)
}
Log.d(tag, "cancelled sleep") Log.d(tag, "cancelled sleep")
}
sleepAtMillis.value = null sleepAtMillis.value = null
} }
} }