AlarmFragment.kt 6.4KB

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