diff --git a/app/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java b/app/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java index 45222b833..84a47bda3 100644 --- a/app/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java +++ b/app/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksSubtaskListFragment.java @@ -6,8 +6,6 @@ package com.todoroo.astrid.gtasks; import android.app.Activity; -import android.content.Context; -import android.database.Cursor; import android.os.Bundle; import com.todoroo.andlib.data.Property; @@ -18,13 +16,12 @@ import com.todoroo.astrid.data.Task; import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTaskList; -import org.tasks.injection.ForApplication; import org.tasks.injection.FragmentComponent; import org.tasks.tasklist.GtasksListFragment; -import org.tasks.themes.Theme; import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import javax.inject.Inject; @@ -37,8 +34,6 @@ public class GtasksSubtaskListFragment extends GtasksListFragment { return fragment; } - @Inject @ForApplication Context context; - @Inject Theme theme; @Inject OrderedMetadataListFragmentHelper helper; @Override @@ -78,8 +73,8 @@ public class GtasksSubtaskListFragment extends GtasksListFragment { } @Override - protected TaskAdapter createTaskAdapter(Cursor cursor) { - return helper.createTaskAdapter(theme.wrap(context), cursor); + protected TaskAdapter createTaskAdapter(List tasks) { + return helper.createTaskAdapter(tasks); } @Override diff --git a/app/src/googleplay/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java b/app/src/googleplay/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java index 9cc5b4c08..808ec1439 100644 --- a/app/src/googleplay/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java +++ b/app/src/googleplay/java/com/todoroo/astrid/gtasks/OrderedMetadataListFragmentHelper.java @@ -5,8 +5,6 @@ */ package com.todoroo.astrid.gtasks; -import android.content.Context; -import android.database.Cursor; import android.text.TextUtils; import com.todoroo.andlib.utility.DateUtilities; @@ -23,6 +21,7 @@ import org.tasks.data.GoogleTaskList; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.inject.Inject; @@ -55,8 +54,8 @@ class OrderedMetadataListFragmentHelper { updater.initialize(filter); } - TaskAdapter createTaskAdapter(Context context, Cursor cursor) { - taskAdapter = new DraggableTaskAdapter(context, cursor); + TaskAdapter createTaskAdapter(List cursor) { + taskAdapter = new DraggableTaskAdapter(cursor); taskAdapter.setOnCompletedTaskListener(this::setCompletedForItemAndSubtasks); @@ -65,8 +64,8 @@ class OrderedMetadataListFragmentHelper { private final class DraggableTaskAdapter extends TaskAdapter { - private DraggableTaskAdapter(Context context, Cursor c) { - super(context, c); + private DraggableTaskAdapter(List tasks) { + super(tasks); } @Override @@ -87,11 +86,11 @@ class OrderedMetadataListFragmentHelper { @Override public void moved(int from, int to) { - long targetTaskId = taskAdapter.getItemId(from); + long targetTaskId = taskAdapter.getTaskId(from); if (targetTaskId <= 0) { return; // This can happen with gestures on empty parts of the list (e.g. extra space below tasks) } - long destinationTaskId = taskAdapter.getItemId(to); + long destinationTaskId = taskAdapter.getTaskId(to); try { if(to >= taskAdapter.getCount()) { @@ -108,7 +107,7 @@ class OrderedMetadataListFragmentHelper { @Override public void indented(int which, int delta) { - long targetTaskId = taskAdapter.getItemId(which); + long targetTaskId = taskAdapter.getTaskId(which); if (targetTaskId <= 0) { return; // This can happen with gestures on empty parts of the list (e.g. extra space below tasks) } @@ -137,7 +136,7 @@ class OrderedMetadataListFragmentHelper { task.setCompletionDate(completionDate); taskDao.save(task); } - taskAdapter.notifyDataSetInvalidated(); + fragment.loadTaskListContent(); } return; } @@ -159,7 +158,7 @@ class OrderedMetadataListFragmentHelper { if(chained.size() > 0) { chainedCompletions.put(itemId, chained); - taskAdapter.notifyDataSetInvalidated(); + fragment.loadTaskListContent(); } } @@ -169,6 +168,6 @@ class OrderedMetadataListFragmentHelper { void onDeleteTask(Task task) { updater.onDeleteTask(list, task.getId()); - taskAdapter.notifyDataSetInvalidated(); + fragment.loadTaskListContent(); } } 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 1dd6e7868..9884980a5 100644 --- a/app/src/main/java/com/todoroo/andlib/data/Property.java +++ b/app/src/main/java/com/todoroo/andlib/data/Property.java @@ -5,7 +5,6 @@ */ package com.todoroo.andlib.data; -import android.database.Cursor; import android.text.TextUtils; import com.todoroo.andlib.sql.Field; @@ -50,11 +49,6 @@ public abstract class Property extends Field implements Cloneable { this.name = columnName; } - /** - * Accept a visitor - */ - abstract public TYPE getValue(Cursor data); - /** * Return a clone of this property */ @@ -104,11 +98,6 @@ public abstract class Property extends Field implements Cloneable { IntegerProperty(String name, String expression) { super(null, name, expression); } - - @Override - public Integer getValue(Cursor data) { - return data.getInt(data.getColumnIndexOrThrow(getColumnName())); - } } /** @@ -123,11 +112,6 @@ public abstract class Property extends Field implements Cloneable { super(table, name); } - @Override - public String getValue(Cursor data) { - return data.getString(data.getColumnIndexOrThrow(getColumnName())); - } - @Override public StringProperty as(String newAlias) { return (StringProperty) super.as(newAlias); @@ -146,11 +130,6 @@ public abstract class Property extends Field implements Cloneable { super(table, name); } - @Override - public Long getValue(Cursor data) { - return data.getLong(data.getColumnIndexOrThrow(getColumnName())); - } - @Override public LongProperty cloneAs(String tableAlias, String columnAlias) { return (LongProperty) super.cloneAs(tableAlias, columnAlias); diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index f909b12f1..81e444f9f 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -9,7 +9,6 @@ import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.database.Cursor; import android.os.Bundle; import android.speech.RecognizerIntent; import android.support.annotation.Nullable; @@ -286,13 +285,13 @@ public class TaskListFragment extends InjectingFragment implements case R.id.menu_show_hidden: item.setChecked(!item.isChecked()); preferences.setBoolean(R.string.p_show_hidden_tasks, item.isChecked()); - reconstructCursor(); + loadTaskListContent(); localBroadcastManager.broadcastRefresh(); return true; case R.id.menu_show_completed: item.setChecked(!item.isChecked()); preferences.setBoolean(R.string.p_show_completed_tasks, item.isChecked()); - reconstructCursor(); + loadTaskListContent(); localBroadcastManager.broadcastRefresh(); return true; case R.id.menu_filter_settings: @@ -366,16 +365,6 @@ public class TaskListFragment extends InjectingFragment implements return snackbar; } - @Override - public void onDestroy() { - super.onDestroy(); - - Cursor cursor = taskAdapter.getCursor(); - if (cursor != null) { - cursor.close(); - } - } - @Override public void onPause() { super.onPause(); @@ -416,12 +405,15 @@ public class TaskListFragment extends InjectingFragment implements * Load or re-load action items and update views */ public void loadTaskListContent() { - Cursor taskCursor = taskAdapter.getCursor(); - + if (taskAdapter == null) { + return; + } // stash selected items Bundle saveState = recyclerAdapter.getSaveState(); - taskCursor.requery(); + List tasks = taskListDataProvider.toList(filter, taskProperties()); + taskAdapter.setTasks(tasks); + if (taskAdapter.getCount() == 0) { swipeRefreshLayout.setVisibility(View.GONE); emptyRefreshLayout.setVisibility(View.VISIBLE); @@ -433,8 +425,8 @@ public class TaskListFragment extends InjectingFragment implements } } - protected TaskAdapter createTaskAdapter(Cursor cursor) { - return new TaskAdapter(context, cursor); + protected TaskAdapter createTaskAdapter(List tasks) { + return new TaskAdapter(tasks); } public static final String TAGS_METADATA_JOIN = "for_tags"; //$NON-NLS-1$ @@ -449,13 +441,10 @@ public class TaskListFragment extends InjectingFragment implements return; } - Cursor currentCursor = taskListDataProvider.constructCursor(filter, taskProperties()); - if (currentCursor == null) { - return; - } + List tasks = taskListDataProvider.toList(filter, taskProperties()); // set up list adapters - taskAdapter = createTaskAdapter(currentCursor); + taskAdapter = createTaskAdapter(tasks); recyclerAdapter = new TaskListRecyclerAdapter(getActivity(), taskAdapter, viewHolderFactory, this, taskDeleter, taskDuplicator, tracker, dialogBuilder); } @@ -468,14 +457,6 @@ public class TaskListFragment extends InjectingFragment implements return filter; } - public void reconstructCursor() { - Cursor cursor = taskListDataProvider.constructCursor(filter, taskProperties()); - if (cursor == null || taskAdapter == null) { - return; - } - taskAdapter.changeCursor(cursor); - } - /* * ====================================================================== * ============================================================== actions diff --git a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java index bce89aaf5..7da4ca324 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/TaskAdapter.java @@ -5,13 +5,6 @@ */ package com.todoroo.astrid.adapter; -import android.content.Context; -import android.database.Cursor; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CursorAdapter; -import android.widget.Filterable; - import com.google.common.collect.ObjectArrays; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property.LongProperty; @@ -24,25 +17,37 @@ import org.tasks.data.TaskAttachment; import java.util.ArrayList; import java.util.List; +import static com.todoroo.astrid.data.Task.NO_ID; +import static com.todoroo.astrid.data.Task.NO_UUID; + /** * Adapter for displaying a user's tasks as a list * * @author Tim Su * */ -public class TaskAdapter extends CursorAdapter implements Filterable { +public class TaskAdapter { + + private List tasks; public List getTaskPositions(List longs) { List result = new ArrayList<>(); - Cursor taskCursor = getTaskCursor(); - for (taskCursor.moveToFirst() ; !taskCursor.isAfterLast() ; taskCursor.moveToNext()) { - if (longs.contains(Task.ID.getValue(taskCursor))) { - result.add(taskCursor.getPosition()); + for (int i = 0 ; i < tasks.size() ; i++) { + if (longs.contains(tasks.get(i).getId())) { + result.add(i); } } return result; } + public void setTasks(List tasks) { + this.tasks = tasks; + } + + public int getCount() { + return tasks.size(); + } + public interface OnCompletedTaskListener { void onCompletedTask(Task item, boolean newState); } @@ -59,18 +64,8 @@ public class TaskAdapter extends CursorAdapter implements Filterable { private OnCompletedTaskListener onCompletedTaskListener = null; - public TaskAdapter(Context context, Cursor c) { - super(context, c, false); - } - - @Override - public View newView(Context context, Cursor cursor, ViewGroup parent) { - throw new RuntimeException(); - } - - @Override - public void bindView(View view, Context context, Cursor c) { - throw new RuntimeException(); + public TaskAdapter(List tasks) { + this.tasks = tasks; } public int getIndent(Task task) { @@ -93,41 +88,20 @@ public class TaskAdapter extends CursorAdapter implements Filterable { } - private Cursor getTaskCursor() { - return getCursor(); + public List getTasks() { + return tasks; } public long getTaskId(int position) { - Cursor c = getTaskCursor(); - if (c != null) { - if (c.moveToPosition(position)) { - return Task.ID.getValue(c); - } - } - return Task.NO_ID; + return position < tasks.size() ? tasks.get(position).getId() : NO_ID; } public Task getTask(int position) { - Cursor c = getTaskCursor(); - if (c != null) { - if (c.moveToPosition(position)) { - return new Task(c); - } - } - return null; + return position < tasks.size() ? tasks.get(position) : null; } protected String getItemUuid(int position) { - Cursor c = getTaskCursor(); - if (c != null) { - if (c.moveToPosition(position)) { - return Task.UUID.getValue(c); - } else { - return Task.NO_UUID; - } - } else { - return Task.NO_UUID; - } + return position < tasks.size() ? tasks.get(position).getUuid() : NO_UUID; } public void onCompletedTask(Task task, boolean newState) { 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 2fbe4efdf..29ee5d6af 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java @@ -225,12 +225,7 @@ public abstract class TaskDao { } public int count(Filter filter) { - Cursor cursor = fetchFiltered(filter.getSqlQuery(), Task.ID); - try { - return cursor.getCount(); - } finally { - cursor.close(); - } + return fetchFiltered(filter.getSqlQuery()).size(); } public List fetchFiltered(Filter filter) { @@ -238,25 +233,25 @@ public abstract class TaskDao { } public List fetchFiltered(String query) { - Cursor cursor = fetchFiltered(query, Task.PROPERTIES); + return fetchFiltered(query, Task.PROPERTIES); + } + + public List fetchFiltered(String queryTemplate, Property... properties) { + Query query = Query.select(properties).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate)); + String queryString = query.from(Task.TABLE).toString(); + if (BuildConfig.DEBUG) { + Timber.v(queryString); + } + Cursor cursor = database.rawQuery(queryString); List result = new ArrayList<>(); try { for (cursor.moveToFirst() ; !cursor.isAfterLast() ; cursor.moveToNext()) { result.add(new Task(cursor)); } + return result; } finally { cursor.close(); } - return result; - } - - public Cursor fetchFiltered(String queryTemplate, Property... properties) { - Query query = Query.select(properties).withQueryTemplate(PermaSql.replacePlaceholders(queryTemplate)); - String queryString = query.from(Task.TABLE).toString(); - if (BuildConfig.DEBUG) { - Timber.v(queryString); - } - return database.rawQuery(queryString); } } diff --git a/app/src/main/java/com/todoroo/astrid/data/Task.java b/app/src/main/java/com/todoroo/astrid/data/Task.java index de6ef7543..7c33e6897 100644 --- a/app/src/main/java/com/todoroo/astrid/data/Task.java +++ b/app/src/main/java/com/todoroo/astrid/data/Task.java @@ -213,6 +213,12 @@ public class Task implements Parcelable { @Ignore private int googleTaskIndent; + @Ignore + private String tags; + + @Ignore + private boolean hasFiles; + @Ignore private HashMap transitoryData = null; @@ -245,6 +251,8 @@ public class Task implements Parcelable { final int _cursorIndexOfCalendarUri = _cursor.getColumnIndexOrThrow("calendarUri"); final int _cursorIndexOfRemoteId = _cursor.getColumnIndexOrThrow("remoteId"); final int _cursorIndexOfIndent = _cursor.getColumnIndex("index"); + final int _cursorIndexOfTags = _cursor.getColumnIndex("tags"); + final int _cursorIndexOfFileId = _cursor.getColumnIndex("fileId"); if (_cursor.isNull(_cursorIndexOfId)) { id = null; } else { @@ -333,6 +341,12 @@ public class Task implements Parcelable { if (_cursorIndexOfIndent >= 0) { googleTaskIndent = _cursor.getInt(_cursorIndexOfIndent); } + if (_cursorIndexOfTags >= 0) { + tags = _cursor.getString(_cursorIndexOfTags); + } + if (_cursorIndexOfFileId >= 0) { + hasFiles = _cursor.getInt(_cursorIndexOfFileId) > 0; + } } @Ignore @@ -979,4 +993,12 @@ public class Task implements Parcelable { Object trans = clearTransitory(flag); return trans != null; } + + public String getTagsString() { + return tags; + } + + public boolean hasFiles() { + return hasFiles; + } } diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java b/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java index 4ffa10aa4..be0a74dff 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/AstridOrderedListFragmentHelper.java @@ -1,7 +1,5 @@ package com.todoroo.astrid.subtasks; -import android.content.Context; -import android.database.Cursor; import android.text.TextUtils; import com.todoroo.andlib.utility.DateUtilities; @@ -46,8 +44,8 @@ class AstridOrderedListFragmentHelper { updater.initialize(list, filter); } - TaskAdapter createTaskAdapter(Context context, Cursor cursor) { - taskAdapter = new DraggableTaskAdapter(context, cursor); + TaskAdapter createTaskAdapter(List tasks) { + taskAdapter = new DraggableTaskAdapter(tasks); taskAdapter.setOnCompletedTaskListener(this::setCompletedForItemAndSubtasks); @@ -56,8 +54,8 @@ class AstridOrderedListFragmentHelper { private final class DraggableTaskAdapter extends TaskAdapter { - private DraggableTaskAdapter(Context context, Cursor c) { - super(context, c); + private DraggableTaskAdapter(List tasks) { + super(tasks); } @Override @@ -95,7 +93,6 @@ class AstridOrderedListFragmentHelper { Timber.e(e, e.getMessage()); } - fragment.reconstructCursor(); fragment.loadTaskListContent(); } @@ -111,7 +108,6 @@ class AstridOrderedListFragmentHelper { Timber.e(e, e.getMessage()); } - fragment.reconstructCursor(); fragment.loadTaskListContent(); } } @@ -130,7 +126,7 @@ class AstridOrderedListFragmentHelper { for(String taskId : chained) { taskDao.setCompletionDate(taskId, completionDate); } - taskAdapter.notifyDataSetInvalidated(); + fragment.loadTaskListContent(); } return; } @@ -159,7 +155,7 @@ class AstridOrderedListFragmentHelper { } chainedCompletions.put(itemId, chained); - taskAdapter.notifyDataSetInvalidated(); + fragment.loadTaskListContent(); } } @@ -169,12 +165,11 @@ class AstridOrderedListFragmentHelper { void onCreateTask(String uuid) { updater.onCreateTask(list, fragment.getFilter(), uuid); - fragment.reconstructCursor(); fragment.loadTaskListContent(); } void onDeleteTask(Task task) { updater.onDeleteTask(list, fragment.getFilter(), task.getUuid()); - taskAdapter.notifyDataSetInvalidated(); + fragment.loadTaskListContent(); } } diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java index 1c88ddd68..b260c6457 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksFilterUpdater.java @@ -1,17 +1,15 @@ package com.todoroo.astrid.subtasks; -import android.database.Cursor; import android.text.TextUtils; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.dao.TaskDao; -import org.tasks.data.TaskListMetadataDao; - import com.todoroo.astrid.data.Task; -import org.tasks.data.TaskListMetadata; import org.json.JSONArray; import org.json.JSONException; +import org.tasks.data.TaskListMetadata; +import org.tasks.data.TaskListMetadataDao; import java.util.ArrayList; import java.util.HashMap; @@ -120,28 +118,24 @@ public class SubtasksFilterUpdater { sql = sql.replace( TaskDao.TaskCriteria.activeAndVisible().toString(), TaskDao.TaskCriteria.notDeleted().toString()); - Cursor tasks = taskDao.fetchFiltered(sql, Task.UUID); - try { - for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { - String id = tasks.getString(0); - idsInQuery.add(id); - if (idToNode.containsKey(id)) { - continue; - } - - changedThings = true; - Node newNode = new Node(id, treeRoot, 0); - treeRoot.children.add(0, newNode); - idToNode.put(id, newNode); + List tasks = taskDao.fetchFiltered(sql); + for (Task task : tasks) { + String id = task.getUuid(); + idsInQuery.add(id); + if (idToNode.containsKey(id)) { + continue; } - currentIds.removeAll(idsInQuery); - if (currentIds.size() > 0) { - removeNodes(currentIds); - changedThings = true; - } - } finally { - tasks.close(); + changedThings = true; + Node newNode = new Node(id, treeRoot, 0); + treeRoot.children.add(0, newNode); + idToNode.put(id, newNode); + } + + currentIds.removeAll(idsInQuery); + if (currentIds.size() > 0) { + removeNodes(currentIds); + changedThings = true; } if (changedThings) { writeSerialization(list, serializeTree()); diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java index 22775739c..85e35f96e 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksListFragment.java @@ -7,7 +7,6 @@ package com.todoroo.astrid.subtasks; import android.app.Activity; import android.content.Context; -import android.database.Cursor; import android.text.TextUtils; import com.todoroo.astrid.activity.TaskListFragment; @@ -15,14 +14,15 @@ import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.core.BuiltInFilterExposer; import com.todoroo.astrid.dao.TaskDao; -import org.tasks.data.TaskListMetadataDao; import com.todoroo.astrid.data.Task; -import org.tasks.data.TaskListMetadata; +import org.tasks.data.TaskListMetadata; +import org.tasks.data.TaskListMetadataDao; import org.tasks.injection.ForApplication; import org.tasks.injection.FragmentComponent; import org.tasks.preferences.Preferences; -import org.tasks.themes.Theme; + +import java.util.List; import javax.inject.Inject; @@ -43,7 +43,6 @@ public class SubtasksListFragment extends TaskListFragment { @Inject Preferences preferences; @Inject @ForApplication Context context; @Inject TaskListMetadataDao taskListMetadataDao; - @Inject Theme theme; @Inject TaskDao taskDao; @Inject AstridOrderedListFragmentHelper helper; @@ -102,8 +101,8 @@ public class SubtasksListFragment extends TaskListFragment { } @Override - protected TaskAdapter createTaskAdapter(Cursor cursor) { - return helper.createTaskAdapter(theme.wrap(context), cursor); + protected TaskAdapter createTaskAdapter(List tasks) { + return helper.createTaskAdapter(tasks); } @Override diff --git a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java index 81ea84bd8..41e9c5c36 100644 --- a/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java @@ -6,21 +6,19 @@ package com.todoroo.astrid.subtasks; import android.app.Activity; -import android.content.Context; -import android.database.Cursor; import com.todoroo.astrid.activity.TaskListFragment; import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.TagFilter; -import org.tasks.data.TaskListMetadataDao; -import org.tasks.data.TagData; import com.todoroo.astrid.data.Task; -import org.tasks.data.TaskListMetadata; -import org.tasks.injection.ForApplication; +import org.tasks.data.TagData; +import org.tasks.data.TaskListMetadata; +import org.tasks.data.TaskListMetadataDao; import org.tasks.injection.FragmentComponent; import org.tasks.tasklist.TagListFragment; -import org.tasks.themes.Theme; + +import java.util.List; import javax.inject.Inject; @@ -33,9 +31,7 @@ public class SubtasksTagListFragment extends TagListFragment { return fragment; } - @Inject @ForApplication Context context; @Inject TaskListMetadataDao taskListMetadataDao; - @Inject Theme theme; @Inject AstridOrderedListFragmentHelper helper; @Override @@ -72,8 +68,8 @@ public class SubtasksTagListFragment extends TagListFragment { } @Override - protected TaskAdapter createTaskAdapter(Cursor cursor) { - return helper.createTaskAdapter(theme.wrap(context), cursor); + protected TaskAdapter createTaskAdapter(List tasks) { + return helper.createTaskAdapter(tasks); } @Override diff --git a/app/src/main/java/org/tasks/data/TaskListDataProvider.java b/app/src/main/java/org/tasks/data/TaskListDataProvider.java index 8c9c79626..9a3fc8e9c 100644 --- a/app/src/main/java/org/tasks/data/TaskListDataProvider.java +++ b/app/src/main/java/org/tasks/data/TaskListDataProvider.java @@ -1,8 +1,5 @@ package org.tasks.data; -import android.database.Cursor; -import android.database.sqlite.SQLiteException; - import com.todoroo.andlib.data.Property; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Field; @@ -15,14 +12,11 @@ import com.todoroo.astrid.data.Task; import org.tasks.preferences.Preferences; -import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; -import timber.log.Timber; - import static com.todoroo.astrid.activity.TaskListFragment.FILE_METADATA_JOIN; import static com.todoroo.astrid.activity.TaskListFragment.TAGS_METADATA_JOIN; @@ -39,19 +33,10 @@ public class TaskListDataProvider { } public List toList(Filter filter) { - Cursor cursor = constructCursor(filter, Task.PROPERTIES); - List result = new ArrayList<>(); - try { - for (cursor.moveToFirst() ; !cursor.isAfterLast() ; cursor.moveToNext()) { - result.add(new Task(cursor)); - } - } finally { - cursor.close(); - } - return result; + return toList(filter, Task.PROPERTIES); } - public Cursor constructCursor(Filter filter, Property[] properties) { + public List toList(Filter filter, Property[] properties) { Criterion tagsJoinCriterion = Criterion.and( Task.ID.eq(Field.field(TAGS_METADATA_JOIN + ".task"))); @@ -81,16 +66,6 @@ public class TaskListDataProvider { } sqlQueryTemplate.set(groupedQuery); - // Peform query - try { - return taskDao.fetchFiltered(sqlQueryTemplate.get(), properties); - } catch (SQLiteException e) { - // We don't show this error anymore--seems like this can get triggered - // by a strange bug, but there seems to not be any negative side effect. - // For now, we'll suppress the error - // See http://astrid.com/home#tags-7tsoi/task-1119pk - Timber.e(e, e.getMessage()); - return null; - } + return taskDao.fetchFiltered(sqlQueryTemplate.get(), properties); } } diff --git a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java index 54e846029..b42b119b5 100644 --- a/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java +++ b/app/src/main/java/org/tasks/tasklist/TaskListRecyclerAdapter.java @@ -1,7 +1,6 @@ package org.tasks.tasklist; import android.app.Activity; -import android.database.Cursor; import android.graphics.Canvas; import android.os.Bundle; import android.support.v7.view.ActionMode; @@ -105,9 +104,7 @@ public class TaskListRecyclerAdapter extends RecyclerView.Adapter im @Override public void onBindViewHolder(ViewHolder holder, int position) { - Cursor cursor = adapter.getCursor(); - cursor.moveToPosition(position); - holder.bindView(cursor); + holder.bindView(adapter.getTask(position)); holder.setMoving(false); holder.setIndent(adapter.getIndent(holder.task)); } diff --git a/app/src/main/java/org/tasks/tasklist/ViewHolder.java b/app/src/main/java/org/tasks/tasklist/ViewHolder.java index 33d5205fd..51f7fd6d2 100644 --- a/app/src/main/java/org/tasks/tasklist/ViewHolder.java +++ b/app/src/main/java/org/tasks/tasklist/ViewHolder.java @@ -3,7 +3,6 @@ package org.tasks.tasklist; import android.annotation.SuppressLint; import android.app.PendingIntent; import android.content.Context; -import android.database.Cursor; import android.graphics.Paint; import android.support.v7.app.AlertDialog; import android.text.SpannableString; @@ -20,7 +19,6 @@ import com.bignerdranch.android.multiselector.MultiSelector; import com.bignerdranch.android.multiselector.MultiSelectorBindingHolder; import com.google.common.collect.Lists; import com.todoroo.andlib.utility.DateUtilities; -import com.todoroo.astrid.adapter.TaskAdapter; import com.todoroo.astrid.api.TaskAction; import com.todoroo.astrid.core.LinkActionExposer; import com.todoroo.astrid.dao.TaskDao; @@ -103,8 +101,6 @@ class ViewHolder extends MultiSelectorBindingHolder { public Task task; - private String tagsString; // From join query, not part of the task model - private boolean hasFiles; // From join query, not part of the task model private final Context context; private final CheckBoxes checkBoxes; private final TagFormatter tagFormatter; @@ -191,12 +187,9 @@ class ViewHolder extends MultiSelectorBindingHolder { return indent > 0; } - void bindView(Cursor cursor) { - tagsString = TaskAdapter.TAGS.getValue(cursor); - hasFiles = TaskAdapter.FILE_ID_PROPERTY.getValue(cursor) > 0; - + void bindView(Task task) { // TODO: see if this is a performance issue - task = new Task(cursor); + this.task = task; setFieldContentsAndVisibility(); setTaskAppearance(); @@ -215,7 +208,7 @@ class ViewHolder extends MultiSelectorBindingHolder { setupDueDateAndTags(); // Task action - TaskAction action = getTaskAction(task, hasFiles); + TaskAction action = getTaskAction(task, task.hasFiles()); if (action != null) { taskActionIcon.setVisibility(View.VISIBLE); taskActionIcon.setImageResource(action.icon); @@ -291,7 +284,7 @@ class ViewHolder extends MultiSelectorBindingHolder { if (task.isCompleted()) { tagBlock.setVisibility(View.GONE); } else { - String tags = tagsString; + String tags = task.getTagsString(); List tagUuids = tags != null ? newArrayList(tags.split(",")) : Lists.newArrayList(); CharSequence tagString = tagFormatter.getTagString(tagUuids); diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java index fa0f60968..5690ca2a4 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java +++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.java @@ -4,7 +4,6 @@ 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; @@ -29,6 +28,8 @@ import org.tasks.themes.ThemeCache; import org.tasks.themes.WidgetTheme; import org.tasks.ui.WidgetCheckBoxes; +import java.util.List; + import timber.log.Timber; import static android.support.v4.content.ContextCompat.getColor; @@ -55,7 +56,7 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { private int textColorPrimary; private int textColorSecondary; - private Cursor cursor; + private List tasks; ScrollableViewsFactory( SubtasksHelper subtasksHelper, @@ -85,25 +86,21 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { @Override public void onCreate() { database.openForReading(); - cursor = getCursor(); + tasks = getTasks(); } @Override public void onDataSetChanged() { - if (cursor != null) { - cursor.close(); - } - cursor = getCursor(); + tasks = getTasks(); } @Override public void onDestroy() { - cursor.close(); } @Override public int getCount() { - return cursor.getCount(); + return tasks.size(); } @Override @@ -202,18 +199,13 @@ class ScrollableViewsFactory implements RemoteViewsService.RemoteViewsFactory { return null; } - private Cursor getCursor() { + private List getTasks() { String query = getQuery(); - return taskDao.fetchFiltered(query, Task.PROPERTIES); + return taskDao.fetchFiltered(query); } private Task getTask(int position) { - if (position < cursor.getCount()) { - cursor.moveToPosition(position); - return new Task(cursor); - } - Timber.w("requested task at position %s, cursor count is %s", position, cursor.getCount()); - return null; + return position < tasks.size() ? tasks.get(position) : null; } private String getQuery() {