@Override
  public void synchronizeList(
      Object list, final boolean manual, final SyncResultCallback callback) {
    if (!(list instanceof StoreObject)) return;
    final StoreObject gtasksList = (StoreObject) list;
    if (!GtasksList.TYPE.equals(gtasksList.getValue(StoreObject.TYPE))) return;

    callback.started();
    callback.incrementMax(100);

    new Thread(
            new Runnable() {
              public void run() {
                callback.incrementProgress(50);
                try {
                  String authToken = getValidatedAuthToken();
                  callback.incrementProgress(12);
                  gtasksSyncService.waitUntilEmpty();
                  callback.incrementProgress(13);
                  final GtasksInvoker service = new GtasksInvoker(authToken);
                  synchronizeListHelper(gtasksList, service, manual, null, callback);
                } finally {
                  callback.incrementProgress(25);
                  callback.finished();
                }
              }
            })
        .start();
  }
  @Override
  public void synchronizeActiveTasks(final boolean manual, final SyncResultCallback callback) {
    callback.started();
    callback.incrementMax(100);

    gtasksPreferenceService.recordSyncStart();

    new Thread(
            new Runnable() {
              public void run() {
                callback.incrementProgress(50);
                String authToken = getValidatedAuthToken();
                final GtasksInvoker invoker = new GtasksInvoker(authToken);
                try {
                  gtasksListService.updateLists(invoker.allGtaskLists());
                } catch (GoogleTasksException e) {
                  handler.handleException("gtasks-sync=io", e, e.getType()); // $NON-NLS-1$
                } catch (IOException e) {
                  handler.handleException("gtasks-sync=io", e, e.toString()); // $NON-NLS-1$
                }

                StoreObject[] lists = gtasksListService.getLists();
                if (lists.length == 0) {
                  finishSync(callback);
                  return;
                }
                callback.incrementMax(25 * lists.length);
                final AtomicInteger finisher = new AtomicInteger(lists.length);

                for (final StoreObject list : lists) {
                  new Thread(
                          new Runnable() {
                            @Override
                            public void run() {
                              synchronizeListHelper(list, invoker, manual, handler, callback);
                              callback.incrementProgress(25);
                              if (finisher.decrementAndGet() == 0) {
                                pushUpdated(invoker, callback);
                                finishSync(callback);
                              }
                            }
                          })
                      .start();
                }
              }
            })
        .start();
  }