diff --git a/app/src/main/java/org/tasks/caldav/CaldavConverter.java b/app/src/main/java/org/tasks/caldav/CaldavConverter.java index 2ef8b60bd..338f59adf 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavConverter.java +++ b/app/src/main/java/org/tasks/caldav/CaldavConverter.java @@ -5,20 +5,27 @@ import static com.todoroo.astrid.data.Task.URGENCY_SPECIFIC_DAY; import static com.todoroo.astrid.data.Task.URGENCY_SPECIFIC_DAY_TIME; import static org.tasks.date.DateTimeUtils.newDateTime; +import com.google.common.base.Optional; import com.google.common.base.Strings; +import com.google.common.collect.Iterables; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task.Priority; +import java.io.IOException; import java.io.StringReader; +import java.net.URISyntaxException; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.LinkedList; import java.util.Locale; import net.fortuna.ical4j.model.Date; import net.fortuna.ical4j.model.DateTime; +import net.fortuna.ical4j.model.Property; import net.fortuna.ical4j.model.Recur; import net.fortuna.ical4j.model.property.Completed; import net.fortuna.ical4j.model.property.Due; import net.fortuna.ical4j.model.property.RRule; +import net.fortuna.ical4j.model.property.RelatedTo; import net.fortuna.ical4j.model.property.Status; import org.tasks.data.CaldavTask; import timber.log.Timber; @@ -152,6 +159,24 @@ public class CaldavConverter { } remote.setLastModified(newDateTime(task.getModificationDate()).toUTC().getMillis()); remote.setPriority(toRemote(remote.getPriority(), task.getPriority())); + + LinkedList unknownProperties = remote.getUnknownProperties(); + Optional relatedTo = + Iterables.tryFind(unknownProperties, p -> Property.RELATED_TO.equals(p.getName())); + if (caldavTask.getParent() == 0) { + if (relatedTo.isPresent()) { + unknownProperties.remove(relatedTo.get()); + } + } else if (relatedTo.isPresent()) { + try { + relatedTo.get().setValue(caldavTask.getRemoteParent()); + } catch (IOException | URISyntaxException | ParseException e) { + Timber.e(e); + } + } else { + unknownProperties.add(new RelatedTo(caldavTask.getRemoteParent())); + } + return remote; } } diff --git a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java index 196b800d7..5bf3d0e5e 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java +++ b/app/src/main/java/org/tasks/caldav/CaldavSynchronizer.java @@ -42,6 +42,7 @@ 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; @@ -252,6 +253,8 @@ public class CaldavSynchronizer { Timber.d("UPDATE %s", caldavCalendar); caldavDao.update(caldavCalendar); + caldavDao.updateParents(caldavCalendar.getUuid()); + localBroadcastManager.broadcastRefresh(); } @@ -372,6 +375,15 @@ public class CaldavSynchronizer { caldavTask.setVtodo(vtodo); 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()); + } + } + if (caldavTask.getId() == Task.NO_ID) { caldavTask.setId(caldavDao.insert(caldavTask)); Timber.d("NEW %s", caldavTask); diff --git a/app/src/main/java/org/tasks/data/CaldavDao.java b/app/src/main/java/org/tasks/data/CaldavDao.java index 9ff7b93da..6e11671db 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.java +++ b/app/src/main/java/org/tasks/data/CaldavDao.java @@ -111,6 +111,9 @@ public interface CaldavDao { + "GROUP BY tasks._id") List getTasksWithTags(); + @Query("UPDATE caldav_tasks SET cd_parent = IFNULL((SELECT cd_task FROM caldav_tasks AS p WHERE p.cd_remote_id = caldav_tasks.cd_remote_parent), cd_parent) WHERE cd_calendar = :calendar AND cd_remote_parent IS NOT NULL and cd_remote_parent != ''") + void updateParents(String calendar); + @Query("WITH RECURSIVE " + " recursive_caldav (cd_task) AS ( " + " SELECT cd_task "