AlarmFragment.kt 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package io.r_a_d.radio2.preferences
  2. import android.app.TimePickerDialog
  3. import android.os.Bundle
  4. import android.util.Log
  5. import androidx.core.content.edit
  6. import androidx.preference.*
  7. import io.r_a_d.radio2.R
  8. import io.r_a_d.radio2.alarm.RadioAlarm
  9. import java.util.*
  10. class AlarmFragment : PreferenceFragmentCompat() {
  11. override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
  12. setPreferencesFromResource(R.xml.alarm_preferences, rootKey)
  13. val timeSet = findPreference<Preference>("timeSet")
  14. val isWakingUp = findPreference<SwitchPreferenceCompat>("isWakingUp")
  15. val alarmDays = findPreference<MultiSelectListPreference>("alarmDays")
  16. val snoozeDuration = findPreference<ListPreference>("snoozeDuration")
  17. fun updateIsWakingUpSummary(preference: SwitchPreferenceCompat?, newValue: Boolean? = true, forceTime: Int? = null, forceDays: Set<String>? = null)
  18. {
  19. val dateLong = RadioAlarm.instance.findNextAlarmTime(context!!, forceTime, forceDays)
  20. val calendar = Calendar.getInstance()
  21. calendar.timeInMillis = dateLong
  22. if (newValue == true && calendar.timeInMillis > 0)
  23. {
  24. val fullWeekOrdered = arrayListOf("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
  25. preference?.summary = "Next alarm on ${fullWeekOrdered[calendar.get(Calendar.DAY_OF_WEEK) - 1]} " +
  26. "at ${if (calendar.get(Calendar.HOUR_OF_DAY) < 10) "0" else ""}${calendar.get(Calendar.HOUR_OF_DAY)}" +
  27. ":${if (calendar.get(Calendar.MINUTE) < 10) "0" else ""}${calendar.get(Calendar.MINUTE)}"
  28. } else if (newValue == true)
  29. preference?.summary = "Select at least one day"
  30. else
  31. {
  32. preference?.summary = "No alarm set"
  33. }
  34. }
  35. val hourOfDayDefault = 7
  36. val minuteDefault = 0
  37. if (!PreferenceManager.getDefaultSharedPreferences(context!!).contains("alarmTimeFromMidnight"))
  38. {
  39. PreferenceManager.getDefaultSharedPreferences(context!!).edit {
  40. putInt("alarmTimeFromMidnight", (60*hourOfDayDefault+minuteDefault))
  41. commit()
  42. }
  43. }
  44. val time = PreferenceManager.getDefaultSharedPreferences(context!!).getInt("alarmTimeFromMidnight", (60*hourOfDayDefault+minuteDefault))
  45. val hourOfDay = time / 60
  46. val minute = time % 60
  47. timeSet?.summary = "${if (hourOfDay < 10) "0" else ""}$hourOfDay:${if (minute < 10) "0" else ""}$minute"
  48. timeSet?.setOnPreferenceClickListener {
  49. val timePickerOnTimeSetListener = TimePickerDialog.OnTimeSetListener { _, hourOfDay, minute ->
  50. PreferenceManager.getDefaultSharedPreferences(context!!).edit {
  51. putInt("alarmTimeFromMidnight", (60*hourOfDay+minute))
  52. commit()
  53. }
  54. timeSet.summary = "${if (hourOfDay < 10) "0" else ""}$hourOfDay:${if (minute < 10) "0" else ""}$minute"
  55. RadioAlarm.instance.cancelAlarm(context!!)
  56. RadioAlarm.instance.setNextAlarm(context!!, isForce = true, forceTime = hourOfDay*60+minute)
  57. updateIsWakingUpSummary(isWakingUp, isWakingUp?.isChecked, forceTime = hourOfDay*60+minute)
  58. }
  59. val timeNew = PreferenceManager.getDefaultSharedPreferences(context!!).getInt("alarmTimeFromMidnight", 7*60)
  60. val hourOfDayNew = timeNew / 60
  61. val minuteNew = timeNew % 60
  62. val timePicker = TimePickerDialog(context, timePickerOnTimeSetListener, hourOfDayNew, minuteNew, true)
  63. timePicker.show()
  64. true
  65. }
  66. fun updateDays(preference : MultiSelectListPreference?, newValue : Set<String>?)
  67. {
  68. Log.d(tag, newValue.toString())
  69. val listOfDays : String
  70. val fullWeek = context!!.resources.getStringArray(R.array.weekdays).toSet()
  71. val workingWeek = context!!.resources.getStringArray(R.array.weekdays).toSet().minusElement("Saturday").minusElement("Sunday")
  72. listOfDays = when (newValue) {
  73. fullWeek -> context!!.getString(R.string.every_day)
  74. workingWeek -> context!!.getString(R.string.working_days)
  75. else -> {
  76. // build ORDERED LIST of days... I don't know why the original one is in shambles!!
  77. val fullWeekOrdered = arrayListOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
  78. val selectedDays = arrayListOf<String>()
  79. for (item in fullWeekOrdered) {
  80. if (newValue!!.contains(item))
  81. selectedDays.add(item)
  82. }
  83. "$selectedDays".drop(1).dropLast(1) // dropping '[' and ']'
  84. }
  85. }
  86. preference?.summary = listOfDays
  87. }
  88. updateDays(alarmDays, PreferenceManager.getDefaultSharedPreferences(context).getStringSet("alarmDays", setOf()))
  89. alarmDays?.setOnPreferenceChangeListener { preference, newValue ->
  90. @Suppress("UNCHECKED_CAST")
  91. updateDays(preference as MultiSelectListPreference, newValue as Set<String>)
  92. RadioAlarm.instance.cancelAlarm(context!!)
  93. RadioAlarm.instance.setNextAlarm(context!!, isForce = true, forceDays = newValue)
  94. updateIsWakingUpSummary(isWakingUp, isWakingUp?.isChecked, forceDays = newValue)
  95. true
  96. }
  97. updateIsWakingUpSummary(isWakingUp, isWakingUp?.isChecked)
  98. isWakingUp?.setOnPreferenceChangeListener { _, newValue ->
  99. if (newValue as Boolean)
  100. RadioAlarm.instance.setNextAlarm(context!!, isForce = true)
  101. else
  102. RadioAlarm.instance.cancelAlarm(context!!)
  103. timeSet?.isEnabled = newValue
  104. alarmDays?.isEnabled = newValue
  105. snoozeDuration?.isEnabled = newValue
  106. updateIsWakingUpSummary(isWakingUp, newValue)
  107. true
  108. }
  109. alarmDays?.isEnabled = isWakingUp?.isChecked ?: false
  110. timeSet?.isEnabled = isWakingUp?.isChecked ?: false
  111. snoozeDuration?.isEnabled = isWakingUp?.isChecked ?: false
  112. }
  113. }