From 243277b7fe291b8092224afea5d51a95fcfc9efa Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 7 Feb 2020 07:53:48 -0600 Subject: [PATCH] Fix moved or deleted task synchronization --- .../main/java/org/tasks/data/CaldavDao.java | 3 ++- .../org/tasks/data/CaldavTaskContainer.java | 10 ++++--- .../org/tasks/etesync/EteSynchronizer.java | 27 ++++++++++++++----- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/tasks/data/CaldavDao.java b/app/src/main/java/org/tasks/data/CaldavDao.java index 1044430a3..0c297d419 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.java +++ b/app/src/main/java/org/tasks/data/CaldavDao.java @@ -103,7 +103,8 @@ public abstract class CaldavDao { "SELECT task.*, caldav_task.* FROM tasks AS task " + "INNER JOIN caldav_tasks AS caldav_task ON _id = cd_task " + "WHERE cd_calendar = :calendar " - + "AND modified > cd_last_sync") + + "AND modified > cd_last_sync " + + "AND cd_deleted = 0") public abstract List getCaldavTasksToPush(String calendar); @Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE") diff --git a/app/src/main/java/org/tasks/data/CaldavTaskContainer.java b/app/src/main/java/org/tasks/data/CaldavTaskContainer.java index f580a0e99..127b58c21 100644 --- a/app/src/main/java/org/tasks/data/CaldavTaskContainer.java +++ b/app/src/main/java/org/tasks/data/CaldavTaskContainer.java @@ -1,7 +1,6 @@ package org.tasks.data; import androidx.room.Embedded; -import com.google.common.base.Strings; import com.todoroo.astrid.data.Task; public class CaldavTaskContainer { @@ -24,7 +23,12 @@ public class CaldavTaskContainer { return task.isDeleted(); } - public boolean isNew() { - return Strings.isNullOrEmpty(caldavTask.getVtodo()); + public String getVtodo() { + return caldavTask.getVtodo(); + } + + @Override + public String toString() { + return "CaldavTaskContainer{" + "task=" + task + ", caldavTask=" + caldavTask + '}'; } } diff --git a/app/src/main/java/org/tasks/etesync/EteSynchronizer.java b/app/src/main/java/org/tasks/etesync/EteSynchronizer.java index 1d1bbbb6c..dc5b3e518 100644 --- a/app/src/main/java/org/tasks/etesync/EteSynchronizer.java +++ b/app/src/main/java/org/tasks/etesync/EteSynchronizer.java @@ -193,10 +193,23 @@ public class EteSynchronizer { List changes = new ArrayList<>(); for (CaldavTask task : caldavDao.getDeleted(caldavCalendar.getUuid())) { - changes.add(new SyncEntry(task.getVtodo(), Actions.DELETE)); + String vtodo = task.getVtodo(); + if (!Strings.isNullOrEmpty(vtodo)) { + changes.add(new SyncEntry(vtodo, Actions.DELETE)); + } } + for (CaldavTaskContainer task : localChanges.values()) { - changes.add(new SyncEntry(getVtodo(task), task.isNew() ? Actions.ADD : Actions.CHANGE)); + String vtodo = task.getVtodo(); + boolean existingTask = !Strings.isNullOrEmpty(vtodo); + + if (task.isDeleted()) { + if (existingTask) { + changes.add(new SyncEntry(vtodo, Actions.DELETE)); + } + } else { + changes.add(new SyncEntry(getVtodo(task), existingTask ? Actions.CHANGE : Actions.ADD)); + } } remoteCtag = caldavCalendar.getCtag(); @@ -211,10 +224,12 @@ public class EteSynchronizer { updates.add(Pair.create(entry, syncEntry)); previous = entry; } - Timber.v("Pushing local changes"); - client.pushEntries(journal, from(updates).transform(p -> p.first).toList(), remoteCtag); - Timber.v("Applying local changes"); - applyEntries(caldavCalendar, updates, emptySet()); + if (updates.size() > 0) { + Timber.v("Pushing local changes"); + client.pushEntries(journal, from(updates).transform(p -> p.first).toList(), remoteCtag); + Timber.v("Applying local changes"); + applyEntries(caldavCalendar, updates, emptySet()); + } Timber.d("UPDATE %s", caldavCalendar);