From 804c0f974ae9d65b21e95f27910aa3d61bb33ada Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 5 Aug 2023 23:55:14 -0500 Subject: [PATCH] Force a due date for recurring tasks --- .../astrid/activity/TaskEditFragment.kt | 11 ++-- .../astrid/repeats/RepeatControlSet.kt | 6 ++- .../java/org/tasks/dialogs/DateTimePicker.kt | 52 +++++++++++++------ 3 files changed, 47 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt index 5431f0c77..d8e1947a3 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.kt @@ -450,13 +450,14 @@ class TaskEditFragment : Fragment(), Toolbar.OnMenuItemClickListener { onClick = { DateTimePicker .newDateTimePicker( - this@TaskEditFragment, - REQUEST_DATE, - editViewModel.dueDate.value, - preferences.getBoolean( + target = this@TaskEditFragment, + rc = REQUEST_DATE, + current = editViewModel.dueDate.value, + autoClose = preferences.getBoolean( R.string.p_auto_dismiss_datetime_edit_screen, false - ) + ), + hideNoDate = editViewModel.recurrence.value?.isNotBlank() == true, ) .show(parentFragmentManager, FRAG_TAG_DATE_PICKER) } diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt index 490cb8a4b..fcbca00ae 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatControlSet.kt @@ -34,7 +34,11 @@ class RepeatControlSet : TaskEditControlFragment() { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == REQUEST_RECURRENCE) { if (resultCode == RESULT_OK) { - viewModel.recurrence.value = data?.getStringExtra(BasicRecurrenceDialog.EXTRA_RRULE) + 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) diff --git a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt index c1b2f199f..844a7fc65 100644 --- a/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt +++ b/app/src/main/java/org/tasks/dialogs/DateTimePicker.kt @@ -7,6 +7,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isGone import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.todoroo.andlib.utility.DateUtilities @@ -25,8 +26,14 @@ import org.tasks.time.DateTime import org.tasks.time.DateTimeUtils.millisOfDay import org.tasks.time.DateTimeUtils.startOfDay import java.time.format.FormatStyle -import java.util.* -import java.util.Calendar.* +import java.util.Calendar.FRIDAY +import java.util.Calendar.MONDAY +import java.util.Calendar.SATURDAY +import java.util.Calendar.SUNDAY +import java.util.Calendar.THURSDAY +import java.util.Calendar.TUESDAY +import java.util.Calendar.WEDNESDAY +import java.util.Locale import javax.inject.Inject @AndroidEntryPoint @@ -56,6 +63,7 @@ class DateTimePicker : BaseDateTimePicker() { const val EXTRA_TIME = "extra_time" const val EXTRA_TASKS = "extra_tasks" const val EXTRA_TIMESTAMP = "extra_timestamp" + const val EXTRA_HIDE_NO_DATE = "extra_hide_no_date" private const val REQUEST_TIME = 10101 private const val FRAG_TAG_TIME_PICKER = "frag_tag_time_picker" private const val NO_DAY = 0L @@ -63,26 +71,37 @@ class DateTimePicker : BaseDateTimePicker() { private const val MULTIPLE_DAYS = -1L private const val MULTIPLE_TIMES = -1 - fun newDateTimePicker(autoClose: Boolean, vararg tasks: Task): DateTimePicker { - val bundle = Bundle() - bundle.putLongArray(EXTRA_TASKS, tasks.map { it.id }.toLongArray()) + fun newDateTimePicker( + autoClose: Boolean, + vararg tasks: Task + ): DateTimePicker { + val fragment = DateTimePicker() val dueDates = tasks.map { it.dueDate.startOfDay() }.toSet() val dueTimes = tasks.map { it.dueDate.millisOfDay() }.toSet() - bundle.putLong(EXTRA_DAY, if (dueDates.size == 1) dueDates.first() else MULTIPLE_DAYS) - bundle.putInt(EXTRA_TIME, if (dueTimes.size == 1) dueTimes.first() else MULTIPLE_TIMES) - bundle.putBoolean(EXTRA_AUTO_CLOSE, autoClose) - val fragment = DateTimePicker() - fragment.arguments = bundle + fragment.arguments = Bundle().apply { + putLongArray(EXTRA_TASKS, tasks.map { it.id }.toLongArray()) + putLong(EXTRA_DAY, if (dueDates.size == 1) dueDates.first() else MULTIPLE_DAYS) + putInt(EXTRA_TIME, if (dueTimes.size == 1) dueTimes.first() else MULTIPLE_TIMES) + putBoolean(EXTRA_HIDE_NO_DATE, tasks.any { it.isRecurring }) + putBoolean(EXTRA_AUTO_CLOSE, autoClose) + } return fragment } - fun newDateTimePicker(target: Fragment, rc: Int, current: Long, autoClose: Boolean): DateTimePicker { - val bundle = Bundle() - bundle.putLong(EXTRA_DAY, current.startOfDay()) - bundle.putInt(EXTRA_TIME, current.millisOfDay()) - bundle.putBoolean(EXTRA_AUTO_CLOSE, autoClose) + fun newDateTimePicker( + target: Fragment, + rc: Int, + current: Long, + autoClose: Boolean, + hideNoDate: Boolean, + ): DateTimePicker { val fragment = DateTimePicker() - fragment.arguments = bundle + fragment.arguments = Bundle().apply { + putLong(EXTRA_DAY, current.startOfDay()) + putInt(EXTRA_TIME, current.millisOfDay()) + putBoolean(EXTRA_AUTO_CLOSE, autoClose) + putBoolean(EXTRA_HIDE_NO_DATE, hideNoDate) + } fragment.setTargetFragment(target, rc) return fragment } @@ -105,6 +124,7 @@ class DateTimePicker : BaseDateTimePicker() { else -> throw IllegalArgumentException() } ) + noDateButton.isGone = requireArguments().getBoolean(EXTRA_HIDE_NO_DATE, false) noDateButton.setOnClickListener { clearDate() } noTime.setOnClickListener { clearTime() } todayButton.setOnClickListener { setToday() }