From ab101c15d0f0a3194b67bdf08e1d070eaa7a907e Mon Sep 17 00:00:00 2001 From: Tim Su Date: Tue, 21 Feb 2012 18:35:00 -0800 Subject: [PATCH] Add a method to sanity check task list --- .../astrid/subtasks/SubtasksListFragment.java | 2 ++ .../astrid/subtasks/SubtasksUpdater.java | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java index 7d74fad49..db6d4ddd3 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksListFragment.java @@ -54,10 +54,12 @@ public class SubtasksListFragment extends TaskListFragment { protected void setUpTaskList() { updater.applySubtasksToFilter(filter, null); + updater.sanitizeTaskList(filter, SubtasksMetadata.LIST_ACTIVE_TASKS); super.setUpTaskList(); unregisterForContextMenu(getListView()); + } @Override diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java index 272be5f4e..8cb850253 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksUpdater.java @@ -1,5 +1,8 @@ package com.todoroo.astrid.subtasks; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.TodorooCursor; @@ -98,4 +101,32 @@ public class SubtasksUpdater extends OrderedListUpdater { filter.sqlQuery = query; } } + + public void sanitizeTaskList(Filter filter, String list) { + final AtomicInteger previousIndent = new AtomicInteger(-1); + final AtomicLong previousOrder = new AtomicLong(-1); + + iterateThroughList(filter, list, new OrderedListIterator() { + @Override + public void processTask(long taskId, Metadata metadata) { + if(!metadata.isSaved()) + return; + + long order = metadata.getValue(SubtasksMetadata.ORDER); + if(order <= previousOrder.get()) // bad + order = previousOrder.get() + 1; + + int indent = metadata.getValue(SubtasksMetadata.INDENT); + if(indent > previousIndent.get() + 1) // bad + indent = previousIndent.get(); + + metadata.setValue(SubtasksMetadata.ORDER, order); + metadata.setValue(SubtasksMetadata.INDENT, indent); + saveAndUpdateModifiedDate(metadata, taskId); + + previousIndent.set(indent); + previousOrder.set(order); + } + }); + } }