diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksListFragment.java b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksListFragment.java index d15dc728c..91b2fb90f 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksListFragment.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksListFragment.java @@ -5,16 +5,10 @@ */ package com.todoroo.astrid.gtasks; -import android.content.Context; -import android.content.Intent; -import android.os.AsyncTask; import android.os.Bundle; import android.view.MenuItem; 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.StoreObjectDao; 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.subtasks.OrderedListFragmentHelperInterface; import com.todoroo.astrid.subtasks.SubtasksListFragment; +import com.todoroo.astrid.sync.SyncResultCallback; +import org.tasks.Broadcaster; import org.tasks.R; import org.tasks.dialogs.DialogBuilder; -import org.tasks.injection.ForActivity; import org.tasks.preferences.ActivityPreferences; import org.tasks.sync.IndeterminateProgressBarSyncResultCallback; +import org.tasks.sync.RecordSyncStatusCallback; import org.tasks.sync.SyncThrottle; import javax.inject.Inject; @@ -41,14 +37,13 @@ public class GtasksListFragment extends SubtasksListFragment { @Inject MetadataDao metadataDao; @Inject StoreObjectDao storeObjectDao; @Inject GtasksTaskListUpdater gtasksTaskListUpdater; - @Inject GtasksMetadataService gtasksMetadataService; @Inject GtasksPreferenceService gtasksPreferenceService; @Inject SyncV2Service syncService; - @Inject @ForActivity Context context; @Inject TaskAttachmentDao taskAttachmentDao; @Inject ActivityPreferences preferences; @Inject SyncThrottle syncThrottle; @Inject DialogBuilder dialogBuilder; + @Inject Broadcaster broadcaster; private GtasksList list; @@ -69,21 +64,12 @@ public class GtasksListFragment extends SubtasksListFragment { @Override protected void initiateAutomaticSyncImpl() { if (list != null && syncThrottle.canSync(list.getId())) { - refreshData(false); + syncData(); } } - private void refreshData(final boolean manual) { - syncService.synchronizeList(list, new IndeterminateProgressBarSyncResultCallback(gtasksPreferenceService, getActivity(), new Runnable() { - @Override - public void run() { - if (manual) { - context.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH)); - } else { - refresh(); - } - } - })); + private void syncData() { + syncService.synchronizeList(list, new IndeterminateProgressBarSyncResultCallback(this, gtasksPreferenceService, broadcaster)); } @Override @@ -103,44 +89,19 @@ public class GtasksListFragment extends SubtasksListFragment { } private void clearCompletedTasks() { - final TodorooCursor tasks = taskService.fetchFiltered(filter.getSqlQuery(), - null, Task.ID, Task.COMPLETION_DATE); - - new AsyncTask() { - + syncService.clearCompleted(list, new SyncResultCallback() { @Override - protected void onPreExecute() { + public void started() { + setSyncOngoing(true); } @Override - protected Void doInBackground(Void... params) { - String listId = null; - 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; - } + public void finished() { + setSyncOngoing(false); - @Override - protected void onPostExecute(Void aVoid) { - loadTaskListContent(); + syncData(); } - }.execute(); + }); } @Override diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java index c94770a3b..c9558885e 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java @@ -42,17 +42,15 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater localToRemoteIdMap = new HashMap<>(); - private final GtasksListService gtasksListService; private final GtasksMetadataService gtasksMetadataService; private final GtasksSyncService gtasksSyncService; private final MetadataDao metadataDao; private final GtasksMetadata gtasksMetadata; @Inject - public GtasksTaskListUpdater(GtasksListService gtasksListService, GtasksMetadataService gtasksMetadataService, - GtasksSyncService gtasksSyncService, MetadataDao metadataDao, GtasksMetadata gtasksMetadata) { + public GtasksTaskListUpdater(GtasksMetadataService gtasksMetadataService, GtasksSyncService gtasksSyncService, + MetadataDao metadataDao, GtasksMetadata gtasksMetadata) { super(metadataDao); - this.gtasksListService = gtasksListService; this.gtasksMetadataService = gtasksMetadataService; this.gtasksSyncService = gtasksSyncService; this.metadataDao = metadataDao; @@ -104,42 +102,6 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater 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) { orderAndIndentHelper(listId, new AtomicLong(0L), Task.NO_ID, 0, new HashSet()); diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java b/src/googleplay/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java index e8c199592..1437fecd0 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/api/GtasksInvoker.java @@ -116,6 +116,12 @@ public class GtasksInvoker { .setPrevious(previousId)); } + public void clearCompleted(String listId) throws IOException { + execute(service + .tasks() + .clear(listId)); + } + public void deleteGtask(String listId, String taskId) throws IOException { execute(service .tasks() diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java b/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java index 1c5780580..87cfc1a2f 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java @@ -45,7 +45,7 @@ public class GtasksSyncService { private final TaskDao taskDao; private final GtasksPreferenceService gtasksPreferenceService; private final GtasksMetadata gtasksMetadataFactory; - private GtasksInvoker gtasksInvoker; + private final GtasksInvoker gtasksInvoker; private final LinkedBlockingQueue operationQueue = new LinkedBlockingQueue<>(); @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 final Semaphore sema; @@ -186,6 +199,9 @@ public class GtasksSyncService { return false; } + public void clearCompleted(String listId) { + operationQueue.offer(new ClearOp(listId)); + } public void triggerMoveForMetadata(final Metadata metadata) { if (metadata == null) { diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java b/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java index 45177117c..a2377a9e8 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncV2Provider.java @@ -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) { executor.execute(callback, new Runnable() { @Override diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 3c2d628f8..29796e9b6 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -173,9 +173,17 @@ public class TaskListFragment extends InjectingListFragment implements SwipeRefr } } - public void setSyncOngoing(boolean ongoing) { - swipeRefreshLayout.setRefreshing(ongoing); - emptyView.setRefreshing(ongoing); + public void setSyncOngoing(final boolean ongoing) { + Activity activity = getActivity(); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + swipeRefreshLayout.setRefreshing(ongoing); + emptyView.setRefreshing(ongoing); + } + }); + } } /** diff --git a/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java b/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java index c649dda26..15a1ba049 100644 --- a/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java +++ b/src/main/java/com/todoroo/astrid/helper/SyncActionHelper.java @@ -5,18 +5,15 @@ */ package com.todoroo.astrid.helper; -import android.app.Activity; -import android.content.Intent; - import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.activity.TaskListFragment; -import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.service.SyncV2Service; import com.todoroo.astrid.sync.SyncResultCallback; +import org.tasks.Broadcaster; import org.tasks.preferences.Preferences; -import org.tasks.sync.IndeterminateProgressBarSyncResultCallback; +import org.tasks.sync.RecordSyncStatusCallback; import javax.inject.Inject; @@ -42,15 +39,11 @@ public class SyncActionHelper { // --- boilerplate @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.preferences = preferences; - syncResultCallback = new IndeterminateProgressBarSyncResultCallback(gtasksPreferenceService, activity, new Runnable() { - @Override - public void run() { - activity.sendBroadcast(new Intent(AstridApiConstants.BROADCAST_EVENT_REFRESH)); - } - }); + syncResultCallback = new RecordSyncStatusCallback(gtasksPreferenceService, broadcaster); } // --- automatic sync logic diff --git a/src/main/java/com/todoroo/astrid/service/SyncV2Service.java b/src/main/java/com/todoroo/astrid/service/SyncV2Service.java index ce1ec4a1d..206834be8 100644 --- a/src/main/java/com/todoroo/astrid/service/SyncV2Service.java +++ b/src/main/java/com/todoroo/astrid/service/SyncV2Service.java @@ -63,4 +63,10 @@ public class SyncV2Service { provider.synchronizeList(list, callback); } } + + public void clearCompleted(GtasksList list, SyncResultCallback callback) { + if (provider.isActive()) { + provider.clearCompleted(list, callback); + } + } } diff --git a/src/main/java/org/tasks/sync/IndeterminateProgressBarSyncResultCallback.java b/src/main/java/org/tasks/sync/IndeterminateProgressBarSyncResultCallback.java index 06987f253..0d515b954 100644 --- a/src/main/java/org/tasks/sync/IndeterminateProgressBarSyncResultCallback.java +++ b/src/main/java/org/tasks/sync/IndeterminateProgressBarSyncResultCallback.java @@ -1,36 +1,32 @@ package org.tasks.sync; -import android.app.Activity; - +import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.gtasks.GtasksPreferenceService; -import timber.log.Timber; +import org.tasks.Broadcaster; public class IndeterminateProgressBarSyncResultCallback extends RecordSyncStatusCallback { - private final Activity activity; - private Runnable onFinished; + private final TaskListFragment taskListFragment; + 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) { - super(gtasksPreferenceService); + @Override + public void started() { + super.started(); - this.activity = activity; - this.onFinished = onFinished; + taskListFragment.setSyncOngoing(gtasksPreferenceService.isOngoing()); } @Override public void finished() { super.finished(); - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - try { - onFinished.run(); - } catch (IllegalStateException e) { - Timber.e(e, e.getMessage()); - } - } - }); + taskListFragment.setSyncOngoing(gtasksPreferenceService.isOngoing()); } } diff --git a/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java b/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java index 7673733a6..2dd28e7a0 100644 --- a/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java +++ b/src/main/java/org/tasks/sync/RecordSyncStatusCallback.java @@ -10,10 +10,6 @@ public class RecordSyncStatusCallback implements SyncResultCallback { private GtasksPreferenceService gtasksPreferenceService; private Broadcaster broadcaster; - public RecordSyncStatusCallback(GtasksPreferenceService gtasksPreferenceService) { - this(gtasksPreferenceService, null); - } - public RecordSyncStatusCallback(GtasksPreferenceService gtasksPreferenceService, Broadcaster broadcaster) { this.gtasksPreferenceService = gtasksPreferenceService; this.broadcaster = broadcaster; @@ -27,8 +23,6 @@ public class RecordSyncStatusCallback implements SyncResultCallback { @Override public void finished() { gtasksPreferenceService.stopOngoing(); - if (broadcaster != null) { - broadcaster.refresh(); - } + broadcaster.refresh(); } }