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)
* Fix updating modification timestamp on edits

@ -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"

@ -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())

@ -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)
}
}

@ -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?) {

@ -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) {

@ -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
}

@ -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 {

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

@ -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) {

@ -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
}
}
}

@ -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

@ -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
}
}

@ -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

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