diff --git a/api/src/com/todoroo/astrid/sync/SyncMetadataService.java b/api/src/com/todoroo/astrid/sync/SyncMetadataService.java index 265481e0f4..6bfda336a6 100644 --- a/api/src/com/todoroo/astrid/sync/SyncMetadataService.java +++ b/api/src/com/todoroo/astrid/sync/SyncMetadataService.java @@ -97,13 +97,22 @@ public TodorooCursor getLocallyUpdated(Property... properties) { if(lastSyncDate == 0) tasks = taskDao.query(Query.select(Task.ID).where(Criterion.none)); else - tasks = taskDao.query(Query.select(Task.ID).where(Criterion.and( - Task.MODIFICATION_DATE.gt(lastSyncDate), - Task.LAST_SYNC.lte(lastSyncDate))).orderBy(Order.asc(Task.ID))); + tasks = taskDao.query(Query.select(Task.ID).where( + Task.MODIFICATION_DATE.gt(lastSyncDate)).orderBy(Order.asc(Task.ID))); + tasks = filterLocallyUpdated(tasks, lastSyncDate); return joinWithMetadata(tasks, true, properties); } + /** + * @param tasks + * @param lastSyncDate + */ + protected TodorooCursor filterLocallyUpdated(TodorooCursor tasks, long lastSyncDate) { + // override hook + return tasks; + } + private TodorooCursor joinWithMetadata(TodorooCursor tasks, boolean both, Property... properties) { try { diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java index 657d2af738..c271ef76f5 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java @@ -4,6 +4,7 @@ package com.todoroo.astrid.gtasks; import java.util.ArrayList; +import java.util.HashSet; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; @@ -74,6 +75,22 @@ public Criterion getMetadataWithRemoteId() { return GtasksMetadata.ID.neq(""); //$NON-NLS-1$ } + @Override + protected TodorooCursor filterLocallyUpdated(TodorooCursor tasks, long lastSyncDate) { + HashSet taskIds = new HashSet(); + for(tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) + taskIds.add(tasks.get(Task.ID)); + + TodorooCursor metadata = metadataDao.query(Query.select(Metadata.TASK).where( + Criterion.and(MetadataCriteria.withKey(GtasksSyncMetadata.METADATA_KEY), + GtasksSyncMetadata.LAST_SYNC.lt(lastSyncDate)))); + for(metadata.moveToFirst(); !metadata.isAfterLast(); metadata.moveToNext()) + taskIds.remove(metadata.get(Metadata.TASK)); + + return taskDao.query(Query.select(Task.ID).where( + Task.ID.in(taskIds.toArray(new Long[taskIds.size()])))); + } + // --- list iterating helpers diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksSyncMetadata.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksSyncMetadata.java new file mode 100644 index 0000000000..2ff903c1aa --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksSyncMetadata.java @@ -0,0 +1,49 @@ +package com.todoroo.astrid.gtasks; + +import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Property.LongProperty; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.sql.Query; +import com.todoroo.astrid.dao.MetadataDao; +import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; +import com.todoroo.astrid.data.Metadata; + +/** + * Metadata entries for synchronizing a GTasks Task + * @author Tim Su + * + */ +public class GtasksSyncMetadata { + + /** metadata key */ + public static final String METADATA_KEY = "gtasks-sync"; //$NON-NLS-1$ + + /** last sync date*/ + public static final LongProperty LAST_SYNC = new LongProperty(Metadata.TABLE, + Metadata.VALUE1.name); + + /** + * Helper to set value + * @param metadataDao + * @param id + * @param property + * @param now + */ + public static void set(MetadataDao metadataDao, long taskId, + Property property, T value) { + TodorooCursor cursor = metadataDao.query(Query.select(Metadata.PROPERTIES). + where(MetadataCriteria.byTaskAndwithKey(taskId, METADATA_KEY))); + Metadata metadata = new Metadata(); + if(cursor.getCount() == 0) { + metadata.setValue(Metadata.TASK, taskId); + metadata.setValue(Metadata.KEY, METADATA_KEY); + } else { + cursor.moveToFirst(); + metadata.readFromCursor(cursor); + } + + metadata.setValue(property, value); + metadataDao.persist(metadata); + } + +} diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncOnSaveService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncOnSaveService.java index 33094dc4fa..cb47e3b476 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncOnSaveService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/sync/GtasksSyncOnSaveService.java @@ -21,6 +21,7 @@ import com.todoroo.astrid.gtasks.GtasksMetadata; import com.todoroo.astrid.gtasks.GtasksMetadataService; import com.todoroo.astrid.gtasks.GtasksPreferenceService; +import com.todoroo.astrid.gtasks.GtasksSyncMetadata; import com.todoroo.astrid.gtasks.GtasksTaskListUpdater; import com.todoroo.astrid.gtasks.api.GtasksApiUtilities; import com.todoroo.astrid.gtasks.api.GtasksService; @@ -253,7 +254,7 @@ private void pushTaskOnSave(Task task, ContentValues values) throws IOException } task.setValue(Task.MODIFICATION_DATE, DateUtilities.now()); - task.setValue(Task.LAST_SYNC, DateUtilities.now()); + GtasksSyncMetadata.set(metadataDao, task.getId(), GtasksSyncMetadata.LAST_SYNC, DateUtilities.now()); Flags.set(Flags.GTASKS_SUPPRESS_SYNC); taskDao.saveExisting(task); }