Check for subtasks before using recursive query

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

@ -6,6 +6,7 @@
package com.todoroo.astrid.dao;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastLollipop;
import static com.todoroo.andlib.utility.DateUtilities.now;
import android.database.Cursor;
@ -17,6 +18,7 @@ import androidx.room.Transaction;
import androidx.room.Update;
import androidx.sqlite.db.SimpleSQLiteQuery;
import androidx.sqlite.db.SupportSQLiteDatabase;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Functions;
@ -130,8 +132,9 @@ public abstract class TaskDao {
public abstract int clearCompletedCalendarEvents();
@Transaction
public List<TaskContainer> fetchTasks(List<String> queries) {
public List<TaskContainer> fetchTasks(Function<Boolean, List<String>> getQueries) {
long start = BuildConfig.DEBUG ? now() : 0;
List<String> queries = getQueries.apply(atLeastLollipop() && hasSubtasks());
SupportSQLiteDatabase db = database.getOpenHelper().getWritableDatabase();
int last = queries.size() - 1;
for (int i = 0 ; i < last ; i++) {
@ -145,6 +148,13 @@ public abstract class TaskDao {
@RawQuery
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)")
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.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.GTASK_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);
}
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);
if (atLeastLollipop()
if (subtasks
&& filter.supportsSubtasks()
&& !(preferences.isManualSort() && filter.supportsManualSort())) {
String tagQuery =
@ -274,11 +272,9 @@ public class TaskListViewModel extends ViewModel {
}
public void invalidate() {
assertMainThread();
List<String> queries = getQuery(preferences, filter);
disposable.add(
Single.fromCallable(() -> taskDao.fetchTasks(queries))
Single.fromCallable(
() -> taskDao.fetchTasks(hasSubtasks -> getQuery(preferences, filter, hasSubtasks)))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(tasks::postValue, Timber::e));

@ -82,7 +82,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
@Override
public void onDataSetChanged() {
updateSettings();
tasks = taskDao.fetchTasks(getQuery(filter));
tasks = taskDao.fetchTasks(hasSubtasks -> getQuery(filter, hasSubtasks));
}
@Override
@ -196,7 +196,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory {
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);
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.scrollable_widget);
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());
}
appWidgetManager.partiallyUpdateAppWidget(widgetId, rv);
List<String> queries = TaskListViewModel.getQuery(preferences, filter);
List<String> queries = TaskListViewModel.getQuery(preferences, filter, hasSubtasks);
int last = queries.size() - 1;
queries.set(last, subtasksHelper.applySubtasksToWidgetFilter(filter, queries.get(last)));
return queries;

Loading…
Cancel
Save