diff --git a/app/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java b/app/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java index cbda4e439..2229c5efe 100644 --- a/app/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java +++ b/app/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksTaskContainer.java @@ -22,8 +22,11 @@ public class GtasksTaskContainer { public GoogleTask gtaskMetadata; private final long updateTime; - public GtasksTaskContainer(com.google.api.services.tasks.model.Task remoteTask, String listId, GoogleTask metadata) { - this.task = new Task(); + public GtasksTaskContainer( + com.google.api.services.tasks.model.Task remoteTask, + Task localTask, String listId, + GoogleTask metadata) { + task = localTask; this.metadata = new ArrayList<>(); this.gtaskMetadata = metadata; diff --git a/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java b/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java index 7392409c4..27f8312f4 100644 --- a/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java +++ b/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java @@ -103,6 +103,7 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter @Inject Tracker tracker; @Inject NotificationManager notificationManager; @Inject GoogleTaskDao googleTaskDao; + @Inject TaskCreator taskCreator; public GoogleTaskSyncAdapter(Context context, boolean autoInitialize) { super(context, autoInitialize); @@ -327,11 +328,18 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter } while (nextPageToken != null); if (!tasks.isEmpty()) { - for (com.google.api.services.tasks.model.Task t : tasks) { - GtasksTaskContainer container = new GtasksTaskContainer(t, listId, new GoogleTask(0, "")); - findLocalMatch(container); - container.gtaskMetadata.setRemoteOrder(Long.parseLong(t.getPosition())); - container.gtaskMetadata.setParent(localIdForGtasksId(t.getParent())); + for (com.google.api.services.tasks.model.Task gtask : tasks) { + String remoteId = gtask.getId(); + GoogleTask googleTask = getMetadataByGtaskId(remoteId); + if (googleTask == null) { + googleTask = new GoogleTask(0, ""); + } + Task task = googleTask.getTask() > 0 + ? taskDao.fetch(googleTask.getTask()) + : taskCreator.createWithValues(null, null); + GtasksTaskContainer container = new GtasksTaskContainer(gtask, task, listId, googleTask); + container.gtaskMetadata.setRemoteOrder(Long.parseLong(gtask.getPosition())); + container.gtaskMetadata.setParent(localIdForGtasksId(gtask.getParent())); container.gtaskMetadata.setLastSync(DateUtilities.now() + 1000L); write(container); lastSyncDate = Math.max(lastSyncDate, container.getUpdateTime()); @@ -352,19 +360,6 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter return metadata == null ? AbstractModel.NO_ID : metadata.getTask(); } - private void findLocalMatch(GtasksTaskContainer remoteTask) { - if(remoteTask.task.getId() != Task.NO_ID) { - return; - } - GoogleTask googleTask = getMetadataByGtaskId(remoteTask.gtaskMetadata.getRemoteId()); - if (googleTask != null) { - remoteTask.task.setId(googleTask.getTask()); - String uuid = taskDao.uuidFromLocalId(remoteTask.task.getId()); - remoteTask.task.setUuid(Strings.isNullOrEmpty(uuid) ? NO_UUID : uuid); - remoteTask.gtaskMetadata = googleTask; - } - } - private GoogleTask getMetadataByGtaskId(String gtaskId) { return googleTaskDao.getByRemoteId(gtaskId); } @@ -391,6 +386,9 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter task.task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); task.task.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true); task.prepareForSaving(); + if (task.task.isNew()) { + taskDao.createNew(task.task); + } taskDao.save(task.task); synchronizeMetadata(task.task.getId(), task.metadata); }