From b0fa12589bb50c3b3b0cde6cf781496b7e85561c Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 25 Mar 2016 12:43:05 -0500 Subject: [PATCH] Clean up task duplicator and fix tag duplication --- .../todoroo/andlib/data/AbstractModel.java | 11 ++++ .../com/todoroo/astrid/dao/MetadataDao.java | 8 +++ .../com/todoroo/astrid/data/Metadata.java | 8 +++ .../com/todoroo/astrid/data/RemoteModel.java | 4 ++ .../java/com/todoroo/astrid/data/Task.java | 4 ++ .../astrid/service/TaskDuplicator.java | 64 +++++++++---------- 6 files changed, 65 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/todoroo/andlib/data/AbstractModel.java b/src/main/java/com/todoroo/andlib/data/AbstractModel.java index 58981631c..f60fcc41b 100644 --- a/src/main/java/com/todoroo/andlib/data/AbstractModel.java +++ b/src/main/java/com/todoroo/andlib/data/AbstractModel.java @@ -82,6 +82,17 @@ public abstract class AbstractModel implements Parcelable, Cloneable { readPropertiesFromCursor(cursor); } + public AbstractModel(AbstractModel abstractModel) { + if (abstractModel != null) { + if (abstractModel.setValues != null) { + setValues = new ContentValues(abstractModel.setValues); + } + if (abstractModel.values != null) { + values = new ContentValues(abstractModel.values); + } + } + } + /** Get database-read values for this object */ public ContentValues getDatabaseValues() { return values; diff --git a/src/main/java/com/todoroo/astrid/dao/MetadataDao.java b/src/main/java/com/todoroo/astrid/dao/MetadataDao.java index af8ae870e..33b50bcd9 100644 --- a/src/main/java/com/todoroo/astrid/dao/MetadataDao.java +++ b/src/main/java/com/todoroo/astrid/dao/MetadataDao.java @@ -56,6 +56,10 @@ public class MetadataDao { dao.createNew(metadata); } + public List toList(Criterion criterion) { + return toList(Query.select(Metadata.PROPERTIES).where(criterion)); + } + public List toList(Query where) { return dao.toList(where); } @@ -118,6 +122,10 @@ public class MetadataDao { Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull()))); } + public List byTask(long taskId) { + return toList(MetadataCriteria.byTask(taskId)); + } + public void byTask(long taskId, Callback callback) { dao.query(callback, Query.select(Metadata.PROPERTIES).where(Metadata.TASK.eq(taskId))); } diff --git a/src/main/java/com/todoroo/astrid/data/Metadata.java b/src/main/java/com/todoroo/astrid/data/Metadata.java index 555ab20f5..cc63396dd 100644 --- a/src/main/java/com/todoroo/astrid/data/Metadata.java +++ b/src/main/java/com/todoroo/astrid/data/Metadata.java @@ -94,6 +94,14 @@ public class Metadata extends AbstractModel { defaultValues.put(DELETION_DATE.name, 0L); } + public Metadata() { + super(); + } + + public Metadata(Metadata metadata) { + super(metadata); + } + @Override public ContentValues getDefaultValues() { return defaultValues; diff --git a/src/main/java/com/todoroo/astrid/data/RemoteModel.java b/src/main/java/com/todoroo/astrid/data/RemoteModel.java index b8c78ff26..8be2b19e2 100644 --- a/src/main/java/com/todoroo/astrid/data/RemoteModel.java +++ b/src/main/java/com/todoroo/astrid/data/RemoteModel.java @@ -36,6 +36,10 @@ abstract public class RemoteModel extends AbstractModel { super(cursor); } + public RemoteModel(AbstractModel model) { + super(model); + } + /** remote id property common to all remote models */ public static final String UUID_PROPERTY_NAME = "remoteId"; //$NON-NLS-1$ diff --git a/src/main/java/com/todoroo/astrid/data/Task.java b/src/main/java/com/todoroo/astrid/data/Task.java index 226075c37..74b226232 100644 --- a/src/main/java/com/todoroo/astrid/data/Task.java +++ b/src/main/java/com/todoroo/astrid/data/Task.java @@ -190,6 +190,10 @@ public class Task extends RemoteModel { super(cursor); } + public Task(Task task) { + super(task); + } + @Override public long getId() { return getIdHelper(ID); diff --git a/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java b/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java index a661e02c3..5b1ffc2bb 100644 --- a/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java +++ b/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java @@ -1,6 +1,5 @@ package com.todoroo.astrid.service; -import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.data.Metadata; @@ -8,11 +7,14 @@ import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gcal.GCalHelper; import com.todoroo.astrid.gtasks.GtasksMetadata; +import com.todoroo.astrid.tags.TaskToTagMetadata; import java.util.List; import javax.inject.Inject; +import timber.log.Timber; + public class TaskDuplicator { private final TaskService taskService; @@ -31,47 +33,41 @@ public class TaskDuplicator { * @return cloned item id */ public long duplicateTask(long itemId) { - Task original = new Task(); - original.setId(itemId); - Task clone = clone(original); + Task original = taskService.fetchById(itemId, Task.PROPERTIES); + Timber.d("Cloning %s", original); + Task clone = new Task(original); clone.setCreationDate(DateUtilities.now()); clone.setCompletionDate(0L); clone.setDeletionDate(0L); - clone.setCalendarUri(""); //$NON-NLS-1$ - gcalHelper.createTaskEventIfEnabled(clone); - - taskService.save(clone); - return clone.getId(); - } - - private Task clone(Task task) { - Task newTask = taskService.fetchById(task.getId(), Task.PROPERTIES); - if(newTask == null) { - return new Task(); - } - newTask.clearValue(Task.ID); - newTask.clearValue(Task.UUID); - - List metadataList = metadataDao.toList(Query.select(Metadata.PROPERTIES).where(MetadataDao.MetadataCriteria.byTask(task.getId()))); + clone.setCalendarUri(""); + clone.clearValue(Task.ID); + clone.clearValue(Task.UUID); + List metadataList = metadataDao.byTask(itemId); if (!metadataList.isEmpty()) { - newTask.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); - taskService.save(newTask); - long newId = newTask.getId(); - for (Metadata metadata : metadataList) { - if(!metadata.containsNonNullValue(Metadata.KEY)) { - continue; - } + clone.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); + } - if(GtasksMetadata.METADATA_KEY.equals(metadata.getKey())) { - metadata.setValue(GtasksMetadata.ID, ""); //$NON-NLS-1$ - } + taskService.save(clone); - metadata.setTask(newId); - metadata.clearValue(Metadata.ID); - metadataDao.createNew(metadata); + for (Metadata oldMetadata : metadataList) { + if(!oldMetadata.containsNonNullValue(Metadata.KEY)) { + continue; + } + Timber.d("Cloning %s", oldMetadata); + Metadata metadata = new Metadata(oldMetadata); + if(GtasksMetadata.METADATA_KEY.equals(metadata.getKey())) { + metadata.setValue(GtasksMetadata.ID, ""); //$NON-NLS-1$ + } else if (TaskToTagMetadata.KEY.equals(metadata.getKey())) { + metadata.setValue(TaskToTagMetadata.TASK_UUID, clone.getUuid()); } + metadata.setTask(clone.getId()); + metadata.clearValue(Metadata.ID); + metadataDao.createNew(metadata); } - return newTask; + + gcalHelper.createTaskEventIfEnabled(clone); + + return clone.getId(); } }