Merge branch '13.6.3'

pull/2602/head
Alex Baker 6 months ago
commit 8312113d7b

@ -1,3 +1,8 @@
### 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) ### 13.6.2 (2023-10-30)
* Fix updating modification timestamp on edits * Fix updating modification timestamp on edits

@ -55,8 +55,8 @@ android {
defaultConfig { defaultConfig {
testApplicationId = "org.tasks.test" testApplicationId = "org.tasks.test"
applicationId = "org.tasks" applicationId = "org.tasks"
versionCode = 130604 versionCode = 130605
versionName = "13.6.2" versionName = "13.6.3"
targetSdk = 33 targetSdk = 33
minSdk = 24 minSdk = 24
testInstrumentationRunner = "org.tasks.TestRunner" testInstrumentationRunner = "org.tasks.TestRunner"

@ -112,7 +112,7 @@ class CaldavDaoShiftTests : InjectingTestCase() {
fun ignoreDeletedTasksWhenShiftingDown() = runBlocking { fun ignoreDeletedTasksWhenShiftingDown() = runBlocking {
val created = DateTime(2020, 5, 17, 9, 53, 17) val created = DateTime(2020, 5, 17, 9, 53, 17)
addTask(with(CREATED, created)) 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()) caldavDao.shiftDown("calendar", 0, created.toAppleEpoch())

@ -443,6 +443,6 @@ open class TaskAdapter(
task.parent = newParent task.parent = newParent
} }
caldavDao.update(caldavTask.id, caldavTask.remoteParent) caldavDao.update(caldavTask.id, caldavTask.remoteParent)
taskDao.save(task.task) taskDao.save(task.task, null)
} }
} }

@ -106,8 +106,9 @@ class TaskDao @Inject constructor(
} }
suspend fun save(task: Task, original: Task?) { suspend fun save(task: Task, original: Task?) {
val updated = taskDao.update(task, original) if (taskDao.update(task, original)) {
afterUpdate(updated, original) afterUpdate(task, original)
}
} }
private suspend fun afterUpdate(task: Task, original: Task?) { private suspend fun afterUpdate(task: Task, original: Task?) {

@ -187,25 +187,31 @@ data class Task(
val isNew: Boolean val isNew: Boolean
get() = id == NO_ID get() = id == NO_ID
fun significantChange(task: Task): Boolean = fun insignificantChange(task: Task?): Boolean {
id != task.id if (this === task) {
|| title != task.title return true
|| priority != task.priority }
|| dueDate != task.dueDate return if (task == null) {
|| hideUntil != task.hideUntil false
|| creationDate != task.creationDate } else id == task.id
|| modificationDate != task.modificationDate && title == task.title
|| completionDate != task.completionDate && priority == task.priority
|| deletionDate != task.deletionDate && dueDate == task.dueDate
|| notes != task.notes && hideUntil == task.hideUntil
|| estimatedSeconds != task.estimatedSeconds && creationDate == task.creationDate
|| elapsedSeconds != task.elapsedSeconds && modificationDate == task.modificationDate
|| ringFlags != task.ringFlags && completionDate == task.completionDate
|| recurrence != task.recurrence && deletionDate == task.deletionDate
|| calendarURI != task.calendarURI && notes == task.notes
|| parent != task.parent && estimatedSeconds == task.estimatedSeconds
|| remoteId != task.remoteId && elapsedSeconds == task.elapsedSeconds
|| order != task.order && ringFlags == task.ringFlags
&& recurrence == task.recurrence
&& calendarURI == task.calendarURI
&& parent == task.parent
&& remoteId == task.remoteId
&& order == task.order
}
fun googleTaskUpToDate(original: Task?): Boolean { fun googleTaskUpToDate(original: Task?): Boolean {
if (this === original) { if (this === original) {

@ -114,7 +114,7 @@ class TaskCreator @Inject constructor(
locationDao.insert(Geofence(place.uid, preferences)) locationDao.insert(Geofence(place.uid, preferences))
} }
} }
taskDao.save(task) taskDao.save(task, null)
alarmDao.insert(task.getDefaultAlarms()) alarmDao.insert(task.getDefaultAlarms())
return task return task
} }

@ -99,7 +99,7 @@ class TaskDuplicator @Inject constructor(
alarmDao.insert(alarms.map { Alarm(clone.id, it.time, it.type) }) alarmDao.insert(alarms.map { Alarm(clone.id, it.time, it.type) })
} }
gcalHelper.createTaskEventIfEnabled(clone) gcalHelper.createTaskEventIfEnabled(clone)
taskDao.save(clone) // TODO: delete me taskDao.save(clone, null) // TODO: delete me
taskAttachmentDao taskAttachmentDao
.getAttachmentsForTask(originalId) .getAttachmentsForTask(originalId)
.map { .map {

@ -55,7 +55,7 @@ class TimerPlugin @Inject constructor(
task.elapsedSeconds = task.elapsedSeconds + newElapsed task.elapsedSeconds = task.elapsedSeconds + newElapsed
} }
} }
taskDao.update(task, taskDao.fetch(task.id)) taskDao.update(task)
updateNotifications() updateNotifications()
} }

