RadioSleeper.kt 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package fr.forum_thalie.tsumugi.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 fr.forum_thalie.tsumugi.*
  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. private fun defineIntents(c: Context)
  27. {
  28. sleepIntent = Intent(c, RadioService::class.java).let { intent ->
  29. intent.putExtra("action", Actions.KILL.name)
  30. PendingIntent.getService(c, 99, intent, 0)
  31. }
  32. fadeOutIntent = Intent(c, RadioService::class.java).let { intent ->
  33. intent.putExtra("action", Actions.FADE_OUT.name)
  34. PendingIntent.getService(c, 98, intent, 0)
  35. }
  36. }
  37. fun setSleep(c: Context, isForce: Boolean = false, forceDuration: Long? = null)
  38. {
  39. defineIntents(c)
  40. // don't do anything if the preference is set to FALSE, of course.
  41. if (!PreferenceManager.getDefaultSharedPreferences(c).getBoolean("isSleeping", false) && !isForce)
  42. return
  43. val minutes: Long = forceDuration ?: Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(c).getString("sleepDuration", "1") ?: "1").toLong()
  44. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  45. val currentMillis = System.currentTimeMillis()
  46. if (minutes > 0)
  47. {
  48. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000), sleepIntent)
  49. AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, currentMillis + (minutes * 60 * 1000) - (1 * 60 * 1000), fadeOutIntent)
  50. sleepAtMillis.value = System.currentTimeMillis() + (minutes * 60 * 1000) - 1 // this -1 allows to round the division for display at the right integer
  51. //[REMOVE LOG CALLS]Log.d(tag, "set sleep to $minutes minutes")
  52. }
  53. }
  54. fun cancelSleep(c: Context, isClosing: Boolean = false)
  55. {
  56. defineIntents(c)
  57. val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager
  58. alarmManager.cancel(sleepIntent)
  59. alarmManager.cancel(fadeOutIntent)
  60. if (!isClosing)
  61. {
  62. val cancelFadeOutIntent = Intent(c, RadioService::class.java).putExtra("action", Actions.CANCEL_FADE_OUT.name)
  63. c.startService(cancelFadeOutIntent)
  64. }
  65. //[REMOVE LOG CALLS]Log.d(tag, "cancelled sleep")
  66. sleepAtMillis.value = null
  67. }
  68. }