Move after update work inside transaction

pull/2860/head
Alex Baker 2 months ago
parent 7c68a7fa59
commit 584d4a5cbb

@ -9,9 +9,6 @@ import com.todoroo.astrid.alarms.AlarmService
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.data.Task import com.todoroo.astrid.data.Task
import com.todoroo.astrid.timers.TimerPlugin 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.LocalBroadcastManager
import org.tasks.data.TaskContainer import org.tasks.data.TaskContainer
import org.tasks.data.TaskDao 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 save(task: Task) = save(task, fetch(task.id))
suspend fun saved(original: Task) = suspend fun save(tasks: List<Task>, originals: List<Task>) {
fetch(original.id)?.let { taskDao.updateInternal(tasks)
afterUpdate( tasks.forEach { task -> afterUpdate(task, originals.find { it.id == task.id }) }
it.apply { if (original.isSuppressRefresh()) suppressRefresh() }, }
original
)
}
suspend fun save(task: Task, original: Task?) { suspend fun save(task: Task, original: Task?) {
if (taskDao.update(task, original)) { if (taskDao.update(task, original)) {
@ -117,28 +111,24 @@ class TaskDao @Inject constructor(
if (task.calendarURI?.isNotBlank() == true) { if (task.calendarURI?.isNotBlank() == true) {
workManager.updateCalendar(task) workManager.updateCalendar(task)
} }
coroutineScope { if (justCompleted || justDeleted) {
launch(Dispatchers.Default) { notificationManager.cancel(task.id)
if (justCompleted || justDeleted) { if (task.timerStart > 0) {
notificationManager.cancel(task.id) timerPlugin.stopTimer(task)
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 (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) suspend fun createNew(task: Task) = taskDao.createNew(task)

@ -65,24 +65,29 @@ class TaskCompleter @Inject internal constructor(
return return
} }
val completed = completionDate > 0 val completed = completionDate > 0
val modified = System.currentTimeMillis()
database.withTransaction { database.withTransaction {
taskDao.setCompletionDate(tasks.mapNotNull { it.remoteId }, completionDate) tasks
tasks.forEachIndexed { i, original -> .map {
if (i < tasks.lastIndex) { it.copy(
original.suppressRefresh() completionDate = completionDate,
modificationDate = modified,
)
} }
taskDao.saved(original) .also { completed ->
} completed.subList(0, completed.lastIndex).forEach { it.suppressRefresh() }
tasks.forEach { task -> taskDao.save(completed, tasks)
if (completed && task.isRecurring) { }
gCalHelper.updateEvent(task) .forEach { task ->
if (completed && task.isRecurring) {
gCalHelper.updateEvent(task)
if (caldavDao.getAccountForTask(task.id)?.isSuppressRepeatingTasks != true) { if (caldavDao.getAccountForTask(task.id)?.isSuppressRepeatingTasks != true) {
repeatTaskHelper.handleRepeat(task) repeatTaskHelper.handleRepeat(task)
setComplete(task, false) setComplete(task, false)
}
} }
} }
}
} }
if (completed && notificationManager.currentInterruptionFilter == INTERRUPTION_FILTER_ALL) { if (completed && notificationManager.currentInterruptionFilter == INTERRUPTION_FILTER_ALL) {
preferences preferences

@ -211,6 +211,9 @@ FROM recursive_tasks
@Update @Update
internal abstract suspend fun updateInternal(task: Task): Int internal abstract suspend fun updateInternal(task: Task): Int
@Update
internal abstract suspend fun updateInternal(tasks: List<Task>)
suspend fun createNew(task: Task): Long { suspend fun createNew(task: Task): Long {
task.id = NO_ID task.id = NO_ID
if (task.creationDate == 0L) { if (task.creationDate == 0L) {

Loading…
Cancel
Save