193 lines
6.7 KiB
Kotlin
193 lines
6.7 KiB
Kotlin
package com.simplemobiletools.smsmessenger.dialogs
|
|
|
|
import android.app.DatePickerDialog
|
|
import android.app.DatePickerDialog.OnDateSetListener
|
|
import android.app.TimePickerDialog
|
|
import android.app.TimePickerDialog.OnTimeSetListener
|
|
import android.text.format.DateFormat
|
|
import androidx.appcompat.app.AlertDialog
|
|
import com.google.android.material.timepicker.MaterialTimePicker
|
|
import com.google.android.material.timepicker.TimeFormat
|
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
|
import com.simplemobiletools.commons.extensions.*
|
|
import com.simplemobiletools.smsmessenger.R
|
|
import com.simplemobiletools.smsmessenger.databinding.ScheduleMessageDialogBinding
|
|
import com.simplemobiletools.smsmessenger.extensions.config
|
|
import com.simplemobiletools.smsmessenger.extensions.roundToClosestMultipleOf
|
|
import org.joda.time.DateTime
|
|
import java.util.Calendar
|
|
|
|
class ScheduleMessageDialog(
|
|
private val activity: BaseSimpleActivity,
|
|
private var dateTime: DateTime? = null,
|
|
private val callback: (dateTime: DateTime?) -> Unit
|
|
) {
|
|
private val binding = ScheduleMessageDialogBinding.inflate(activity.layoutInflater)
|
|
private val textColor = activity.getProperTextColor()
|
|
|
|
private var previewDialog: AlertDialog? = null
|
|
private var previewShown = false
|
|
private var isNewMessage = dateTime == null
|
|
|
|
private val calendar = Calendar.getInstance()
|
|
|
|
init {
|
|
arrayOf(binding.subtitle, binding.editTime, binding.editDate).forEach {
|
|
it.setTextColor(textColor)
|
|
}
|
|
|
|
arrayOf(binding.dateImage, binding.timeImage).forEach {
|
|
it.applyColorFilter(textColor)
|
|
}
|
|
|
|
binding.editDate.setOnClickListener { showDatePicker() }
|
|
binding.editTime.setOnClickListener { showTimePicker() }
|
|
|
|
val targetDateTime = dateTime ?: DateTime.now().plusHours(1)
|
|
updateTexts(targetDateTime)
|
|
|
|
if (isNewMessage) {
|
|
showDatePicker()
|
|
} else {
|
|
showPreview()
|
|
}
|
|
}
|
|
|
|
private fun updateTexts(dateTime: DateTime) {
|
|
val dateFormat = activity.config.dateFormat
|
|
val timeFormat = activity.getTimeFormat()
|
|
binding.editDate.text = dateTime.toString(dateFormat)
|
|
binding.editTime.text = dateTime.toString(timeFormat)
|
|
}
|
|
|
|
private fun showPreview() {
|
|
if (previewShown) {
|
|
return
|
|
}
|
|
|
|
activity.getAlertDialogBuilder()
|
|
.setPositiveButton(com.simplemobiletools.commons.R.string.ok, null)
|
|
.setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null)
|
|
.apply {
|
|
previewShown = true
|
|
activity.setupDialogStuff(binding.root, this, R.string.schedule_message) { dialog ->
|
|
previewDialog = dialog
|
|
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
|
|
if (validateDateTime()) {
|
|
callback(dateTime)
|
|
dialog.dismiss()
|
|
}
|
|
}
|
|
|
|
dialog.setOnDismissListener {
|
|
previewShown = false
|
|
previewDialog = null
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun showDatePicker() {
|
|
val year = dateTime?.year ?: calendar.get(Calendar.YEAR)
|
|
val monthOfYear = dateTime?.monthOfYear?.minus(1) ?: calendar.get(Calendar.MONTH)
|
|
val dayOfMonth = dateTime?.dayOfMonth ?: calendar.get(Calendar.DAY_OF_MONTH)
|
|
|
|
val dateSetListener = OnDateSetListener { _, y, m, d -> dateSet(y, m, d) }
|
|
DatePickerDialog(
|
|
activity, activity.getDatePickerDialogTheme(), dateSetListener, year, monthOfYear, dayOfMonth
|
|
).apply {
|
|
datePicker.minDate = System.currentTimeMillis()
|
|
show()
|
|
getButton(AlertDialog.BUTTON_NEGATIVE).apply {
|
|
text = activity.getString(com.simplemobiletools.commons.R.string.cancel)
|
|
setOnClickListener {
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun showTimePicker() {
|
|
val hourOfDay = dateTime?.hourOfDay ?: getNextHour()
|
|
val minute = dateTime?.minuteOfHour ?: getNextMinute()
|
|
|
|
if (activity.config.isUsingSystemTheme) {
|
|
val timeFormat = if (DateFormat.is24HourFormat(activity)) {
|
|
TimeFormat.CLOCK_24H
|
|
} else {
|
|
TimeFormat.CLOCK_12H
|
|
}
|
|
|
|
val timePicker = MaterialTimePicker.Builder()
|
|
.setTimeFormat(timeFormat)
|
|
.setHour(hourOfDay)
|
|
.setMinute(minute)
|
|
.build()
|
|
|
|
timePicker.addOnPositiveButtonClickListener {
|
|
timeSet(timePicker.hour, timePicker.minute)
|
|
}
|
|
|
|
timePicker.show(activity.supportFragmentManager, "")
|
|
} else {
|
|
val timeSetListener = OnTimeSetListener { _, hours, minutes -> timeSet(hours, minutes) }
|
|
TimePickerDialog(
|
|
activity, activity.getDatePickerDialogTheme(), timeSetListener, hourOfDay, minute, DateFormat.is24HourFormat(activity)
|
|
).apply {
|
|
show()
|
|
getButton(AlertDialog.BUTTON_NEGATIVE).apply {
|
|
text = activity.getString(com.simplemobiletools.commons.R.string.cancel)
|
|
setOnClickListener {
|
|
dismiss()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun dateSet(year: Int, monthOfYear: Int, dayOfMonth: Int) {
|
|
if (isNewMessage) {
|
|
showTimePicker()
|
|
}
|
|
|
|
dateTime = DateTime.now()
|
|
.withDate(year, monthOfYear + 1, dayOfMonth)
|
|
.run {
|
|
if (dateTime != null) {
|
|
withTime(dateTime!!.hourOfDay, dateTime!!.minuteOfHour, 0, 0)
|
|
} else {
|
|
withTime(getNextHour(), getNextMinute(), 0, 0)
|
|
}
|
|
}
|
|
|
|
if (!isNewMessage) {
|
|
validateDateTime()
|
|
}
|
|
|
|
isNewMessage = false
|
|
updateTexts(dateTime!!)
|
|
}
|
|
|
|
private fun timeSet(hourOfDay: Int, minute: Int) {
|
|
dateTime = dateTime?.withHourOfDay(hourOfDay)?.withMinuteOfHour(minute)
|
|
if (validateDateTime()) {
|
|
updateTexts(dateTime!!)
|
|
showPreview()
|
|
} else {
|
|
showTimePicker()
|
|
}
|
|
}
|
|
|
|
private fun validateDateTime(): Boolean {
|
|
return if (dateTime?.isAfterNow == false) {
|
|
activity.toast(R.string.must_pick_time_in_the_future)
|
|
false
|
|
} else {
|
|
true
|
|
}
|
|
}
|
|
|
|
private fun getNextHour() = (calendar.get(Calendar.HOUR_OF_DAY) + 1).coerceIn(0, 23)
|
|
|
|
private fun getNextMinute() = (calendar.get(Calendar.MINUTE) + 5).roundToClosestMultipleOf(5).coerceIn(0, 59)
|
|
}
|