diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java index 2bdf85a68..b64332aa7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java @@ -105,6 +105,10 @@ import com.todoroo.astrid.service.StatisticsConstants; import com.todoroo.astrid.service.StatisticsService; import com.todoroo.astrid.service.SyncV2Service; import com.todoroo.astrid.service.TaskService; +import com.todoroo.astrid.subtasks.AstridOrderedListUpdater; +import com.todoroo.astrid.subtasks.AstridOrderedListUpdater.Node; +import com.todoroo.astrid.subtasks.SubtasksHelper; +import com.todoroo.astrid.subtasks.SubtasksHelper.TreeRemapHelper; import com.todoroo.astrid.tags.TaskToTagMetadata; /** @@ -690,7 +694,7 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener } private void generateNewUuids() { - HashMap uuidTaskMap = new HashMap(); + final HashMap uuidTaskMap = new HashMap(); HashMap uuidTagMap = new HashMap(); HashMap uuidUserActivityMap = new HashMap(); HashMap uuidTaskListMetadataMap = new HashMap(); @@ -756,15 +760,26 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener userActivityDao.update(UserActivity.UUID.eq(oldUuid), ua); } - entries = uuidTaskListMetadataMap.entrySet(); - for (Entry e : entries) { - tlm.clear(); - - String oldUuid = e.getKey(); - String newUuid = e.getValue(); - - tlm.setValue(TaskListMetadata.UUID, newUuid); - taskListMetadataDao.update(TaskListMetadata.UUID.eq(oldUuid), tlm); + TodorooCursor tlmCursor = taskListMetadataDao.query(Query.select(TaskListMetadata.ID, TaskListMetadata.UUID, TaskListMetadata.TASK_IDS, TaskListMetadata.CHILD_TAG_IDS)); + try { + for (tlmCursor.moveToFirst(); !tlmCursor.isAfterLast(); tlmCursor.moveToNext()) { + tlm.clear(); + tlm.readFromCursor(tlmCursor); + + String taskIds = tlm.getValue(TaskListMetadata.TASK_IDS); + if (!TaskListMetadata.taskIdsIsEmpty(taskIds)) { + Node root = AstridOrderedListUpdater.buildTreeModel(taskIds, null); + SubtasksHelper.remapTree(root, uuidTaskMap, new TreeRemapHelper() { + public String getKeyFromUuid(String uuid) { + return uuidTaskMap.get(uuid); + } + }); + taskIds = AstridOrderedListUpdater.serializeTree(root); + tlm.setValue(TaskListMetadata.TASK_IDS, taskIds); + } + } + } finally { + tlmCursor.close(); } } diff --git a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksHelper.java b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksHelper.java index 681d18170..90257e395 100644 --- a/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksHelper.java +++ b/astrid/plugin-src/com/todoroo/astrid/subtasks/SubtasksHelper.java @@ -139,27 +139,39 @@ public class SubtasksHelper { return AstridOrderedListUpdater.serializeTree(tree); } - private static void remapLocalTreeToRemote(Node root, HashMap idMap) { + public static interface TreeRemapHelper { + public T getKeyFromUuid(String uuid); + } + + public static void remapTree(Node root, HashMap idMap, TreeRemapHelper helper) { ArrayList children = root.children; for (int i = 0; i < children.size(); i++) { Node child = children.get(i); - - long localId = -1L; - try { - localId = Long.parseLong(child.uuid); - } catch (NumberFormatException e) {/**/} - String uuid = idMap.get(localId); + T key = helper.getKeyFromUuid(child.uuid); + String uuid = idMap.get(key); if (!RemoteModel.isValidUuid(uuid)) { children.remove(i); children.addAll(i, child.children); i--; } else { child.uuid = uuid; - remapLocalTreeToRemote(child, idMap); + remapTree(child, idMap, helper); } } } + private static void remapLocalTreeToRemote(Node root, HashMap idMap) { + remapTree(root, idMap, new TreeRemapHelper() { + public Long getKeyFromUuid(String uuid) { + Long localId = -1L; + try { + localId = Long.parseLong(uuid); + } catch (NumberFormatException e) {/**/} + return localId; + } + }); + } + private static HashMap getIdMap(A[] keys, Property keyProperty, Property valueProperty) { HashMap map = new HashMap(); TodorooCursor tasks = PluginServices.getTaskService().query(Query.select(keyProperty, valueProperty).where(keyProperty.in(keys)));