Use google task API to clear completed

pull/384/head
Alex Baker 10 years ago
parent d6269f0bf0
commit 69ec971719

@ -5,16 +5,10 @@
*/ */
package com.todoroo.astrid.gtasks; package com.todoroo.astrid.gtasks;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.view.MenuItem; import android.view.MenuItem;
import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskAttachmentDao; import com.todoroo.astrid.dao.TaskAttachmentDao;
@ -23,12 +17,14 @@ import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.service.TaskService; import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.OrderedListFragmentHelperInterface; import com.todoroo.astrid.subtasks.OrderedListFragmentHelperInterface;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.sync.SyncResultCallback;
import org.tasks.Broadcaster;
import org.tasks.R; import org.tasks.R;
import org.tasks.dialogs.DialogBuilder; import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ForActivity;
import org.tasks.preferences.ActivityPreferences; import org.tasks.preferences.ActivityPreferences;
import org.tasks.sync.IndeterminateProgressBarSyncResultCallback; import org.tasks.sync.IndeterminateProgressBarSyncResultCallback;
import org.tasks.sync.RecordSyncStatusCallback;
import org.tasks.sync.SyncThrottle; import org.tasks.sync.SyncThrottle;
import javax.inject.Inject; import javax.inject.Inject;
@ -41,14 +37,13 @@ public class GtasksListFragment extends SubtasksListFragment {
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
@Inject StoreObjectDao storeObjectDao; @Inject StoreObjectDao storeObjectDao;
@Inject GtasksTaskListUpdater gtasksTaskListUpdater; @Inject GtasksTaskListUpdater gtasksTaskListUpdater;
@Inject GtasksMetadataService gtasksMetadataService;
@Inject GtasksPreferenceService gtasksPreferenceService; @Inject GtasksPreferenceService gtasksPreferenceService;
@Inject SyncV2Service syncService; @Inject SyncV2Service syncService;
@Inject @ForActivity Context context;
@Inject TaskAttachmentDao taskAttachmentDao; @Inject TaskAttachmentDao taskAttachmentDao;
@Inject ActivityPreferences preferences; @Inject ActivityPreferences preferences;
@Inject SyncThrottle syncThrottle; @Inject SyncThrottle syncThrottle;
@Inject DialogBuilder dialogBuilder; @Inject DialogBuilder dialogBuilder;
@Inject Broadcaster broadcaster;
private GtasksList list; private GtasksList list;
@ -69,21 +64,12 @@ public class GtasksListFragment extends SubtasksListFragment {
@Override @Override
protected void initiateAutomaticSyncImpl() { protected void initiateAutomaticSyncImpl() {
if (list != null && syncThrottle.canSync(list.getId())) { if (list != null && syncThrottle.canSync(list.getId())) {
refreshData(false); syncData();
} }
} }
private void refreshData(final boolean manual) { private void syncData() {
syncService.synchronizeList(list, new IndeterminateProgressBarSyncResultCallback(gtasksPreferenceService, getActivity(), new Runnable() { syncService.synchronizeList(list, new IndeterminateProgressBarSyncResultCallback(this, gtasksPreferenceService, broadcaster));
@Override
public void run() {
if (manual) {
context.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
} else {
refresh();
}
}
}));
} }
@Override @Override
@ -103,44 +89,19 @@ public class GtasksListFragment extends SubtasksListFragment {
} }
private void clearCompletedTasks() { private void clearCompletedTasks() {
final TodorooCursor<Task> tasks = taskService.fetchFiltered(filter.getSqlQuery(), syncService.clearCompleted(list, new SyncResultCallback() {
null, Task.ID, Task.COMPLETION_DATE);
new AsyncTask<Void, Void, Void>() {
@Override @Override
protected void onPreExecute() { public void started() {
setSyncOngoing(true);
} }
@Override @Override
protected Void doInBackground(Void... params) { public void finished() {
String listId = null; setSyncOngoing(false);
try {
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
Task t = new Task(tasks);
if (t.isCompleted()) {
if (listId == null) {
listId = gtasksMetadataService.getTaskMetadata(
t.getId()).getValue(GtasksMetadata.LIST_ID);
}
t.setDeletionDate(DateUtilities.now());
taskService.save(t);
}
}
} finally {
tasks.close();
}
if (listId != null) {
gtasksTaskListUpdater.correctMetadataForList(listId);
}
return null;
}
@Override syncData();
protected void onPostExecute(Void aVoid) {
loadTaskListContent();
} }
}.execute(); });
} }
@Override @Override

