Simple-Clock/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/EditAlarmDialog.kt

238 lines
10 KiB
Kotlin

package com.simplemobiletools.clock.dialogs
import android.app.TimePickerDialog
import android.graphics.drawable.Drawable
import android.media.AudioManager
import android.media.RingtoneManager
import android.text.format.DateFormat
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import com.google.android.material.timepicker.MaterialTimePicker
import com.google.android.material.timepicker.TimeFormat
import com.simplemobiletools.clock.R
import com.simplemobiletools.clock.activities.SimpleActivity
import com.simplemobiletools.clock.databinding.DialogEditAlarmBinding
import com.simplemobiletools.clock.extensions.*
import com.simplemobiletools.clock.helpers.PICK_AUDIO_FILE_INTENT_ID
import com.simplemobiletools.clock.helpers.TODAY_BIT
import com.simplemobiletools.clock.helpers.TOMORROW_BIT
import com.simplemobiletools.clock.helpers.getCurrentDayMinutes
import com.simplemobiletools.clock.models.Alarm
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.SelectAlarmSoundDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.models.AlarmSound
class EditAlarmDialog(val activity: SimpleActivity, val alarm: Alarm, val onDismiss: () -> Unit = {}, val callback: (alarmId: Int) -> Unit) {
private val binding = DialogEditAlarmBinding.inflate(activity.layoutInflater)
private val textColor = activity.getProperTextColor()
init {
restoreLastAlarm()
updateAlarmTime()
binding.apply {
editAlarmTime.setOnClickListener {
if (activity.config.isUsingSystemTheme) {
val timeFormat = if (DateFormat.is24HourFormat(activity)) {
TimeFormat.CLOCK_24H
} else {
TimeFormat.CLOCK_12H
}
val timePicker = MaterialTimePicker.Builder()
.setTimeFormat(timeFormat)
.setHour(alarm.timeInMinutes / 60)
.setMinute(alarm.timeInMinutes % 60)
.setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK)
.build()
timePicker.addOnPositiveButtonClickListener {
timePicked(timePicker.hour, timePicker.minute)
}
timePicker.show(activity.supportFragmentManager, "")
} else {
TimePickerDialog(
root.context,
root.context.getTimePickerDialogTheme(),
timeSetListener,
alarm.timeInMinutes / 60,
alarm.timeInMinutes % 60,
DateFormat.is24HourFormat(activity)
).show()
}
}
editAlarmSound.colorCompoundDrawable(textColor)
editAlarmSound.text = alarm.soundTitle
editAlarmSound.setOnClickListener {
SelectAlarmSoundDialog(activity, alarm.soundUri, AudioManager.STREAM_ALARM, PICK_AUDIO_FILE_INTENT_ID, RingtoneManager.TYPE_ALARM, true,
onAlarmPicked = {
if (it != null) {
updateSelectedAlarmSound(it)
}
}, onAlarmSoundDeleted = {
if (alarm.soundUri == it.uri) {
val defaultAlarm = root.context.getDefaultAlarmSound(RingtoneManager.TYPE_ALARM)
updateSelectedAlarmSound(defaultAlarm)
}
activity.checkAlarmsWithDeletedSoundUri(it.uri)
})
}
editAlarmVibrateIcon.setColorFilter(textColor)
editAlarmVibrate.isChecked = alarm.vibrate
editAlarmVibrateHolder.setOnClickListener {
editAlarmVibrate.toggle()
alarm.vibrate = editAlarmVibrate.isChecked
}
editAlarmLabelImage.applyColorFilter(textColor)
editAlarm.setText(alarm.label)
val dayLetters = activity.resources.getStringArray(com.simplemobiletools.commons.R.array.week_day_letters).toList() as ArrayList<String>
val dayIndexes = arrayListOf(0, 1, 2, 3, 4, 5, 6)
if (activity.config.isSundayFirst) {
dayIndexes.moveLastItemToFront()
}
dayIndexes.forEach {
val pow = Math.pow(2.0, it.toDouble()).toInt()
val day = activity.layoutInflater.inflate(R.layout.alarm_day, editAlarmDaysHolder, false) as TextView
day.text = dayLetters[it]
val isDayChecked = alarm.days > 0 && alarm.days and pow != 0
day.background = getProperDayDrawable(isDayChecked)
day.setTextColor(if (isDayChecked) root.context.getProperBackgroundColor() else textColor)
day.setOnClickListener {
if (alarm.days < 0) {
alarm.days = 0
}
val selectDay = alarm.days and pow == 0
if (selectDay) {
alarm.days = alarm.days.addBit(pow)
} else {
alarm.days = alarm.days.removeBit(pow)
}
day.background = getProperDayDrawable(selectDay)
day.setTextColor(if (selectDay) root.context.getProperBackgroundColor() else textColor)
checkDaylessAlarm()
}
editAlarmDaysHolder.addView(day)
}
}
activity.getAlertDialogBuilder()
.setOnDismissListener { onDismiss() }
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
.apply {
activity.setupDialogStuff(binding.root, this) { alertDialog ->
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
if (!activity.config.wasAlarmWarningShown) {
ConfirmationDialog(
activity,
messageId = com.simplemobiletools.commons.R.string.alarm_warning,
positive = com.simplemobiletools.commons.R.string.ok,
negative = 0
) {
activity.config.wasAlarmWarningShown = true
it.performClick()
}
return@setOnClickListener
}
if (alarm.days <= 0) {
alarm.days = if (alarm.timeInMinutes > getCurrentDayMinutes()) {
TODAY_BIT
} else {
TOMORROW_BIT
}
}
alarm.label = binding.editAlarm.value
alarm.isEnabled = true
var alarmId = alarm.id
activity.handleFullScreenNotificationsPermission { granted ->
if (granted) {
if (alarm.id == 0) {
alarmId = activity.dbHelper.insertAlarm(alarm)
if (alarmId == -1) {
activity.toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
} else {
if (!activity.dbHelper.updateAlarm(alarm)) {
activity.toast(com.simplemobiletools.commons.R.string.unknown_error_occurred)
}
}
activity.config.alarmLastConfig = alarm
callback(alarmId)
alertDialog.dismiss()
}
}
}
}
}
}
private fun restoreLastAlarm() {
if (alarm.id == 0) {
activity.config.alarmLastConfig?.let { lastConfig ->
alarm.label = lastConfig.label
alarm.days = lastConfig.days
alarm.soundTitle = lastConfig.soundTitle
alarm.soundUri = lastConfig.soundUri
alarm.timeInMinutes = lastConfig.timeInMinutes
alarm.vibrate = lastConfig.vibrate
}
}
}
private val timeSetListener = TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute ->
timePicked(hourOfDay, minute)
}
private fun timePicked(hours: Int, minutes: Int) {
alarm.timeInMinutes = hours * 60 + minutes
updateAlarmTime()
}
private fun updateAlarmTime() {
binding.editAlarmTime.text = activity.getFormattedTime(alarm.timeInMinutes * 60, false, true)
checkDaylessAlarm()
}
private fun checkDaylessAlarm() {
if (alarm.days <= 0) {
val textId = if (alarm.timeInMinutes > getCurrentDayMinutes()) {
com.simplemobiletools.commons.R.string.today
} else {
com.simplemobiletools.commons.R.string.tomorrow
}
binding.editAlarmDaylessLabel.text = "(${activity.getString(textId)})"
}
binding.editAlarmDaylessLabel.beVisibleIf(alarm.days <= 0)
}
private fun getProperDayDrawable(selected: Boolean): Drawable {
val drawableId = if (selected) R.drawable.circle_background_filled else R.drawable.circle_background_stroke
val drawable = activity.resources.getDrawable(drawableId)
drawable.applyColorFilter(textColor)
return drawable
}
fun updateSelectedAlarmSound(alarmSound: AlarmSound) {
alarm.soundTitle = alarmSound.title
alarm.soundUri = alarmSound.uri
binding.editAlarmSound.text = alarmSound.title
}
}