From 74fca07c1bb4c8a622a836d8e6445bc949150731 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 18 May 2024 01:46:51 -0500 Subject: [PATCH] Make alarm immutable --- .../java/org/tasks/ui/editviewmodel/ReminderTests.kt | 2 +- .../java/com/todoroo/astrid/alarms/AlarmService.kt | 12 +++--------- .../com/todoroo/astrid/repeats/RepeatTaskHelper.kt | 10 ++++++---- .../java/com/todoroo/astrid/service/Upgrade_12_4.kt | 4 ++-- .../main/java/org/tasks/backup/TasksJsonImporter.kt | 5 +---- app/src/main/java/org/tasks/caldav/iCalendar.kt | 5 ++--- data/src/main/kotlin/org/tasks/data/entity/Alarm.kt | 12 ++++++------ 7 files changed, 21 insertions(+), 29 deletions(-) diff --git a/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt b/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt index 0320427df..9843e1c0a 100644 --- a/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt +++ b/app/src/androidTest/java/org/tasks/ui/editviewmodel/ReminderTests.kt @@ -90,7 +90,7 @@ class ReminderTests : BaseTaskEditViewModelTest() { save() assertEquals( - listOf(whenOverdue(1).apply { id = 1 }), + listOf(whenOverdue(1).copy(id = 1)), alarmDao.getAlarms(task.id) ) } diff --git a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt index f3434630b..286c3d88a 100644 --- a/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt +++ b/app/src/main/java/com/todoroo/astrid/alarms/AlarmService.kt @@ -45,19 +45,13 @@ class AlarmService @Inject constructor( suspend fun synchronizeAlarms(taskId: Long, alarms: MutableSet): Boolean { var changed = false for (existing in alarmDao.getAlarms(taskId)) { - if (!alarms.removeIf { - it.type == existing.type && - it.time == existing.time && - it.repeat == existing.repeat && - it.interval == existing.interval - }) { + if (!alarms.removeIf { it.same(existing)}) { alarmDao.delete(existing) changed = true } } - for (alarm in alarms) { - alarm.task = taskId - alarmDao.insert(alarm) + alarmDao.insert(alarms.map { it.copy(task = taskId) }) + if (alarms.isNotEmpty()) { changed = true } if (changed) { diff --git a/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt b/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt index 952ec1353..e3f8c4760 100644 --- a/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt +++ b/app/src/main/java/com/todoroo/astrid/repeats/RepeatTaskHelper.kt @@ -8,15 +8,15 @@ package com.todoroo.astrid.repeats import com.todoroo.andlib.utility.DateUtilities import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.dao.TaskDao -import org.tasks.data.entity.Task import com.todoroo.astrid.gcal.GCalHelper import net.fortuna.ical4j.model.Date import net.fortuna.ical4j.model.Recur import net.fortuna.ical4j.model.WeekDay import org.tasks.LocalBroadcastManager +import org.tasks.data.createDueDate import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm.Companion.TYPE_SNOOZE -import org.tasks.data.createDueDate +import org.tasks.data.entity.Task import org.tasks.data.setRecurrence import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.repeats.RecurrenceUtils.newRecur @@ -115,9 +115,11 @@ class RepeatTaskHelper @Inject constructor( } alarmService.getAlarms(taskId) .filter { it.type != TYPE_SNOOZE } - .onEach { + .map { if (it.type == Alarm.TYPE_DATE_TIME) { - it.time += newDueDate - oldDueDate + it.copy(time = it.time + newDueDate - oldDueDate) + } else { + it } } .let { alarmService.synchronizeAlarms(taskId, it.toMutableSet()) } diff --git a/app/src/main/java/com/todoroo/astrid/service/Upgrade_12_4.kt b/app/src/main/java/com/todoroo/astrid/service/Upgrade_12_4.kt index 82598d51c..cc9be7c44 100644 --- a/app/src/main/java/com/todoroo/astrid/service/Upgrade_12_4.kt +++ b/app/src/main/java/com/todoroo/astrid/service/Upgrade_12_4.kt @@ -5,8 +5,8 @@ package com.todoroo.astrid.service import org.tasks.caldav.VtodoCache import org.tasks.caldav.iCalendar import org.tasks.caldav.iCalendar.Companion.reminders -import org.tasks.data.dao.AlarmDao import org.tasks.data.CaldavTaskContainer +import org.tasks.data.dao.AlarmDao import org.tasks.data.dao.TaskDao import org.tasks.data.dao.UpgraderDao import javax.inject.Inject @@ -25,7 +25,7 @@ class Upgrade_12_4 @Inject constructor( remoteTask .reminders .filter { existingAlarms.find { e -> e.task == task.task && e.same(it) } == null } - .onEach { it.task = task.task } + .map { it.copy(task = task.task) } .let { alarmDao.insert(it) } } taskDao.touch(existingAlarms.map { it.task }.toSet().toList()) diff --git a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt index fb2375b33..3a47355ef 100644 --- a/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt +++ b/app/src/main/java/org/tasks/backup/TasksJsonImporter.kt @@ -202,10 +202,7 @@ class TasksJsonImporter @Inject constructor( taskDao.createNew(task) val taskId = task.id val taskUuid = task.uuid - for (alarm in backup.alarms) { - alarm.task = taskId - alarmDao.insert(alarm) - } + alarmDao.insert(backup.alarms.map { it.copy(task = taskId) }) if (version < V12_4) { task.defaultReminders(task.ringFlags) alarmDao.insert(task.getDefaultAlarms()) diff --git a/app/src/main/java/org/tasks/caldav/iCalendar.kt b/app/src/main/java/org/tasks/caldav/iCalendar.kt index b68080a9b..e5916a5e1 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendar.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendar.kt @@ -249,9 +249,8 @@ class iCalendar @Inject constructor( task.setDefaultReminders(preferences) alarmService.synchronizeAlarms(task.id, task.getDefaultAlarms().toMutableSet()) } else if (account.reminderSync) { - val alarms = alarmDao.getAlarms(task.id).onEach { - it.id = 0 - it.task = 0 + val alarms = alarmDao.getAlarms(task.id).map { + it.copy(id = 0, task = 0) } val randomReminders = alarms.filter { it.type == TYPE_RANDOM } val localReminders = diff --git a/data/src/main/kotlin/org/tasks/data/entity/Alarm.kt b/data/src/main/kotlin/org/tasks/data/entity/Alarm.kt index d04499c0f..feaba28b8 100644 --- a/data/src/main/kotlin/org/tasks/data/entity/Alarm.kt +++ b/data/src/main/kotlin/org/tasks/data/entity/Alarm.kt @@ -29,18 +29,18 @@ data class Alarm( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id") @Transient - var id: Long = 0, + val id: Long = 0, @ColumnInfo(name = "task", index = true) @Transient - var task: Long = 0, + val task: Long = 0, @ColumnInfo(name = "time") - var time: Long = 0, + val time: Long = 0, @ColumnInfo(name = "type", defaultValue = "0") - var type: Int = 0, + val type: Int = 0, @ColumnInfo(name = "repeat", defaultValue = "0") - var repeat: Int = 0, + val repeat: Int = 0, @ColumnInfo(name = "interval", defaultValue = "0") - var interval: Long = 0, + val interval: Long = 0, ) : Parcelable { fun same(other: Alarm) = type == other.type &&