From ac35002408193eb5f1dd8c057b1bba33f8d68b43 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 25 Nov 2023 21:27:22 -0600 Subject: [PATCH 1/4] Revert "Update modification timestamp logic (#2585)" This reverts commit 775289b058f29d28ea117bb088d6e10889b3259f. --- .../java/com/todoroo/astrid/dao/TaskDao.kt | 5 ++- .../main/java/com/todoroo/astrid/data/Task.kt | 44 +++++++++++-------- .../main/java/org/tasks/caldav/iCalendar.kt | 8 +--- .../java/org/tasks/caldav/iCalendarMerge.kt | 13 +----- app/src/main/java/org/tasks/data/TaskDao.kt | 18 +++----- 5 files changed, 38 insertions(+), 50 deletions(-) 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 acdb6534f..67a1e43cd 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.kt @@ -106,8 +106,9 @@ class TaskDao @Inject constructor( } suspend fun save(task: Task, original: Task?) { - val updated = taskDao.update(task, original) - afterUpdate(updated, original) + if (taskDao.update(task, original)) { + afterUpdate(task, original) + } } private suspend fun afterUpdate(task: Task, original: Task?) { diff --git a/app/src/main/java/com/todoroo/astrid/data/Task.kt b/app/src/main/java/com/todoroo/astrid/data/Task.kt index 0f683d69b..a195984e7 100644 --- a/app/src/main/java/com/todoroo/astrid/data/Task.kt +++ b/app/src/main/java/com/todoroo/astrid/data/Task.kt @@ -187,25 +187,31 @@ data class Task( val isNew: Boolean get() = id == NO_ID - fun significantChange(task: Task): Boolean = - id != task.id - || title != task.title - || priority != task.priority - || dueDate != task.dueDate - || hideUntil != task.hideUntil - || creationDate != task.creationDate - || modificationDate != task.modificationDate - || completionDate != task.completionDate - || deletionDate != task.deletionDate - || notes != task.notes - || estimatedSeconds != task.estimatedSeconds - || elapsedSeconds != task.elapsedSeconds - || ringFlags != task.ringFlags - || recurrence != task.recurrence - || calendarURI != task.calendarURI - || parent != task.parent - || remoteId != task.remoteId - || order != task.order + fun insignificantChange(task: Task?): Boolean { + if (this === task) { + return true + } + return if (task == null) { + false + } else id == task.id + && title == task.title + && priority == task.priority + && dueDate == task.dueDate + && hideUntil == task.hideUntil + && creationDate == task.creationDate + && modificationDate == task.modificationDate + && completionDate == task.completionDate + && deletionDate == task.deletionDate + && notes == task.notes + && estimatedSeconds == task.estimatedSeconds + && elapsedSeconds == task.elapsedSeconds + && ringFlags == task.ringFlags + && recurrence == task.recurrence + && calendarURI == task.calendarURI + && parent == task.parent + && remoteId == task.remoteId + && order == task.order + } fun googleTaskUpToDate(original: Task?): Boolean { if (this === original) { diff --git a/app/src/main/java/org/tasks/caldav/iCalendar.kt b/app/src/main/java/org/tasks/caldav/iCalendar.kt index 946876c97..cfde1c3f4 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendar.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendar.kt @@ -215,7 +215,7 @@ class iCalendar @Inject constructor( `object` = obj ) val isNew = caldavTask.id == com.todoroo.astrid.data.Task.NO_ID - val dirty = !isNew && task.modificationDate > caldavTask.lastSync + val dirty = task.modificationDate > caldavTask.lastSync || caldavTask.lastSync == 0L val local = vtodoCache.getVtodo(calendar, caldavTask)?.let { fromVtodo(it) } task.applyRemote(remote, local) caldavTask.applyRemote(remote, local) @@ -263,11 +263,7 @@ class iCalendar @Inject constructor( task.suppressSync() task.suppressRefresh() - if (isNew) { - taskDao.save(task, null) - } else { - taskDao.save(task) - } + taskDao.save(task) vtodoCache.putVtodo(calendar, caldavTask, vtodo) caldavTask.etag = eTag if (!dirty) { diff --git a/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt b/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt index 3b9ac2a52..b59498d86 100644 --- a/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt +++ b/app/src/main/java/org/tasks/caldav/iCalendarMerge.kt @@ -2,7 +2,6 @@ package org.tasks.caldav import at.bitfire.ical4android.Task import com.todoroo.andlib.utility.DateUtilities -import com.todoroo.andlib.utility.DateUtilities.now import com.todoroo.astrid.data.Task.Priority.Companion.HIGH import com.todoroo.astrid.data.Task.Priority.Companion.LOW import com.todoroo.astrid.data.Task.Priority.Companion.MEDIUM @@ -24,7 +23,6 @@ fun com.todoroo.astrid.data.Task.applyRemote( ): com.todoroo.astrid.data.Task { applyCompletedAt(remote, local) applyCreatedAt(remote, local) - applyModified(remote, local) applyTitle(remote, local) applyDescription(remote, local) applyPriority(remote, local) @@ -63,16 +61,7 @@ private fun com.todoroo.astrid.data.Task.applyCreatedAt(remote: Task, local: Tas val localCreated = local?.createdAt?.let { newDateTime(it, UTC) }?.toLocal()?.millis if (localCreated == null || localCreated == creationDate) { remote.createdAt?.let { - creationDate = newDateTime(it, UTC).toLocal().millis.coerceAtMost(now()) - } - } -} - -private fun com.todoroo.astrid.data.Task.applyModified(remote: Task, local: Task?) { - val localModified = local?.lastModified?.let { newDateTime(it, UTC) }?.toLocal()?.millis - if (localModified == null || localModified == modificationDate) { - remote.lastModified?.let { - modificationDate = newDateTime(it, UTC).toLocal().millis.coerceAtMost(now()) + creationDate = newDateTime(it, UTC).toLocal().millis } } } diff --git a/app/src/main/java/org/tasks/data/TaskDao.kt b/app/src/main/java/org/tasks/data/TaskDao.kt index 08961aa2e..10e950e07 100644 --- a/app/src/main/java/org/tasks/data/TaskDao.kt +++ b/app/src/main/java/org/tasks/data/TaskDao.kt @@ -188,19 +188,15 @@ FROM recursive_tasks @Insert abstract suspend fun insert(task: Task): Long - suspend fun update(task: Task, original: Task?): Task = - task - .copy( - modificationDate = when { - original?.let { task.significantChange(it) } == true -> now() - task.modificationDate == 0L -> task.creationDate - else -> task.modificationDate - } - ) - .also { updateInternal(it) } + suspend fun update(task: Task, original: Task? = null): Boolean { + if (!task.insignificantChange(original)) { + task.modificationDate = now() + } + return updateInternal(task) == 1 + } @Update - internal abstract suspend fun updateInternal(task: Task) + internal abstract suspend fun updateInternal(task: Task): Int suspend fun createNew(task: Task): Long { task.id = NO_ID From d0360a4862a44b291e0203ff5f7c8820dd242d1a Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 25 Nov 2023 23:42:35 -0600 Subject: [PATCH 2/4] Revert "Update timestamp on edits" This reverts commit b477623524de02c283f0b78800ebadd12d1125e1. --- app/src/androidTest/java/org/tasks/data/CaldavDaoShiftTests.kt | 2 +- app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt | 2 +- app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt | 2 +- app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt | 2 +- app/src/main/java/com/todoroo/astrid/timers/TimerPlugin.kt | 2 +- app/src/main/java/org/tasks/ui/TaskEditViewModel.kt | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/tasks/data/CaldavDaoShiftTests.kt b/app/src/androidTest/java/org/tasks/data/CaldavDaoShiftTests.kt index 0b0cdf9a4..bc4936efe 100644 --- a/app/src/androidTest/java/org/tasks/data/CaldavDaoShiftTests.kt +++ b/app/src/androidTest/java/org/tasks/data/CaldavDaoShiftTests.kt @@ -112,7 +112,7 @@ class CaldavDaoShiftTests : InjectingTestCase() { fun ignoreDeletedTasksWhenShiftingDown() = runBlocking { val created = DateTime(2020, 5, 17, 9, 53, 17) addTask(with(CREATED, created)) - taskDao.update(taskDao.fetch(tasks[0].id).apply { this?.deletionDate = now() }!!, null) + taskDao.update(taskDao.fetch(tasks[0].id).apply { this?.deletionDate = now() }!!) caldavDao.shiftDown("calendar", 0, created.toAppleEpoch()) diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt index c5547f267..134730848 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.kt @@ -443,6 +443,6 @@ open class TaskAdapter( task.parent = newParent } caldavDao.update(caldavTask.id, caldavTask.remoteParent) - taskDao.save(task.task) + taskDao.save(task.task, null) } } \ No newline at end of file diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt index c1acd0aa2..013d1590f 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.kt @@ -114,7 +114,7 @@ class TaskCreator @Inject constructor( locationDao.insert(Geofence(place.uid, preferences)) } } - taskDao.save(task) + taskDao.save(task, null) alarmDao.insert(task.getDefaultAlarms()) return task } diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt b/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt index de4b42ba2..b958e705b 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt +++ b/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.kt @@ -99,7 +99,7 @@ class TaskDuplicator @Inject constructor( alarmDao.insert(alarms.map { Alarm(clone.id, it.time, it.type) }) } gcalHelper.createTaskEventIfEnabled(clone) - taskDao.save(clone) // TODO: delete me + taskDao.save(clone, null) // TODO: delete me taskAttachmentDao .getAttachmentsForTask(originalId) .map { diff --git a/app/src/main/java/com/todoroo/astrid/timers/TimerPlugin.kt b/app/src/main/java/com/todoroo/astrid/timers/TimerPlugin.kt index 393ff1aee..d9a1f9963 100644 --- a/app/src/main/java/com/todoroo/astrid/timers/TimerPlugin.kt +++ b/app/src/main/java/com/todoroo/astrid/timers/TimerPlugin.kt @@ -55,7 +55,7 @@ class TimerPlugin @Inject constructor( task.elapsedSeconds = task.elapsedSeconds + newElapsed } } - taskDao.update(task, taskDao.fetch(task.id)) + taskDao.update(task) updateNotifications() } diff --git a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt index fdc845314..8d1ade3cd 100644 --- a/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt +++ b/app/src/main/java/org/tasks/ui/TaskEditViewModel.kt @@ -300,7 +300,7 @@ class TaskEditViewModel @Inject constructor( selectedAlarms.value = selectedAlarms.value.filterNot { a -> a.type == TYPE_REL_END } } - taskDao.save(task) + taskDao.save(task, null) if (isNew || originalList != selectedList.value) { task.parent = 0 From 5edc481ffe4ae49501836807f0ff3c687d34652d Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 25 Nov 2023 21:42:35 -0600 Subject: [PATCH 3/4] Fix etag check for DecSync --- .../org/tasks/opentasks/OpenTasksSynchronizer.kt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt b/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt index 785b198ce..39d42903c 100644 --- a/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt +++ b/app/src/main/java/org/tasks/opentasks/OpenTasksSynchronizer.kt @@ -15,7 +15,12 @@ import org.tasks.analytics.Constants import org.tasks.analytics.Firebase import org.tasks.billing.Inventory import org.tasks.caldav.iCalendar -import org.tasks.data.* +import org.tasks.data.CaldavAccount +import org.tasks.data.CaldavCalendar +import org.tasks.data.CaldavDao +import org.tasks.data.CaldavTask +import org.tasks.data.MyAndroidTask +import org.tasks.data.OpenTaskDao import org.tasks.data.OpenTaskDao.Companion.filterActive import org.tasks.data.OpenTaskDao.Companion.isDavx5 import org.tasks.data.OpenTaskDao.Companion.isDecSync @@ -151,7 +156,7 @@ class OpenTasksSynchronizer @Inject constructor( val etags = openTaskDao.getEtags(listId) etags.forEach { (uid, sync1, version) -> val caldavTask = caldavDao.getTaskByRemoteId(calendar.uuid!!, uid) - val etag = if (account.isEteSync) version else sync1 + val etag = if (account.isEteSync || account.isDecSync) version else sync1 if (caldavTask?.etag == null || caldavTask.etag != etag) { applyChanges(account, calendar, listId, uid, etag, caldavTask) } @@ -236,5 +241,8 @@ class OpenTasksSynchronizer @Inject constructor( companion object { private val CaldavAccount.isEteSync: Boolean get() = uuid?.isEteSync() == true + + private val CaldavAccount.isDecSync: Boolean + get() = uuid?.isDecSync() == true } } \ No newline at end of file From ee21cc660eb5ccea11ed011d23aab33d7e06bb40 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 25 Nov 2023 23:38:41 -0600 Subject: [PATCH 4/4] Update version and changelog --- CHANGELOG.md | 9 +++++++-- app/build.gradle.kts | 4 ++-- fastlane/metadata/android/en-US/changelogs/130605.txt | 2 ++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/130605.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 95a7793eb..b8e86451f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,13 @@ -### 13.6.2 (2023-11-30) +### 13.6.3 (2023-11-25) + +* Revert "Preserve modification times on initial sync" [#2460](https://github.com/tasks/tasks/issues/2640) +* Fix unnecessary DecSync work + +### 13.6.2 (2023-10-30) * Fix updating modification timestamp on edits -### 13.6.1 (2023-11-27) +### 13.6.1 (2023-10-27) * Push pending changes when app is backgrounded * Don't require internet connection for DAVx5/EteSync/DecSync sync diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9f8c166aa..f6f847ef1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -55,8 +55,8 @@ android { defaultConfig { testApplicationId = "org.tasks.test" applicationId = "org.tasks" - versionCode = 130604 - versionName = "13.6.2" + versionCode = 130605 + versionName = "13.6.3" targetSdk = 33 minSdk = 24 testInstrumentationRunner = "org.tasks.TestRunner" diff --git a/fastlane/metadata/android/en-US/changelogs/130605.txt b/fastlane/metadata/android/en-US/changelogs/130605.txt new file mode 100644 index 000000000..cdbe1cd13 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/130605.txt @@ -0,0 +1,2 @@ +* Revert "Preserve modification times on initial sync" +* Fix unnecessary DecSync work