Check for subtasks before using recursive query

gtask_related_email
Alex Baker 6 years ago
parent 777980cb71
commit 4ef56a34df

@ -6,6 +6,7 @@
package com.todoroo.astrid.dao; package com.todoroo.astrid.dao;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.DateUtilities.now; import static com.todoroo.andlib.utility.DateUtilities.now;
import android.database.Cursor; import android.database.Cursor;
@ -17,6 +18,7 @@ import androidx.room.Transaction;
import androidx.room.Update; import androidx.room.Update;
import androidx.sqlite.db.SimpleSQLiteQuery; import androidx.sqlite.db.SimpleSQLiteQuery;
import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.sqlite.db.SupportSQLiteDatabase;
import com.google.common.base.Function;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
@ -130,8 +132,9 @@ public abstract class TaskDao {
public abstract int clearCompletedCalendarEvents(); public abstract int clearCompletedCalendarEvents();
@Transaction @Transaction
public List<TaskContainer> fetchTasks(List<String> queries) { public List<TaskContainer> fetchTasks(Function<Boolean, List<String>> getQueries) {
long start = BuildConfig.DEBUG ? now() : 0; long start = BuildConfig.DEBUG ? now() : 0;
List<String> queries = getQueries.apply(atLeastLollipop() && hasSubtasks());
SupportSQLiteDatabase db = database.getOpenHelper().getWritableDatabase(); SupportSQLiteDatabase db = database.getOpenHelper().getWritableDatabase();
int last = queries.size() - 1; int last = queries.size() - 1;
for (int i = 0 ; i < last ; i++) { for (int i = 0 ; i < last ; i++) {
@ -145,6 +148,13 @@ public abstract class TaskDao {
@RawQuery @RawQuery
abstract List<TaskContainer> fetchTasks(SimpleSQLiteQuery query); abstract List<TaskContainer> fetchTasks(SimpleSQLiteQuery query);
@Query(
"SELECT EXISTS("
+ "SELECT 1 FROM google_tasks WHERE gt_parent > 0 AND gt_deleted = 0"
+ " UNION ALL "
+ "SELECT 1 FROM caldav_tasks WHERE cd_parent > 0 AND cd_deleted = 0);")
public abstract boolean hasSubtasks();
@Query("UPDATE tasks SET modified = datetime('now', 'localtime') WHERE _id in (:ids)") @Query("UPDATE tasks SET modified = datetime('now', 'localtime') WHERE _id in (:ids)")
public abstract void touch(List<Long> ids); public abstract void touch(List<Long> ids);

@ -2,8 +2,6 @@ package org.tasks.ui;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayList;
import static com.todoroo.andlib.sql.Field.field; import static com.todoroo.andlib.sql.Field.field;
import static com.todoroo.andlib.utility.AndroidUtilities.assertMainThread;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.astrid.activity.TaskListFragment.CALDAV_METADATA_JOIN; 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.GTASK_METADATA_JOIN;
import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN; import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN;
@ -102,10 +100,10 @@ public class TaskListViewModel extends ViewModel {
tasks.observe(owner, observer); tasks.observe(owner, observer);
} }
public static List<String> getQuery(Preferences preferences, Filter filter) { public static List<String> getQuery(Preferences preferences, Filter filter, boolean subtasks) {
List<Field> fields = newArrayList(TASKS, GTASK, CALDAV, GEOFENCE, PLACE); List<Field> fields = newArrayList(TASKS, GTASK, CALDAV, GEOFENCE, PLACE);
if (atLeastLollipop() if (subtasks
&& filter.supportsSubtasks() && filter.supportsSubtasks()
&& !(preferences.isManualSort() && filter.supportsManualSort())) { && !(preferences.isManualSort() && filter.supportsManualSort())) {
String tagQuery = String tagQuery =
@ -274,11 +272,9 @@ public class TaskListViewModel extends ViewModel {
} }
public void invalidate() { public void invalidate() {
assertMainThread();
List<String> queries = getQuery(preferences, filter);
disposable.add( disposable.add(
Single.fromCallable(() -> taskDao.fetchTasks(queries)) Single.fromCallable(
() -> taskDao.fetchTasks(hasSubtasks -> getQuery(preferences, filter, hasSubtasks)))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(tasks::postValue, Timber::e)); .subscribe(tasks::postValue, Timber::e));

@ -82,7 +82,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
@Override @Override
public void onDataSetChanged() { public void onDataSetChanged() {
updateSettings(); updateSettings();
tasks = taskDao.fetchTasks(getQuery(filter)); tasks = taskDao.fetchTasks(hasSubtasks -> getQuery(filter, hasSubtasks));
} }
@Override @Override
@ -196,7 +196,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
return position < tasks.size() ? tasks.get(position) : null; return position < tasks.size() ? tasks.get(position) : null;
} }
private List<String> getQuery(Filter filter) { private List<String> getQuery(Filter filter, boolean hasSubtasks) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget); RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
rv.setTextViewText(R.id.widget_title, filter.listingTitle); rv.setTextViewText(R.id.widget_title, filter.listingTitle);
@ -204,7 +204,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
rv.setInt(R.id.widget, "setLayoutDirection", Locale.getInstance(context).getDirectionality()); rv.setInt(R.id.widget, "setLayoutDirection", Locale.getInstance(context).getDirectionality());
} }
appWidgetManager.partiallyUpdateAppWidget(widgetId, rv); appWidgetManager.partiallyUpdateAppWidget(widgetId, rv);
List<String> queries = TaskListViewModel.getQuery(preferences, filter); List<String> queries = TaskListViewModel.getQuery(preferences, filter, hasSubtasks);
int last = queries.size() - 1; int last = queries.size() - 1;
queries.set(last, subtasksHelper.applySubtasksToWidgetFilter(filter, queries.get(last))); queries.set(last, subtasksHelper.applySubtasksToWidgetFilter(filter, queries.get(last)));
return queries; return queries;

Loading…
Cancel
Save