From 6feab1865382f1f3563f7edf46febdc0b3ae9bc6 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 23 Dec 2019 13:28:48 -0600 Subject: [PATCH] Touch and sync instead of using AfterSaveWork --- .../astrid/adapter/CaldavTaskAdapter.java | 8 +--- .../astrid/adapter/GoogleTaskAdapter.java | 9 +---- .../adapter/GoogleTaskManualSortAdapter.java | 9 +---- .../java/com/todoroo/astrid/dao/TaskDao.java | 26 ++++++++----- .../com/todoroo/astrid/service/TaskMover.java | 13 +------ .../main/java/org/tasks/jobs/SyncWork.java | 38 +++++++++++-------- .../java/org/tasks/ui/RemoteListFragment.java | 3 +- 7 files changed, 46 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java index 5b52c6965..4e0a6898a 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/CaldavTaskAdapter.java @@ -1,14 +1,12 @@ package com.todoroo.astrid.adapter; import static android.os.Build.VERSION_CODES.LOLLIPOP; -import static com.todoroo.andlib.utility.DateUtilities.now; import androidx.annotation.RequiresApi; import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.Task; -import org.tasks.data.SubsetCaldav; import org.tasks.data.CaldavDao; import org.tasks.data.CaldavTask; +import org.tasks.data.SubsetCaldav; import org.tasks.data.TaskContainer; import org.tasks.tasklist.ViewHolder; @@ -79,9 +77,7 @@ public final class CaldavTaskAdapter extends TaskAdapter { changeParent(task, newParent); - Task update = task.getTask(); - update.setModificationDate(now()); - taskDao.save(update); + taskDao.touch(task.getId()); } private void changeParent(TaskContainer task, long newParent) { diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java index 5afddf750..7c8cade94 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskAdapter.java @@ -1,10 +1,6 @@ package com.todoroo.astrid.adapter; -import static com.todoroo.andlib.utility.DateUtilities.now; - import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.SyncFlags; -import com.todoroo.astrid.data.Task; import org.tasks.BuildConfig; import org.tasks.data.GoogleTaskDao; import org.tasks.data.SubsetGoogleTask; @@ -46,10 +42,7 @@ public final class GoogleTaskAdapter extends GoogleTaskManualSortAdapter { newTasksOnTop ? 0 : googleTaskDao.getBottom(googleTask.getListId(), newParent)); } - Task update = task.getTask(); - update.setModificationDate(now()); - update.putTransitory(SyncFlags.FORCE_SYNC, true); - taskDao.save(update); + taskDao.touch(task.getId()); if (BuildConfig.DEBUG) { googleTaskDao.validateSorting(task.getGoogleTaskList()); diff --git a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java index 46e9d9bdd..c9180c2f7 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/GoogleTaskManualSortAdapter.java @@ -1,10 +1,6 @@ package com.todoroo.astrid.adapter; -import static com.todoroo.andlib.utility.DateUtilities.now; - import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.SyncFlags; -import com.todoroo.astrid.data.Task; import org.tasks.BuildConfig; import org.tasks.data.GoogleTaskDao; import org.tasks.data.SubsetGoogleTask; @@ -104,10 +100,7 @@ public class GoogleTaskManualSortAdapter extends TaskAdapter { } } - Task update = task.getTask(); - update.setModificationDate(now()); - update.putTransitory(SyncFlags.FORCE_SYNC, true); - taskDao.save(update); + taskDao.touch(task.getId()); if (BuildConfig.DEBUG) { googleTaskDao.validateSorting(task.getGoogleTaskList()); diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java index fec2eb65c..72980ca08 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java @@ -24,6 +24,7 @@ import androidx.room.Update; import androidx.sqlite.db.SimpleSQLiteQuery; import androidx.sqlite.db.SupportSQLiteDatabase; import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableList; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Functions; @@ -168,8 +169,17 @@ public abstract class TaskDao { public abstract DataSource.Factory getTaskFactory( SimpleSQLiteQuery query); - @Query("UPDATE tasks SET modified = datetime('now', 'localtime') WHERE _id in (:ids)") - public abstract void touch(List ids); + public void touch(Long id) { + touch(ImmutableList.of(id)); + } + + public void touch(List ids) { + touchInternal(ids); + workManager.sync(false); + } + + @Query("UPDATE tasks SET modified = strftime('%s','now')*1000 WHERE _id in (:ids)") + abstract void touchInternal(List ids); @Query("UPDATE tasks SET collapsed = :collapsed WHERE _id = :id") public abstract void setCollapsed(long id, boolean collapsed); @@ -196,7 +206,10 @@ public abstract class TaskDao { // TODO: get rid of this super-hack public void save(Task task, Task original) { - if (saveExisting(task, original)) { + if (!task.insignificantChange(original)) { + task.setModificationDate(now()); + } + if (update(task) == 1) { workManager.afterSave(task, original); } } @@ -219,13 +232,6 @@ public abstract class TaskDao { task.setId(insert); } - private boolean saveExisting(Task item, Task original) { - if (!item.insignificantChange(original)) { - item.setModificationDate(now()); - } - return update(item) == 1; - } - @Query( "SELECT * FROM tasks " + "WHERE completed = 0 AND deleted = 0 AND hideUntil < (strftime('%s','now')*1000) " diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskMover.java b/app/src/main/java/com/todoroo/astrid/service/TaskMover.java index 0a7f7778e..5e4b17003 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskMover.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskMover.java @@ -20,13 +20,11 @@ import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskListDao; import org.tasks.preferences.Preferences; -import org.tasks.sync.SyncAdapters; public class TaskMover { private final TaskDao taskDao; private final CaldavDao caldavDao; private final GoogleTaskDao googleTaskDao; - private final SyncAdapters syncAdapters; private final GoogleTaskListDao googleTaskListDao; private final Preferences preferences; @@ -35,35 +33,26 @@ public class TaskMover { TaskDao taskDao, CaldavDao caldavDao, GoogleTaskDao googleTaskDao, - SyncAdapters syncAdapters, GoogleTaskListDao googleTaskListDao, Preferences preferences) { this.taskDao = taskDao; this.caldavDao = caldavDao; this.googleTaskDao = googleTaskDao; - this.syncAdapters = syncAdapters; this.googleTaskListDao = googleTaskListDao; this.preferences = preferences; } - public void move(Long task, Filter selectedList) { - move(singletonList(task), selectedList); - } - public void move(List tasks, Filter selectedList) { tasks = newArrayList(tasks); tasks.removeAll(googleTaskDao.findChildrenInList(tasks)); tasks.removeAll(caldavDao.findChildrenInList(tasks)); for (Task task : taskDao.fetch(tasks)) { performMove(task, selectedList); - task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); - task.setModificationDate(now()); - taskDao.save(task); } if (selectedList instanceof CaldavFilter) { caldavDao.updateParents((((CaldavFilter) selectedList).getUuid())); } - syncAdapters.sync(); + taskDao.touch(tasks); } public Filter getSingleFilter(List tasks) { diff --git a/app/src/main/java/org/tasks/jobs/SyncWork.java b/app/src/main/java/org/tasks/jobs/SyncWork.java index 60963208e..11b135348 100644 --- a/app/src/main/java/org/tasks/jobs/SyncWork.java +++ b/app/src/main/java/org/tasks/jobs/SyncWork.java @@ -21,6 +21,7 @@ import org.tasks.gtasks.GoogleTaskSynchronizer; import org.tasks.injection.InjectingWorker; import org.tasks.injection.JobComponent; import org.tasks.preferences.Preferences; +import org.tasks.sync.SyncAdapters; public class SyncWork extends InjectingWorker { @@ -33,6 +34,7 @@ public class SyncWork extends InjectingWorker { @Inject Tracker tracker; @Inject CaldavDao caldavDao; @Inject GoogleTaskListDao googleTaskListDao; + @Inject SyncAdapters syncAdapters; public SyncWork(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); @@ -41,29 +43,18 @@ public class SyncWork extends InjectingWorker { @NonNull @Override public Result run() { + if (!syncAdapters.isSyncEnabled()) { + return Result.success(); + } synchronized (LOCK) { if (preferences.isSyncOngoing()) { return Result.retry(); } } - preferences.setSyncOngoing(true); localBroadcastManager.broadcastRefresh(); try { - int numThreads = atLeastJellybeanMR1() ? Runtime.getRuntime().availableProcessors() : 2; - ExecutorService executor = newFixedThreadPool(numThreads); - - for (CaldavAccount account : caldavDao.getAccounts()) { - executor.execute(() -> caldavSynchronizer.sync(account)); - } - List accounts = googleTaskListDao.getAccounts(); - for (int i = 0; i < accounts.size(); i++) { - int count = i; - executor.execute(() -> googleTaskSynchronizer.sync(accounts.get(count), count)); - } - - executor.shutdown(); - executor.awaitTermination(15, TimeUnit.MINUTES); + sync(); } catch (Exception e) { tracker.reportException(e); } finally { @@ -73,6 +64,23 @@ public class SyncWork extends InjectingWorker { return Result.success(); } + private void sync() throws InterruptedException { + int numThreads = atLeastJellybeanMR1() ? Runtime.getRuntime().availableProcessors() : 2; + ExecutorService executor = newFixedThreadPool(numThreads); + + for (CaldavAccount account : caldavDao.getAccounts()) { + executor.execute(() -> caldavSynchronizer.sync(account)); + } + List accounts = googleTaskListDao.getAccounts(); + for (int i = 0; i < accounts.size(); i++) { + int count = i; + executor.execute(() -> googleTaskSynchronizer.sync(accounts.get(count), count)); + } + + executor.shutdown(); + executor.awaitTermination(15, TimeUnit.MINUTES); + } + @Override protected void inject(JobComponent component) { component.inject(this); diff --git a/app/src/main/java/org/tasks/ui/RemoteListFragment.java b/app/src/main/java/org/tasks/ui/RemoteListFragment.java index caca18627..e157ab8f9 100644 --- a/app/src/main/java/org/tasks/ui/RemoteListFragment.java +++ b/app/src/main/java/org/tasks/ui/RemoteListFragment.java @@ -14,6 +14,7 @@ import androidx.annotation.Nullable; import butterknife.BindView; import butterknife.OnClick; import com.google.android.material.chip.Chip; +import com.google.common.collect.ImmutableList; import com.todoroo.astrid.api.CaldavFilter; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.GtasksFilter; @@ -163,7 +164,7 @@ public class RemoteListFragment extends TaskEditControlFragment { @Override public void apply(Task task) { - taskMover.move(task.getId(), selectedList); + taskMover.move(ImmutableList.of(task.getId()), selectedList); } @Override