From 974141ce800d57d623d04258490f1f29b450f808 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 24 Jan 2020 11:50:45 -0600 Subject: [PATCH] Move query construction to TaskListQuery --- .../todoroo/astrid/service/TaskDeleter.java | 4 +- .../java/org/tasks/data/TaskListQuery.java | 248 ++++++++++++++++ .../java/org/tasks/ui/TaskListViewModel.java | 277 ++---------------- .../tasks/widget/ScrollableViewsFactory.java | 4 +- 4 files changed, 272 insertions(+), 261 deletions(-) create mode 100644 app/src/main/java/org/tasks/data/TaskListQuery.java diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java b/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java index 4724198ad..b7eebf695 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskDeleter.java @@ -20,9 +20,9 @@ import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskList; import org.tasks.data.TaskContainer; +import org.tasks.data.TaskListQuery; import org.tasks.jobs.WorkManager; import org.tasks.preferences.Preferences; -import org.tasks.ui.TaskListViewModel; public class TaskDeleter { @@ -87,7 +87,7 @@ public class TaskDeleter { List tasks = taskDao.fetchTasks( (includeGoogleSubtasks, includeCaldavSubtasks) -> - TaskListViewModel.getQuery( + TaskListQuery.getQuery( preferences, deleteFilter, includeGoogleSubtasks, includeCaldavSubtasks)); for (TaskContainer task : tasks) { if (task.isCompleted()) { diff --git a/app/src/main/java/org/tasks/data/TaskListQuery.java b/app/src/main/java/org/tasks/data/TaskListQuery.java new file mode 100644 index 000000000..6e0b87c9f --- /dev/null +++ b/app/src/main/java/org/tasks/data/TaskListQuery.java @@ -0,0 +1,248 @@ +package org.tasks.data; + +import static com.google.common.collect.Lists.newArrayList; +import static com.todoroo.andlib.sql.Field.field; +import static com.todoroo.astrid.activity.TaskListFragment.CALDAV_METADATA_JOIN; +import static com.todoroo.astrid.activity.TaskListFragment.GTASK_METADATA_JOIN; +import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN; + +import com.google.common.collect.ImmutableList; +import com.todoroo.andlib.data.Property.StringProperty; +import com.todoroo.andlib.data.Table; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Field; +import com.todoroo.andlib.sql.Join; +import com.todoroo.andlib.sql.Query; +import com.todoroo.andlib.sql.QueryTemplate; +import com.todoroo.astrid.api.CaldavFilter; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.api.GtasksFilter; +import com.todoroo.astrid.api.PermaSql; +import com.todoroo.astrid.core.SortHelper; +import com.todoroo.astrid.dao.TaskDao.TaskCriteria; +import com.todoroo.astrid.data.Task; +import java.util.List; +import org.tasks.preferences.Preferences; + +public class TaskListQuery { + + private static final Criterion JOIN_GTASK = + Criterion.and( + Task.ID.eq(field(GTASK_METADATA_JOIN + ".gt_task")), + field(GTASK_METADATA_JOIN + ".gt_deleted").eq(0)); + private static final Criterion JOIN_CALDAV = + Criterion.and( + Task.ID.eq(field(CALDAV_METADATA_JOIN + ".cd_task")), + field(CALDAV_METADATA_JOIN + ".cd_deleted").eq(0)); + private static final Criterion JOIN_TAGS = Task.ID.eq(field(TAGS_METADATA_JOIN + ".task")); + private static final String JOINS = + Join.left(GoogleTask.TABLE.as(GTASK_METADATA_JOIN), JOIN_GTASK).toString() + + Join.left(CaldavTask.TABLE.as(CALDAV_METADATA_JOIN), JOIN_CALDAV) + + Join.left(Geofence.TABLE, Geofence.TASK.eq(Task.ID)) + + Join.left(Place.TABLE, Place.UID.eq(Geofence.PLACE)); + + private static final Table RECURSIVE = new Table("recursive_tasks"); + private static final Field RECURSIVE_TASK = field(RECURSIVE + ".task"); + private static final Field TASKS = field("tasks.*"); + private static final Field GTASK = field(GTASK_METADATA_JOIN + ".*"); + private static final Field GEOFENCE = field("geofences.*"); + private static final Field PLACE = field("places.*"); + private static final Field CALDAV = field(CALDAV_METADATA_JOIN + ".*"); + private static final Field CHILDREN = field("children"); + private static final Field SIBLINGS = field("siblings"); + private static final Field PRIMARY_SORT = field("primary_sort").as("primarySort"); + private static final Field SECONDARY_SORT = field("secondary_sort").as("secondarySort"); + private static final Field INDENT = field("indent"); + private static final Field TAG_QUERY = + field( + "(" + + Query.select(field("group_concat(distinct(tag_uid))")) + .from(Tag.TABLE) + .where(Task.ID.eq(Tag.TASK)) + .toString() + + " GROUP BY " + + Tag.TASK + + ")") + .as("tags"); + private static final StringProperty TAGS = + new StringProperty(null, "group_concat(distinct(" + TAGS_METADATA_JOIN + ".tag_uid)" + ")") + .as("tags"); + private static final List FIELDS = ImmutableList.of(TASKS, GTASK, CALDAV, GEOFENCE, PLACE); + + public static List getQuery( + Preferences preferences, + com.todoroo.astrid.api.Filter filter, + boolean includeGoogleTaskSubtasks, + boolean includeCaldavSubtasks) { + if (filter.supportSubtasks() + && (includeGoogleTaskSubtasks || includeCaldavSubtasks) + && preferences.showSubtasks() + && !(preferences.isManualSort() && filter.supportsManualSort())) { + return getRecursiveQuery( + filter, preferences, includeGoogleTaskSubtasks, includeCaldavSubtasks); + } else { + return getNonRecursiveQuery(filter, preferences); + } + } + + private static List getRecursiveQuery( + com.todoroo.astrid.api.Filter filter, + Preferences preferences, + boolean includeGoogleTaskSubtasks, + boolean includeCaldavSubtasks) { + List fields = newArrayList(FIELDS); + fields.add(TAG_QUERY); + fields.add(INDENT); + fields.add(CHILDREN); + + String joinedQuery = + Join.inner(RECURSIVE, Task.ID.eq(RECURSIVE_TASK)) + + " LEFT JOIN (SELECT parent, count(distinct recursive_tasks.task) AS children FROM recursive_tasks GROUP BY parent) AS recursive_children ON recursive_children.parent = tasks._id " + + JOINS; + String where = " WHERE recursive_tasks.hidden = 0"; + String parentQuery; + QueryTemplate subtaskQuery = new QueryTemplate(); + if (filter instanceof CaldavFilter) { + CaldavCalendar calendar = ((CaldavFilter) filter).getCalendar(); + parentQuery = + new QueryTemplate() + .join( + Join.inner( + CaldavTask.TABLE, + Criterion.and( + CaldavTask.CALENDAR.eq(calendar.getUuid()), + CaldavTask.TASK.eq(Task.ID), + CaldavTask.DELETED.eq(0)))) + .where(Criterion.and(TaskCriteria.activeAndVisible(), Task.PARENT.eq(0))) + .toString(); + subtaskQuery + .join(Join.inner(RECURSIVE, Task.PARENT.eq(RECURSIVE_TASK))) + .where(TaskCriteria.activeAndVisible()); + } else if (filter instanceof GtasksFilter) { + GoogleTaskList list = ((GtasksFilter) filter).getList(); + parentQuery = + new QueryTemplate() + .join( + Join.inner( + GoogleTask.TABLE, + Criterion.and( + GoogleTask.LIST.eq(list.getRemoteId()), + GoogleTask.PARENT.eq(0), + GoogleTask.TASK.eq(Task.ID), + GoogleTask.DELETED.eq(0)))) + .where(TaskCriteria.activeAndVisible()) + .toString(); + subtaskQuery + .join(Join.inner(RECURSIVE, GoogleTask.PARENT.eq(RECURSIVE_TASK))) + .join( + Join.inner( + GoogleTask.TABLE, + Criterion.and(GoogleTask.TASK.eq(Task.ID), GoogleTask.DELETED.eq(0)))) + .where(TaskCriteria.activeAndVisible()); + } else { + parentQuery = PermaSql.replacePlaceholdersForQuery(filter.getSqlQuery()); + if (includeGoogleTaskSubtasks && includeCaldavSubtasks) { + addGoogleAndCaldavSubtasks(subtaskQuery); + } else if (includeGoogleTaskSubtasks) { + addGoogleSubtasks(subtaskQuery); + } else { + addCaldavSubtasks(subtaskQuery); + } + subtaskQuery.where(TaskCriteria.activeAndVisible()); + joinedQuery += + " LEFT JOIN (SELECT task, max(indent) AS max_indent FROM recursive_tasks GROUP BY task) AS recursive_indents ON recursive_indents.task = tasks._id "; + where += " AND indent = max_indent "; + } + joinedQuery += where; + + String sortSelect = SortHelper.orderSelectForSortTypeRecursive(preferences.getSortMode()); + String withClause = + "CREATE TEMPORARY TABLE `recursive_tasks` AS\n" + + "WITH RECURSIVE recursive_tasks (task, parent, collapsed, hidden, indent, title, sortField) AS (\n" + + " SELECT tasks._id, 0 as parent, tasks.collapsed as collapsed, 0 as hidden, 0 AS sort_indent, UPPER(tasks.title) AS sort_title, " + + sortSelect + + " FROM tasks\n" + + parentQuery + + "\nUNION ALL SELECT tasks._id, recursive_tasks.task as parent, tasks.collapsed as collapsed, CASE WHEN recursive_tasks.collapsed > 0 OR recursive_tasks.hidden > 0 THEN 1 ELSE 0 END as hidden, recursive_tasks.indent+1 AS sort_indent, UPPER(tasks.title) AS sort_title, " + + sortSelect + + " FROM tasks\n" + + subtaskQuery + + "\nORDER BY sort_indent DESC, " + + SortHelper.orderForSortTypeRecursive(preferences) + + ") SELECT * FROM recursive_tasks"; + + return newArrayList( + "DROP TABLE IF EXISTS `temp`.`recursive_tasks`", + SortHelper.adjustQueryForFlags(preferences, withClause), + "CREATE INDEX `r_tasks` ON `recursive_tasks` (`task`)", + "CREATE INDEX `r_parents` ON `recursive_tasks` (`parent`)", + Query.select(fields.toArray(new Field[0])) + .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(joinedQuery)) + .from(Task.TABLE) + .toString()); + } + + private static List getNonRecursiveQuery(Filter filter, Preferences preferences) { + List fields = newArrayList(FIELDS); + fields.add(TAGS); + + if (filter instanceof GtasksFilter && preferences.isManualSort()) { + fields.add(INDENT); + fields.add(CHILDREN); + fields.add(SIBLINGS); + fields.add(PRIMARY_SORT); + fields.add(SECONDARY_SORT); + } + // TODO: For now, we'll modify the query to join and include the things like tag data here. + // Eventually, we might consider restructuring things so that this query is constructed + // elsewhere. + + String joinedQuery = + Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), JOIN_TAGS).toString() + + JOINS + + filter.getSqlQuery(); + + String query = + SortHelper.adjustQueryForFlagsAndSort(preferences, joinedQuery, preferences.getSortMode()); + + String groupedQuery = + query.contains("ORDER BY") + ? query.replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY") + : query + " GROUP BY " + Task.ID; + + return newArrayList( + Query.select(fields.toArray(new Field[0])) + .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(groupedQuery)) + .from(Task.TABLE) + .toString()); + } + + private static void addGoogleSubtasks(QueryTemplate subtaskQuery) { + subtaskQuery + .join(Join.inner(RECURSIVE, GoogleTask.PARENT.eq(RECURSIVE_TASK))) + .join( + Join.inner( + GoogleTask.TABLE, + Criterion.and(GoogleTask.TASK.eq(Task.ID), GoogleTask.DELETED.eq(0)))); + } + + private static void addCaldavSubtasks(QueryTemplate subtaskQuery) { + subtaskQuery.join(Join.inner(RECURSIVE, Task.PARENT.eq(RECURSIVE_TASK))); + } + + private static void addGoogleAndCaldavSubtasks(QueryTemplate subtaskQuery) { + subtaskQuery + .join( + Join.inner( + RECURSIVE, + Criterion.or(GoogleTask.PARENT.eq(RECURSIVE_TASK), Task.PARENT.eq(RECURSIVE_TASK)))) + .join( + Join.left( + GoogleTask.TABLE, + Criterion.and(GoogleTask.TASK.eq(Task.ID), GoogleTask.DELETED.eq(0)))) + .join( + Join.left( + CaldavTask.TABLE, + Criterion.and(CaldavTask.TASK.eq(Task.ID), CaldavTask.DELETED.eq(0)))); + } +} diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.java b/app/src/main/java/org/tasks/ui/TaskListViewModel.java index 7c03c9055..bb74d5592 100644 --- a/app/src/main/java/org/tasks/ui/TaskListViewModel.java +++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.java @@ -1,13 +1,9 @@ package org.tasks.ui; -import static com.google.common.collect.Lists.newArrayList; -import static com.todoroo.andlib.sql.Field.field; import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread; import static com.todoroo.andlib.utility.AndroidUtilities.assertNotMainThread; import static com.todoroo.andlib.utility.DateUtilities.now; -import static com.todoroo.astrid.activity.TaskListFragment.CALDAV_METADATA_JOIN; -import static com.todoroo.astrid.activity.TaskListFragment.GTASK_METADATA_JOIN; -import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN; +import static org.tasks.data.TaskListQuery.getQuery; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; @@ -19,21 +15,8 @@ import androidx.paging.DataSource.Factory; import androidx.paging.LivePagedListBuilder; import androidx.paging.PagedList; import androidx.sqlite.db.SimpleSQLiteQuery; -import com.todoroo.andlib.data.Property.StringProperty; -import com.todoroo.andlib.data.Table; -import com.todoroo.andlib.sql.Criterion; -import com.todoroo.andlib.sql.Field; -import com.todoroo.andlib.sql.Join; -import com.todoroo.andlib.sql.Query; -import com.todoroo.andlib.sql.QueryTemplate; -import com.todoroo.astrid.api.CaldavFilter; import com.todoroo.astrid.api.Filter; -import com.todoroo.astrid.api.GtasksFilter; -import com.todoroo.astrid.api.PermaSql; -import com.todoroo.astrid.core.SortHelper; import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.dao.TaskDao.TaskCriteria; -import com.todoroo.astrid.data.Task; import io.reactivex.Completable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -43,13 +26,6 @@ import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.tasks.BuildConfig; -import org.tasks.data.CaldavCalendar; -import org.tasks.data.CaldavTask; -import org.tasks.data.Geofence; -import org.tasks.data.GoogleTask; -import org.tasks.data.GoogleTaskList; -import org.tasks.data.Place; -import org.tasks.data.Tag; import org.tasks.data.TaskContainer; import org.tasks.preferences.Preferences; import timber.log.Timber; @@ -58,47 +34,6 @@ public class TaskListViewModel extends ViewModel implements Observer getQuery( - Preferences preferences, - Filter filter, - boolean includeGoogleTaskSubtasks, - boolean includeCaldavSubtasks) { - List fields = newArrayList(TASKS, GTASK, CALDAV, GEOFENCE, PLACE); - - if (filter.supportSubtasks() - && (includeGoogleTaskSubtasks || includeCaldavSubtasks) - && preferences.showSubtasks() - && !(preferences.isManualSort() && filter.supportsManualSort())) { - fields.add(TAG_QUERY); - fields.add(INDENT); - fields.add(CHILDREN); - - String joinedQuery = Join.inner(RECURSIVE, Task.ID.eq(RECURSIVE_TASK)) - + " LEFT JOIN (SELECT parent, count(distinct recursive_tasks.task) AS children FROM recursive_tasks GROUP BY parent) AS recursive_children ON recursive_children.parent = tasks._id " - + JOINS; - String where = " WHERE recursive_tasks.hidden = 0"; - String parentQuery; - QueryTemplate subtaskQuery = new QueryTemplate(); - if (filter instanceof CaldavFilter) { - CaldavCalendar calendar = ((CaldavFilter) filter).getCalendar(); - parentQuery = - new QueryTemplate() - .join( - Join.inner( - CaldavTask.TABLE, - Criterion.and( - CaldavTask.CALENDAR.eq(calendar.getUuid()), - CaldavTask.TASK.eq(Task.ID), - CaldavTask.DELETED.eq(0)))) - .where(Criterion.and(TaskCriteria.activeAndVisible(), Task.PARENT.eq(0))) - .toString(); - subtaskQuery - .join(Join.inner(RECURSIVE, Task.PARENT.eq(RECURSIVE_TASK))) - .where(TaskCriteria.activeAndVisible()); - } else if (filter instanceof GtasksFilter) { - GoogleTaskList list = ((GtasksFilter) filter).getList(); - parentQuery = - new QueryTemplate() - .join( - Join.inner( - GoogleTask.TABLE, - Criterion.and( - GoogleTask.LIST.eq(list.getRemoteId()), - GoogleTask.PARENT.eq(0), - GoogleTask.TASK.eq(Task.ID), - GoogleTask.DELETED.eq(0)))) - .where(TaskCriteria.activeAndVisible()) - .toString(); - subtaskQuery - .join(Join.inner(RECURSIVE, GoogleTask.PARENT.eq(RECURSIVE_TASK))) - .join( - Join.inner( - GoogleTask.TABLE, - Criterion.and( - GoogleTask.TASK.eq(Task.ID), - GoogleTask.DELETED.eq(0)))) - .where(TaskCriteria.activeAndVisible()); - } else { - parentQuery = PermaSql.replacePlaceholdersForQuery(filter.getSqlQuery()); - if (includeGoogleTaskSubtasks && includeCaldavSubtasks) { - addGoogleAndCaldavSubtasks(subtaskQuery); - } else if (includeGoogleTaskSubtasks) { - addGoogleSubtasks(subtaskQuery); - } else { - addCaldavSubtasks(subtaskQuery); - } - subtaskQuery.where(TaskCriteria.activeAndVisible()); - joinedQuery += " LEFT JOIN (SELECT task, max(indent) AS max_indent FROM recursive_tasks GROUP BY task) AS recursive_indents ON recursive_indents.task = tasks._id "; - where += " AND indent = max_indent "; - } - joinedQuery += where; - - String sortSelect = SortHelper.orderSelectForSortTypeRecursive(preferences.getSortMode()); - String withClause = "CREATE TEMPORARY TABLE `recursive_tasks` AS\n" - + "WITH RECURSIVE recursive_tasks (task, parent, collapsed, hidden, indent, title, sortField) AS (\n" - + " SELECT tasks._id, 0 as parent, tasks.collapsed as collapsed, 0 as hidden, 0 AS sort_indent, UPPER(tasks.title) AS sort_title, " - + sortSelect - + " FROM tasks\n" - + parentQuery - + "\nUNION ALL SELECT tasks._id, recursive_tasks.task as parent, tasks.collapsed as collapsed, CASE WHEN recursive_tasks.collapsed > 0 OR recursive_tasks.hidden > 0 THEN 1 ELSE 0 END as hidden, recursive_tasks.indent+1 AS sort_indent, UPPER(tasks.title) AS sort_title, " - + sortSelect - + " FROM tasks\n" - + subtaskQuery - + "\nORDER BY sort_indent DESC, " - + SortHelper.orderForSortTypeRecursive(preferences) - + ") SELECT * FROM recursive_tasks"; - - return newArrayList( - "DROP TABLE IF EXISTS `temp`.`recursive_tasks`", - SortHelper.adjustQueryForFlags(preferences, withClause), - "CREATE INDEX `r_tasks` ON `recursive_tasks` (`task`)", - "CREATE INDEX `r_parents` ON `recursive_tasks` (`parent`)", - Query.select(fields.toArray(new Field[0])) - .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(joinedQuery)) - .from(Task.TABLE) - .toString()); - } else { - fields.add(TAGS); - - if (filter instanceof GtasksFilter && preferences.isManualSort()) { - fields.add(INDENT); - fields.add(CHILDREN); - fields.add(SIBLINGS); - fields.add(PRIMARY_SORT); - fields.add(SECONDARY_SORT); - } - // TODO: For now, we'll modify the query to join and include the things like tag data here. - // Eventually, we might consider restructuring things so that this query is constructed - // elsewhere. - - String joinedQuery = - Join.left(Tag.TABLE.as(TAGS_METADATA_JOIN), JOIN_TAGS).toString() - + JOINS - + filter.getSqlQuery(); - - String query = - SortHelper.adjustQueryForFlagsAndSort( - preferences, joinedQuery, preferences.getSortMode()); - - String groupedQuery = - query.contains("ORDER BY") - ? query.replace("ORDER BY", "GROUP BY " + Task.ID + " ORDER BY") - : query + " GROUP BY " + Task.ID; - - return newArrayList( - Query.select(fields.toArray(new Field[0])) - .withQueryTemplate(PermaSql.replacePlaceholdersForQuery(groupedQuery)) - .from(Task.TABLE) - .toString()); - } - } - - private static void addGoogleSubtasks(QueryTemplate subtaskQuery) { - subtaskQuery - .join(Join.inner(RECURSIVE, GoogleTask.PARENT.eq(RECURSIVE_TASK))) - .join( - Join.inner( - GoogleTask.TABLE, - Criterion.and( - GoogleTask.TASK.eq(Task.ID), - GoogleTask.DELETED.eq(0)))); - } - - private static void addCaldavSubtasks(QueryTemplate subtaskQuery) { - subtaskQuery - .join(Join.inner(RECURSIVE, Task.PARENT.eq(RECURSIVE_TASK))); - } - - private static void addGoogleAndCaldavSubtasks(QueryTemplate subtaskQuery) { - subtaskQuery - .join( - Join.inner( - RECURSIVE, - Criterion.or( - GoogleTask.PARENT.eq(RECURSIVE_TASK), - Task.PARENT.eq(RECURSIVE_TASK)))) - .join( - Join.left( - GoogleTask.TABLE, - Criterion.and( - GoogleTask.TASK.eq(Task.ID), - GoogleTask.DELETED.eq(0)))) - .join( - Join.left( - CaldavTask.TABLE, - Criterion.and( - CaldavTask.TASK.eq(Task.ID), - CaldavTask.DELETED.eq(0)))); - } - public void searchByFilter(Filter filter) { this.filter = filter; invalidate(); @@ -323,14 +85,14 @@ public class TaskListViewModel extends ViewModel implements Observer - taskDao.fetchTasks( - ((includeGoogleSubtasks, includeCaldavSubtasks) -> - getQuery( - preferences, - filter, - includeGoogleSubtasks, - includeCaldavSubtasks)))) + () -> + taskDao.fetchTasks( + ((includeGoogleSubtasks, includeCaldavSubtasks) -> + getQuery( + preferences, + filter, + includeGoogleSubtasks, + includeCaldavSubtasks)))) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(tasks::postValue, Timber::e)); @@ -352,16 +114,17 @@ public class TaskListViewModel extends ViewModel implements Observer - Completable.fromAction( - () -> { - assertNotMainThread(); - long start = now(); - command.run(); - Timber.d("*** paged list execution took %sms", now() - start); - }) - .subscribeOn(Schedulers.io()) - .subscribe()); + builder.setFetchExecutor( + command -> + Completable.fromAction( + () -> { + assertNotMainThread(); + long start = now(); + command.run(); + Timber.d("*** paged list execution took %sms", now() - start); + }) + .subscribeOn(Schedulers.io()) + .subscribe()); } internal = builder.build(); internal.observeForever(this); diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index e3aed1674..aac336eb4 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -22,13 +22,13 @@ import java.util.List; import org.tasks.BuildConfig; import org.tasks.R; import org.tasks.data.TaskContainer; +import org.tasks.data.TaskListQuery; import org.tasks.locale.Locale; import org.tasks.preferences.DefaultFilterProvider; import org.tasks.preferences.Preferences; import org.tasks.themes.ThemeCache; import org.tasks.themes.WidgetTheme; import org.tasks.ui.CheckBoxes; -import org.tasks.ui.TaskListViewModel; import timber.log.Timber; class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { @@ -209,7 +209,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { } appWidgetManager.partiallyUpdateAppWidget(widgetId, rv); List queries = - TaskListViewModel.getQuery( + TaskListQuery.getQuery( preferences, filter, includeGoogleSubtasks, includeCaldavSubtasks); int last = queries.size() - 1; queries.set(last, subtasksHelper.applySubtasksToWidgetFilter(filter, queries.get(last)));