RadioSleeper.kt 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package io.r_a_d.radio2.alarm
  2. import android.app.AlarmManager
  3. import android.app.PendingIntent
  4. import android.content.Context
  5. import android.content.Intent
  6. import android.util.Log
  7. import androidx.core.app.AlarmManagerCompat
  8. import androidx.lifecycle.MutableLiveData
  9. import androidx.preference.PreferenceManager
  10. import io.r_a_d.radio2.*
  11. class RadioSleeper {
  12. companion object {
  13. val instance by lazy {
  14. RadioSleeper()
  15. }
  16. }
  17. val sleepAtMillis: MutableLiveData<Long?> = MutableLiveData()
  18. init
  19. {
  20. // the companion object is lazy, and is invoked by a Ticker, so a background thread.
  21. // we MUST use postValue to set it correctly.
  22. sleepAtMillis.postValue(null)
  23. }
  24. private lateinit var sleepIntent: PendingIntent
  25. private lateinit var fadeOutIntent: PendingIntent
  26. fun setSleep(c: Context, isForce: Boolean = false, forceDuration: Long? = null)
  27. {
  28. // don't do anything if the preference is set to FALSE, of course.
  29. if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isSleeping", false) && !isForce)
  30. return
  31. val minutes: Long = forceDuration ?: Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(c).getString("sleepDuration", "1") ?: "1").toLong()
  32. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  33. sleepIntent = Intent(c, RadioService::class.java).let { intent ->
  34. intent.putExtra("action", Actions.KILL.name)
  35. PendingIntent.getService(c, 99, intent, 0)
  36. }
  37. val currentMillis = System.currentTimeMillis()
  38. if (minutes > 0)
  39. {
  40. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000), sleepIntent)
  41. fadeOutIntent = Intent(c, RadioService::class.java).let { intent ->
  42. intent.putExtra("action", Actions.FADE_OUT.name)
  43. PendingIntent.getService(c, 98, intent, 0)
  44. }
  45. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000) - (1 * 60 * 1000), fadeOutIntent)
  46. sleepAtMillis.value = System.currentTimeMillis() + (minutes * 60 * 1000) - 1 // this -1 allows to round the division for display at the right integer
  47. Log.d(tag, "set sleep to $minutes minutes")
  48. }
  49. }
  50. fun cancelSleep(c: Context)
  51. {
  52. if (::sleepIntent.isInitialized)
  53. {
  54. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  55. alarmManager.cancel(sleepIntent)
  56. alarmManager.cancel(fadeOutIntent)
  57. val cancelFadeOutIntent = Intent(c, RadioService::class.java).putExtra("action", Actions.CANCEL_FADE_OUT.name)
  58. c.startService(cancelFadeOutIntent)
  59. Log.d(tag, "cancelled sleep")
  60. }
  61. sleepAtMillis.value = null
  62. }
  63. }