Fix microsoft sync issues

- fix sync on empty categories
- apply parent completion time to checklist items
pull/3888/head
Alex Baker 3 months ago
parent 930e980550
commit 882338f554

@ -25,14 +25,15 @@ object MicrosoftConverter {
fun Task.applySubtask( fun Task.applySubtask(
parent: Long, parent: Long,
parentCompletionDate: Long,
checklistItem: Tasks.Task.ChecklistItem, checklistItem: Tasks.Task.ChecklistItem,
) { ) {
this.parent = parent this.parent = parent
title = checklistItem.displayName title = checklistItem.displayName
completionDate = if (checklistItem.isChecked) { completionDate = if (checklistItem.isChecked) {
checklistItem.checkedDateTime?.parseDateTime() ?: System.currentTimeMillis() checklistItem.checkedDateTime.parseDateTime()
} else { } else {
0L parentCompletionDate
} }
creationDate = checklistItem.createdDateTime.parseDateTime() creationDate = checklistItem.createdDateTime.parseDateTime()
} }
@ -120,7 +121,7 @@ object MicrosoftConverter {
} else { } else {
Tasks.Task.Status.notStarted Tasks.Task.Status.notStarted
}, },
categories = tags.map { it.name!! }.takeIf { it.isNotEmpty() }, categories = tags.map { it.name!! }.takeIf { it.isNotEmpty() } ?: emptyList(),
dueDateTime = if (hasDueDate()) { dueDateTime = if (hasDueDate()) {
Tasks.Task.DateTime( Tasks.Task.DateTime(
dateTime = DateTime(dueDate).startOfDay().toString(DATE_TIME_FORMAT), dateTime = DateTime(dueDate).startOfDay().toString(DATE_TIME_FORMAT),

@ -11,15 +11,14 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.http.isSuccess import io.ktor.http.isSuccess
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import org.tasks.broadcast.RefreshBroadcaster
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.analytics.Firebase import org.tasks.analytics.Firebase
import org.tasks.broadcast.RefreshBroadcaster
import org.tasks.caldav.VtodoCache import org.tasks.caldav.VtodoCache
import org.tasks.data.dao.CaldavDao import org.tasks.data.dao.CaldavDao
import org.tasks.data.dao.TagDao import org.tasks.data.dao.TagDao
import org.tasks.data.dao.TagDataDao import org.tasks.data.dao.TagDataDao
import org.tasks.data.entity.CaldavAccount import org.tasks.data.entity.CaldavAccount
import org.tasks.data.entity.CaldavAccount.Companion.ERROR_UNAUTHORIZED
import org.tasks.data.entity.CaldavCalendar import org.tasks.data.entity.CaldavCalendar
import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_OWNER import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_OWNER
import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_READ_WRITE import org.tasks.data.entity.CaldavCalendar.Companion.ACCESS_READ_WRITE
@ -403,6 +402,7 @@ class MicrosoftSynchronizer @Inject constructor(
list = list, list = list,
parentId = task.id, parentId = task.id,
parentRemoteId = caldavTask.remoteId!!, parentRemoteId = caldavTask.remoteId!!,
parentCompletionDate = task.completionDate,
checklistItems = it, checklistItems = it,
) )
} }
@ -421,6 +421,7 @@ class MicrosoftSynchronizer @Inject constructor(
list: CaldavCalendar, list: CaldavCalendar,
parentId: Long, parentId: Long,
parentRemoteId: String, parentRemoteId: String,
parentCompletionDate: Long,
checklistItems: List<Tasks.Task.ChecklistItem>, checklistItems: List<Tasks.Task.ChecklistItem>,
) { ) {
val existingSubtasks: List<CaldavTask> = taskDao.getChildren(parentId).let { caldavDao.getTasks(it) } val existingSubtasks: List<CaldavTask> = taskDao.getChildren(parentId).let { caldavDao.getTasks(it) }
@ -451,6 +452,7 @@ class MicrosoftSynchronizer @Inject constructor(
} else { } else {
task.applySubtask( task.applySubtask(
parent = parentId, parent = parentId,
parentCompletionDate = parentCompletionDate,
checklistItem = item, checklistItem = item,
) )
} }

@ -22,7 +22,7 @@ data class Tasks(
@EncodeDefault val body: Body? = null, @EncodeDefault val body: Body? = null,
@EncodeDefault val importance: Importance = Importance.low, @EncodeDefault val importance: Importance = Importance.low,
@EncodeDefault val status: Status = Status.notStarted, @EncodeDefault val status: Status = Status.notStarted,
@EncodeDefault val categories: List<String>? = null, val categories: List<String>? = null,
val isReminderOn: Boolean = false, val isReminderOn: Boolean = false,
val createdDateTime: String? = null, val createdDateTime: String? = null,
val lastModifiedDateTime: String? = null, val lastModifiedDateTime: String? = null,
@ -31,7 +31,7 @@ data class Tasks(
val linkedResources: List<LinkedResource>? = null, val linkedResources: List<LinkedResource>? = null,
@EncodeDefault val recurrence: Recurrence? = null, @EncodeDefault val recurrence: Recurrence? = null,
@EncodeDefault val reminderDateTime: DateTime? = null, @EncodeDefault val reminderDateTime: DateTime? = null,
@EncodeDefault val checklistItems: List<ChecklistItem>? = null, val checklistItems: List<ChecklistItem>? = null,
@SerialName("@removed") val removed: Removed? = null, @SerialName("@removed") val removed: Removed? = null,
) { ) {
@Serializable @Serializable

Loading…
Cancel
Save