@ -42,17 +42,15 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<GtasksList
final HashMap<Long, String> localToRemoteIdMap = final HashMap<Long, String> localToRemoteIdMap =
new HashMap<>(); new HashMap<>();
private final GtasksListService gtasksListService;
private final GtasksMetadataService gtasksMetadataService; private final GtasksMetadataService gtasksMetadataService;
private final GtasksSyncService gtasksSyncService; private final GtasksSyncService gtasksSyncService;
private final MetadataDao metadataDao; private final MetadataDao metadataDao;
private final GtasksMetadata gtasksMetadata; private final GtasksMetadata gtasksMetadata;
@Inject @Inject
public GtasksTaskListUpdater(GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService, public GtasksTaskListUpdater(GtasksMetadataService gtasksMetadataService, GtasksSyncService gtasksSyncService,
GtasksSyncService gtasksSyncService, MetadataDao metadataDao, GtasksMetadata gtasksMetadata) { MetadataDao metadataDao, GtasksMetadata gtasksMetadata) {
super(metadataDao); super(metadataDao);
this.gtasksListService = gtasksListService;
this.gtasksMetadataService = gtasksMetadataService; this.gtasksMetadataService = gtasksMetadataService;
this.gtasksSyncService = gtasksSyncService; this.gtasksSyncService = gtasksSyncService;
this.metadataDao = metadataDao; this.metadataDao = metadataDao;
@ -104,42 +102,6 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<GtasksList
// --- used during synchronization // --- used during synchronization
/**
* Update order, parent, and indentation fields for all tasks in the given list
*/
public void correctMetadataForList(String listId) {
GtasksList list = gtasksListService.getList(listId);
if(list == null) {
return;
}
updateParentSiblingMapsFor(list);
final AtomicLong order = new AtomicLong(0);
final AtomicInteger previousIndent = new AtomicInteger(-1);
gtasksMetadataService.iterateThroughList(list, new OrderedListIterator() {
@Override
public void processTask(long taskId, Metadata metadata) {
metadata.setValue(GtasksMetadata.ORDER, order.getAndAdd(1));
int indent = metadata.getValue(GtasksMetadata.INDENT);
if(indent > previousIndent.get() + 1) {
indent = previousIndent.get() + 1;
}
metadata.setValue(GtasksMetadata.INDENT, indent);
Long parent = parents.get(taskId);
if(parent == null || parent < 0) {
parent = Task.NO_ID;
}
metadata.setValue(GtasksMetadata.PARENT_TASK, parent);
metadataDao.persist(metadata);
previousIndent.set(indent);
}
});
}
public void correctOrderAndIndentForList(String listId) { public void correctOrderAndIndentForList(String listId) {
orderAndIndentHelper(listId, new AtomicLong(0L), Task.NO_ID, 0, orderAndIndentHelper(listId, new AtomicLong(0L), Task.NO_ID, 0,
new HashSet<Long>()); new HashSet<Long>());

@ -116,6 +116,12 @@ public class GtasksInvoker {
.setPrevious(previousId)); .setPrevious(previousId));
} }
public void clearCompleted(String listId) throws IOException {
execute(service
.tasks()
.clear(listId));
}
public void deleteGtask(String listId, String taskId) throws IOException { public void deleteGtask(String listId, String taskId) throws IOException {
execute(service execute(service
.tasks() .tasks()

@ -45,7 +45,7 @@ public class GtasksSyncService {
private final TaskDao taskDao; private final TaskDao taskDao;
private final GtasksPreferenceService gtasksPreferenceService; private final GtasksPreferenceService gtasksPreferenceService;
private final GtasksMetadata gtasksMetadataFactory; private final GtasksMetadata gtasksMetadataFactory;
private GtasksInvoker gtasksInvoker; private final GtasksInvoker gtasksInvoker;
private final LinkedBlockingQueue<SyncOnSaveOperation> operationQueue = new LinkedBlockingQueue<>(); private final LinkedBlockingQueue<SyncOnSaveOperation> operationQueue = new LinkedBlockingQueue<>();
@Inject @Inject
@ -94,6 +94,19 @@ public class GtasksSyncService {
} }
} }
private class ClearOp extends SyncOnSaveOperation {
private final String listId;
public ClearOp(String listId) {
this.listId = listId;
}
@Override
public void op(GtasksInvoker invoker) throws IOException {
invoker.clearCompleted(listId);
}
}
private class NotifyOp extends SyncOnSaveOperation { private class NotifyOp extends SyncOnSaveOperation {
private final Semaphore sema; private final Semaphore sema;
@ -186,6 +199,9 @@ public class GtasksSyncService {
return false; return false;
} }
public void clearCompleted(String listId) {
operationQueue.offer(new ClearOp(listId));
}
public void triggerMoveForMetadata(final Metadata metadata) { public void triggerMoveForMetadata(final Metadata metadata) {
if (metadata == null) { if (metadata == null) {

@ -187,6 +187,21 @@ public class GtasksSyncV2Provider {
} }
} }
public void clearCompleted(final GtasksList list, final SyncResultCallback callback) {
executor.execute(callback, new Runnable() {
@Override
public void run() {
callback.started();
try {
gtasksSyncService.clearCompleted(list.getRemoteId());
} finally {
callback.finished();
}
}
});
}
public void synchronizeList(final GtasksList gtasksList, final SyncResultCallback callback) { public void synchronizeList(final GtasksList gtasksList, final SyncResultCallback callback) {
executor.execute(callback, new Runnable() { executor.execute(callback, new Runnable() {
@Override @Override

@ -173,9 +173,17 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr
} }
} }
public void setSyncOngoing(boolean ongoing) { public void setSyncOngoing(final boolean ongoing) {
swipeRefreshLayout.setRefreshing(ongoing); Activity activity = getActivity();
emptyView.setRefreshing(ongoing); if (activity != null) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(ongoing);
emptyView.setRefreshing(ongoing);
}
});
}
} }
/** /**

@ -5,18 +5,15 @@
*/ */
package com.todoroo.astrid.helper; package com.todoroo.astrid.helper;
import android.app.Activity;
import android.content.Intent;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import com.todoroo.astrid.service.SyncV2Service; import com.todoroo.astrid.service.SyncV2Service;
import com.todoroo.astrid.sync.SyncResultCallback; import com.todoroo.astrid.sync.SyncResultCallback;
import org.tasks.Broadcaster;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import org.tasks.sync.IndeterminateProgressBarSyncResultCallback; import org.tasks.sync.RecordSyncStatusCallback;
import javax.inject.Inject; import javax.inject.Inject;
@ -42,15 +39,11 @@ public class SyncActionHelper {
// --- boilerplate // --- boilerplate
@Inject @Inject
public SyncActionHelper(GtasksPreferenceService gtasksPreferenceService, SyncV2Service syncService, final Activity activity, Preferences preferences) { public SyncActionHelper(GtasksPreferenceService gtasksPreferenceService, SyncV2Service syncService,
Preferences preferences, Broadcaster broadcaster) {
this.syncService = syncService; this.syncService = syncService;
this.preferences = preferences; this.preferences = preferences;
syncResultCallback = new IndeterminateProgressBarSyncResultCallback(gtasksPreferenceService, activity, new Runnable() { syncResultCallback = new RecordSyncStatusCallback(gtasksPreferenceService, broadcaster);
@Override
public void run() {
activity.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH));
}
});
} }
// --- automatic sync logic // --- automatic sync logic

@ -63,4 +63,10 @@ public class SyncV2Service {
provider.synchronizeList(list, callback); provider.synchronizeList(list, callback);
} }
} }
public void clearCompleted(GtasksList list, SyncResultCallback callback) {
if (provider.isActive()) {
provider.clearCompleted(list, callback);
}
}
} }

