You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt

111 lines
4.3 KiB
Kotlin

/*
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.repeats
import android.app.Activity.RESULT_OK
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.lifecycleScope
import com.google.android.material.composethemeadapter.MdcTheme
import dagger.hilt.android.AndroidEntryPoint
import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.WeekDay
import org.tasks.R
import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.RepeatRow
import org.tasks.repeats.BasicRecurrenceDialog
import org.tasks.repeats.RecurrenceUtils.newRecur
import org.tasks.repeats.RepeatRuleToString
import org.tasks.time.DateTime
import org.tasks.time.DateTimeUtils.currentTimeMillis
import org.tasks.ui.TaskEditControlFragment
import javax.inject.Inject
@AndroidEntryPoint
class RepeatControlSet : TaskEditControlFragment() {
@Inject lateinit var repeatRuleToString: RepeatRuleToString
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_RECURRENCE) {
if (resultCode == RESULT_OK) {
val result = data?.getStringExtra(BasicRecurrenceDialog.EXTRA_RRULE)
viewModel.recurrence.value = result
if (result?.isNotBlank() == true && viewModel.dueDate.value == 0L) {
viewModel.setDueDate(DateTime().startOfDay().millis)
}
}
} else {
super.onActivityResult(requestCode, resultCode, data)
}
}
private fun onDueDateChanged() {
viewModel.recurrence.value?.takeIf { it.isNotBlank() }?.let { recurrence ->
val recur = newRecur(recurrence)
if (recur.frequency == Recur.Frequency.MONTHLY && recur.dayList.isNotEmpty()) {
val weekdayNum = recur.dayList[0]
val dateTime =
DateTime(this.viewModel.dueDate.value.let { if (it > 0) it else currentTimeMillis() })
val num: Int
val dayOfWeekInMonth = dateTime.dayOfWeekInMonth
num = if (weekdayNum.offset == -1 || dayOfWeekInMonth == 5) {
if (dayOfWeekInMonth == dateTime.maxDayOfWeekInMonth) -1 else dayOfWeekInMonth
} else {
dayOfWeekInMonth
}
recur.dayList.let {
it.clear()
it.add(WeekDay(dateTime.weekDay, num))
}
viewModel.recurrence.value = recur.toString()
}
}
}
override fun createView(savedInstanceState: Bundle?) {
lifecycleScope.launchWhenResumed {
viewModel.dueDate.collect {
onDueDateChanged()
}
}
}
override fun bind(parent: ViewGroup?): View =
(parent as ComposeView).apply {
setContent {
MdcTheme {
RepeatRow(
recurrence = viewModel.recurrence.collectAsStateLifecycleAware().value?.let {
repeatRuleToString.toString(it)
},
repeatAfterCompletion = viewModel.repeatAfterCompletion.collectAsStateLifecycleAware().value,
onClick = {
BasicRecurrenceDialog.newBasicRecurrenceDialog(
this@RepeatControlSet,
REQUEST_RECURRENCE,
viewModel.recurrence.value,
viewModel.dueDate.value.let { if (it > 0) it else currentTimeMillis() }
)
.show(parentFragmentManager, FRAG_TAG_BASIC_RECURRENCE)
},
onRepeatFromChanged = { viewModel.repeatAfterCompletion.value = it }
)
}
}
}
override fun controlId() = TAG
companion object {
val TAG = R.string.TEA_ctrl_repeat_pref
private const val FRAG_TAG_BASIC_RECURRENCE = "frag_tag_basic_recurrence"
private const val REQUEST_RECURRENCE = 10000
}
}