From dfe64d5f6f163536b8b3af86d0101de287ba6a5b Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 19 Feb 2022 22:42:25 -0600 Subject: [PATCH] Convert selected alarms to MutableStateFlow --- .../astrid/ui/RandomReminderControlSet.kt | 13 +++++----- .../todoroo/astrid/ui/ReminderControlSet.kt | 25 ++++++++----------- .../java/org/tasks/ui/TaskEditViewModel.kt | 23 ++++++++--------- 3 files changed, 29 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.kt index 616705082..bdf1f1da1 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/RandomReminderControlSet.kt @@ -43,13 +43,14 @@ internal class RandomReminderControlSet(context: Context, parentView: View, remi override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { val newAlarm = Alarm(vm.task?.id ?: 0, hours[position] * DateUtilities.ONE_HOUR, TYPE_RANDOM) - vm.selectedAlarms?.apply { - find { it.type == TYPE_RANDOM }?.let { - newAlarm.id = it.id - remove(it) + vm.selectedAlarms.value = + vm.selectedAlarms.value.toMutableList().apply { + find { it.type == TYPE_RANDOM }?.let { + newAlarm.id = it.id + remove(it) + } + add(newAlarm) } - add(newAlarm) - } } override fun onNothingSelected(parent: AdapterView<*>?) {} diff --git a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt index dbcea9eca..3f1d8cff9 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt +++ b/app/src/main/java/com/todoroo/astrid/ui/ReminderControlSet.kt @@ -70,7 +70,7 @@ class ReminderControlSet : TaskEditControlFragment() { viewModel.ringFiveTimes!! -> setRingMode(1) else -> setRingMode(0) } - viewModel.selectedAlarms?.forEach(this::addAlarmRow) + viewModel.selectedAlarms.value.forEach(this::addAlarmRow) } override fun onSaveInstanceState(outState: Bundle) { @@ -217,9 +217,9 @@ class ReminderControlSet : TaskEditControlFragment() { if (requestCode == REQUEST_NEW_ALARM) { if (resultCode == Activity.RESULT_OK) { val timestamp = data!!.getLongExtra(MyTimePickerDialog.EXTRA_TIMESTAMP, 0L) - if (viewModel.selectedAlarms?.any { it.type == TYPE_DATE_TIME && timestamp == it.time } == false) { + if (viewModel.selectedAlarms.value.none { it.type == TYPE_DATE_TIME && timestamp == it.time }) { val alarm = Alarm(viewModel.task?.id ?: 0, timestamp, TYPE_DATE_TIME) - viewModel.selectedAlarms?.add(alarm) + viewModel.selectedAlarms.value = viewModel.selectedAlarms.value.plus(alarm) addAlarmRow(alarm) } } @@ -231,15 +231,12 @@ class ReminderControlSet : TaskEditControlFragment() { private fun addAlarmRow(alarm: Alarm) { val alarmRow = addAlarmRow(alarm) { if (alarm.type == TYPE_RANDOM) { - viewModel.selectedAlarms?.removeIf { it.type == TYPE_RANDOM } + viewModel.selectedAlarms.value = + viewModel.selectedAlarms.value.filterNot { it.type == TYPE_RANDOM } randomControlSet = null } else { - viewModel.selectedAlarms?.removeIf { - it.type == alarm.type && - it.time == alarm.time && - it.repeat == alarm.repeat && - it.interval == alarm.interval - } + viewModel.selectedAlarms.value = + viewModel.selectedAlarms.value.filterNot { it.same(alarm) } } } if (alarm.type == TYPE_RANDOM) { @@ -267,7 +264,7 @@ class ReminderControlSet : TaskEditControlFragment() { private fun addAlarmRow(alertItem: View, alarm: Alarm, onRemove: View.OnClickListener?) { val display = alertItem.findViewById(R.id.alarm_string) - viewModel.selectedAlarms?.add(alarm) + viewModel.selectedAlarms.value = viewModel.selectedAlarms.value.plus(alarm) display.text = alarmToString.toString(alarm) alertItem .findViewById(R.id.clear) @@ -280,13 +277,13 @@ class ReminderControlSet : TaskEditControlFragment() { private val options: List get() { val options: MutableList = ArrayList() - if (viewModel.selectedAlarms?.find { it.type == TYPE_REL_START && it.time == 0L } == null) { + if (viewModel.selectedAlarms.value.find { it.type == TYPE_REL_START && it.time == 0L } == null) { options.add(getString(R.string.when_started)) } - if (viewModel.selectedAlarms?.find { it.type == TYPE_REL_END && it.time == 0L } == null) { + if (viewModel.selectedAlarms.value.find { it.type == TYPE_REL_END && it.time == 0L } == null) { options.add(getString(R.string.when_due)) } - if (viewModel.selectedAlarms?.find { it.type == TYPE_REL_END && it.time == TimeUnit.HOURS.toMillis(24) } == null) { + if (viewModel.selectedAlarms.value.find { it.type == TYPE_REL_END && it.time == TimeUnit.HOURS.toMillis(24) } == null) { options.add(getString(R.string.when_overdue)) } if (randomControlSet == null) { diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt index bfee7dece..b44e454c5 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt @@ -26,10 +26,9 @@ import com.todoroo.astrid.timers.TimerPlugin import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.runBlocking import net.fortuna.ical4j.model.Recur import org.tasks.Event @@ -117,7 +116,7 @@ class TaskEditViewModel @Inject constructor( } } else { alarms - }.toImmutableSet() + } if (isNew && permissionChecker.canAccessCalendars()) { originalCalendar = preferences.defaultCalendar } @@ -266,13 +265,13 @@ class TaskEditViewModel @Inject constructor( var newSubtasks = ArrayList() - var originalAlarms: ImmutableSet? = null + private var originalAlarms = emptyList() private set(value) { field = value - selectedAlarms = value?.let { HashSet(it) } + selectedAlarms.value = value } - var selectedAlarms: HashSet? = null + var selectedAlarms = MutableStateFlow(emptyList()) var ringNonstop: Boolean? = null get() = field ?: task?.isNotifyModeNonstop @@ -319,7 +318,7 @@ class TaskEditViewModel @Inject constructor( originalTags?.toHashSet() != selectedTags?.toHashSet() || newSubtasks.isNotEmpty() || it.ringFlags != getRingFlags() || - originalAlarms != selectedAlarms + originalAlarms.toHashSet() != selectedAlarms.value.toHashSet() } ?: false fun cleared() = cleared.value?.value == true @@ -412,19 +411,19 @@ class TaskEditViewModel @Inject constructor( } if (!it.hasStartDate()) { - selectedAlarms?.removeIf { a -> a.type == TYPE_REL_START } + selectedAlarms.value = selectedAlarms.value.filterNot { a -> a.type == TYPE_REL_START } } if (!it.hasDueDate()) { - selectedAlarms?.removeIf { a -> a.type == TYPE_REL_END } + selectedAlarms.value = selectedAlarms.value.filterNot { a -> a.type == TYPE_REL_END } } taskDao.save(it, null) if ( - selectedAlarms != originalAlarms || - (isNew && selectedAlarms?.isNotEmpty() == true) + selectedAlarms.value.toHashSet() != originalAlarms.toHashSet() || + (isNew && selectedAlarms.value.isNotEmpty()) ) { - alarmService.synchronizeAlarms(it.id, selectedAlarms!!) + alarmService.synchronizeAlarms(it.id, selectedAlarms.value.toMutableSet()) it.putTransitory(SyncFlags.FORCE_CALDAV_SYNC, true) it.modificationDate = now() }