|
|
@ -3,6 +3,7 @@ package com.todoroo.astrid.gtasks.sync;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Date;
|
|
|
|
import java.util.Date;
|
|
|
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
|
|
|
|
|
@ -40,6 +41,7 @@ import com.todoroo.astrid.gtasks.api.GtasksApiUtilities;
|
|
|
|
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
|
|
|
|
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
|
|
|
|
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
|
|
|
|
import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator;
|
|
|
|
import com.todoroo.astrid.service.AstridDependencyInjector;
|
|
|
|
import com.todoroo.astrid.service.AstridDependencyInjector;
|
|
|
|
|
|
|
|
import com.todoroo.astrid.service.MetadataService;
|
|
|
|
import com.todoroo.astrid.service.StatisticsConstants;
|
|
|
|
import com.todoroo.astrid.service.StatisticsConstants;
|
|
|
|
import com.todoroo.astrid.service.StatisticsService;
|
|
|
|
import com.todoroo.astrid.service.StatisticsService;
|
|
|
|
import com.todoroo.astrid.service.TaskService;
|
|
|
|
import com.todoroo.astrid.service.TaskService;
|
|
|
@ -49,6 +51,7 @@ import com.todoroo.astrid.sync.SyncV2Provider;
|
|
|
|
public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired TaskService taskService;
|
|
|
|
@Autowired TaskService taskService;
|
|
|
|
|
|
|
|
@Autowired MetadataService metadataService;
|
|
|
|
@Autowired StoreObjectDao storeObjectDao;
|
|
|
|
@Autowired StoreObjectDao storeObjectDao;
|
|
|
|
@Autowired GtasksPreferenceService gtasksPreferenceService;
|
|
|
|
@Autowired GtasksPreferenceService gtasksPreferenceService;
|
|
|
|
@Autowired GtasksSyncService gtasksSyncService;
|
|
|
|
@Autowired GtasksSyncService gtasksSyncService;
|
|
|
@ -96,8 +99,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public void synchronizeActiveTasks(boolean manual, final SyncResultCallback callback) {
|
|
|
|
public void synchronizeActiveTasks(final boolean manual, final SyncResultCallback callback) {
|
|
|
|
|
|
|
|
|
|
|
|
callback.started();
|
|
|
|
callback.started();
|
|
|
|
callback.incrementMax(100);
|
|
|
|
callback.incrementMax(100);
|
|
|
|
|
|
|
|
|
|
|
@ -110,10 +112,10 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
gtasksListService.updateLists(invoker.allGtaskLists());
|
|
|
|
gtasksListService.updateLists(invoker.allGtaskLists());
|
|
|
|
} catch (IOException e) {
|
|
|
|
} catch (IOException e) {
|
|
|
|
handler.handleException("gtasks-sync=io", e); //$NON-NLS-1$
|
|
|
|
handler.handleException("gtasks-sync=io", e); //$NON-NLS-1$
|
|
|
|
} finally {
|
|
|
|
|
|
|
|
callback.incrementMax(25);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
StoreObject[] lists = gtasksListService.getLists();
|
|
|
|
StoreObject[] lists = gtasksListService.getLists();
|
|
|
|
|
|
|
|
callback.incrementMax(25 * lists.length);
|
|
|
|
final AtomicInteger finisher = new AtomicInteger(lists.length);
|
|
|
|
final AtomicInteger finisher = new AtomicInteger(lists.length);
|
|
|
|
|
|
|
|
|
|
|
|
pushUpdated(invoker, callback);
|
|
|
|
pushUpdated(invoker, callback);
|
|
|
@ -122,7 +124,8 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
new Thread(new Runnable() {
|
|
|
|
new Thread(new Runnable() {
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
public void run() {
|
|
|
|
synchronizeListHelper(list, invoker, handler, callback);
|
|
|
|
synchronizeListHelper(list, invoker, manual, handler, callback);
|
|
|
|
|
|
|
|
callback.incrementProgress(25);
|
|
|
|
if (finisher.decrementAndGet() == 0) {
|
|
|
|
if (finisher.decrementAndGet() == 0) {
|
|
|
|
gtasksPreferenceService.recordSuccessfulSync();
|
|
|
|
gtasksPreferenceService.recordSuccessfulSync();
|
|
|
|
callback.finished();
|
|
|
|
callback.finished();
|
|
|
@ -154,15 +157,14 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
callback.incrementProgress(10);
|
|
|
|
callback.incrementProgress(10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} finally {
|
|
|
|
finally {
|
|
|
|
|
|
|
|
queued.close();
|
|
|
|
queued.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public void synchronizeList(Object list, boolean manual, final SyncResultCallback callback) {
|
|
|
|
public void synchronizeList(Object list, final boolean manual, final SyncResultCallback callback) {
|
|
|
|
if (!(list instanceof StoreObject))
|
|
|
|
if (!(list instanceof StoreObject))
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
final StoreObject gtasksList = (StoreObject) list;
|
|
|
|
final StoreObject gtasksList = (StoreObject) list;
|
|
|
@ -179,7 +181,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
String authToken = getValidatedAuthToken();
|
|
|
|
String authToken = getValidatedAuthToken();
|
|
|
|
callback.incrementProgress(25);
|
|
|
|
callback.incrementProgress(25);
|
|
|
|
final GtasksInvoker service = new GtasksInvoker(authToken);
|
|
|
|
final GtasksInvoker service = new GtasksInvoker(authToken);
|
|
|
|
synchronizeListHelper(gtasksList, service, null, callback);
|
|
|
|
synchronizeListHelper(gtasksList, service, manual, null, callback);
|
|
|
|
} finally {
|
|
|
|
} finally {
|
|
|
|
callback.incrementProgress(25);
|
|
|
|
callback.incrementProgress(25);
|
|
|
|
callback.finished();
|
|
|
|
callback.finished();
|
|
|
@ -201,34 +203,50 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private void synchronizeListHelper(StoreObject list, GtasksInvoker invoker,
|
|
|
|
private synchronized void synchronizeListHelper(StoreObject list, GtasksInvoker invoker,
|
|
|
|
SyncExceptionHandler errorHandler, SyncResultCallback callback) {
|
|
|
|
boolean manual, SyncExceptionHandler errorHandler, SyncResultCallback callback) {
|
|
|
|
// Do stuff
|
|
|
|
|
|
|
|
String listId = list.getValue(GtasksList.REMOTE_ID);
|
|
|
|
String listId = list.getValue(GtasksList.REMOTE_ID);
|
|
|
|
long lastSyncDate;
|
|
|
|
long lastSyncDate;
|
|
|
|
if (list.containsNonNullValue(GtasksList.LAST_SYNC)) {
|
|
|
|
if (!manual && list.containsNonNullValue(GtasksList.LAST_SYNC)) {
|
|
|
|
lastSyncDate = list.getValue(GtasksList.LAST_SYNC);
|
|
|
|
lastSyncDate = list.getValue(GtasksList.LAST_SYNC);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
lastSyncDate = 0;
|
|
|
|
lastSyncDate = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
boolean includeDeletedAndHidden = lastSyncDate != 0;
|
|
|
|
boolean includeDeletedAndHidden = lastSyncDate != 0;
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
Tasks taskList = invoker.getAllGtasksFromListId(listId, includeDeletedAndHidden, includeDeletedAndHidden, lastSyncDate);
|
|
|
|
Tasks taskList = invoker.getAllGtasksFromListId(listId, includeDeletedAndHidden,
|
|
|
|
|
|
|
|
includeDeletedAndHidden, lastSyncDate);
|
|
|
|
List<com.google.api.services.tasks.model.Task> tasks = taskList.getItems();
|
|
|
|
List<com.google.api.services.tasks.model.Task> tasks = taskList.getItems();
|
|
|
|
if (tasks != null) {
|
|
|
|
if (tasks != null) {
|
|
|
|
callback.incrementMax(tasks.size() * 10);
|
|
|
|
callback.incrementMax(tasks.size() * 10);
|
|
|
|
|
|
|
|
HashSet<Long> localIds = new HashSet<Long>(tasks.size());
|
|
|
|
for (com.google.api.services.tasks.model.Task t : tasks) {
|
|
|
|
for (com.google.api.services.tasks.model.Task t : tasks) {
|
|
|
|
GtasksTaskContainer container = parseRemoteTask(t, listId);
|
|
|
|
GtasksTaskContainer container = parseRemoteTask(t, listId);
|
|
|
|
gtasksMetadataService.findLocalMatch(container);
|
|
|
|
gtasksMetadataService.findLocalMatch(container);
|
|
|
|
container.gtaskMetadata.setValue(GtasksMetadata.GTASKS_ORDER, Long.parseLong(t.getPosition()));
|
|
|
|
container.gtaskMetadata.setValue(GtasksMetadata.GTASKS_ORDER,
|
|
|
|
container.gtaskMetadata.setValue(GtasksMetadata.PARENT_TASK, gtasksMetadataService.localIdForGtasksId(t.getParent()));
|
|
|
|
Long.parseLong(t.getPosition()));
|
|
|
|
container.gtaskMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L);
|
|
|
|
container.gtaskMetadata.setValue(GtasksMetadata.PARENT_TASK,
|
|
|
|
|
|
|
|
gtasksMetadataService.localIdForGtasksId(t.getParent()));
|
|
|
|
|
|
|
|
container.gtaskMetadata.setValue(GtasksMetadata.LAST_SYNC,
|
|
|
|
|
|
|
|
DateUtilities.now() + 1000L);
|
|
|
|
write(container);
|
|
|
|
write(container);
|
|
|
|
|
|
|
|
localIds.add(container.task.getId());
|
|
|
|
callback.incrementProgress(10);
|
|
|
|
callback.incrementProgress(10);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
list.setValue(GtasksList.LAST_SYNC, DateUtilities.now());
|
|
|
|
list.setValue(GtasksList.LAST_SYNC, DateUtilities.now());
|
|
|
|
storeObjectDao.persist(list);
|
|
|
|
storeObjectDao.persist(list);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(lastSyncDate == 0) {
|
|
|
|
|
|
|
|
Long[] localIdArray = localIds.toArray(new Long[localIds.size()]);
|
|
|
|
|
|
|
|
Criterion delete = Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY),
|
|
|
|
|
|
|
|
GtasksMetadata.LIST_ID.eq(listId),
|
|
|
|
|
|
|
|
Criterion.not(Metadata.TASK.in(localIdArray)));
|
|
|
|
|
|
|
|
taskService.deleteWhere(
|
|
|
|
|
|
|
|
Task.ID.in(Query.select(Metadata.TASK).from(Metadata.TABLE).
|
|
|
|
|
|
|
|
where(delete)));
|
|
|
|
|
|
|
|
metadataService.deleteWhere(delete);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
gtasksTaskListUpdater.correctOrderAndIndentForList(listId);
|
|
|
|
gtasksTaskListUpdater.correctOrderAndIndentForList(listId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (IOException e) {
|
|
|
|
} catch (IOException e) {
|
|
|
|