diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt index fdeb6fa80..1d69edd05 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt @@ -9,9 +9,6 @@ import com.todoroo.astrid.alarms.AlarmService import com.todoroo.astrid.api.Filter import com.todoroo.astrid.data.Task import com.todoroo.astrid.timers.TimerPlugin -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch import org.tasks.LocalBroadcastManager import org.tasks.data.TaskContainer import org.tasks.data.TaskDao @@ -95,13 +92,10 @@ class TaskDao @Inject constructor( */ suspend fun save(task: Task) = save(task, fetch(task.id)) - suspend fun saved(original: Task) = - fetch(original.id)?.let { - afterUpdate( - it.apply { if (original.isSuppressRefresh()) suppressRefresh() }, - original - ) - } + suspend fun save(tasks: List, originals: List) { + taskDao.updateInternal(tasks) + tasks.forEach { task -> afterUpdate(task, originals.find { it.id == task.id }) } + } suspend fun save(task: Task, original: Task?) { if (taskDao.update(task, original)) { @@ -117,28 +111,24 @@ class TaskDao @Inject constructor( if (task.calendarURI?.isNotBlank() == true) { workManager.updateCalendar(task) } - coroutineScope { - launch(Dispatchers.Default) { - if (justCompleted || justDeleted) { - notificationManager.cancel(task.id) - if (task.timerStart > 0) { - timerPlugin.stopTimer(task) - } - } - if (task.dueDate != original?.dueDate && task.dueDate.isAfterNow()) { - notificationManager.cancel(task.id) - } - if (completionDateModified || deletionDateModified) { - geofenceApi.update(task.id) - } - alarmService.scheduleAlarms(task) - workManager.scheduleRefresh() - if (!task.isSuppressRefresh()) { - localBroadcastManager.broadcastRefresh() - } - syncAdapters.sync(task, original) + if (justCompleted || justDeleted) { + notificationManager.cancel(task.id) + if (task.timerStart > 0) { + timerPlugin.stopTimer(task) } } + if (task.dueDate != original?.dueDate && task.dueDate.isAfterNow()) { + notificationManager.cancel(task.id) + } + if (completionDateModified || deletionDateModified) { + geofenceApi.update(task.id) + } + alarmService.scheduleAlarms(task) + workManager.scheduleRefresh() + if (!task.isSuppressRefresh()) { + localBroadcastManager.broadcastRefresh() + } + syncAdapters.sync(task, original) } suspend fun createNew(task: Task) = taskDao.createNew(task) diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt index 16a7f0b02..74c81ff12 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCompleter.kt @@ -65,24 +65,29 @@ class TaskCompleter @Inject internal constructor( return } val completed = completionDate > 0 + val modified = System.currentTimeMillis() database.withTransaction { - taskDao.setCompletionDate(tasks.mapNotNull { it.remoteId }, completionDate) - tasks.forEachIndexed { i, original -> - if (i < tasks.lastIndex) { - original.suppressRefresh() + tasks + .map { + it.copy( + completionDate = completionDate, + modificationDate = modified, + ) } - taskDao.saved(original) - } - tasks.forEach { task -> - if (completed && task.isRecurring) { - gCalHelper.updateEvent(task) + .also { completed -> + completed.subList(0, completed.lastIndex).forEach { it.suppressRefresh() } + taskDao.save(completed, tasks) + } + .forEach { task -> + if (completed && task.isRecurring) { + gCalHelper.updateEvent(task) - if (caldavDao.getAccountForTask(task.id)?.isSuppressRepeatingTasks != true) { - repeatTaskHelper.handleRepeat(task) - setComplete(task, false) + if (caldavDao.getAccountForTask(task.id)?.isSuppressRepeatingTasks != true) { + repeatTaskHelper.handleRepeat(task) + setComplete(task, false) + } } } - } } if (completed && notificationManager.currentInterruptionFilter == INTERRUPTION_FILTER_ALL) { preferences diff --git a/app/src/main/java/org/tasks/data/TaskDao.kt b/app/src/main/java/org/tasks/data/TaskDao.kt index a19d479b6..82fbd615c 100644 --- a/app/src/main/java/org/tasks/data/TaskDao.kt +++ b/app/src/main/java/org/tasks/data/TaskDao.kt @@ -211,6 +211,9 @@ FROM recursive_tasks @Update internal abstract suspend fun updateInternal(task: Task): Int + @Update + internal abstract suspend fun updateInternal(tasks: List) + suspend fun createNew(task: Task): Long { task.id = NO_ID if (task.creationDate == 0L) {