Updated gtasks jar for proper exception class, started work on creating sibling and parent maps

pull/14/head
Tim Su 14 years ago
parent 1e9cda7aaa
commit e8489b7996

Binary file not shown.

@ -4,7 +4,10 @@
package com.todoroo.astrid.gtasks; package com.todoroo.astrid.gtasks;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Stack; import java.util.Stack;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
@ -71,24 +74,25 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
StoreObject list = gtasksListService.getList(listId); StoreObject list = gtasksListService.getList(listId);
if(list == GtasksListService.LIST_NOT_FOUND_OBJECT) if(list == GtasksListService.LIST_NOT_FOUND_OBJECT)
return; return;
Filter filter = GtasksFilterExposer.filterFromList(list);
TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered(filter.sqlQuery, null, Task.ID); final ArrayList<Long> ids = new ArrayList<Long>();
try { final Stack<Long> taskHierarchyStack = new Stack<Long>();
Long[] ids = new Long[cursor.getCount()];
int order = 0; final AtomicInteger order = new AtomicInteger(0);
int previousIndent = -1; final AtomicInteger previousIndent = new AtomicInteger(-1);
Stack<Long> taskHierarchyStack = new Stack<Long>();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { iterateThroughList(list, new ListIterator() {
long taskId = cursor.getLong(0); @Override
ids[order] = taskId; public void processTask(long taskId) {
ids.add(taskId);
Metadata metadata = getTaskMetadata(taskId); Metadata metadata = getTaskMetadata(taskId);
if(metadata == null) if(metadata == null)
continue; return;
metadata.setValue(GtasksMetadata.ORDER, order++); metadata.setValue(GtasksMetadata.ORDER, order.getAndAdd(1));
int indent = metadata.getValue(GtasksMetadata.INDENT); int indent = metadata.getValue(GtasksMetadata.INDENT);
for(int i = indent; i <= previousIndent; i++) { for(int i = indent; i <= previousIndent.get(); i++) {
if(!taskHierarchyStack.isEmpty()) if(!taskHierarchyStack.isEmpty())
taskHierarchyStack.pop(); taskHierarchyStack.pop();
} }
@ -105,10 +109,67 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
PluginServices.getMetadataService().save(metadata); PluginServices.getMetadataService().save(metadata);
taskHierarchyStack.push(taskId); taskHierarchyStack.push(taskId);
previousIndent = indent; previousIndent.set(indent);
}
});
PluginServices.getTaskService().clearDetails(Task.ID.in(ids));
}
/**
* Create a local tree of tasks to expedite sibling and parent lookups
*/
public void createParentSiblingMaps() {
final HashMap<Long, Long> parents = new HashMap<Long, Long>();
final HashMap<Long, Long> siblings = new HashMap<Long, Long>();
for(StoreObject list : gtasksListService.getLists()) {
final AtomicLong previousTask = new AtomicLong(-1L);
final AtomicInteger previousIndent = new AtomicInteger(-1);
iterateThroughList(list, new ListIterator() {
@Override
public void processTask(long taskId) {
Metadata metadata = getTaskMetadata(taskId);
if(metadata == null)
return;
int indent = metadata.getValue(GtasksMetadata.INDENT);
final long parent, sibling;
if(indent > previousIndent.get()) {
parent = previousTask.get();
sibling = -1L;
} else if(indent == previousIndent.get()) {
sibling = previousTask.get();
parent = parents.get(sibling);
} else {
sibling = parents.get(previousTask.get());
parent = parents.get(sibling);
}
parents.put(taskId, parent);
siblings.put(taskId, sibling);
previousTask.set(taskId);
previousIndent.set(indent);
}
});
}
}
private interface ListIterator {
public void processTask(long taskId);
}
private void iterateThroughList(StoreObject list, ListIterator iterator) {
Filter filter = GtasksFilterExposer.filterFromList(list);
TodorooCursor<Task> cursor = PluginServices.getTaskService().fetchFiltered(filter.sqlQuery, null, Task.ID);
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long taskId = cursor.getLong(0);
iterator.processTask(taskId);
} }
PluginServices.getTaskService().clearDetails(Task.ID.in(ids));
} finally { } finally {
cursor.close(); cursor.close();
} }

