From 021c9bbf35eb006329dd632279575b14ee8a8ff6 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 25 Apr 2018 16:55:41 -0500 Subject: [PATCH] Fix google task bugs * Fix manual sort query * Fix multi-account sync --- CHANGELOG.md | 5 +++++ app/build.gradle | 4 ++-- .../java/com/todoroo/andlib/data/Property.java | 5 +++++ .../com/todoroo/astrid/api/GtasksFilter.java | 2 +- .../java/com/todoroo/astrid/dao/TaskDao.java | 13 +++++++++---- .../gtasks/GtasksSubtaskListFragment.java | 1 + .../main/java/org/tasks/data/DeletionDao.java | 2 +- .../main/java/org/tasks/data/GoogleTask.java | 4 ++++ .../tasks/gtasks/GoogleTaskSynchronizer.java | 6 +++--- .../tasks/widget/ScrollableViewsFactory.java | 18 ++++++++++++++---- 10 files changed, 45 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee8dc07e2..0565e1cf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Change Log --- +### 6.0.3 (2018-04-25) + +* Fix crash when manually sorting Google Task lists +* Fix multi account Google Task sync issue + ### 6.0.2 (2018-04-25) * Fix crash caused by missing tag metadata diff --git a/app/build.gradle b/app/build.gradle index b653a6a84..37b9b0198 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,8 +20,8 @@ android { defaultConfig { testApplicationId "org.tasks.test" applicationId "org.tasks" - versionCode 528 - versionName "6.0.2" + versionCode 529 + versionName "6.0.3" targetSdkVersion 27 minSdkVersion 15 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/todoroo/andlib/data/Property.java b/app/src/main/java/com/todoroo/andlib/data/Property.java index a5dc83728..98f6bc77c 100644 --- a/app/src/main/java/com/todoroo/andlib/data/Property.java +++ b/app/src/main/java/com/todoroo/andlib/data/Property.java @@ -84,6 +84,11 @@ public abstract class Property extends Field implements Cloneable { super(table, name); } + @Override + public IntegerProperty as(String newAlias) { + return (IntegerProperty) super.as(newAlias); + } + IntegerProperty(String name, String expression) { super(null, name, expression); } diff --git a/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.java b/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.java index 33a1cbb76..4c7729c0b 100644 --- a/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.java +++ b/app/src/main/java/com/todoroo/astrid/api/GtasksFilter.java @@ -51,7 +51,7 @@ public class GtasksFilter extends Filter { public static String toManualOrder(String query) { query = query.replaceAll("ORDER BY .*", ""); - query = query + " ORDER BY `order` ASC"; + query = query + " ORDER BY `gtasks_order` ASC"; return query.replace( TaskDao.TaskCriteria.activeAndVisible().toString(), TaskDao.TaskCriteria.notDeleted().toString()); 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 33b1f2a3d..3059a3538 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java @@ -95,9 +95,10 @@ public abstract class TaskDao { @android.arch.persistence.room.Query( "SELECT tasks.* FROM tasks " + "LEFT JOIN google_tasks ON tasks._id = google_tasks.task " - + "WHERE tasks.modified > google_tasks.last_sync " - + "OR google_tasks.remote_id = ''") - public abstract List getGoogleTasksToPush(); + + "WHERE list_id IN (SELECT remote_id FROM google_task_lists WHERE account = :account)" + + "AND (tasks.modified > google_tasks.last_sync " + + "OR google_tasks.remote_id = '')") + public abstract List getGoogleTasksToPush(String account); @android.arch.persistence.room.Query( "SELECT tasks.* FROM tasks " @@ -226,8 +227,12 @@ public abstract class TaskDao { } public Cursor getCursor(String queryTemplate) { + return getCursor(queryTemplate, Task.PROPERTIES); + } + + public Cursor getCursor(String queryTemplate, Property... properties) { Query query = - Query.select(Task.PROPERTIES) + Query.select(properties) .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(queryTemplate)); String queryString = query.from(Task.TABLE).toString(); if (BuildConfig.DEBUG) { diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java index 62e7a7d52..773343609 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java @@ -49,6 +49,7 @@ public class GtasksSubtaskListFragment extends GtasksListFragment { public Property[] taskProperties() { Property[] baseProperties = TaskAdapter.PROPERTIES; ArrayList> properties = new ArrayList<>(Arrays.asList(baseProperties)); + properties.add(GoogleTask.ORDER); properties.add(GoogleTask.INDENT); return properties.toArray(new Property[properties.size()]); } diff --git a/app/src/main/java/org/tasks/data/DeletionDao.java b/app/src/main/java/org/tasks/data/DeletionDao.java index 7c03c4c8f..448c21a19 100644 --- a/app/src/main/java/org/tasks/data/DeletionDao.java +++ b/app/src/main/java/org/tasks/data/DeletionDao.java @@ -70,7 +70,7 @@ public abstract class DeletionDao { return deleted; } - @Query("UPDATE tasks SET deleted = :timestamp WHERE _id IN(:ids)") + @Query("UPDATE tasks SET modified = :timestamp, deleted = :timestamp WHERE _id IN(:ids)") public abstract void markDeleted(long timestamp, List ids); @Query("SELECT task FROM caldav_tasks WHERE calendar = :calendar AND deleted = 0") diff --git a/app/src/main/java/org/tasks/data/GoogleTask.java b/app/src/main/java/org/tasks/data/GoogleTask.java index 4db8493f0..a699c644d 100644 --- a/app/src/main/java/org/tasks/data/GoogleTask.java +++ b/app/src/main/java/org/tasks/data/GoogleTask.java @@ -19,6 +19,10 @@ public class GoogleTask { public static final Property.IntegerProperty INDENT = new Property.IntegerProperty(GoogleTask.TABLE, "indent"); + @Deprecated + public static final Property.IntegerProperty ORDER = + new Property.IntegerProperty(GoogleTask.TABLE, "`order`").as("gtasks_order"); + @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "_id") private transient long id; diff --git a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java index 61b42c906..bf7eba651 100644 --- a/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java +++ b/app/src/main/java/org/tasks/gtasks/GoogleTaskSynchronizer.java @@ -182,7 +182,7 @@ public class GoogleTaskSynchronizer { } GtasksInvoker gtasksInvoker = new GtasksInvoker(context, playServices, account.getAccount()); - pushLocalChanges(gtasksInvoker); + pushLocalChanges(account, gtasksInvoker); List gtaskLists = new ArrayList<>(); String nextPageToken = null; @@ -212,8 +212,8 @@ public class GoogleTaskSynchronizer { account.setError(""); } - private void pushLocalChanges(GtasksInvoker gtasksInvoker) throws UserRecoverableAuthIOException { - List tasks = taskDao.getGoogleTasksToPush(); + private void pushLocalChanges(GoogleTaskAccount account, GtasksInvoker gtasksInvoker) throws UserRecoverableAuthIOException { + List tasks = taskDao.getGoogleTasksToPush(account.getAccount()); for (Task task : tasks) { try { pushTask(task, gtasksInvoker); diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index 9bcde475a..3e4669a73 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -14,14 +14,18 @@ import android.text.TextUtils; import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; +import com.google.common.collect.ObjectArrays; +import com.todoroo.andlib.data.Property; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.GtasksFilter; import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.subtasks.SubtasksHelper; import org.tasks.BuildConfig; import org.tasks.R; +import org.tasks.data.GoogleTask; import org.tasks.locale.Locale; import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.Preferences; @@ -199,20 +203,20 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { } private Cursor getCursor() { - return taskDao.getCursor(getQuery()); + updateSettings(); + Filter filter = defaultFilterProvider.getFilterFromPreference(filterId); + return taskDao.getCursor(getQuery(filter), getProperties(filter)); } private Task getTask(int position) { return cursor.moveToPosition(position) ? new Task(cursor) : null; } - private String getQuery() { + private String getQuery(Filter filter) { int sort = preferences.getSortMode(); if (sort == 0) { sort = SortHelper.SORT_WIDGET; } - updateSettings(); - Filter filter = defaultFilterProvider.getFilterFromPreference(filterId); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget); rv.setTextViewText(R.id.widget_title, filter.listingTitle); @@ -226,6 +230,12 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { return subtasksHelper.applySubtasksToWidgetFilter(filter, query); } + private Property[] getProperties(Filter filter) { + return filter instanceof GtasksFilter + ? ObjectArrays.concat(Task.PROPERTIES, new Property[] {GoogleTask.ORDER}, Property.class) + : Task.PROPERTIES; + } + private void formatDueDate(RemoteViews row, Task task) { if (task.hasDueDate()) { Resources resources = context.getResources();