AlarmFragment.kt 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package fr.riff_app.riff.preferences
  2. import android.app.TimePickerDialog
  3. import android.content.Context
  4. import android.content.Intent
  5. import android.media.AudioManager
  6. import android.os.Bundle
  7. import android.util.Log
  8. import android.view.KeyEvent
  9. import androidx.appcompat.app.AlertDialog
  10. import androidx.appcompat.app.AppCompatActivity
  11. import androidx.core.content.edit
  12. import androidx.preference.*
  13. import fr.riff_app.riff.*
  14. import fr.riff_app.riff.R
  15. import fr.riff_app.riff.alarm.RadioAlarm
  16. import fr.riff_app.riff.playerstore.PlayerStore
  17. import kotlinx.coroutines.CoroutineScope
  18. import kotlinx.coroutines.GlobalScope.coroutineContext
  19. import kotlinx.coroutines.Job
  20. import kotlinx.coroutines.delay
  21. import kotlinx.coroutines.launch
  22. import java.util.*
  23. import kotlin.coroutines.CoroutineContext
  24. import kotlin.math.max
  25. import kotlin.math.min
  26. class AlarmFragment : PreferenceFragmentCompat() {
  27. override fun onAttach(context: Context) {
  28. (activity as AppCompatActivity).supportActionBar?.title = context.getString(R.string.setupAlarmClock)
  29. super.onAttach(context)
  30. }
  31. override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
  32. setPreferencesFromResource(R.xml.alarm_preferences, rootKey)
  33. val timeSet = findPreference<Preference>("timeSet")
  34. val isWakingUp = findPreference<SwitchPreferenceCompat>("isWakingUp")
  35. val alarmDays = findPreference<MultiSelectListPreference>("alarmDays")
  36. val snoozeDuration = findPreference<ListPreference>("snoozeDuration")
  37. alarmDays?.entries = weekdaysArray
  38. alarmDays?.entryValues = weekdaysArray
  39. alarmDays?.setDefaultValue(weekdaysArray)
  40. fun updateIsWakingUpSummary(preference: SwitchPreferenceCompat?, newValue: Boolean? = true, forceTime: Int? = null, forceDays: Set<String>? = null)
  41. {
  42. val dateLong = RadioAlarm.instance.findNextAlarmTime(requireContext(), forceTime, forceDays)
  43. val calendar = Calendar.getInstance()
  44. calendar.timeInMillis = dateLong
  45. if (newValue == true && calendar.timeInMillis > 0)
  46. {
  47. val fullWeekOrdered = weekdaysSundayFirst
  48. preference?.summary = getString(R.string.next_alarm) + " ${fullWeekOrdered[calendar.get(Calendar.DAY_OF_WEEK) - 1]} ${if (calendar.get(Calendar.HOUR_OF_DAY) < 10) "0" else ""}${calendar.get(Calendar.HOUR_OF_DAY)}:${if (calendar.get(Calendar.MINUTE) < 10) "0" else ""}${calendar.get(Calendar.MINUTE)}"
  49. } else if (newValue == true)
  50. preference?.summary = getString(R.string.select_one_day)
  51. else
  52. {
  53. preference?.summary = getString(R.string.no_alarm_set)
  54. }
  55. }
  56. val hourOfDayDefault = 7
  57. val minuteDefault = 0
  58. if (!PreferenceManager.getDefaultSharedPreferences(requireContext()).contains("alarmTimeFromMidnight"))
  59. {
  60. PreferenceManager.getDefaultSharedPreferences(requireContext()).edit {
  61. putInt("alarmTimeFromMidnight", (60*hourOfDayDefault+minuteDefault))
  62. commit()
  63. }
  64. }
  65. val time = PreferenceManager.getDefaultSharedPreferences(requireContext()).getInt("alarmTimeFromMidnight", (60*hourOfDayDefault+minuteDefault))
  66. val hourOfDay = time / 60
  67. val minute = time % 60
  68. timeSet?.summary = "${if (hourOfDay < 10) "0" else ""}$hourOfDay:${if (minute < 10) "0" else ""}$minute"
  69. timeSet?.setOnPreferenceClickListener {
  70. val timePickerOnTimeSetListener = TimePickerDialog.OnTimeSetListener { _, hourOfDay, minute ->
  71. PreferenceManager.getDefaultSharedPreferences(requireContext()).edit {
  72. putInt("alarmTimeFromMidnight", (60*hourOfDay+minute))
  73. commit()
  74. }
  75. timeSet.summary = "${if (hourOfDay < 10) "0" else ""}$hourOfDay:${if (minute < 10) "0" else ""}$minute"
  76. RadioAlarm.instance.cancelAlarm(requireContext())
  77. RadioAlarm.instance.setNextAlarm(requireContext(), isForce = true, forceTime = hourOfDay*60+minute)
  78. updateIsWakingUpSummary(isWakingUp, isWakingUp?.isChecked, forceTime = hourOfDay*60+minute)
  79. }
  80. val timeNew = PreferenceManager.getDefaultSharedPreferences(requireContext()).getInt("alarmTimeFromMidnight", 7*60)
  81. val hourOfDayNew = timeNew / 60
  82. val minuteNew = timeNew % 60
  83. val timePicker = TimePickerDialog(context, timePickerOnTimeSetListener, hourOfDayNew, minuteNew, true)
  84. timePicker.show()
  85. true
  86. }
  87. fun updateDays(preference : MultiSelectListPreference?, newValue : Set<String>?)
  88. {
  89. val fullWeek = weekdays.toSet()
  90. val workingWeek = weekdays.toSet().minusElement(weekdays.last()).minusElement(weekdays.elementAt(weekdays.size - 2))
  91. val listOfDays = when (newValue) {
  92. fullWeek -> requireContext().getString(R.string.every_day)
  93. workingWeek -> requireContext().getString(R.string.working_days)
  94. else -> {
  95. // build ORDERED LIST of days... I don't know why the original one is in shambles!!
  96. val fullWeekOrdered = weekdays
  97. val selectedDays = ArrayList<String>()
  98. for (item in fullWeekOrdered) {
  99. if (newValue!!.contains(item))
  100. selectedDays.add(item)
  101. }
  102. "$selectedDays".drop(1).dropLast(1) // dropping '[' and ']'
  103. }
  104. }
  105. preference?.summary = listOfDays
  106. }
  107. updateDays(alarmDays, PreferenceManager.getDefaultSharedPreferences(requireContext()).getStringSet("alarmDays", setOf()))
  108. alarmDays?.setOnPreferenceChangeListener { preference, newValue ->
  109. @Suppress("UNCHECKED_CAST")
  110. updateDays(preference as MultiSelectListPreference, newValue as Set<String>)
  111. RadioAlarm.instance.cancelAlarm(requireContext())
  112. RadioAlarm.instance.setNextAlarm(requireContext(), isForce = true, forceDays = newValue)
  113. updateIsWakingUpSummary(isWakingUp, isWakingUp?.isChecked, forceDays = newValue)
  114. true
  115. }
  116. updateIsWakingUpSummary(isWakingUp, isWakingUp?.isChecked)
  117. isWakingUp?.setOnPreferenceChangeListener { _, newValue ->
  118. if (newValue as Boolean)
  119. RadioAlarm.instance.setNextAlarm(requireContext(), isForce = true)
  120. else
  121. RadioAlarm.instance.cancelAlarm(requireContext())
  122. timeSet?.isEnabled = newValue
  123. alarmDays?.isEnabled = newValue
  124. snoozeDuration?.isEnabled = newValue
  125. updateIsWakingUpSummary(isWakingUp, newValue)
  126. true
  127. }
  128. alarmDays?.isEnabled = isWakingUp?.isChecked ?: false
  129. timeSet?.isEnabled = isWakingUp?.isChecked ?: false
  130. snoozeDuration?.isEnabled = isWakingUp?.isChecked ?: false
  131. }
  132. }