From 5e37ad27c8aa0e96a5d1046993010796652df3ab Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Mon, 20 Jun 2016 16:06:21 -0500 Subject: [PATCH] Move tasks between google task lists --- .../astrid/gtasks/GtasksIndentActionTest.java | 2 +- .../gtasks/GtasksMetadataServiceTest.java | 2 +- .../gtasks/GtasksTaskListUpdaterTest.java | 5 +- .../astrid/gtasks/GtasksTaskMovingTest.java | 2 +- .../astrid/gtasks/GtasksMetadataService.java | 18 ++++-- .../astrid/gtasks/GtasksTaskListUpdater.java | 2 +- .../astrid/gtasks/api/GtasksInvoker.java | 10 ++- .../astrid/gtasks/sync/GtasksSyncService.java | 7 ++- .../org/tasks/ui/GoogleTaskListFragment.java | 61 ++++++++++--------- .../com/todoroo/astrid/dao/MetadataDao.java | 8 +++ 10 files changed, 73 insertions(+), 44 deletions(-) diff --git a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java index 814f286ac..d59efd15d 100644 --- a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java +++ b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksIndentActionTest.java @@ -173,7 +173,7 @@ public class GtasksIndentActionTest extends DatabaseTestCase { } private void thenExpectIndentationLevel(Task targetTask, int expected) { - Metadata metadata = gtasksMetadataService.getTaskMetadata(targetTask.getId()); + Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(targetTask.getId()); assertNotNull("task has metadata", metadata); int indentation = metadata.getValue(GtasksMetadata.INDENT); assertTrue("indentation: " + indentation, diff --git a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java index 0401a9040..c837e1859 100644 --- a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java +++ b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataServiceTest.java @@ -101,7 +101,7 @@ public class GtasksMetadataServiceTest extends DatabaseTestCase { } private void whenSearchForMetadata() { - metadata = gtasksMetadataService.getTaskMetadata(task.getId()); + metadata = gtasksMetadataService.getActiveTaskMetadata(task.getId()); } private Task taskWithMetadata(String id) { diff --git a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java index 9523621fd..20060ea36 100644 --- a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java +++ b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdaterTest.java @@ -6,7 +6,6 @@ package com.todoroo.astrid.gtasks; 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.data.Metadata; import com.todoroo.astrid.data.Task; @@ -88,14 +87,14 @@ public class GtasksTaskListUpdaterTest extends DatabaseTestCase { // --- helpers 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); assertEquals("order", order, metadata.getValue(GtasksMetadata.ORDER).longValue()); assertEquals("indentation", indent, (int)metadata.getValue(GtasksMetadata.INDENT)); } 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); if(expectedParent == null) assertEquals("Task " + task.getTitle() + " parent none", 0, parent); diff --git a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java index e4898a418..a0242b121 100644 --- a/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java +++ b/src/androidTestGoogleplay/java/com/todoroo/astrid/gtasks/GtasksTaskMovingTest.java @@ -237,7 +237,7 @@ public class GtasksTaskMovingTest extends DatabaseTestCase { } 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); assertEquals("order", order, metadata.getValue(GtasksMetadata.ORDER).longValue()); assertEquals("indentation", indent, (int)metadata.getValue(GtasksMetadata.INDENT)); diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java index bb6f70f97..3a06cebce 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksMetadataService.java @@ -25,6 +25,7 @@ import com.todoroo.astrid.gtasks.OrderedMetadataListUpdater.OrderedListIterator; import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -71,9 +72,16 @@ public final class GtasksMetadataService { * Reads metadata out of a task * @return null if no metadata found */ - public Metadata getTaskMetadata(long taskId) { - return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where( - MetadataCriteria.byTaskAndwithKey(taskId, GtasksMetadata.METADATA_KEY))); + public Metadata getActiveTaskMetadata(long taskId) { + return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(Criterion.and( + MetadataCriteria.byTaskAndwithKey(taskId, GtasksMetadata.METADATA_KEY), + MetadataCriteria.isActive()))); + } + + public List 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 public void apply(Metadata entry) { long taskId = entry.getValue(Metadata.TASK); - Metadata metadata = getTaskMetadata(taskId); + Metadata metadata = getActiveTaskMetadata(taskId); if(metadata != null) { iterator.processTask(taskId, metadata); } @@ -179,7 +187,7 @@ public final class GtasksMetadataService { String parent = null; if (gtasksMetadata.containsNonNullValue(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)) { parent = parentMetadata.getValue(GtasksMetadata.ID); if (TextUtils.isEmpty(parent)) { diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java index 4abe0bbdf..aad446359 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/GtasksTaskListUpdater.java @@ -74,7 +74,7 @@ public class GtasksTaskListUpdater extends OrderedMetadataListUpdater T execute(TasksRequest request) throws IOException { diff --git a/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java b/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java index 46d6bb27f..89d284b01 100644 --- a/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java +++ b/src/googleplay/java/com/todoroo/astrid/gtasks/sync/GtasksSyncService.java @@ -172,7 +172,12 @@ public class GtasksSyncService { * Synchronize with server when data changes */ 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; boolean newlyCreated = false; diff --git a/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java b/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java index 4e9b78bbb..2105195a3 100644 --- a/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java +++ b/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java @@ -27,12 +27,14 @@ import javax.inject.Inject; import butterknife.BindView; import butterknife.OnClick; +import static com.todoroo.andlib.utility.DateUtilities.now; + 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 EXTRA_IS_NEW_TASK = "extra_is_new_task"; 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; @@ -44,24 +46,26 @@ public class GoogleTaskListFragment extends TaskEditControlFragment { @Inject MetadataDao metadataDao; private long taskId; - private GtasksList list; - private boolean isNewTask; + private GtasksList originalList; + private GtasksList selectedList; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = super.onCreateView(inflater, container, savedInstanceState); if (savedInstanceState != null) { - isNewTask = savedInstanceState.getBoolean(EXTRA_IS_NEW_TASK); taskId = savedInstanceState.getLong(EXTRA_TASK_ID); - list = new GtasksList((StoreObject) savedInstanceState.getParcelable(EXTRA_LIST)); - } - Metadata metadata = gtasksMetadataService.getTaskMetadata(taskId); - if (metadata != null) { - list = gtasksListService.getList(metadata.getValue(GtasksMetadata.LIST_ID)); - } - if (list == null) { - list = gtasksListService.getList(gtasksPreferenceService.getDefaultList()); + originalList = new GtasksList((StoreObject) savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST)); + selectedList = new GtasksList((StoreObject) savedInstanceState.getParcelable(EXTRA_SELECTED_LIST)); + } else { + Metadata metadata = gtasksMetadataService.getActiveTaskMetadata(taskId); + if (metadata != null) { + originalList = gtasksListService.getList(metadata.getValue(GtasksMetadata.LIST_ID)); + } + if (originalList == null) { + originalList = gtasksListService.getList(gtasksPreferenceService.getDefaultList()); + } + selectedList = originalList; } refreshView(); @@ -72,9 +76,9 @@ public class GoogleTaskListFragment extends TaskEditControlFragment { public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putBoolean(EXTRA_IS_NEW_TASK, isNewTask); 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 @@ -94,10 +98,6 @@ public class GoogleTaskListFragment extends TaskEditControlFragment { @OnClick(R.id.google_task_list) void clickGoogleTaskList(View view) { - if (!isNewTask) { - return; - } - FragmentManager fragmentManager = getFragmentManager(); GoogleTaskListSelectionDialog dialog = (GoogleTaskListSelectionDialog) fragmentManager.findFragmentByTag(FRAG_TAG_GOOGLE_TASK_LIST_SELECTION); if (dialog == null) { @@ -108,36 +108,41 @@ public class GoogleTaskListFragment extends TaskEditControlFragment { @Override public void initialize(boolean isNewTask, Task task) { - this.isNewTask = isNewTask; taskId = task.getId(); } @Override public void apply(Task task) { - if (!isNewTask) { - return; - } - Metadata taskMetadata = gtasksMetadataService.getTaskMetadata(task.getId()); + Metadata taskMetadata = gtasksMetadataService.getActiveTaskMetadata(task.getId()); if (taskMetadata == null) { 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); } + @Override + public boolean hasChanges(Task original) { + return !selectedList.equals(originalList); + } + @Override protected void inject(FragmentComponent component) { component.inject(this); } public void setList(GtasksList list) { - this.list = list; + this.selectedList = list; refreshView(); } private void refreshView() { - if (list != null) { - textView.setText(list.getName()); + if (selectedList != null) { + textView.setText(selectedList.getName()); } } } diff --git a/src/main/java/com/todoroo/astrid/dao/MetadataDao.java b/src/main/java/com/todoroo/astrid/dao/MetadataDao.java index 33b50bcd9..4a195dee9 100644 --- a/src/main/java/com/todoroo/astrid/dao/MetadataDao.java +++ b/src/main/java/com/todoroo/astrid/dao/MetadataDao.java @@ -101,6 +101,14 @@ public class MetadataDao { public static Criterion byTaskAndwithKey(long taskId, String key) { 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) {