Fixed bugs related to task creation with order

pull/14/head
Sam Bosley 14 years ago
parent 89dc6d462a
commit f2e17386ef

@ -10,13 +10,35 @@ import com.google.api.services.tasks.v1.model.Task;
*/ */
public class CreateRequest extends PushRequest { public class CreateRequest extends PushRequest {
public CreateRequest(GtasksService service, String listId, Task toUpdate) { private String parent;
private String priorSiblingId;
public CreateRequest(GtasksService service, String listId, Task toUpdate, String parent, String priorSiblingId) {
super(service, listId, toUpdate); super(service, listId, toUpdate);
this.parent = parent;
this.priorSiblingId = priorSiblingId;
} }
@Override @Override
public Task executePush() throws IOException { public Task executePush() throws IOException {
return service.createGtask(listId, toPush); return service.createGtask(listId, toPush, parent, priorSiblingId);
}
public String getParent() {
return parent;
}
public void setParent(String parent) {
this.parent = parent;
} }
public String getPriorSiblingId() {
return priorSiblingId;
}
public void setPriorSiblingId(String priorSiblingId) {
this.priorSiblingId = priorSiblingId;
}
} }

@ -6,6 +6,7 @@ import com.google.api.client.extensions.android2.AndroidHttp;
import com.google.api.client.googleapis.auth.oauth2.draft10.GoogleAccessProtectedResource; import com.google.api.client.googleapis.auth.oauth2.draft10.GoogleAccessProtectedResource;
import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.tasks.v1.Tasks; import com.google.api.services.tasks.v1.Tasks;
import com.google.api.services.tasks.v1.Tasks.TasksOperations.Insert;
import com.google.api.services.tasks.v1.Tasks.TasksOperations.List; import com.google.api.services.tasks.v1.Tasks.TasksOperations.List;
import com.google.api.services.tasks.v1.Tasks.TasksOperations.Move; import com.google.api.services.tasks.v1.Tasks.TasksOperations.Move;
import com.google.api.services.tasks.v1.model.Task; import com.google.api.services.tasks.v1.model.Task;
@ -135,11 +136,19 @@ public class GtasksService {
} }
public Task createGtask(String listId, Task task) throws IOException { public Task createGtask(String listId, Task task) throws IOException {
return createGtask(listId, task, null, null);
}
public Task createGtask(String listId, Task task, String parent, String priorSiblingId) throws IOException {
Insert insertOp = service.tasks.insert(listId, task);
insertOp.parent = parent;
insertOp.previous = priorSiblingId;
Task toReturn; Task toReturn;
try { try {
toReturn = service.tasks.insert(listId, task).execute(); toReturn = insertOp.execute();
} catch (IOException e) { } catch (IOException e) {
toReturn = service.tasks.insert(listId, task).execute(); toReturn = insertOp.execute();
} }
return toReturn; return toReturn;
} }

