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 fa0d503c0..8b8abf59a 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java @@ -256,12 +256,7 @@ public abstract class TaskDao { } public List fetchFiltered(String queryTemplate) { - Query query = Query.select(Task.PROPERTIES).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate)); - String queryString = query.from(Task.TABLE).toString(); - if (BuildConfig.DEBUG) { - Timber.v(queryString); - } - Cursor cursor = database.rawQuery(queryString); + Cursor cursor = getCursor(queryTemplate); List result = new ArrayList<>(); try { for (cursor.moveToFirst() ; !cursor.isAfterLast() ; cursor.moveToNext()) { @@ -273,6 +268,15 @@ public abstract class TaskDao { } } + public Cursor getCursor(String queryTemplate) { + Query query = Query.select(Task.PROPERTIES).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate)); + String queryString = query.from(Task.TABLE).toString(); + if (BuildConfig.DEBUG) { + Timber.v(queryString); + } + return database.rawQuery(queryString); + } + public LimitOffsetDataSource getLimitOffsetDataSource(String queryTemplate, Property... properties) { String query = Query .select(properties) diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index 5690ca2a4..04f50d721 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -4,6 +4,7 @@ import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.res.Resources; +import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Paint; import android.text.TextUtils; @@ -14,7 +15,6 @@ import android.widget.RemoteViewsService; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.SortHelper; -import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.subtasks.SubtasksHelper; @@ -40,7 +40,6 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { private final WidgetCheckBoxes checkBoxes; private final ThemeCache themeCache; private final int widgetId; - private final Database database; private final TaskDao taskDao; private final DefaultFilterProvider defaultFilterProvider; private final SubtasksHelper subtasksHelper; @@ -56,14 +55,13 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { private int textColorPrimary; private int textColorSecondary; - private List tasks; + private Cursor cursor; ScrollableViewsFactory( SubtasksHelper subtasksHelper, Preferences preferences, Context context, int widgetId, - Database database, TaskDao taskDao, DefaultFilterProvider defaultFilterProvider, WidgetCheckBoxes checkBoxes, @@ -72,7 +70,6 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { this.preferences = preferences; this.context = context; this.widgetId = widgetId; - this.database = database; this.taskDao = taskDao; this.defaultFilterProvider = defaultFilterProvider; this.checkBoxes = checkBoxes; @@ -85,22 +82,27 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { @Override public void onCreate() { - database.openForReading(); - tasks = getTasks(); + cursor = getCursor(); } @Override public void onDataSetChanged() { - tasks = getTasks(); + if (cursor != null) { + cursor.close(); + } + cursor = getCursor(); } @Override public void onDestroy() { + if (cursor != null) { + cursor.close(); + } } @Override public int getCount() { - return tasks.size(); + return cursor.getCount(); } @Override @@ -199,13 +201,12 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { return null; } - private List getTasks() { - String query = getQuery(); - return taskDao.fetchFiltered(query); + private Cursor getCursor() { + return taskDao.getCursor(getQuery()); } private Task getTask(int position) { - return position < tasks.size() ? tasks.get(position) : null; + return cursor.moveToPosition(position) ? new Task(cursor) : null; } private String getQuery() { diff --git a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java index 92545d455..9f74b718a 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java +++ b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java @@ -5,7 +5,6 @@ import android.content.Intent; import android.os.Bundle; import android.widget.RemoteViewsService; -import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.subtasks.SubtasksHelper; @@ -20,7 +19,6 @@ import javax.inject.Inject; public class ScrollableWidgetUpdateService extends RemoteViewsService { - @Inject Database database; @Inject TaskDao taskDao; @Inject Preferences preferences; @Inject SubtasksHelper subtasksHelper; @@ -58,6 +56,6 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService { int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); return new ScrollableViewsFactory(subtasksHelper, preferences, locale.createConfigurationContext(getApplicationContext()), - widgetId, database, taskDao, defaultFilterProvider, widgetCheckBoxes, themeCache); + widgetId, taskDao, defaultFilterProvider, widgetCheckBoxes, themeCache); } }