diff --git a/app/src/main/java/com/todoroo/astrid/service/Upgrader.java b/app/src/main/java/com/todoroo/astrid/service/Upgrader.java index 49ce35e4b..47608a8df 100644 --- a/app/src/main/java/com/todoroo/astrid/service/Upgrader.java +++ b/app/src/main/java/com/todoroo/astrid/service/Upgrader.java @@ -1,6 +1,10 @@ package com.todoroo.astrid.service; import static com.google.common.base.Strings.isNullOrEmpty; +import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.collect.Sets.newHashSet; +import static org.tasks.caldav.CaldavUtils.applyRelatedTo; import static org.tasks.db.DbUtils.batch; import android.os.Environment; @@ -19,6 +23,7 @@ import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; import org.tasks.caldav.CaldavUtils; import org.tasks.data.CaldavDao; +import org.tasks.data.CaldavTask; import org.tasks.data.CaldavTaskContainer; import org.tasks.data.Filter; import org.tasks.data.FilterDao; @@ -47,6 +52,7 @@ public class Upgrader { private static final int V6_7 = 585; private static final int V6_8_1 = 607; private static final int V6_9 = 608; + private static final int V6_10 = 617; private final Preferences preferences; private final Tracker tracker; private final TagDataDao tagDataDao; @@ -96,6 +102,7 @@ public class Upgrader { run(from, V6_7, this::migrateGoogleTaskFilters); run(from, V6_8_1, this::migrateCaldavFilters); run(from, V6_9, this::applyCaldavCategories); + run(from, V6_10, this::applyCaldavSubtasks); tracker.reportEvent(Tracking.Events.UPGRADE, Integer.toString(from)); } preferences.setCurrentVersion(to); @@ -108,6 +115,27 @@ public class Upgrader { } } + private void applyCaldavSubtasks() { + List updated = newArrayList(); + + for (CaldavTask task : transform(caldavDao.getTasks(), CaldavTaskContainer::getCaldavTask)) { + at.bitfire.ical4android.Task remoteTask = CaldavUtils.fromVtodo(task.getVtodo()); + if (remoteTask == null) { + continue; + } + applyRelatedTo(task, remoteTask); + if (!Strings.isNullOrEmpty(task.getRemoteParent())) { + updated.add(task); + } + } + + caldavDao.update(updated); + + for (String calendar : newHashSet(transform(updated, CaldavTask::getCalendar))) { + caldavDao.updateParents(calendar); + } + } + private void applyCaldavCategories() { List tasksWithTags = caldavDao.getTasksWithTags(); for (CaldavTaskContainer container : caldavDao.getTasks()) { diff --git a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java index 0f35320a9..120764644 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java +++ b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java @@ -7,6 +7,7 @@ import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.transform; import static com.google.common.collect.Sets.difference; import static com.google.common.collect.Sets.newHashSet; +import static org.tasks.caldav.CaldavUtils.applyRelatedTo; import static org.tasks.time.DateTimeUtils.currentTimeMillis; import android.content.Context; @@ -42,7 +43,6 @@ import java.util.List; import java.util.Set; import javax.inject.Inject; import javax.net.ssl.SSLException; -import net.fortuna.ical4j.model.Property; import net.fortuna.ical4j.model.property.ProdId; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; @@ -60,7 +60,6 @@ import org.tasks.data.TagDao; import org.tasks.data.TagData; import org.tasks.data.TagDataDao; import org.tasks.injection.ForApplication; -import retrofit2.http.HEAD; import timber.log.Timber; public class CaldavSynchronizer { @@ -377,13 +376,7 @@ public class CaldavSynchronizer { caldavTask.setEtag(eTag); caldavTask.setLastSync(DateUtilities.now() + 1000L); - // Process remote parents - LinkedList unknownProperties = remote.getUnknownProperties(); - for (Property prop : unknownProperties) { - if (prop.getName().equals(Property.RELATED_TO)) { - caldavTask.setRemoteParent(prop.getValue()); - } - } + applyRelatedTo(caldavTask, remote); if (caldavTask.getId() == Task.NO_ID) { caldavTask.setId(caldavDao.insert(caldavTask)); @@ -393,5 +386,4 @@ public class CaldavSynchronizer { Timber.d("UPDATE %s", caldavTask); } } - } diff --git a/app/src/main/java/org/tasks/caldav/CaldavUtils.java b/app/src/main/java/org/tasks/caldav/CaldavUtils.java index 920401e43..1e8fdc979 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavUtils.java +++ b/app/src/main/java/org/tasks/caldav/CaldavUtils.java @@ -9,6 +9,8 @@ import java.io.StringReader; import java.util.Collections; import java.util.List; import java.util.Set; +import net.fortuna.ical4j.model.Property; +import org.tasks.data.CaldavTask; import org.tasks.data.TagData; import org.tasks.data.TagDataDao; @@ -33,4 +35,12 @@ public class CaldavUtils { } return selectedTags; } + + public static void applyRelatedTo(CaldavTask caldavTask, at.bitfire.ical4android.Task remote) { + for (Property prop : remote.getUnknownProperties()) { + if (prop.getName().equals(Property.RELATED_TO)) { + caldavTask.setRemoteParent(prop.getValue()); + } + } + } } diff --git a/app/src/main/java/org/tasks/data/CaldavDao.java b/app/src/main/java/org/tasks/data/CaldavDao.java index 6207ce6e2..d4ef98ff3 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.java +++ b/app/src/main/java/org/tasks/data/CaldavDao.java @@ -52,6 +52,9 @@ public abstract class CaldavDao { @Update public abstract void update(CaldavTask caldavTask); + @Update + public abstract void update(Iterable tasks); + @Delete public abstract void delete(CaldavTask caldavTask); diff --git a/app/src/main/java/org/tasks/data/CaldavTaskContainer.java b/app/src/main/java/org/tasks/data/CaldavTaskContainer.java index eb6d8be79..344d81d0a 100644 --- a/app/src/main/java/org/tasks/data/CaldavTaskContainer.java +++ b/app/src/main/java/org/tasks/data/CaldavTaskContainer.java @@ -6,4 +6,8 @@ import com.todoroo.astrid.data.Task; public class CaldavTaskContainer { @Embedded public Task task; @Embedded public CaldavTask caldavTask; + + public CaldavTask getCaldavTask() { + return caldavTask; + } }