@ -215,7 +215,7 @@ class iCalendar @Inject constructor(
`object` = obj `object` = obj
) )
val isNew = caldavTask.id == com.todoroo.astrid.data.Task.NO_ID 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) } val local = vtodoCache.getVtodo(calendar, caldavTask)?.let { fromVtodo(it) }
task.applyRemote(remote, local) task.applyRemote(remote, local)
caldavTask.applyRemote(remote, local) caldavTask.applyRemote(remote, local)
@ -263,11 +263,7 @@ class iCalendar @Inject constructor(
task.suppressSync() task.suppressSync()
task.suppressRefresh() task.suppressRefresh()
if (isNew) { taskDao.save(task)
taskDao.save(task, null)
} else {
taskDao.save(task)
}
vtodoCache.putVtodo(calendar, caldavTask, vtodo) vtodoCache.putVtodo(calendar, caldavTask, vtodo)
caldavTask.etag = eTag caldavTask.etag = eTag
if (!dirty) { if (!dirty) {

@ -2,7 +2,6 @@ package org.tasks.caldav
import at.bitfire.ical4android.Task import at.bitfire.ical4android.Task
import com.todoroo.andlib.utility.DateUtilities 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.HIGH
import com.todoroo.astrid.data.Task.Priority.Companion.LOW import com.todoroo.astrid.data.Task.Priority.Companion.LOW
import com.todoroo.astrid.data.Task.Priority.Companion.MEDIUM 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 { ): com.todoroo.astrid.data.Task {
applyCompletedAt(remote, local) applyCompletedAt(remote, local)
applyCreatedAt(remote, local) applyCreatedAt(remote, local)
applyModified(remote, local)
applyTitle(remote, local) applyTitle(remote, local)
applyDescription(remote, local) applyDescription(remote, local)
applyPriority(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 val localCreated = local?.createdAt?.let { newDateTime(it, UTC) }?.toLocal()?.millis
if (localCreated == null || localCreated == creationDate) { if (localCreated == null || localCreated == creationDate) {
remote.createdAt?.let { remote.createdAt?.let {
creationDate = newDateTime(it, UTC).toLocal().millis.coerceAtMost(now()) creationDate = newDateTime(it, UTC).toLocal().millis
}
}
}
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())
} }
} }
} }

@ -188,19 +188,15 @@ FROM recursive_tasks
@Insert @Insert
abstract suspend fun insert(task: Task): Long abstract suspend fun insert(task: Task): Long
suspend fun update(task: Task, original: Task?): Task = suspend fun update(task: Task, original: Task? = null): Boolean {
task if (!task.insignificantChange(original)) {
.copy( task.modificationDate = now()
modificationDate = when { }
original?.let { task.significantChange(it) } == true -> now() return updateInternal(task) == 1
task.modificationDate == 0L -> task.creationDate }
else -> task.modificationDate
}
)
.also { updateInternal(it) }
@Update @Update
internal abstract suspend fun updateInternal(task: Task) internal abstract suspend fun updateInternal(task: Task): Int
suspend fun createNew(task: Task): Long { suspend fun createNew(task: Task): Long {
task.id = NO_ID task.id = NO_ID

@ -15,7 +15,12 @@ import org.tasks.analytics.Constants
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.caldav.iCalendar 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.filterActive
import org.tasks.data.OpenTaskDao.Companion.isDavx5 import org.tasks.data.OpenTaskDao.Companion.isDavx5
import org.tasks.data.OpenTaskDao.Companion.isDecSync import org.tasks.data.OpenTaskDao.Companion.isDecSync
@ -151,7 +156,7 @@ class OpenTasksSynchronizer @Inject constructor(
val etags = openTaskDao.getEtags(listId) val etags = openTaskDao.getEtags(listId)
etags.forEach { (uid, sync1, version) -> etags.forEach { (uid, sync1, version) ->
val caldavTask = caldavDao.getTaskByRemoteId(calendar.uuid!!, uid) 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) { if (caldavTask?.etag == null || caldavTask.etag != etag) {
applyChanges(account, calendar, listId, uid, etag, caldavTask) applyChanges(account, calendar, listId, uid, etag, caldavTask)
} }
@ -236,5 +241,8 @@ class OpenTasksSynchronizer @Inject constructor(
companion object { companion object {
private val CaldavAccount.isEteSync: Boolean private val CaldavAccount.isEteSync: Boolean
get() = uuid?.isEteSync() == true get() = uuid?.isEteSync() == true
private val CaldavAccount.isDecSync: Boolean
get() = uuid?.isDecSync() == true
} }
} }

@ -300,7 +300,7 @@ class TaskEditViewModel @Inject constructor(
selectedAlarms.value = selectedAlarms.value.filterNot { a -> a.type == TYPE_REL_END } selectedAlarms.value = selectedAlarms.value.filterNot { a -> a.type == TYPE_REL_END }
} }
taskDao.save(task) taskDao.save(task, null)
if (isNew || originalList != selectedList.value) { if (isNew || originalList != selectedList.value) {
task.parent = 0 task.parent = 0

@ -0,0 +1,2 @@
* Revert "Preserve modification times on initial sync"
* Fix unnecessary DecSync work
Loading…
Cancel
Save