@ -213,6 +213,8 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
gtasksListService.updateLists(taskView.getAllLists()); gtasksListService.updateLists(taskView.getAllLists());
gtasksMetadataService.createParentSiblingMaps();
// batched read tasks for each list // batched read tasks for each list
ArrayList<GtasksTaskContainer> remoteTasks = new ArrayList<GtasksTaskContainer>(); ArrayList<GtasksTaskContainer> remoteTasks = new ArrayList<GtasksTaskContainer>();
ArrayList<GetTasksAction> getTasksActions = new ArrayList<GetTasksAction>(); ArrayList<GetTasksAction> getTasksActions = new ArrayList<GetTasksAction>();
@ -299,14 +301,19 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
} }
updateTaskHelper(local, null, createdTask); updateTaskHelper(local, null, createdTask);
String remoteId = createdTask.go(); String remoteId;
try {
remoteId = createdTask.go();
} catch (JSONException e) {
throw new GoogleTasksException(e);
}
local.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, remoteId); local.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, remoteId);
return local; return local;
} }
private void updateTaskHelper(GtasksTaskContainer local, private void updateTaskHelper(GtasksTaskContainer local,
GtasksTaskContainer remote, TaskBuilder<?> builder) { GtasksTaskContainer remote, TaskBuilder<?> builder) throws IOException {
String idTask = local.gtaskMetadata.getValue(GtasksMetadata.ID); String idTask = local.gtaskMetadata.getValue(GtasksMetadata.ID);
String idList = local.gtaskMetadata.getValue(GtasksMetadata.LIST_ID); String idList = local.gtaskMetadata.getValue(GtasksMetadata.LIST_ID);
@ -315,22 +322,28 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
if(remote == null && idTask != null) if(remote == null && idTask != null)
remote = pull(local); remote = pull(local);
// moving between lists try {
if(remote != null && !idList.equals(remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID))) {
a.moveTask(idTask, idList, remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID), null); // moving between lists
} if(remote != null && !idList.equals(remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID))) {
a.moveTask(idTask, idList, remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID), null);
}
// other properties // other properties
if(shouldTransmit(local, Task.TITLE, remote)) if(shouldTransmit(local, Task.TITLE, remote))
((TaskModifier)builder).name(local.task.getValue(Task.TITLE)); ((TaskModifier)builder).name(local.task.getValue(Task.TITLE));
if(shouldTransmit(local, Task.DUE_DATE, remote)) if(shouldTransmit(local, Task.DUE_DATE, remote))
builder.taskDate(local.task.getValue(Task.DUE_DATE)); builder.taskDate(local.task.getValue(Task.DUE_DATE));
if(shouldTransmit(local, Task.COMPLETION_DATE, remote)) if(shouldTransmit(local, Task.COMPLETION_DATE, remote))
builder.completed(local.task.isCompleted()); builder.completed(local.task.isCompleted());
if(shouldTransmit(local, Task.DELETION_DATE, remote)) if(shouldTransmit(local, Task.DELETION_DATE, remote))
builder.deleted(local.task.isDeleted()); builder.deleted(local.task.isDeleted());
if(shouldTransmit(local, Task.NOTES, remote)) if(shouldTransmit(local, Task.NOTES, remote))
builder.notes(local.task.getValue(Task.NOTES)); builder.notes(local.task.getValue(Task.NOTES));
} catch (JSONException e) {
throw new GoogleTasksException(e);
}
// TODO indentation // TODO indentation
} }
@ -367,7 +380,12 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
throw new ApiServiceException("Tried to read an invalid task"); //$NON-NLS-1$ throw new ApiServiceException("Tried to read an invalid task"); //$NON-NLS-1$
String idToMatch = task.gtaskMetadata.getValue(GtasksMetadata.ID); String idToMatch = task.gtaskMetadata.getValue(GtasksMetadata.ID);
List<GoogleTaskTask> tasks = taskService.getTasks(task.gtaskMetadata.getValue(GtasksMetadata.LIST_ID)); List<GoogleTaskTask> tasks;
try {
tasks = taskService.getTasks(task.gtaskMetadata.getValue(GtasksMetadata.LIST_ID));
} catch (JSONException e) {
throw new GoogleTasksException(e);
}
for(GoogleTaskTask remoteTask : tasks) { for(GoogleTaskTask remoteTask : tasks) {
if(remoteTask.getId().equals(idToMatch)) { if(remoteTask.getId().equals(idToMatch)) {
return parseRemoteTask(remoteTask); return parseRemoteTask(remoteTask);
@ -384,10 +402,14 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
*/ */
@Override @Override
protected void push(GtasksTaskContainer local, GtasksTaskContainer remote) throws IOException { protected void push(GtasksTaskContainer local, GtasksTaskContainer remote) throws IOException {
TaskModifier modifyTask = l.modifyTask(remote.gtaskMetadata.getValue(GtasksMetadata.ID)); try {
updateTaskHelper(local, remote, modifyTask); TaskModifier modifyTask = l.modifyTask(remote.gtaskMetadata.getValue(GtasksMetadata.ID));
ListAction action = modifyTask.done(); updateTaskHelper(local, remote, modifyTask);
batch(local.gtaskMetadata.getValue(GtasksMetadata.LIST_ID), action); ListAction action = modifyTask.done();
batch(local.gtaskMetadata.getValue(GtasksMetadata.LIST_ID), action);
} catch (JSONException e) {
throw new GoogleTasksException(e);
}
} }
/** add action to batch */ /** add action to batch */

@ -19,6 +19,10 @@ public class GtasksTaskContainer extends SyncContainer {
public Metadata gtaskMetadata; public Metadata gtaskMetadata;
// position information
public String parentId = null;
public String priorSiblingId = null;
public GtasksTaskContainer(Task task, ArrayList<Metadata> metadata, Metadata gtaskMetadata) { public GtasksTaskContainer(Task task, ArrayList<Metadata> metadata, Metadata gtaskMetadata) {
this.task = task; this.task = task;
this.metadata = metadata; this.metadata = metadata;

Loading…
Cancel
Save