RadioSleeper.kt 3.2KB

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