Make alarm immutable

pull/2906/head
Alex Baker 2 years ago
parent 5bd0cef42e
commit 74fca07c1b

@ -90,7 +90,7 @@ class ReminderTests : BaseTaskEditViewModelTest() {
save() save()
assertEquals( assertEquals(
listOf(whenOverdue(1).apply { id = 1 }), listOf(whenOverdue(1).copy(id = 1)),
alarmDao.getAlarms(task.id) alarmDao.getAlarms(task.id)
) )
} }

@ -45,19 +45,13 @@ class AlarmService @Inject constructor(
suspend fun synchronizeAlarms(taskId: Long, alarms: MutableSet<Alarm>): Boolean { suspend fun synchronizeAlarms(taskId: Long, alarms: MutableSet<Alarm>): Boolean {
var changed = false var changed = false
for (existing in alarmDao.getAlarms(taskId)) { for (existing in alarmDao.getAlarms(taskId)) {
if (!alarms.removeIf { if (!alarms.removeIf { it.same(existing)}) {
it.type == existing.type &&
it.time == existing.time &&
it.repeat == existing.repeat &&
it.interval == existing.interval
}) {
alarmDao.delete(existing) alarmDao.delete(existing)
changed = true changed = true
} }
} }
for (alarm in alarms) { alarmDao.insert(alarms.map { it.copy(task = taskId) })
alarm.task = taskId if (alarms.isNotEmpty()) {
alarmDao.insert(alarm)
changed = true changed = true
} }
if (changed) { if (changed) {

@ -8,15 +8,15 @@ package com.todoroo.astrid.repeats
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.dao.TaskDao import com.todoroo.astrid.dao.TaskDao
import org.tasks.data.entity.Task
import com.todoroo.astrid.gcal.GCalHelper import com.todoroo.astrid.gcal.GCalHelper
import net.fortuna.ical4j.model.Date import net.fortuna.ical4j.model.Date
import net.fortuna.ical4j.model.Recur import net.fortuna.ical4j.model.Recur
import net.fortuna.ical4j.model.WeekDay import net.fortuna.ical4j.model.WeekDay
import org.tasks.LocalBroadcastManager import org.tasks.LocalBroadcastManager
import org.tasks.data.createDueDate
import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm
import org.tasks.data.entity.Alarm.Companion.TYPE_SNOOZE 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.data.setRecurrence
import org.tasks.date.DateTimeUtils.newDateTime import org.tasks.date.DateTimeUtils.newDateTime
import org.tasks.repeats.RecurrenceUtils.newRecur import org.tasks.repeats.RecurrenceUtils.newRecur
@ -115,9 +115,11 @@ class RepeatTaskHelper @Inject constructor(
} }
alarmService.getAlarms(taskId) alarmService.getAlarms(taskId)
.filter { it.type != TYPE_SNOOZE } .filter { it.type != TYPE_SNOOZE }
.onEach { .map {
if (it.type == Alarm.TYPE_DATE_TIME) { 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()) } .let { alarmService.synchronizeAlarms(taskId, it.toMutableSet()) }

@ -5,8 +5,8 @@ package com.todoroo.astrid.service
import org.tasks.caldav.VtodoCache import org.tasks.caldav.VtodoCache
import org.tasks.caldav.iCalendar import org.tasks.caldav.iCalendar
import org.tasks.caldav.iCalendar.Companion.reminders import org.tasks.caldav.iCalendar.Companion.reminders
import org.tasks.data.dao.AlarmDao
import org.tasks.data.CaldavTaskContainer import org.tasks.data.CaldavTaskContainer
import org.tasks.data.dao.AlarmDao
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.dao.UpgraderDao import org.tasks.data.dao.UpgraderDao
import javax.inject.Inject import javax.inject.Inject
@ -25,7 +25,7 @@ class Upgrade_12_4 @Inject constructor(
remoteTask remoteTask
.reminders .reminders
.filter { existingAlarms.find { e -> e.task == task.task && e.same(it) } == null } .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) } .let { alarmDao.insert(it) }
} }
taskDao.touch(existingAlarms.map { it.task }.toSet().toList()) taskDao.touch(existingAlarms.map { it.task }.toSet().toList())

@ -202,10 +202,7 @@ class TasksJsonImporter @Inject constructor(
taskDao.createNew(task) taskDao.createNew(task)
val taskId = task.id val taskId = task.id
val taskUuid = task.uuid val taskUuid = task.uuid
for (alarm in backup.alarms) { alarmDao.insert(backup.alarms.map { it.copy(task = taskId) })
alarm.task = taskId
alarmDao.insert(alarm)
}
if (version < V12_4) { if (version < V12_4) {
task.defaultReminders(task.ringFlags) task.defaultReminders(task.ringFlags)
alarmDao.insert(task.getDefaultAlarms()) alarmDao.insert(task.getDefaultAlarms())

@ -249,9 +249,8 @@ class iCalendar @Inject constructor(
task.setDefaultReminders(preferences) task.setDefaultReminders(preferences)
alarmService.synchronizeAlarms(task.id, task.getDefaultAlarms().toMutableSet()) alarmService.synchronizeAlarms(task.id, task.getDefaultAlarms().toMutableSet())
} else if (account.reminderSync) { } else if (account.reminderSync) {
val alarms = alarmDao.getAlarms(task.id).onEach { val alarms = alarmDao.getAlarms(task.id).map {
it.id = 0 it.copy(id = 0, task = 0)
it.task = 0
} }
val randomReminders = alarms.filter { it.type == TYPE_RANDOM } val randomReminders = alarms.filter { it.type == TYPE_RANDOM }
val localReminders = val localReminders =

@ -29,18 +29,18 @@ data class Alarm(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id") @ColumnInfo(name = "_id")
@Transient @Transient
var id: Long = 0, val id: Long = 0,
@ColumnInfo(name = "task", index = true) @ColumnInfo(name = "task", index = true)
@Transient @Transient
var task: Long = 0, val task: Long = 0,
@ColumnInfo(name = "time") @ColumnInfo(name = "time")
var time: Long = 0, val time: Long = 0,
@ColumnInfo(name = "type", defaultValue = "0") @ColumnInfo(name = "type", defaultValue = "0")
var type: Int = 0, val type: Int = 0,
@ColumnInfo(name = "repeat", defaultValue = "0") @ColumnInfo(name = "repeat", defaultValue = "0")
var repeat: Int = 0, val repeat: Int = 0,
@ColumnInfo(name = "interval", defaultValue = "0") @ColumnInfo(name = "interval", defaultValue = "0")
var interval: Long = 0, val interval: Long = 0,
) : Parcelable { ) : Parcelable {
fun same(other: Alarm) = fun same(other: Alarm) =
type == other.type && type == other.type &&

Loading…
Cancel
Save