First pass at fleshing out the order changing operation

pull/14/head
Tim Su 15 years ago
parent 459009f39c
commit 9c3efb775b

@ -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;

@ -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;

@ -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);

@ -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;
}
}

@ -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;

@ -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<GtasksTaskContainer> {
@Autowired private GtasksPreferenceService gtasksPreferenceService;
@Autowired private GtasksListService gtasksListService;
public GtasksMetadataService() {
super(ContextManager.getContext());
@ -57,4 +63,45 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
return gtasksPreferenceService;
}
/**
* Update order and parent fields for all tasks in the given list
* @param listId
*/
public void updateMetadataForList(String listId) {
StoreObject list = gtasksListService.getList(listId);
if(list == GtasksListService.LIST_NOT_FOUND_OBJECT)
return;
Filter filter = GtasksFilterExposer.filterFromList(list);
TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered(filter.sqlQuery, null, Task.ID);
try {
int order = 0;
int previousIndent = -1;
Stack<Long> taskHierarchyStack = new Stack<Long>();
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();
}
}
}

@ -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<Metadata> 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);
}

@ -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;
}

@ -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);
}

Loading…
Cancel
Save