From 5ed0555280734cec1ec3ad065a792777ff948791 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 31 Oct 2012 14:17:26 -0700 Subject: [PATCH] Manual ordering seems to be sort of working, bugs may still exist --- api/src/com/todoroo/astrid/data/TagData.java | 4 ++ astrid/AndroidManifest.xml | 2 +- .../NewOrderedListFragmentHelper.java | 7 +-- .../subtasks/NewOrderedListUpdater.java | 44 ++++++++++++++++--- .../astrid/subtasks/SubtasksListFragment.java | 2 +- .../subtasks/SubtasksTagListFragment.java | 2 +- .../astrid/subtasks/SubtasksUpdater.java | 26 +++++++---- .../astrid/activity/TaskListFragment.java | 2 +- .../src/com/todoroo/astrid/dao/Database.java | 8 +++- 9 files changed, 73 insertions(+), 24 deletions(-) diff --git a/api/src/com/todoroo/astrid/data/TagData.java b/api/src/com/todoroo/astrid/data/TagData.java index bdd8bab79..c5c300cf3 100644 --- a/api/src/com/todoroo/astrid/data/TagData.java +++ b/api/src/com/todoroo/astrid/data/TagData.java @@ -114,6 +114,10 @@ public final class TagData extends RemoteModel { public static final StringProperty TAG_DESCRIPTION = new StringProperty( TABLE, "tagDescription"); + /** Tag ordering */ + public static final StringProperty TAG_ORDERING = new StringProperty( + TABLE, "tagOrdering"); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(TagData.class); diff --git a/astrid/AndroidManifest.xml b/astrid/AndroidManifest.xml index 248d91705..a847137c2 100644 --- a/astrid/AndroidManifest.xml +++ b/astrid/AndroidManifest.xml @@ -6,7 +6,7 @@ --> diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListFragmentHelper.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListFragmentHelper.java index 5ad342c51..e95d100f9 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListFragmentHelper.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListFragmentHelper.java @@ -135,8 +135,8 @@ public class NewOrderedListFragmentHelper { } catch (Exception e) { Log.e("drag", "Drag Error", e); //$NON-NLS-1$ //$NON-NLS-2$ } - - fragment.loadTaskListContent(true); + updater.writeSerialization(list, updater.serializeTree()); + fragment.setUpTaskList(); } }; @@ -159,7 +159,8 @@ public class NewOrderedListFragmentHelper { } catch (Exception e) { Log.e("drag", "Indent Error", e); //$NON-NLS-1$ //$NON-NLS-2$ } - fragment.loadTaskListContent(true); + updater.writeSerialization(list, updater.serializeTree()); + fragment.setUpTaskList(); } }; diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListUpdater.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListUpdater.java index 0dc2e51ee..a90e6c809 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListUpdater.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/NewOrderedListUpdater.java @@ -10,12 +10,18 @@ import org.json.JSONObject; import android.util.Log; +import com.todoroo.andlib.data.TodorooCursor; +import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.data.Task; +import com.todoroo.astrid.service.TaskService; public abstract class NewOrderedListUpdater { + @Autowired + private TaskService taskService; + public NewOrderedListUpdater() { DependencyInjectionService.getInstance().inject(this); idToNode = new HashMap(); @@ -42,8 +48,9 @@ public abstract class NewOrderedListUpdater { private final HashMap idToNode; - protected abstract String getSerializedTree(LIST list); + protected abstract String getSerializedTree(LIST list, Filter filter); protected abstract void writeSerialization(LIST list, String serialized); + protected abstract void applyToFilter(Filter filter); public int getIndentForTask(long targetTaskId) { Node n = idToNode.get(targetTaskId); @@ -53,7 +60,26 @@ public abstract class NewOrderedListUpdater { } protected void initialize(LIST list, Filter filter) { - treeRoot = buildTreeModel(getSerializedTree(list)); + treeRoot = buildTreeModel(getSerializedTree(list, filter)); + } + + protected String serializedTreeFromFilter(Filter filter) { + JSONArray array = new JSONArray(); + TodorooCursor tasks = taskService.fetchFiltered(filter.getSqlQuery(), null, Task.ID); + try { + for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { + try { + JSONObject curr = new JSONObject(); + curr.put(Long.toString(tasks.getLong(0)), new JSONArray()); + array.put(curr); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } finally { + tasks.close(); + } + return array.toString(); } public Long[] getOrderedIds() { @@ -162,15 +188,19 @@ public abstract class NewOrderedListUpdater { } private void moveHelper(Node moveThis, Node beforeThis) { - Node parent = beforeThis.parent; - ArrayList siblings = parent.children; + Node oldParent = moveThis.parent; + ArrayList oldSiblings = oldParent.children; + + Node newParent = beforeThis.parent; + ArrayList newSiblings = newParent.children; - int index = siblings.indexOf(beforeThis); + int index = newSiblings.indexOf(beforeThis); if (index < 0) return; - moveThis.parent = parent; - siblings.add(index, moveThis); + moveThis.parent = newParent; + oldSiblings.remove(moveThis); + newSiblings.add(index, moveThis); } private void moveToEndOfList(Node moveThis) { diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java index f9eee2894..7d0b9b3dc 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java @@ -52,7 +52,7 @@ public class SubtasksListFragment extends TaskListFragment { } @Override - protected void setUpTaskList() { + public void setUpTaskList() { helper.beforeSetUpTaskList(filter); super.setUpTaskList(); diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java index 0bc86d9a4..0ec4e5135 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksTagListFragment.java @@ -49,7 +49,7 @@ public class SubtasksTagListFragment extends TagViewFragment { } @Override - protected void setUpTaskList() { + public void setUpTaskList() { helper.beforeSetUpTaskList(filter); super.setUpTaskList(); diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java index fe357fbfd..ccd7e43eb 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java @@ -25,32 +25,40 @@ public class SubtasksUpdater extends NewOrderedListUpdater { @Override protected void initialize(TagData list, Filter filter) { super.initialize(list, filter); - applySubtasksToFilter(filter); + applyToFilter(filter); } + @Override @SuppressWarnings("nls") - public void applySubtasksToFilter(Filter filter) { + public void applyToFilter(Filter filter) { String query = filter.getSqlQuery(); query = query.replaceAll("ORDER BY .*", ""); - query = query + String.format(" ORDER BY %s, %s, %s, %s)", + query = query + String.format(" ORDER BY %s, %s, %s, %s", Task.DELETION_DATE, Task.COMPLETION_DATE, getOrderString(), Task.CREATION_DATE); query = query.replace(TaskCriteria.isVisible().toString(), Criterion.all.toString()); + System.err.println("QUERY: " + query); filter.setFilterQueryOverride(query); } @Override - protected String getSerializedTree(TagData list) { + protected String getSerializedTree(TagData list, Filter filter) { + String order; if (list == null) { - String order = Preferences.getStringValue(ACTIVE_TASKS_ORDER); + order = Preferences.getStringValue(ACTIVE_TASKS_ORDER); if (order == null) - order = "{}"; //$NON-NLS-1$ - return order; + order = "[]"; //$NON-NLS-1$ + } else { + order = list.getValue(TagData.TAG_ORDERING); + } + if (order == null || "[]".equals(order)) { //$NON-NLS-1$ + order = serializedTreeFromFilter(filter); + writeSerialization(list, order); } - return list.getValue(TagData.NAME); + return order; } @Override @@ -58,7 +66,7 @@ public class SubtasksUpdater extends NewOrderedListUpdater { if (list == null) Preferences.setString(ACTIVE_TASKS_ORDER, serialized); else { - list.setValue(TagData.NAME, serialized); + list.setValue(TagData.TAG_ORDERING, serialized); tagDataService.save(list); } } diff --git a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java index e2a8eb860..4f69c6a14 100644 --- a/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java +++ b/astrid/src/com/todoroo/astrid/activity/TaskListFragment.java @@ -896,7 +896,7 @@ public class TaskListFragment extends ListFragment implements OnScrollListener, * force task with given custom id to be part of list */ @SuppressWarnings("nls") - protected void setUpTaskList() { + public void setUpTaskList() { if (filter == null) return; diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index 4dc57e667..b14ff418f 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -40,7 +40,7 @@ public class Database extends AbstractDatabase { * Database version number. This variable must be updated when database * tables are updated, as it determines whether a database needs updating. */ - public static final int VERSION = 26; + public static final int VERSION = 27; /** * Database name (must be unique) @@ -339,6 +339,12 @@ public class Database extends AbstractDatabase { } catch (SQLiteException e) { Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e); } + case 26: try { + database.execSQL("ALTER TABLE " + TagData.TABLE.name + " ADD " + + TagData.TAG_ORDERING.accept(visitor, null)); + } catch (SQLiteException e) { + Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e); + } return true; }