Move tasks between google task lists

pull/413/head
Alex Baker 8 years ago
parent 17672c1e2e
commit 5e37ad27c8

@ -173,7 +173,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase {
} }
private void thenExpectIndentationLevel(Task targetTask, int expected) { private void thenExpectIndentationLevel(Task targetTask, int expected) {
Metadata metadata = gtasksMetadataService.getTaskMetadata(targetTask.getId()); Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(targetTask.getId());
assertNotNull("task has metadata", metadata); assertNotNull("task has metadata", metadata);
int indentation = metadata.getValue(GtasksMetadata.INDENT); int indentation = metadata.getValue(GtasksMetadata.INDENT);
assertTrue("indentation: " + indentation, assertTrue("indentation: " + indentation,

@ -101,7 +101,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase {
} }
private void whenSearchForMetadata() { private void whenSearchForMetadata() {
metadata = gtasksMetadataService.getTaskMetadata(task.getId()); metadata = gtasksMetadataService.getActiveTaskMetadata(task.getId());
} }
private Task taskWithMetadata(String id) { private Task taskWithMetadata(String id) {

@ -6,7 +6,6 @@
package com.todoroo.astrid.gtasks; package com.todoroo.astrid.gtasks;
import com.google.api.services.tasks.model.TaskList; import com.google.api.services.tasks.model.TaskList;
import com.google.api.services.tasks.model.TaskLists;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -88,14 +87,14 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase {
// --- helpers // --- helpers
private void thenExpectMetadataIndentAndOrder(Task task, long order, int indent) { private void thenExpectMetadataIndentAndOrder(Task task, long order, int indent) {
Metadata metadata = gtasksMetadataService.getTaskMetadata(task.getId()); Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(task.getId());
assertNotNull("metadata was found", metadata); assertNotNull("metadata was found", metadata);
assertEquals("order", order, metadata.getValue(GtasksMetadata.ORDER).longValue()); assertEquals("order", order, metadata.getValue(GtasksMetadata.ORDER).longValue());
assertEquals("indentation", indent, (int)metadata.getValue(GtasksMetadata.INDENT)); assertEquals("indentation", indent, (int)metadata.getValue(GtasksMetadata.INDENT));
} }
private void thenExpectMetadataParent(Task task, Task expectedParent) { private void thenExpectMetadataParent(Task task, Task expectedParent) {
Metadata metadata = gtasksMetadataService.getTaskMetadata(task.getId()); Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(task.getId());
long parent = metadata.getValue(GtasksMetadata.PARENT_TASK); long parent = metadata.getValue(GtasksMetadata.PARENT_TASK);
if(expectedParent == null) if(expectedParent == null)
assertEquals("Task " + task.getTitle() + " parent none", 0, parent); assertEquals("Task " + task.getTitle() + " parent none", 0, parent);

@ -237,7 +237,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase {
} }
private void thenExpectMetadataOrderAndIndent(Task task, long order, int indent) { private void thenExpectMetadataOrderAndIndent(Task task, long order, int indent) {
Metadata metadata = gtasksMetadataService.getTaskMetadata(task.getId()); Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(task.getId());
assertNotNull("metadata was found", metadata); assertNotNull("metadata was found", metadata);
assertEquals("order", order, metadata.getValue(GtasksMetadata.ORDER).longValue()); assertEquals("order", order, metadata.getValue(GtasksMetadata.ORDER).longValue());
assertEquals("indentation", indent, (int)metadata.getValue(GtasksMetadata.INDENT)); assertEquals("indentation", indent, (int)metadata.getValue(GtasksMetadata.INDENT));

@ -25,6 +25,7 @@ import com.todoroo.astrid.gtasks.OrderedMetadataListUpdater.OrderedListIterator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
@ -71,9 +72,16 @@ public final class GtasksMetadataService {
* Reads metadata out of a task * Reads metadata out of a task
* @return null if no metadata found * @return null if no metadata found
*/ */
public Metadata getTaskMetadata(long taskId) { public Metadata getActiveTaskMetadata(long taskId) {
return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where( return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(Criterion.and(
MetadataCriteria.byTaskAndwithKey(taskId, GtasksMetadata.METADATA_KEY))); MetadataCriteria.byTaskAndwithKey(taskId, GtasksMetadata.METADATA_KEY),
MetadataCriteria.isActive())));
}
public List<Metadata> getDeleted(long taskId) {
return metadataDao.toList(Criterion.and(
MetadataCriteria.byTaskAndwithKey(taskId, GtasksMetadata.METADATA_KEY),
MetadataCriteria.isDeleted()));
} }
/** /**
@ -164,7 +172,7 @@ public final class GtasksMetadataService {
@Override @Override
public void apply(Metadata entry) { public void apply(Metadata entry) {
long taskId = entry.getValue(Metadata.TASK); long taskId = entry.getValue(Metadata.TASK);
Metadata metadata = getTaskMetadata(taskId); Metadata metadata = getActiveTaskMetadata(taskId);
if(metadata != null) { if(metadata != null) {
iterator.processTask(taskId, metadata); iterator.processTask(taskId, metadata);
} }
@ -179,7 +187,7 @@ public final class GtasksMetadataService {
String parent = null; String parent = null;
if (gtasksMetadata.containsNonNullValue(GtasksMetadata.PARENT_TASK)) { if (gtasksMetadata.containsNonNullValue(GtasksMetadata.PARENT_TASK)) {
long parentId = gtasksMetadata.getValue(GtasksMetadata.PARENT_TASK); long parentId = gtasksMetadata.getValue(GtasksMetadata.PARENT_TASK);
Metadata parentMetadata = getTaskMetadata(parentId); Metadata parentMetadata = getActiveTaskMetadata(parentId);
if (parentMetadata != null && parentMetadata.containsNonNullValue(GtasksMetadata.ID)) { if (parentMetadata != null && parentMetadata.containsNonNullValue(GtasksMetadata.ID)) {
parent = parentMetadata.getValue(GtasksMetadata.ID); parent = parentMetadata.getValue(GtasksMetadata.ID);
if (TextUtils.isEmpty(parent)) { if (TextUtils.isEmpty(parent)) {

@ -74,7 +74,7 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater<GtasksList
@Override @Override
protected Metadata getTaskMetadata(long taskId) { protected Metadata getTaskMetadata(long taskId) {
return gtasksMetadataService.getTaskMetadata(taskId); return gtasksMetadataService.getActiveTaskMetadata(taskId);
} }
@Override @Override
protected Metadata createEmptyMetadata(GtasksList list, long taskId) { protected Metadata createEmptyMetadata(GtasksList list, long taskId) {

@ -127,9 +127,13 @@ public class GtasksInvoker {
} }
public void deleteGtask(String listId, String taskId) throws IOException { public void deleteGtask(String listId, String taskId) throws IOException {
execute(service try {
.tasks() execute(service
.delete(listId, taskId)); .tasks()
.delete(listId, taskId));
} catch(HttpNotFoundException ignored) {
}
} }
private synchronized <T> T execute(TasksRequest<T> request) throws IOException { private synchronized <T> T execute(TasksRequest<T> request) throws IOException {

@ -172,7 +172,12 @@ public class GtasksSyncService {
* Synchronize with server when data changes * Synchronize with server when data changes
*/ */
public void pushTaskOnSave(Task task, ContentValues values, GtasksInvoker invoker) throws IOException { public void pushTaskOnSave(Task task, ContentValues values, GtasksInvoker invoker) throws IOException {
Metadata gtasksMetadata = gtasksMetadataService.getTaskMetadata(task.getId()); for (Metadata deleted : gtasksMetadataService.getDeleted(task.getId())) {
gtasksInvoker.deleteGtask(deleted.getValue(GtasksMetadata.LIST_ID), deleted.getValue(GtasksMetadata.ID));
metadataDao.delete(deleted.getId());
}
Metadata gtasksMetadata = gtasksMetadataService.getActiveTaskMetadata(task.getId());
com.google.api.services.tasks.model.Task remoteModel; com.google.api.services.tasks.model.Task remoteModel;
boolean newlyCreated = false; boolean newlyCreated = false;

@ -27,12 +27,14 @@ import javax.inject.Inject;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick; import butterknife.OnClick;
import static com.todoroo.andlib.utility.DateUtilities.now;
public class GoogleTaskListFragment extends TaskEditControlFragment { public class GoogleTaskListFragment extends TaskEditControlFragment {
private static final String FRAG_TAG_GOOGLE_TASK_LIST_SELECTION = "frag_tag_google_task_list_selection"; private static final String FRAG_TAG_GOOGLE_TASK_LIST_SELECTION = "frag_tag_google_task_list_selection";
private static final String EXTRA_IS_NEW_TASK = "extra_is_new_task";
private static final String EXTRA_TASK_ID = "extra_task_id"; private static final String EXTRA_TASK_ID = "extra_task_id";
private static final String EXTRA_LIST = "extra_list"; private static final String EXTRA_ORIGINAL_LIST = "extra_original_list";
private static final String EXTRA_SELECTED_LIST = "extra_selected_list";
public static final int TAG = R.string.TEA_ctrl_google_task_list; public static final int TAG = R.string.TEA_ctrl_google_task_list;
@ -44,24 +46,26 @@ public class GoogleTaskListFragment extends TaskEditControlFragment {
@Inject MetadataDao metadataDao; @Inject MetadataDao metadataDao;
private long taskId; private long taskId;
private GtasksList list; private GtasksList originalList;
private boolean isNewTask; private GtasksList selectedList;
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState); View view = super.onCreateView(inflater, container, savedInstanceState);
if (savedInstanceState != null) { if (savedInstanceState != null) {
isNewTask = savedInstanceState.getBoolean(EXTRA_IS_NEW_TASK);
taskId = savedInstanceState.getLong(EXTRA_TASK_ID); taskId = savedInstanceState.getLong(EXTRA_TASK_ID);
list = new GtasksList((StoreObject) savedInstanceState.getParcelable(EXTRA_LIST)); originalList = new GtasksList((StoreObject) savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST));
} selectedList = new GtasksList((StoreObject) savedInstanceState.getParcelable(EXTRA_SELECTED_LIST));
Metadata metadata = gtasksMetadataService.getTaskMetadata(taskId); } else {
if (metadata != null) { Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(taskId);
list = gtasksListService.getList(metadata.getValue(GtasksMetadata.LIST_ID)); if (metadata != null) {
} originalList = gtasksListService.getList(metadata.getValue(GtasksMetadata.LIST_ID));
if (list == null) { }
list = gtasksListService.getList(gtasksPreferenceService.getDefaultList()); if (originalList == null) {
originalList = gtasksListService.getList(gtasksPreferenceService.getDefaultList());
}
selectedList = originalList;
} }
refreshView(); refreshView();
@ -72,9 +76,9 @@ public class GoogleTaskListFragment extends TaskEditControlFragment {
public void onSaveInstanceState(Bundle outState) { public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
outState.putBoolean(EXTRA_IS_NEW_TASK, isNewTask);
outState.putLong(EXTRA_TASK_ID, taskId); outState.putLong(EXTRA_TASK_ID, taskId);
outState.putParcelable(EXTRA_LIST, list.getStoreObject()); outState.putParcelable(EXTRA_ORIGINAL_LIST, originalList.getStoreObject());
outState.putParcelable(EXTRA_SELECTED_LIST, selectedList.getStoreObject());
} }
@Override @Override
@ -94,10 +98,6 @@ public class GoogleTaskListFragment extends TaskEditControlFragment {
@OnClick(R.id.google_task_list) @OnClick(R.id.google_task_list)
void clickGoogleTaskList(View view) { void clickGoogleTaskList(View view) {
if (!isNewTask) {
return;
}
FragmentManager fragmentManager = getFragmentManager(); FragmentManager fragmentManager = getFragmentManager();
GoogleTaskListSelectionDialog dialog = (GoogleTaskListSelectionDialog) fragmentManager.findFragmentByTag(FRAG_TAG_GOOGLE_TASK_LIST_SELECTION); GoogleTaskListSelectionDialog dialog = (GoogleTaskListSelectionDialog) fragmentManager.findFragmentByTag(FRAG_TAG_GOOGLE_TASK_LIST_SELECTION);
if (dialog == null) { if (dialog == null) {
@ -108,36 +108,41 @@ public class GoogleTaskListFragment extends TaskEditControlFragment {
@Override @Override
public void initialize(boolean isNewTask, Task task) { public void initialize(boolean isNewTask, Task task) {
this.isNewTask = isNewTask;
taskId = task.getId(); taskId = task.getId();
} }
@Override @Override
public void apply(Task task) { public void apply(Task task) {
if (!isNewTask) { Metadata taskMetadata = gtasksMetadataService.getActiveTaskMetadata(task.getId());
return;
}
Metadata taskMetadata = gtasksMetadataService.getTaskMetadata(task.getId());
if (taskMetadata == null) { if (taskMetadata == null) {
taskMetadata = GtasksMetadata.createEmptyMetadataWithoutList(task.getId()); taskMetadata = GtasksMetadata.createEmptyMetadataWithoutList(task.getId());
} else if (!taskMetadata.getValue(GtasksMetadata.LIST_ID).equals(selectedList.getRemoteId())) {
taskMetadata.setDeletionDate(now());
metadataDao.persist(taskMetadata);
taskMetadata = GtasksMetadata.createEmptyMetadataWithoutList(task.getId());
} }
taskMetadata.setValue(GtasksMetadata.LIST_ID, list.getRemoteId()); taskMetadata.setValue(GtasksMetadata.LIST_ID, selectedList.getRemoteId());
metadataDao.persist(taskMetadata); metadataDao.persist(taskMetadata);
} }
@Override
public boolean hasChanges(Task original) {
return !selectedList.equals(originalList);
}
@Override @Override
protected void inject(FragmentComponent component) { protected void inject(FragmentComponent component) {
component.inject(this); component.inject(this);
} }
public void setList(GtasksList list) { public void setList(GtasksList list) {
this.list = list; this.selectedList = list;
refreshView(); refreshView();
} }
private void refreshView() { private void refreshView() {
if (list != null) { if (selectedList != null) {
textView.setText(list.getName()); textView.setText(selectedList.getName());
} }
} }
} }

@ -101,6 +101,14 @@ public class MetadataDao {
public static Criterion byTaskAndwithKey(long taskId, String key) { public static Criterion byTaskAndwithKey(long taskId, String key) {
return Criterion.and(withKey(key), byTask(taskId)); return Criterion.and(withKey(key), byTask(taskId));
} }
public static Criterion isActive() {
return Metadata.DELETION_DATE.eq(0);
}
public static Criterion isDeleted() {
return Metadata.DELETION_DATE.gt(0);
}
} }
public boolean persist(Metadata item) { public boolean persist(Metadata item) {

Loading…
Cancel
Save