diff --git a/app/src/androidTest/java/org/tasks/injection/TestModule.java b/app/src/androidTest/java/org/tasks/injection/TestModule.java index d2062c720..76d69641b 100644 --- a/app/src/androidTest/java/org/tasks/injection/TestModule.java +++ b/app/src/androidTest/java/org/tasks/injection/TestModule.java @@ -84,9 +84,9 @@ public class TestModule { } @Provides - public TaskDao getTaskDao(Database database, Preferences preferences) { + public TaskDao getTaskDao(Database database) { TaskDao taskDao = database.getTaskDao(); - taskDao.initialize(context, preferences); + taskDao.initialize(context); return taskDao; } diff --git a/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java b/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java index cec4d5067..142e6839c 100644 --- a/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java +++ b/app/src/googleplay/java/org/tasks/gtasks/GoogleTaskSyncAdapter.java @@ -48,6 +48,8 @@ import com.todoroo.astrid.gtasks.api.GtasksInvoker; import com.todoroo.astrid.gtasks.api.HttpNotFoundException; import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer; +import com.todoroo.astrid.helper.UUIDHelper; +import com.todoroo.astrid.service.TaskCreator; import com.todoroo.astrid.utility.Constants; import org.tasks.LocalBroadcastManager; @@ -388,24 +390,19 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter } else { // Set default importance and reminders for remotely created tasks task.task.setImportance(preferences.getIntegerFromString( R.string.p_default_importance_key, Task.IMPORTANCE_SHOULD_DO)); - TaskDao.setDefaultReminders(preferences, task.task); + TaskCreator.setDefaultReminders(preferences, task.task); + task.task.setUuid(UUIDHelper.newUUID()); + taskDao.createNew(task.task); } if (!TextUtils.isEmpty(task.task.getTitle())) { task.task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); task.task.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true); - saveTaskAndMetadata(task); + task.prepareForSaving(); + taskDao.save(task.task); + synchronizeMetadata(task.task.getId(), task.metadata); } } - /** - * Saves a task and its metadata - */ - private void saveTaskAndMetadata(GtasksTaskContainer task) { - task.prepareForSaving(); - taskDao.save(task.task); - synchronizeMetadata(task.task.getId(), task.metadata); - } - /** * Synchronize metadata for given task id. Deletes rows in database that * are not identical to those in the metadata list, creates rows that diff --git a/app/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java b/app/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java index 535233296..9072c7e23 100644 --- a/app/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java +++ b/app/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java @@ -54,9 +54,13 @@ public class GoogleTaskListFragment extends TaskEditControlFragment { originalList = savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST); selectedList = savedInstanceState.getParcelable(EXTRA_SELECTED_LIST); } else { - GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId()); - if (googleTask != null) { - originalList = gtasksListService.getList(googleTask.getListId()); + if (task.isNew()) { + originalList = gtasksListService.getList(task.getTransitory(GoogleTask.KEY)); + } else { + GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId()); + if (googleTask != null) { + originalList = gtasksListService.getList(googleTask.getListId()); + } } if (originalList == null) { originalList = gtasksListService.getList(gtasksPreferenceService.getDefaultList()); diff --git a/app/src/main/java/com/todoroo/andlib/data/AbstractModel.java b/app/src/main/java/com/todoroo/andlib/data/AbstractModel.java index 882c61cb1..02ebba70a 100644 --- a/app/src/main/java/com/todoroo/andlib/data/AbstractModel.java +++ b/app/src/main/java/com/todoroo/andlib/data/AbstractModel.java @@ -14,6 +14,9 @@ import com.todoroo.andlib.data.Property.PropertyVisitor; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.astrid.data.Task; +import org.tasks.data.Tag; + +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -316,11 +319,23 @@ public abstract class AbstractModel { transitoryData.put(key, value); } - private Object getTransitory(String key) { + public void setTags(ArrayList tags) { + if (transitoryData == null) { + transitoryData = new HashMap<>(); + } + transitoryData.put(Tag.KEY, tags); + } + + public ArrayList getTags() { + Object tags = getTransitory(Tag.KEY); + return tags == null ? new ArrayList<>() : (ArrayList) tags; + } + + public T getTransitory(String key) { if(transitoryData == null) { return null; } - return transitoryData.get(key); + return (T) transitoryData.get(key); } private Object clearTransitory(String key) { diff --git a/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java b/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java index 008da160a..e5b233a3b 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/ShareLinkActivity.java @@ -55,11 +55,10 @@ public final class ShareLinkActivity extends InjectingAppCompatActivity { subject = ""; } - Task task = taskCreator.basicQuickAddTask(subject); + Task task = taskCreator.createWithValues(null, subject); if (task != null) { task.setNotes(intent.getStringExtra(Intent.EXTRA_TEXT)); - taskDao.save(task); - getEditTaskStack(this, null, task.getId()).startActivities(); + getEditTaskStack(this, null, task).startActivities(); } finish(); } diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java index eac1a39bf..30075766d 100755 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskEditFragment.java @@ -200,13 +200,15 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar List fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()); if (hasChanges(fragments)) { boolean isNewTask = model.isNew(); - + if (isNewTask) { + taskDao.createNew(model); + } for (TaskEditControlFragment fragment : fragments) { fragment.apply(model); } taskDao.save(model); - if (Flags.check(Flags.TAGS_CHANGED)) { + if (Flags.checkAndClear(Flags.TAGS_CHANGED)) { localBroadcastManager.broadcastRefreshList(); } @@ -291,7 +293,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar .show(); } - /* * ====================================================================== * ========================================== UI component helper classes diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index 8fd2aff91..24668ac54 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -110,6 +110,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements public static final String OPEN_FILTER = "open_filter"; //$NON-NLS-1$ public static final String LOAD_FILTER = "load_filter"; public static final String OPEN_TASK = "open_task"; //$NON-NLS-1$ + public static final String OPEN_NEW_TASK = "open_new_task"; //$NON-NLS-1$ private int currentNightMode; private Filter filter; @@ -156,7 +157,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements TaskEditFragment taskEditFragment = getTaskEditFragment(); if (taskEditFragment == null) { hideDetailFragment(); - } else if (intent.hasExtra(OPEN_FILTER) || intent.hasExtra(LOAD_FILTER) || intent.hasExtra(OPEN_TASK)) { + } else if (intent.hasExtra(OPEN_FILTER) || intent.hasExtra(LOAD_FILTER) || intent.hasExtra(OPEN_TASK) || intent.hasExtra(OPEN_NEW_TASK)) { taskEditFragment.save(); taskEditFinished(); } else { @@ -349,6 +350,10 @@ public class TaskListActivity extends InjectingAppCompatActivity implements Task task = getTaskListFragment().addTask(""); onTaskListItemClicked(task); } + } else if (intent.hasExtra(OPEN_NEW_TASK)) { + Task task = intent.getParcelableExtra(OPEN_NEW_TASK); + intent.removeExtra(OPEN_NEW_TASK); + onTaskListItemClicked(task); } if (intent.hasExtra(TOKEN_CREATE_NEW_LIST_NAME)) { diff --git a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java index 243ed6284..384fa2bd6 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java +++ b/app/src/main/java/com/todoroo/astrid/activity/TaskListFragment.java @@ -520,11 +520,7 @@ public class TaskListFragment extends InjectingFragment implements recognizedSpeech = recognizedSpeech.substring(0, 1).toUpperCase() + recognizedSpeech.substring(1).toLowerCase(); - Task task = addTask(recognizedSpeech); - taskCreator.addToCalendar(task); - onTaskListItemClicked(task); - loadTaskListContent(); - onTaskCreated(task.getUuid()); + onTaskListItemClicked(addTask(recognizedSpeech)); } } } else if (requestCode == REQUEST_EDIT_FILTER) { diff --git a/app/src/main/java/com/todoroo/astrid/dao/Database.java b/app/src/main/java/com/todoroo/astrid/dao/Database.java index 69b444396..85259242e 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/Database.java +++ b/app/src/main/java/com/todoroo/astrid/dao/Database.java @@ -9,7 +9,6 @@ import android.arch.persistence.db.SupportSQLiteDatabase; import android.arch.persistence.room.RoomDatabase; import android.content.ContentValues; import android.database.Cursor; -import android.database.sqlite.SQLiteConstraintException; import android.database.sqlite.SQLiteDatabase; import com.todoroo.astrid.data.Task; @@ -177,20 +176,6 @@ public abstract class Database extends RoomDatabase { return getDatabase().query(sql, null); } - public long insert(ContentValues values) { - long result; - try { - result = getDatabase().insert(TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values); - } catch (SQLiteConstraintException e) { // Throw these exceptions - throw e; - } catch (Exception e) { // Suppress others - Timber.e(e, e.getMessage()); - result = -1; - } - onDatabaseUpdated(); - return result; - } - public int update(ContentValues values, String whereClause) { int result = getDatabase().update(TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values, whereClause, null); onDatabaseUpdated(); diff --git a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java index ca5bbf78a..cb0fde154 100644 --- a/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java +++ b/app/src/main/java/com/todoroo/astrid/dao/TaskDao.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.dao; import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -16,18 +17,14 @@ import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Query; -import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.TaskApiDao; -import com.todoroo.astrid.helper.UUIDHelper; import org.tasks.BuildConfig; -import org.tasks.R; import org.tasks.jobs.AfterSaveIntentService; -import org.tasks.preferences.Preferences; import org.tasks.receivers.PushReceiver; import java.util.List; @@ -50,16 +47,14 @@ public abstract class TaskDao { private final Database database; - private Preferences preferences; private Context context; public TaskDao(Database database) { this.database = database; } - public void initialize(Context context, Preferences preferences) { + public void initialize(Context context) { this.context = context; - this.preferences = preferences; } public List needsRefresh() { @@ -159,7 +154,7 @@ public abstract class TaskDao { * */ public void save(Task task) { - ContentValues modifiedValues = createOrUpdate(task); + ContentValues modifiedValues = saveExisting(task); if (modifiedValues != null) { AfterSaveIntentService.enqueue(context, task.getId(), modifiedValues); } else if (task.checkTransitory(SyncFlags.FORCE_SYNC)) { @@ -167,91 +162,22 @@ public abstract class TaskDao { } } - private ContentValues createOrUpdate(Task task) { - return task.getId() == Task.NO_ID - ? createNew(task) - : saveExisting(task); - } - - public ContentValues createNew(Task item) { - if(!item.containsValue(Task.CREATION_DATE)) { - item.setCreationDate(now()); - } - item.setModificationDate(now()); - - // set up task defaults - if(!item.containsValue(Task.IMPORTANCE)) { - item.setImportance(preferences.getIntegerFromString( - R.string.p_default_importance_key, Task.IMPORTANCE_SHOULD_DO)); - } - if(!item.containsValue(Task.DUE_DATE)) { - int setting = preferences.getIntegerFromString(R.string.p_default_urgency_key, - Task.URGENCY_NONE); - item.setDueDate(Task.createDueDate(setting, 0)); - } - createDefaultHideUntil(preferences, item); - - setDefaultReminders(preferences, item); - - ContentValues values = item.getSetValues(); - - if (!item.containsValue(Task.UUID) || Task.isUuidEmpty(item.getUuid())) { - item.setUuid(UUIDHelper.newUUID()); - } - - DatabaseChangeOp insert = new DatabaseChangeOp() { - @Override - public boolean makeChange() { - ContentValues mergedValues = item.getMergedValues(); - mergedValues.remove(AbstractModel.ID_PROPERTY.name); - long newRow = database.insert(mergedValues); - boolean result = newRow >= 0; - if (result) { - item.setId(newRow); - } - return result; - } + @Insert + abstract long insert(Task task); - @Override - public String toString() { - return "INSERT"; - } - }; - if (insertOrUpdateAndRecordChanges(item, insert)) { - return values; - } - return null; - } - - private static void createDefaultHideUntil(Preferences preferences, Task item) { - if(!item.containsValue(Task.HIDE_UNTIL)) { - int setting = preferences.getIntegerFromString(R.string.p_default_hideUntil_key, - Task.HIDE_UNTIL_NONE); - item.setHideUntil(item.createHideUntil(setting, 0)); - } - } - - /** - * Sets default reminders for the given task if reminders are not set - */ - public static void setDefaultReminders(Preferences preferences, Task item) { - if(!item.containsValue(Task.REMINDER_PERIOD)) { - item.setReminderPeriod(DateUtilities.ONE_HOUR * - preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, - 0)); - } - if(!item.containsValue(Task.REMINDER_FLAGS)) { - item.setReminderFlags(preferences.getDefaultReminders() | preferences.getDefaultRingMode()); - } + public void createNew(Task task) { + task.id = null; + task.remoteId = task.getUuid(); + task.setId(insert(task)); } private ContentValues saveExisting(Task item) { ContentValues values = item.getSetValues(); - if(values == null || values.size() == 0) { + if (values == null || values.size() == 0) { return null; } - if(!TaskApiDao.insignificantChange(values)) { - if(!values.containsKey(Task.MODIFICATION_DATE.name)) { + if (!TaskApiDao.insignificantChange(values)) { + if (!values.containsKey(Task.MODIFICATION_DATE.name)) { item.setModificationDate(now()); } } @@ -267,7 +193,7 @@ public abstract class TaskDao { return "UPDATE"; } }; - if (insertOrUpdateAndRecordChanges(item, update)) { + if (updateAndRecordChanges(item, update)) { return values; } return null; @@ -308,7 +234,7 @@ public abstract class TaskDao { boolean makeChange(); } - private boolean insertOrUpdateAndRecordChanges(Task item, DatabaseChangeOp op) { + private boolean updateAndRecordChanges(Task item, DatabaseChangeOp op) { final AtomicBoolean result = new AtomicBoolean(false); synchronized(database) { result.set(op.makeChange()); diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java index ebd712697..fa9bfc4a2 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskCreator.java @@ -4,21 +4,24 @@ import android.content.ContentValues; import android.net.Uri; import android.text.TextUtils; +import com.google.common.base.Strings; import com.todoroo.andlib.utility.AndroidUtilities; +import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.api.PermaSql; -import org.tasks.data.TagDataDao; import com.todoroo.astrid.dao.TaskDao; -import com.todoroo.astrid.data.SyncFlags; -import org.tasks.data.TagData; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gcal.GCalHelper; +import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.utility.TitleParser; +import org.tasks.R; import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTaskDao; import org.tasks.data.Tag; import org.tasks.data.TagDao; +import org.tasks.data.TagData; +import org.tasks.data.TagDataDao; import org.tasks.preferences.Preferences; import java.util.ArrayList; @@ -50,23 +53,26 @@ public class TaskCreator { this.googleTaskDao = googleTaskDao; } - public Task basicQuickAddTask(String title) { + public void basicQuickAddTask(String title) { title = title.trim(); Task task = createWithValues(null, title); - addToCalendar(task); - - return task; - } + taskDao.createNew(task); - public void addToCalendar(Task task) { boolean gcalCreateEventEnabled = preferences.isDefaultCalendarSet() && task.hasDueDate(); //$NON-NLS-1$ if (!TextUtils.isEmpty(task.getTitle()) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) { Uri calendarUri = gcalHelper.createTaskEvent(task, new ContentValues()); task.setCalendarUri(calendarUri.toString()); - task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); - taskDao.save(task); } + + createTags(task); + + String googleTaskList = task.getTransitory(GoogleTask.KEY); + if (!Strings.isNullOrEmpty(googleTaskList)) { + googleTaskDao.insert(new GoogleTask(task.getId(), googleTaskList)); + } + + taskDao.save(task); } /** @@ -79,6 +85,8 @@ public class TaskCreator { task.setTitle(title.trim()); } + task.setUuid(UUIDHelper.newUUID()); + ArrayList tags = new ArrayList<>(); try { parseQuickAddMarkup(task, tags); @@ -91,55 +99,66 @@ public class TaskCreator { for (Map.Entry item : values.entrySet()) { String key = item.getKey(); Object value = item.getValue(); - if (key.equals(Tag.KEY) || key.equals(GoogleTask.KEY)) { - continue; + if (key.equals(Tag.KEY)) { + tags.add((String) value); + } else if (key.equals(GoogleTask.KEY)) { + task.putTransitory(key, value); + } else { + if (value instanceof String) { + value = PermaSql.replacePlaceholders((String) value); + } + + AndroidUtilities.putInto(forTask, key, value); } - - if (value instanceof String) { - value = PermaSql.replacePlaceholders((String) value); - } - - AndroidUtilities.putInto(forTask, key, value); } task.mergeWithoutReplacement(forTask); } - saveWithoutPublishingFilterUpdate(task); + if (!task.containsValue(Task.IMPORTANCE)) { + task.setImportance(preferences.getIntegerFromString(R.string.p_default_importance_key, Task.IMPORTANCE_SHOULD_DO)); + } - if (values != null) { - if (values.containsKey(Tag.KEY)) { - createLink(task, (String) values.get(Tag.KEY)); - } - if (values.containsKey(GoogleTask.KEY)) { - GoogleTask googleTask = new GoogleTask(task.getId(), (String) values.get(GoogleTask.KEY)); - googleTaskDao.insert(googleTask); - } + if(!task.containsValue(Task.DUE_DATE)) { + task.setDueDate(Task.createDueDate( + preferences.getIntegerFromString(R.string.p_default_urgency_key, Task.URGENCY_NONE), 0)); } - for(String tag : tags) { - createLink(task, tag); + if(!task.containsValue(Task.HIDE_UNTIL)) { + int setting = preferences.getIntegerFromString(R.string.p_default_hideUntil_key, + Task.HIDE_UNTIL_NONE); + task.setHideUntil(task.createHideUntil(setting, 0)); } + setDefaultReminders(preferences, task); + + task.setTags(tags); + return task; } - private void saveWithoutPublishingFilterUpdate(Task item) { - taskDao.save(item); - } + public static void setDefaultReminders(Preferences preferences, Task task) { + if(!task.containsValue(Task.REMINDER_PERIOD)) { + task.setReminderPeriod(DateUtilities.ONE_HOUR * + preferences.getIntegerFromString(R.string.p_rmd_default_random_hours, + 0)); + } - private void createLink(Task task, String tagName) { - TagData tagData = tagDataDao.getTagByName(tagName); - if (tagData == null) { - tagData = new TagData(); - tagData.setName(tagName); - tagDataDao.persist(tagData); + if(!task.containsValue(Task.REMINDER_FLAGS)) { + task.setReminderFlags(preferences.getDefaultReminders() | preferences.getDefaultRingMode()); } - createLink(task, tagData.getName(), tagData.getRemoteId()); } - private void createLink(Task task, String tagName, String tagUuid) { - Tag link = new Tag(task.getId(), task.getUuid(), tagName, tagUuid); - tagDao.insert(link); + public void createTags(Task task) { + for (String tag : task.getTags()) { + TagData tagData = tagDataDao.getTagByName(tag); + if (tagData == null) { + tagData = new TagData(); + tagData.setName(tag); + tagDataDao.persist(tagData); + } + Tag link = new Tag(task.getId(), task.getUuid(), tagData.getName(), tagData.getRemoteId()); + tagDao.insert(link); + } } /** diff --git a/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java b/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java index 0bda75d92..c4fed2fb6 100644 --- a/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java +++ b/app/src/main/java/com/todoroo/astrid/service/TaskDuplicator.java @@ -1,11 +1,10 @@ package com.todoroo.astrid.service; -import com.google.common.collect.Lists; -import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gcal.GCalHelper; +import com.todoroo.astrid.helper.UUIDHelper; import org.tasks.LocalBroadcastManager; import org.tasks.data.GoogleTask; @@ -18,6 +17,9 @@ import java.util.List; import javax.inject.Inject; +import static com.google.common.collect.Lists.transform; +import static com.todoroo.andlib.utility.DateUtilities.now; + public class TaskDuplicator { private final GCalHelper gcalHelper; @@ -39,32 +41,30 @@ public class TaskDuplicator { public List duplicate(List tasks) { List result = new ArrayList<>(); for (Task task : tasks) { - result.add(clone(taskDao.fetch(task.getId()))); + result.add(clone(task)); } localBroadcastManager.broadcastRefresh(); return result; } private Task clone(Task clone) { - long originalId = clone.getId(); - - clone.setCreationDate(DateUtilities.now()); + clone.setCreationDate(now()); + clone.setModificationDate(now()); clone.setCompletionDate(0L); clone.setDeletionDate(0L); clone.setCalendarUri(""); - clone.clearValue(Task.ID); - clone.clearValue(Task.UUID); + clone.setUuid(UUIDHelper.newUUID()); - GoogleTask googleTask = googleTaskDao.getByTaskId(originalId); + List tags = tagDao.getTagsForTask(clone.getId()); + GoogleTask googleTask = googleTaskDao.getByTaskId(clone.getId()); if (googleTask != null) { clone.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); } clone.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true); - taskDao.save(clone); + taskDao.createNew(clone); - tagDao.insert(Lists.transform( - tagDao.getTagsForTask(originalId), + tagDao.insert(transform(tags, tag -> new Tag(clone.getId(), clone.getUuid(), tag.getName(), tag.getTagUid()))); if (googleTask != null) { @@ -73,6 +73,8 @@ public class TaskDuplicator { gcalHelper.createTaskEventIfEnabled(clone); + taskDao.save(clone); // TODO: delete me + return clone; } } diff --git a/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java b/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java index cbc69cb75..25df997b5 100644 --- a/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java +++ b/app/src/main/java/com/todoroo/astrid/tags/TagsControlSet.java @@ -143,7 +143,10 @@ public final class TagsControlSet extends TaskEditControlFragment { selectedTags = savedInstanceState.getParcelableArrayList(EXTRA_SELECTED_TAGS); newTags = savedInstanceState.getStringArrayList(EXTRA_NEW_TAGS); } else { - selectedTags = tagService.getTagDataForTask(task.getId()); + selectedTags = new ArrayList<>(); + selectedTags.addAll(task.isNew() + ? transform(task.getTags(), tagDataDao::getTagByName) + : tagService.getTagDataForTask(task.getId())); newTags = newArrayList(); } allTags = tagService.getTagList(); diff --git a/app/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java b/app/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java index 6001bbcfa..7398d82df 100644 --- a/app/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java +++ b/app/src/main/java/com/todoroo/astrid/ui/EditTitleControlSet.java @@ -166,7 +166,8 @@ public class EditTitleControlSet extends TaskEditControlFragment { @Override public boolean hasChanges(Task original) { return !title.equals(original.getTitle()) || - isComplete != original.isCompleted(); + isComplete != original.isCompleted() || + (original.isNew() && !Strings.isNullOrEmpty(title)); } @Override diff --git a/app/src/main/java/org/tasks/injection/ApplicationModule.java b/app/src/main/java/org/tasks/injection/ApplicationModule.java index 7757ab20e..5da761f10 100644 --- a/app/src/main/java/org/tasks/injection/ApplicationModule.java +++ b/app/src/main/java/org/tasks/injection/ApplicationModule.java @@ -22,7 +22,6 @@ import org.tasks.data.UserActivityDao; import org.tasks.db.Migrations; import org.tasks.locale.Locale; import org.tasks.notifications.NotificationDao; -import org.tasks.preferences.Preferences; import java.util.concurrent.Executor; @@ -136,9 +135,9 @@ public class ApplicationModule { @Provides @ApplicationScope - public TaskDao getTaskDao(Database database, Preferences preferences) { + public TaskDao getTaskDao(Database database) { TaskDao taskDao = database.getTaskDao(); - taskDao.initialize(context, preferences); + taskDao.initialize(context); return taskDao; } } diff --git a/app/src/main/java/org/tasks/intents/TaskIntents.java b/app/src/main/java/org/tasks/intents/TaskIntents.java index 9a63d0566..4f87d2bec 100644 --- a/app/src/main/java/org/tasks/intents/TaskIntents.java +++ b/app/src/main/java/org/tasks/intents/TaskIntents.java @@ -7,11 +7,20 @@ import android.support.v4.app.TaskStackBuilder; import com.google.common.base.Strings; import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.api.Filter; +import com.todoroo.astrid.data.Task; public class TaskIntents { + public static TaskStackBuilder getEditTaskStack(Context context, final Filter filter, Task task) { + Intent intent = getTaskListIntent(context, filter); + intent.putExtra(TaskListActivity.OPEN_NEW_TASK, task); + return TaskStackBuilder.create(context).addNextIntent(intent); + } + public static TaskStackBuilder getEditTaskStack(Context context, final Filter filter, final long taskId) { - return TaskStackBuilder.create(context).addNextIntent(getEditTaskIntent(context, filter, taskId)); + Intent intent = getTaskListIntent(context, filter); + intent.putExtra(TaskListActivity.OPEN_TASK, taskId); + return TaskStackBuilder.create(context).addNextIntent(intent); } public static Intent getNewTaskIntent(Context context, String filterId) { @@ -24,12 +33,6 @@ public class TaskIntents { return taskListIntent; } - private static Intent getEditTaskIntent(Context context, final Filter filter, final long taskId) { - Intent taskListIntent = getTaskListIntent(context, filter); - taskListIntent.putExtra(TaskListActivity.OPEN_TASK, taskId); - return taskListIntent; - } - public static Intent getTaskListIntent(Context context, final Filter filter) { Intent intent = new Intent(context, TaskListActivity.class); if (filter != null) { diff --git a/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.java b/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.java index d7053fb15..bd7ed8900 100644 --- a/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.java +++ b/app/src/main/java/org/tasks/locale/receiver/TaskerTaskCreator.java @@ -71,6 +71,9 @@ public class TaskerTaskCreator { task.setNotes(bundle.getDescription()); - taskDao.save(task); + taskDao.createNew(task); + taskDao.save(task); // TODO: delete me + + taskCreator.createTags(task); } }