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) {
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,

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save