diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java index 7d27dab19..850f89f16 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksDecorationExposer.java @@ -46,7 +46,7 @@ public class GtasksDecorationExposer implements TaskDecorationExposer { if(metadata == null) return null; - int indentation = metadata.getValue(GtasksMetadata.INDENTATION); + int indentation = metadata.getValue(GtasksMetadata.INDENT); if(indentation <= 0) return null; diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java index c89691b7b..0fddebfa2 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksFilterExposer.java @@ -55,8 +55,8 @@ public class GtasksFilterExposer extends BroadcastReceiver { MetadataCriteria.withKey(GtasksMetadata.METADATA_KEY), TaskCriteria.activeAndVisible(), GtasksMetadata.LIST_ID.eq(list.getValue(GtasksList.REMOTE_ID)))).orderBy( - Order.asc(Functions.caseStatement(GtasksMetadata.ORDERING.eq(0), - Task.CREATION_DATE, GtasksMetadata.ORDERING))), + Order.asc(Functions.caseStatement(GtasksMetadata.ORDER.eq(0), + Task.CREATION_DATE, GtasksMetadata.ORDER))), values); return filter; diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksIndentAction.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksIndentAction.java index e42f68b8c..3a3840990 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksIndentAction.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksIndentAction.java @@ -39,8 +39,8 @@ abstract public class GtasksIndentAction extends BroadcastReceiver { metadata = GtasksMetadata.createEmptyMetadata(taskId); } - int newIndent = Math.max(0, metadata.getValue(GtasksMetadata.INDENTATION) + getDelta()); - metadata.setValue(GtasksMetadata.INDENTATION, newIndent); + int newIndent = Math.max(0, metadata.getValue(GtasksMetadata.INDENT) + getDelta()); + metadata.setValue(GtasksMetadata.INDENT, newIndent); PluginServices.getMetadataService().save(metadata); Flags.set(Flags.REFRESH); diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListService.java index 1c1d0014b..e75d8116f 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksListService.java @@ -15,6 +15,7 @@ import com.todoroo.astrid.data.StoreObject; public class GtasksListService { public static final String LIST_NOT_FOUND = null; + public static final StoreObject LIST_NOT_FOUND_OBJECT = null; @Autowired private StoreObjectDao storeObjectDao; @@ -54,10 +55,9 @@ public class GtasksListService { * @return NOT_FOUND if no list by this id exists, otherwise list name */ public String getListName(String listId) { - readLists(); - for(StoreObject list : lists) - if(list.getValue(GtasksList.REMOTE_ID).equals(listId)) - return list.getValue(GtasksList.NAME); + StoreObject list = getList(listId); + if(list != LIST_NOT_FOUND_OBJECT) + return list.getValue(GtasksList.NAME); return LIST_NOT_FOUND; } @@ -93,4 +93,12 @@ public class GtasksListService { lists = null; } + public StoreObject getList(String listId) { + readLists(); + for(StoreObject list : lists) + if(list.getValue(GtasksList.REMOTE_ID).equals(listId)) + return list; + return LIST_NOT_FOUND_OBJECT; + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadata.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadata.java index 1be2aa0d3..a362c0984 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadata.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadata.java @@ -26,13 +26,13 @@ public class GtasksMetadata { public static final StringProperty LIST_ID = new StringProperty(Metadata.TABLE, Metadata.VALUE2.name); - public static final LongProperty OWNER_ID = new LongProperty(Metadata.TABLE, + public static final LongProperty PARENT_TASK = new LongProperty(Metadata.TABLE, Metadata.VALUE3.name); - public static final IntegerProperty INDENTATION = new IntegerProperty(Metadata.TABLE, + public static final IntegerProperty INDENT = new IntegerProperty(Metadata.TABLE, Metadata.VALUE4.name); - public static final IntegerProperty ORDERING = new IntegerProperty(Metadata.TABLE, + public static final IntegerProperty ORDER = new IntegerProperty(Metadata.TABLE, Metadata.VALUE5.name); /** @@ -45,9 +45,9 @@ public class GtasksMetadata { metadata.setValue(Metadata.KEY, GtasksMetadata.METADATA_KEY); metadata.setValue(ID, (long)VALUE_UNSET); metadata.setValue(LIST_ID, Preferences.getStringValue(GtasksPreferenceService.PREF_DEFAULT_LIST)); - metadata.setValue(OWNER_ID, (long)VALUE_UNSET); - metadata.setValue(INDENTATION, 0); - metadata.setValue(ORDERING, VALUE_UNSET); + metadata.setValue(PARENT_TASK, (long)VALUE_UNSET); + metadata.setValue(INDENT, 0); + metadata.setValue(ORDER, VALUE_UNSET); if(taskId > AbstractModel.NO_ID) metadata.setValue(Metadata.TASK, taskId); return metadata; diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java index 8652761dc..12e5a717e 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksMetadataService.java @@ -4,13 +4,18 @@ package com.todoroo.astrid.gtasks; import java.util.ArrayList; +import java.util.Stack; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.StoreObject; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer; import com.todoroo.astrid.sync.SyncMetadataService; @@ -25,6 +30,7 @@ import com.todoroo.astrid.sync.SyncProviderUtilities; public final class GtasksMetadataService extends SyncMetadataService { @Autowired private GtasksPreferenceService gtasksPreferenceService; + @Autowired private GtasksListService gtasksListService; public GtasksMetadataService() { super(ContextManager.getContext()); @@ -57,4 +63,45 @@ public final class GtasksMetadataService extends SyncMetadataService cursor = PluginServices.getTaskService().fetchFiltered(filter.sqlQuery, null, Task.ID); + try { + int order = 0; + int previousIndent = -1; + Stack taskHierarchyStack = new Stack(); + for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { + long taskId = cursor.getLong(0); + Metadata metadata = getTaskMetadata(taskId); + if(metadata == null) + continue; + + metadata.setValue(GtasksMetadata.ORDER, order++); + int indent = metadata.getValue(GtasksMetadata.INDENT); + + for(int i = indent; i <= previousIndent; i++) + taskHierarchyStack.pop(); + + if(indent > 0) { + if(taskHierarchyStack.isEmpty()) + metadata.setValue(GtasksMetadata.INDENT, 0); + else + metadata.setValue(GtasksMetadata.PARENT_TASK, taskHierarchyStack.peek()); + } + + PluginServices.getMetadataService().save(metadata); + taskHierarchyStack.push(taskId); + } + } finally { + cursor.close(); + } + } + } diff --git a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksOrderAction.java b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksOrderAction.java index 739ef6b7d..e56673037 100644 --- a/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksOrderAction.java +++ b/astrid/plugin-src/com/todoroo/astrid/gtasks/GtasksOrderAction.java @@ -4,9 +4,12 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Query; import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.data.Metadata; @@ -31,16 +34,45 @@ abstract public class GtasksOrderAction extends BroadcastReceiver { long taskId = intent.getLongExtra(AstridApiConstants.EXTRAS_TASK_ID, -1); if(taskId == -1) return; - Metadata metadata = gtasksMetadataService.getTaskMetadata(taskId); - if(metadata == null) { - metadata = GtasksMetadata.createEmptyMetadata(taskId); - } + if(metadata == null) + return; - // TODO + gtasksMetadataService.updateMetadataForList(metadata.getValue(GtasksMetadata.LIST_ID)); - PluginServices.getMetadataService().save(metadata); + metadata = gtasksMetadataService.getTaskMetadata(taskId); + int oldOrder = metadata.getValue(GtasksMetadata.ORDER); + int newOrder = Math.max(0, oldOrder + getDelta()); + if(newOrder == oldOrder) + return; + + metadata.setValue(GtasksMetadata.ORDER, newOrder); + TodorooCursor cursor = PluginServices.getMetadataService().query(Query.select(Metadata.ID, GtasksMetadata.INDENT).where( + Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), + GtasksMetadata.LIST_ID.eq(metadata.getValue(GtasksMetadata.LIST_ID)), + GtasksMetadata.ORDER.eq(newOrder)))); + try { + if(cursor.getCount() > 0) { + cursor.moveToFirst(); + Metadata otherTask = new Metadata(cursor); + int myIndent = metadata.getValue(GtasksMetadata.INDENT); + int otherIndent = otherTask.getValue(GtasksMetadata.INDENT); + + if(myIndent < otherIndent) { + // swap indents. TODO: what does google do + otherTask.setValue(GtasksMetadata.INDENT, myIndent); + metadata.setValue(GtasksMetadata.INDENT, otherIndent); + } + + otherTask.setValue(GtasksMetadata.ORDER, oldOrder); + PluginServices.getMetadataService().save(otherTask); + } + } finally { + cursor.close(); + } + + PluginServices.getMetadataService().save(metadata); Flags.set(Flags.REFRESH); } diff --git a/tests/src/com/todoroo/astrid/gtasks/GtasksDecorationExposerTest.java b/tests/src/com/todoroo/astrid/gtasks/GtasksDecorationExposerTest.java index 9d92186e2..77d6b6e8b 100644 --- a/tests/src/com/todoroo/astrid/gtasks/GtasksDecorationExposerTest.java +++ b/tests/src/com/todoroo/astrid/gtasks/GtasksDecorationExposerTest.java @@ -100,7 +100,7 @@ public class GtasksDecorationExposerTest extends DatabaseTestCase { Task task = new Task(); PluginServices.getTaskService().save(task); Metadata metadata = GtasksMetadata.createEmptyMetadata(task.getId()); - metadata.setValue(GtasksMetadata.INDENTATION, indentation); + metadata.setValue(GtasksMetadata.INDENT, indentation); PluginServices.getMetadataService().save(metadata); return task; } diff --git a/tests/src/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java b/tests/src/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java index 70313321d..6e3993b22 100644 --- a/tests/src/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java +++ b/tests/src/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java @@ -64,7 +64,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase { Task task = new Task(); PluginServices.getTaskService().save(task); Metadata metadata = GtasksMetadata.createEmptyMetadata(task.getId()); - metadata.setValue(GtasksMetadata.INDENTATION, indentation); + metadata.setValue(GtasksMetadata.INDENT, indentation); metadata.setValue(Metadata.TASK, task.getId()); PluginServices.getMetadataService().save(metadata); return task; @@ -73,7 +73,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase { private void thenExpectIndentationLevel(int expected) { Metadata metadata = gtasksMetadataService.getTaskMetadata(task.getId()); assertNotNull("task has metadata", metadata); - int indentation = metadata.getValue(GtasksMetadata.INDENTATION); + int indentation = metadata.getValue(GtasksMetadata.INDENT); assertTrue("indentation: " + indentation, indentation == expected); }