@ -1,36 +1,32 @@
package org.tasks.sync; package org.tasks.sync;
import android.app.Activity; import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.GtasksPreferenceService;
import timber.log.Timber; import org.tasks.Broadcaster;
public class IndeterminateProgressBarSyncResultCallback extends RecordSyncStatusCallback { public class IndeterminateProgressBarSyncResultCallback extends RecordSyncStatusCallback {
private final Activity activity; private final TaskListFragment taskListFragment;
private Runnable onFinished; private final GtasksPreferenceService gtasksPreferenceService;
public IndeterminateProgressBarSyncResultCallback(TaskListFragment taskListFragment, GtasksPreferenceService gtasksPreferenceService, Broadcaster broadcaster) {
super(gtasksPreferenceService, broadcaster);
this.taskListFragment = taskListFragment;
this.gtasksPreferenceService = gtasksPreferenceService;
}
public IndeterminateProgressBarSyncResultCallback(GtasksPreferenceService gtasksPreferenceService, Activity activity, Runnable onFinished) { @Override
super(gtasksPreferenceService); public void started() {
super.started();
this.activity = activity; taskListFragment.setSyncOngoing(gtasksPreferenceService.isOngoing());
this.onFinished = onFinished;
} }
@Override @Override
public void finished() { public void finished() {
super.finished(); super.finished();
activity.runOnUiThread(new Runnable() { taskListFragment.setSyncOngoing(gtasksPreferenceService.isOngoing());
@Override
public void run() {
try {
onFinished.run();
} catch (IllegalStateException e) {
Timber.e(e, e.getMessage());
}
}
});
} }
} }

@ -10,10 +10,6 @@ public class RecordSyncStatusCallback implements SyncResultCallback {
private GtasksPreferenceService gtasksPreferenceService; private GtasksPreferenceService gtasksPreferenceService;
private Broadcaster broadcaster; private Broadcaster broadcaster;
public RecordSyncStatusCallback(GtasksPreferenceService gtasksPreferenceService) {
this(gtasksPreferenceService, null);
}
public RecordSyncStatusCallback(GtasksPreferenceService gtasksPreferenceService, Broadcaster broadcaster) { public RecordSyncStatusCallback(GtasksPreferenceService gtasksPreferenceService, Broadcaster broadcaster) {
this.gtasksPreferenceService = gtasksPreferenceService; this.gtasksPreferenceService = gtasksPreferenceService;
this.broadcaster = broadcaster; this.broadcaster = broadcaster;
@ -27,8 +23,6 @@ public class RecordSyncStatusCallback implements SyncResultCallback {
@Override @Override
public void finished() { public void finished() {
gtasksPreferenceService.stopOngoing(); gtasksPreferenceService.stopOngoing();
if (broadcaster != null) { broadcaster.refresh();
broadcaster.refresh();
}
} }
} }

Loading…
Cancel
Save