@ -80,6 +80,7 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
/** tasks to read id for */ /** tasks to read id for */
ArrayList<GtasksTaskContainer> createdWithoutId; ArrayList<GtasksTaskContainer> createdWithoutId;
ArrayList<GtasksTaskContainer> createdWithoutParent;
Semaphore pushedTaskSemaphore = new Semaphore(0); Semaphore pushedTaskSemaphore = new Semaphore(0);
AtomicInteger pushedTaskCount = new AtomicInteger(0); AtomicInteger pushedTaskCount = new AtomicInteger(0);
@ -160,6 +161,7 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
if(Constants.DEBUG) if(Constants.DEBUG)
Log.e("gtasks-debug", "- -------- SYNC STARTED"); Log.e("gtasks-debug", "- -------- SYNC STARTED");
createdWithoutId = new ArrayList<GtasksTaskContainer>(); createdWithoutId = new ArrayList<GtasksTaskContainer>();
createdWithoutParent = new ArrayList<GtasksTaskContainer>();
try { try {
TaskLists allTaskLists = taskService.allGtaskLists(); TaskLists allTaskLists = taskService.allGtaskLists();
@ -229,22 +231,27 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
return; return;
} }
// first, pull all tasks. then we can write them // first, pull all tasks. then we can write them
// include deleted tasks so we can delete them in astrid // include deleted tasks so we can delete them in astrid
data.remoteUpdated = readAllRemoteTasks(true); data.remoteUpdated = readAllRemoteTasks(true);
// match remote tasks to locally created tasks // match remote tasks to locally created tasks
HashMap<String, GtasksTaskContainer> locals = new HashMap<String, GtasksTaskContainer>(); HashMap<String, GtasksTaskContainer> locals = new HashMap<String, GtasksTaskContainer>();
HashMap<Long, String> localIdsToRemoteIds = new HashMap<Long, String>();
for(GtasksTaskContainer task : createdWithoutId) { for(GtasksTaskContainer task : createdWithoutId) {
locals.put(task.task.getValue(Task.TITLE), task); locals.put(task.gtaskMetadata.getValue(GtasksMetadata.ID), task);
localIdsToRemoteIds.put(task.task.getId(), task.gtaskMetadata.getValue(GtasksMetadata.ID));
} }
verifyCreatedOrder(locals, localIdsToRemoteIds);
for(GtasksTaskContainer remote : data.remoteUpdated) { for(GtasksTaskContainer remote : data.remoteUpdated) {
if(remote.task.getId() < 1) { if(remote.task.getId() < 1) {
GtasksTaskContainer local = locals.get(remote.task.getValue(Task.TITLE)); GtasksTaskContainer local = locals.get(remote.gtaskMetadata.getValue(GtasksMetadata.ID));
if(local != null) { if(local != null) {
if(Constants.DEBUG) if(Constants.DEBUG)
Log.e("gtasks-debug", "FOUND LOCAL - " + remote.task.getValue(Task.TITLE)); Log.e("gtasks-debug", "FOUND LOCAL - " + remote.task.getId());
remote.task.setId(local.task.getId()); remote.task.setId(local.task.getId());
} }
} }
@ -253,6 +260,20 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
super.readRemotelyUpdated(data); super.readRemotelyUpdated(data);
} }
private void verifyCreatedOrder(HashMap<String, GtasksTaskContainer> locals,
HashMap<Long, String> localIdsToRemoteIds) throws IOException {
for (GtasksTaskContainer t : createdWithoutParent) {
String toMove = t.gtaskMetadata.getValue(GtasksMetadata.ID);
String listId = t.gtaskMetadata.getValue(GtasksMetadata.LIST_ID);
long parentTask = t.gtaskMetadata.getValue(GtasksMetadata.PARENT_TASK);
if (parentTask > 0) {
String remoteParent = localIdsToRemoteIds.get(parentTask);
MoveRequest move = new MoveRequest(taskService, toMove, listId, remoteParent, null);
move.executePush();
}
}
}
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// ------------------------------------------------------------ sync data // ------------------------------------------------------------ sync data
@ -395,10 +416,12 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
local.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, listId); local.gtaskMetadata.setValue(GtasksMetadata.LIST_ID, listId);
createdWithoutId.add(local); createdWithoutId.add(local);
if (local.gtaskMetadata.containsNonNullValue(GtasksMetadata.PARENT_TASK)) {
createdWithoutParent.add(local);
}
com.google.api.services.tasks.v1.model.Task createdTask = new com.google.api.services.tasks.v1.model.Task(); com.google.api.services.tasks.v1.model.Task createdTask = new com.google.api.services.tasks.v1.model.Task();
createdTask.parent = local.parentId;
CreateRequest createRequest = new CreateRequest(taskService, listId, createdTask); CreateRequest createRequest = new CreateRequest(taskService, listId, createdTask, local.parentId, local.priorSiblingId);
updateTaskHelper(local, null, createRequest); updateTaskHelper(local, null, createRequest);
return local; return local;
}//*/ }//*/
@ -443,16 +466,23 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
String newIdTask = idTask;
try { try {
if(!TextUtils.isEmpty(idTask) && (remote == null || local.parentId != remote.parentId || if (request instanceof CreateRequest) {
com.google.api.services.tasks.v1.model.Task createResult = request.executePush();
newIdTask = createResult.id;
local.gtaskMetadata.setValue(GtasksMetadata.ID, newIdTask);
}
if(!TextUtils.isEmpty(newIdTask) && (remote == null || local.parentId != remote.parentId ||
local.priorSiblingId != remote.priorSiblingId)) { local.priorSiblingId != remote.priorSiblingId)) {
if(Constants.DEBUG) if(Constants.DEBUG)
Log.e("gtasks-debug", "ACTION: move(1) - " + idTask + ", " + local.parentId + ", " + local.priorSiblingId); Log.e("gtasks-debug", "ACTION: move(1) - " + newIdTask + ", " + local.parentId + ", " + local.priorSiblingId);
//This case basically defaults to whatever local settings are. Future versions could try and merge better //This case basically defaults to whatever local settings are. Future versions could try and merge better
MoveRequest moveRequest = new MoveRequest(taskService, idTask, idList, local.parentId, local.priorSiblingId); MoveRequest moveRequest = new MoveRequest(taskService, newIdTask, idList, local.parentId, local.priorSiblingId);
moveRequest.executePush(); moveRequest.executePush();
} else { }
if (request instanceof UpdateRequest) {
request.executePush(); request.executePush();
} }
@ -460,9 +490,9 @@ public class GtasksSyncProvider extends SyncProvider<GtasksTaskContainer> {
if(remote != null && !idList.equals(remote.gtaskMetadata.getValue( if(remote != null && !idList.equals(remote.gtaskMetadata.getValue(
GtasksMetadata.LIST_ID))) { GtasksMetadata.LIST_ID))) {
if(Constants.DEBUG) if(Constants.DEBUG)
Log.e("gtasks-debug", "ACTION: moveTask(5), " + idTask + ", " + idList + " to " + Log.e("gtasks-debug", "ACTION: moveTask(5), " + newIdTask + ", " + idList + " to " +
remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID)); remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID));
MoveListRequest moveList = new MoveListRequest(taskService, idTask, remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID), idList, null); MoveListRequest moveList = new MoveListRequest(taskService, newIdTask, remote.gtaskMetadata.getValue(GtasksMetadata.LIST_ID), idList, null);
com.google.api.services.tasks.v1.model.Task result = moveList.executePush(); com.google.api.services.tasks.v1.model.Task result = moveList.executePush();
local.gtaskMetadata.setValue(GtasksMetadata.ID, result.id); local.gtaskMetadata.setValue(GtasksMetadata.ID, result.id);
remote.gtaskMetadata.setValue(GtasksMetadata.ID, result.id); remote.gtaskMetadata.setValue(GtasksMetadata.ID, result.id);

Loading…
Cancel
Save