Don't persist new tasks before editing

pull/618/head
Alex Baker 8 years ago
parent b3b2f6295c
commit 985b1f3485

@ -84,9 +84,9 @@ public class TestModule {
} }
@Provides @Provides
public TaskDao getTaskDao(Database database, Preferences preferences) { public TaskDao getTaskDao(Database database) {
TaskDao taskDao = database.getTaskDao(); TaskDao taskDao = database.getTaskDao();
taskDao.initialize(context, preferences); taskDao.initialize(context);
return taskDao; return taskDao;
} }

@ -48,6 +48,8 @@ import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.api.HttpNotFoundException; import com.todoroo.astrid.gtasks.api.HttpNotFoundException;
import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService;
import com.todoroo.astrid.gtasks.sync.GtasksTaskContainer; 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 com.todoroo.astrid.utility.Constants;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
@ -388,23 +390,18 @@ public class GoogleTaskSyncAdapter extends InjectingAbstractThreadedSyncAdapter
} else { // Set default importance and reminders for remotely created tasks } else { // Set default importance and reminders for remotely created tasks
task.task.setImportance(preferences.getIntegerFromString( task.task.setImportance(preferences.getIntegerFromString(
R.string.p_default_importance_key, Task.IMPORTANCE_SHOULD_DO)); 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())) { if (!TextUtils.isEmpty(task.task.getTitle())) {
task.task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); task.task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
task.task.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true); task.task.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true);
saveTaskAndMetadata(task);
}
}
/**
* Saves a task and its metadata
*/
private void saveTaskAndMetadata(GtasksTaskContainer task) {
task.prepareForSaving(); task.prepareForSaving();
taskDao.save(task.task); taskDao.save(task.task);
synchronizeMetadata(task.task.getId(), task.metadata); synchronizeMetadata(task.task.getId(), task.metadata);
} }
}
/** /**
* Synchronize metadata for given task id. Deletes rows in database that * Synchronize metadata for given task id. Deletes rows in database that

@ -53,11 +53,15 @@ public class GoogleTaskListFragment extends TaskEditControlFragment {
if (savedInstanceState != null) { if (savedInstanceState != null) {
originalList = savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST); originalList = savedInstanceState.getParcelable(EXTRA_ORIGINAL_LIST);
selectedList = savedInstanceState.getParcelable(EXTRA_SELECTED_LIST); selectedList = savedInstanceState.getParcelable(EXTRA_SELECTED_LIST);
} else {
if (task.isNew()) {
originalList = gtasksListService.getList(task.getTransitory(GoogleTask.KEY));
} else { } else {
GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId()); GoogleTask googleTask = googleTaskDao.getByTaskId(task.getId());
if (googleTask != null) { if (googleTask != null) {
originalList = gtasksListService.getList(googleTask.getListId()); originalList = gtasksListService.getList(googleTask.getListId());
} }
}
if (originalList == null) { if (originalList == null) {
originalList = gtasksListService.getList(gtasksPreferenceService.getDefaultList()); originalList = gtasksListService.getList(gtasksPreferenceService.getDefaultList());
} }

@ -14,6 +14,9 @@ import com.todoroo.andlib.data.Property.PropertyVisitor;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import org.tasks.data.Tag;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
@ -316,11 +319,23 @@ public abstract class AbstractModel {
transitoryData.put(key, value); transitoryData.put(key, value);
} }
private Object getTransitory(String key) { public void setTags(ArrayList<String> tags) {
if (transitoryData == null) {
transitoryData = new HashMap<>();
}
transitoryData.put(Tag.KEY, tags);
}
public ArrayList<String> getTags() {
Object tags = getTransitory(Tag.KEY);
return tags == null ? new ArrayList<>() : (ArrayList<String>) tags;
}
public <T> T getTransitory(String key) {
if(transitoryData == null) { if(transitoryData == null) {
return null; return null;
} }
return transitoryData.get(key); return (T) transitoryData.get(key);
} }
private Object clearTransitory(String key) { private Object clearTransitory(String key) {

@ -55,11 +55,10 @@ public final class ShareLinkActivity extends InjectingAppCompatActivity {
subject = ""; subject = "";
} }
Task task = taskCreator.basicQuickAddTask(subject); Task task = taskCreator.createWithValues(null, subject);
if (task != null) { if (task != null) {
task.setNotes(intent.getStringExtra(Intent.EXTRA_TEXT)); task.setNotes(intent.getStringExtra(Intent.EXTRA_TEXT));
taskDao.save(task); getEditTaskStack(this, null, task).startActivities();
getEditTaskStack(this, null, task.getId()).startActivities();
} }
finish(); finish();
} }

@ -200,13 +200,15 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
List<TaskEditControlFragment> fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager()); List<TaskEditControlFragment> fragments = taskEditControlSetFragmentManager.getFragmentsInPersistOrder(getChildFragmentManager());
if (hasChanges(fragments)) { if (hasChanges(fragments)) {
boolean isNewTask = model.isNew(); boolean isNewTask = model.isNew();
if (isNewTask) {
taskDao.createNew(model);
}
for (TaskEditControlFragment fragment : fragments) { for (TaskEditControlFragment fragment : fragments) {
fragment.apply(model); fragment.apply(model);
} }
taskDao.save(model); taskDao.save(model);
if (Flags.check(Flags.TAGS_CHANGED)) { if (Flags.checkAndClear(Flags.TAGS_CHANGED)) {
localBroadcastManager.broadcastRefreshList(); localBroadcastManager.broadcastRefreshList();
} }
@ -291,7 +293,6 @@ public final class TaskEditFragment extends InjectingFragment implements Toolbar
.show(); .show();
} }
/* /*
* ====================================================================== * ======================================================================
* ========================================== UI component helper classes * ========================================== UI component helper classes

@ -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 OPEN_FILTER = "open_filter"; //$NON-NLS-1$
public static final String LOAD_FILTER = "load_filter"; public static final String LOAD_FILTER = "load_filter";
public static final String OPEN_TASK = "open_task"; //$NON-NLS-1$ 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 int currentNightMode;
private Filter filter; private Filter filter;
@ -156,7 +157,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
TaskEditFragment taskEditFragment = getTaskEditFragment(); TaskEditFragment taskEditFragment = getTaskEditFragment();
if (taskEditFragment == null) { if (taskEditFragment == null) {
hideDetailFragment(); 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(); taskEditFragment.save();
taskEditFinished(); taskEditFinished();
} else { } else {
@ -349,6 +350,10 @@ public class TaskListActivity extends InjectingAppCompatActivity implements
Task task = getTaskListFragment().addTask(""); Task task = getTaskListFragment().addTask("");
onTaskListItemClicked(task); 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)) { if (intent.hasExtra(TOKEN_CREATE_NEW_LIST_NAME)) {

@ -520,11 +520,7 @@ public class TaskListFragment extends InjectingFragment implements
recognizedSpeech = recognizedSpeech.substring(0, 1).toUpperCase() + recognizedSpeech = recognizedSpeech.substring(0, 1).toUpperCase() +
recognizedSpeech.substring(1).toLowerCase(); recognizedSpeech.substring(1).toLowerCase();
Task task = addTask(recognizedSpeech); onTaskListItemClicked(addTask(recognizedSpeech));
taskCreator.addToCalendar(task);
onTaskListItemClicked(task);
loadTaskListContent();
onTaskCreated(task.getUuid());
} }
} }
} else if (requestCode == REQUEST_EDIT_FILTER) { } else if (requestCode == REQUEST_EDIT_FILTER) {

@ -9,7 +9,6 @@ import android.arch.persistence.db.SupportSQLiteDatabase;
import android.arch.persistence.room.RoomDatabase; import android.arch.persistence.room.RoomDatabase;
import android.content.ContentValues; import android.content.ContentValues;
import android.database.Cursor; import android.database.Cursor;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
@ -177,20 +176,6 @@ public abstract class Database extends RoomDatabase {
return getDatabase().query(sql, null); 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) { public int update(ContentValues values, String whereClause) {
int result = getDatabase().update(TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values, whereClause, null); int result = getDatabase().update(TABLE_NAME, SQLiteDatabase.CONFLICT_REPLACE, values, whereClause, null);
onDatabaseUpdated(); onDatabaseUpdated();

@ -6,6 +6,7 @@
package com.todoroo.astrid.dao; package com.todoroo.astrid.dao;
import android.arch.persistence.room.Dao; import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; 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.Criterion;
import com.todoroo.andlib.sql.Functions; import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao; import com.todoroo.astrid.data.TaskApiDao;
import com.todoroo.astrid.helper.UUIDHelper;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import org.tasks.R;
import org.tasks.jobs.AfterSaveIntentService; import org.tasks.jobs.AfterSaveIntentService;
import org.tasks.preferences.Preferences;
import org.tasks.receivers.PushReceiver; import org.tasks.receivers.PushReceiver;
import java.util.List; import java.util.List;
@ -50,16 +47,14 @@ public abstract class TaskDao {
private final Database database; private final Database database;
private Preferences preferences;
private Context context; private Context context;
public TaskDao(Database database) { public TaskDao(Database database) {
this.database = database; this.database = database;
} }
public void initialize(Context context, Preferences preferences) { public void initialize(Context context) {
this.context = context; this.context = context;
this.preferences = preferences;
} }
public List<Task> needsRefresh() { public List<Task> needsRefresh() {
@ -159,7 +154,7 @@ public abstract class TaskDao {
* *
*/ */
public void save(Task task) { public void save(Task task) {
ContentValues modifiedValues = createOrUpdate(task); ContentValues modifiedValues = saveExisting(task);
if (modifiedValues != null) { if (modifiedValues != null) {
AfterSaveIntentService.enqueue(context, task.getId(), modifiedValues); AfterSaveIntentService.enqueue(context, task.getId(), modifiedValues);
} else if (task.checkTransitory(SyncFlags.FORCE_SYNC)) { } else if (task.checkTransitory(SyncFlags.FORCE_SYNC)) {
@ -167,82 +162,13 @@ public abstract class TaskDao {
} }
} }
private ContentValues createOrUpdate(Task task) { @Insert
return task.getId() == Task.NO_ID abstract long insert(Task task);
? 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;
}
@Override public void createNew(Task task) {
public String toString() { task.id = null;
return "INSERT"; task.remoteId = task.getUuid();
} task.setId(insert(task));
};
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());
}
} }
private ContentValues saveExisting(Task item) { private ContentValues saveExisting(Task item) {
@ -267,7 +193,7 @@ public abstract class TaskDao {
return "UPDATE"; return "UPDATE";
} }
}; };
if (insertOrUpdateAndRecordChanges(item, update)) { if (updateAndRecordChanges(item, update)) {
return values; return values;
} }
return null; return null;
@ -308,7 +234,7 @@ public abstract class TaskDao {
boolean makeChange(); boolean makeChange();
} }
private boolean insertOrUpdateAndRecordChanges(Task item, DatabaseChangeOp op) { private boolean updateAndRecordChanges(Task item, DatabaseChangeOp op) {
final AtomicBoolean result = new AtomicBoolean(false); final AtomicBoolean result = new AtomicBoolean(false);
synchronized(database) { synchronized(database) {
result.set(op.makeChange()); result.set(op.makeChange());

@ -4,21 +4,24 @@ import android.content.ContentValues;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import com.google.common.base.Strings;
import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.api.PermaSql; import com.todoroo.astrid.api.PermaSql;
import org.tasks.data.TagDataDao;
import com.todoroo.astrid.dao.TaskDao; 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.data.Task;
import com.todoroo.astrid.gcal.GCalHelper; import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.helper.UUIDHelper;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.TitleParser; import com.todoroo.astrid.utility.TitleParser;
import org.tasks.R;
import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTask;
import org.tasks.data.GoogleTaskDao; import org.tasks.data.GoogleTaskDao;
import org.tasks.data.Tag; import org.tasks.data.Tag;
import org.tasks.data.TagDao; import org.tasks.data.TagDao;
import org.tasks.data.TagData;
import org.tasks.data.TagDataDao;
import org.tasks.preferences.Preferences; import org.tasks.preferences.Preferences;
import java.util.ArrayList; import java.util.ArrayList;
@ -50,23 +53,26 @@ public class TaskCreator {
this.googleTaskDao = googleTaskDao; this.googleTaskDao = googleTaskDao;
} }
public Task basicQuickAddTask(String title) { public void basicQuickAddTask(String title) {
title = title.trim(); title = title.trim();
Task task = createWithValues(null, title); Task task = createWithValues(null, title);
addToCalendar(task); taskDao.createNew(task);
return task;
}
public void addToCalendar(Task task) {
boolean gcalCreateEventEnabled = preferences.isDefaultCalendarSet() && task.hasDueDate(); //$NON-NLS-1$ boolean gcalCreateEventEnabled = preferences.isDefaultCalendarSet() && task.hasDueDate(); //$NON-NLS-1$
if (!TextUtils.isEmpty(task.getTitle()) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) { if (!TextUtils.isEmpty(task.getTitle()) && gcalCreateEventEnabled && TextUtils.isEmpty(task.getCalendarURI())) {
Uri calendarUri = gcalHelper.createTaskEvent(task, new ContentValues()); Uri calendarUri = gcalHelper.createTaskEvent(task, new ContentValues());
task.setCalendarUri(calendarUri.toString()); 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.setTitle(title.trim());
} }
task.setUuid(UUIDHelper.newUUID());
ArrayList<String> tags = new ArrayList<>(); ArrayList<String> tags = new ArrayList<>();
try { try {
parseQuickAddMarkup(task, tags); parseQuickAddMarkup(task, tags);
@ -91,56 +99,67 @@ public class TaskCreator {
for (Map.Entry<String, Object> item : values.entrySet()) { for (Map.Entry<String, Object> item : values.entrySet()) {
String key = item.getKey(); String key = item.getKey();
Object value = item.getValue(); Object value = item.getValue();
if (key.equals(Tag.KEY) || key.equals(GoogleTask.KEY)) { if (key.equals(Tag.KEY)) {
continue; tags.add((String) value);
} } else if (key.equals(GoogleTask.KEY)) {
task.putTransitory(key, value);
} else {
if (value instanceof String) { if (value instanceof String) {
value = PermaSql.replacePlaceholders((String) value); value = PermaSql.replacePlaceholders((String) value);
} }
AndroidUtilities.putInto(forTask, key, value); AndroidUtilities.putInto(forTask, key, value);
} }
}
task.mergeWithoutReplacement(forTask); 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) { if(!task.containsValue(Task.HIDE_UNTIL)) {
createLink(task, tag); 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; return task;
} }
private void saveWithoutPublishingFilterUpdate(Task item) { public static void setDefaultReminders(Preferences preferences, Task task) {
taskDao.save(item); if(!task.containsValue(Task.REMINDER_PERIOD)) {
task.setReminderPeriod(DateUtilities.ONE_HOUR *
preferences.getIntegerFromString(R.string.p_rmd_default_random_hours,
0));
}
if(!task.containsValue(Task.REMINDER_FLAGS)) {
task.setReminderFlags(preferences.getDefaultReminders() | preferences.getDefaultRingMode());
}
} }
private void createLink(Task task, String tagName) { public void createTags(Task task) {
TagData tagData = tagDataDao.getTagByName(tagName); for (String tag : task.getTags()) {
TagData tagData = tagDataDao.getTagByName(tag);
if (tagData == null) { if (tagData == null) {
tagData = new TagData(); tagData = new TagData();
tagData.setName(tagName); tagData.setName(tag);
tagDataDao.persist(tagData); tagDataDao.persist(tagData);
} }
createLink(task, tagData.getName(), tagData.getRemoteId()); Tag link = new Tag(task.getId(), task.getUuid(), 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); tagDao.insert(link);
} }
}
/** /**
* Parse quick add markup for the given task * Parse quick add markup for the given task

@ -1,11 +1,10 @@
package com.todoroo.astrid.service; 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.dao.TaskDao;
import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalHelper; import com.todoroo.astrid.gcal.GCalHelper;
import com.todoroo.astrid.helper.UUIDHelper;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.data.GoogleTask; import org.tasks.data.GoogleTask;
@ -18,6 +17,9 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import static com.google.common.collect.Lists.transform;
import static com.todoroo.andlib.utility.DateUtilities.now;
public class TaskDuplicator { public class TaskDuplicator {
private final GCalHelper gcalHelper; private final GCalHelper gcalHelper;
@ -39,32 +41,30 @@ public class TaskDuplicator {
public List<Task> duplicate(List<Task> tasks) { public List<Task> duplicate(List<Task> tasks) {
List<Task> result = new ArrayList<>(); List<Task> result = new ArrayList<>();
for (Task task : tasks) { for (Task task : tasks) {
result.add(clone(taskDao.fetch(task.getId()))); result.add(clone(task));
} }
localBroadcastManager.broadcastRefresh(); localBroadcastManager.broadcastRefresh();
return result; return result;
} }
private Task clone(Task clone) { private Task clone(Task clone) {
long originalId = clone.getId(); clone.setCreationDate(now());
clone.setModificationDate(now());
clone.setCreationDate(DateUtilities.now());
clone.setCompletionDate(0L); clone.setCompletionDate(0L);
clone.setDeletionDate(0L); clone.setDeletionDate(0L);
clone.setCalendarUri(""); clone.setCalendarUri("");
clone.clearValue(Task.ID); clone.setUuid(UUIDHelper.newUUID());
clone.clearValue(Task.UUID);
GoogleTask googleTask = googleTaskDao.getByTaskId(originalId); List<Tag> tags = tagDao.getTagsForTask(clone.getId());
GoogleTask googleTask = googleTaskDao.getByTaskId(clone.getId());
if (googleTask != null) { if (googleTask != null) {
clone.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true); clone.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
} }
clone.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true); clone.putTransitory(TaskDao.TRANS_SUPPRESS_REFRESH, true);
taskDao.save(clone); taskDao.createNew(clone);
tagDao.insert(Lists.transform( tagDao.insert(transform(tags,
tagDao.getTagsForTask(originalId),
tag -> new Tag(clone.getId(), clone.getUuid(), tag.getName(), tag.getTagUid()))); tag -> new Tag(clone.getId(), clone.getUuid(), tag.getName(), tag.getTagUid())));
if (googleTask != null) { if (googleTask != null) {
@ -73,6 +73,8 @@ public class TaskDuplicator {
gcalHelper.createTaskEventIfEnabled(clone); gcalHelper.createTaskEventIfEnabled(clone);
taskDao.save(clone); // TODO: delete me
return clone; return clone;
} }
} }

@ -143,7 +143,10 @@ public final class TagsControlSet extends TaskEditControlFragment {
selectedTags = savedInstanceState.getParcelableArrayList(EXTRA_SELECTED_TAGS); selectedTags = savedInstanceState.getParcelableArrayList(EXTRA_SELECTED_TAGS);
newTags = savedInstanceState.getStringArrayList(EXTRA_NEW_TAGS); newTags = savedInstanceState.getStringArrayList(EXTRA_NEW_TAGS);
} else { } else {
selectedTags = tagService.getTagDataForTask(task.getId()); selectedTags = new ArrayList<>();
selectedTags.addAll(task.isNew()
? transform(task.getTags(), tagDataDao::getTagByName)
: tagService.getTagDataForTask(task.getId()));
newTags = newArrayList(); newTags = newArrayList();
} }
allTags = tagService.getTagList(); allTags = tagService.getTagList();

@ -166,7 +166,8 @@ public class EditTitleControlSet extends TaskEditControlFragment {
@Override @Override
public boolean hasChanges(Task original) { public boolean hasChanges(Task original) {
return !title.equals(original.getTitle()) || return !title.equals(original.getTitle()) ||
isComplete != original.isCompleted(); isComplete != original.isCompleted() ||
(original.isNew() && !Strings.isNullOrEmpty(title));
} }
@Override @Override

@ -22,7 +22,6 @@ import org.tasks.data.UserActivityDao;
import org.tasks.db.Migrations; import org.tasks.db.Migrations;
import org.tasks.locale.Locale; import org.tasks.locale.Locale;
import org.tasks.notifications.NotificationDao; import org.tasks.notifications.NotificationDao;
import org.tasks.preferences.Preferences;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@ -136,9 +135,9 @@ public class ApplicationModule {
@Provides @Provides
@ApplicationScope @ApplicationScope
public TaskDao getTaskDao(Database database, Preferences preferences) { public TaskDao getTaskDao(Database database) {
TaskDao taskDao = database.getTaskDao(); TaskDao taskDao = database.getTaskDao();
taskDao.initialize(context, preferences); taskDao.initialize(context);
return taskDao; return taskDao;
} }
} }

@ -7,11 +7,20 @@ import android.support.v4.app.TaskStackBuilder;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.todoroo.astrid.activity.TaskListActivity; import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.data.Task;
public class TaskIntents { 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) { 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) { public static Intent getNewTaskIntent(Context context, String filterId) {
@ -24,12 +33,6 @@ public class TaskIntents {
return taskListIntent; 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) { public static Intent getTaskListIntent(Context context, final Filter filter) {
Intent intent = new Intent(context, TaskListActivity.class); Intent intent = new Intent(context, TaskListActivity.class);
if (filter != null) { if (filter != null) {

@ -71,6 +71,9 @@ public class TaskerTaskCreator {
task.setNotes(bundle.getDescription()); task.setNotes(bundle.getDescription());
taskDao.save(task); taskDao.createNew(task);
taskDao.save(task); // TODO: delete me
taskCreator.createTags(task);
} }
} }

Loading…
Cancel
Save