Fix sql constraint errors when cloning tasks, use transitory for sync suppress flags

pull/14/head
Sam Bosley 12 years ago
parent e8a5fc576f
commit c92693feef

@ -365,6 +365,24 @@ public abstract class AbstractModel implements Parcelable, Cloneable {
return transitoryData.get(key);
}
public Object clearTransitory(String key) {
if (transitoryData == null)
return null;
return transitoryData.remove(key);
}
// --- Convenience wrappers for using transitories as flags
public boolean checkTransitory(String flag) {
Object trans = getTransitory(flag);
return trans != null;
}
public boolean checkAndClearTransitory(String flag) {
Object trans = clearTransitory(flag);
return trans != null;
}
// --- property management
/**

@ -0,0 +1,10 @@
package com.todoroo.astrid.data;
@SuppressWarnings("nls")
public class SyncFlags {
public static final String ACTFM_SUPPRESS_SYNC = "actfm_suppress_sync";
public static final String GTASKS_SUPPRESS_SYNC = "gtasks_suppress_sync";
}

@ -37,6 +37,7 @@ import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterWithCustomIntent;
import com.todoroo.astrid.dao.UpdateDao;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.Update;
@ -47,7 +48,6 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.sync.SyncResultCallbackAdapter;
import com.todoroo.astrid.tags.TagFilterExposer;
import com.todoroo.astrid.utility.Constants;
import com.todoroo.astrid.utility.Flags;
@SuppressWarnings("nls")
public class C2DMReceiver extends BroadcastReceiver {
@ -133,7 +133,7 @@ public class C2DMReceiver extends BroadcastReceiver {
TagData tagData = new TagData();
if(cursor.getCount() == 0) {
tagData.setValue(TagData.REMOTE_ID, Long.parseLong(intent.getStringExtra("tag_id")));
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
tagData.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataService.save(tagData);
} else {
cursor.moveToNext();
@ -152,7 +152,7 @@ public class C2DMReceiver extends BroadcastReceiver {
final Task task = new Task();
if(cursor.getCount() == 0) {
task.setValue(Task.REMOTE_ID, Long.parseLong(intent.getStringExtra("task_id")));
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(task);
} else {
cursor.moveToNext();
@ -298,7 +298,7 @@ public class C2DMReceiver extends BroadcastReceiver {
task.setValue(Task.TITLE, intent.getStringExtra("title"));
task.setValue(Task.REMOTE_ID, Long.parseLong(intent.getStringExtra("task_id")));
task.setValue(Task.USER_ID, Task.USER_ID_UNASSIGNED);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(task);
new Thread(new Runnable() {
@ -338,7 +338,7 @@ public class C2DMReceiver extends BroadcastReceiver {
if(cursor.getCount() == 0) {
tagData.setValue(TagData.NAME, intent.getStringExtra("title"));
tagData.setValue(TagData.REMOTE_ID, Long.parseLong(intent.getStringExtra("tag_id")));
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
tagData.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataService.save(tagData);
new Thread(new Runnable() {

@ -44,6 +44,7 @@ import com.todoroo.astrid.activity.ShortcutActivity;
import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.helper.AsyncImageView;
import com.todoroo.astrid.helper.ImageDiskCache;
@ -318,7 +319,7 @@ public class TagSettingsActivity extends FragmentActivity {
imm.hideSoftInputFromWindow(tagName.getWindowToken(), 0);
if (isNewTag) {
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
tagData.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataService.save(tagData);
final Runnable loadTag = new Runnable() {
@ -436,7 +437,7 @@ public class TagSettingsActivity extends FragmentActivity {
imageCache.move(tagData.getValue(TagData.PICTURE), url);
}
tagData.setValue(TagData.PICTURE, url);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
tagData.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataService.save(tagData);
} catch (IOException e) {
DialogUtilities.okDialog(TagSettingsActivity.this, e.toString(), null);

@ -42,6 +42,7 @@ import com.todoroo.astrid.activity.AstridActivity;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.adapter.UpdateAdapter;
import com.todoroo.astrid.dao.UpdateDao;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.helper.AsyncImageView;
@ -51,7 +52,6 @@ import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.Flags;
public class TagUpdatesFragment extends ListFragment {
@ -361,7 +361,7 @@ public class TagUpdatesFragment extends ListFragment {
Log.e("EditNoteActivity", "Failed to put image to disk...");
}
}
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
update.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
updateDao.createNew(update);
final long updateId = update.getId();

@ -52,6 +52,7 @@ import com.todoroo.astrid.dao.UpdateDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.MetadataApiDao.MetadataCriteria;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.TaskApiDao;
@ -120,7 +121,7 @@ public final class ActFmSyncService {
taskDao.addListener(new ModelUpdateListener<Task>() {
@Override
public void onModelUpdated(final Task model) {
if(Flags.checkAndClear(Flags.ACTFM_SUPPRESS_SYNC))
if(model.checkAndClearTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC))
return;
if (actFmPreferenceService.isOngoing() && model.getTransitory("task-edit-save") == null)
return;
@ -149,7 +150,7 @@ public final class ActFmSyncService {
updateDao.addListener(new ModelUpdateListener<Update>() {
@Override
public void onModelUpdated(final Update model) {
if(Flags.checkAndClear(Flags.ACTFM_SUPPRESS_SYNC))
if(model.checkAndClearTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC))
return;
if (actFmPreferenceService.isOngoing())
return;
@ -169,7 +170,7 @@ public final class ActFmSyncService {
tagDataDao.addListener(new ModelUpdateListener<TagData>() {
@Override
public void onModelUpdated(final TagData model) {
if(Flags.checkAndClear(Flags.ACTFM_SUPPRESS_SYNC))
if(model.checkAndClearTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC))
return;
if (actFmPreferenceService.isOngoing())
return;
@ -439,7 +440,7 @@ public final class ActFmSyncService {
task.setValue(Task.LAST_SYNC, DateUtilities.now() + 1000L);
}
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskDao.saveExisting(task);
}
@ -558,7 +559,7 @@ public final class ActFmSyncService {
JSONObject result = actFmInvoker.invoke("tag_save", params.toArray(new Object[params.size()]));
if(newlyCreated) {
tagData.setValue(TagData.REMOTE_ID, result.optLong("id"));
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
tagData.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataDao.saveExisting(tagData);
}
} catch (ActFmServiceException e) {
@ -618,7 +619,7 @@ public final class ActFmSyncService {
JSONObject item = list.getJSONObject(i);
readIds(locals, item, remote);
JsonHelper.tagFromJson(item, remote);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataService.save(remote);
}
}
@ -660,7 +661,7 @@ public final class ActFmSyncService {
"token", token);
JsonHelper.tagFromJson(result, tagData);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
tagData.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
tagDataService.save(tagData);
}
@ -682,7 +683,7 @@ public final class ActFmSyncService {
ArrayList<Metadata> metadata = new ArrayList<Metadata>();
JsonHelper.taskFromJson(result, task, metadata);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(task);
metadataService.synchronizeMetadata(task.getId(), metadata, Metadata.KEY.eq(TagService.KEY));
}
@ -743,7 +744,7 @@ public final class ActFmSyncService {
remote.getValue(Task.DUE_DATE) < DateUtilities.now())
remote.setFlag(Task.REMINDER_FLAGS, Task.NOTIFY_AFTER_DEADLINE, false);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(remote);
ids.add(remote.getId());
metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY));
@ -800,7 +801,7 @@ public final class ActFmSyncService {
StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_COMPLETED);
}
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(remote);
ids.add(remote.getId());
metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY));
@ -943,7 +944,7 @@ public final class ActFmSyncService {
readIds(locals, item, remote);
JsonHelper.updateFromJson(item, remote);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
if(remote.getId() == AbstractModel.NO_ID)
updateDao.createNew(remote);
else

@ -16,6 +16,7 @@ import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksMetadata;
import com.todoroo.astrid.gtasks.GtasksMetadataService;
@ -26,7 +27,6 @@ import com.todoroo.astrid.gtasks.api.GtasksApiUtilities;
import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.gtasks.api.MoveRequest;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.utility.Flags;
public final class GtasksSyncService {
@ -93,7 +93,7 @@ public final class GtasksSyncService {
taskDao.addListener(new ModelUpdateListener<Task>() {
public void onModelUpdated(final Task model) {
if(Flags.checkAndClear(Flags.GTASKS_SUPPRESS_SYNC))
if(model.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC))
return;
if (gtasksPreferenceService.isOngoing()) //Don't try and sync changes that occur during a normal sync
return;
@ -131,7 +131,7 @@ public final class GtasksSyncService {
public void triggerMoveForMetadata(final Metadata metadata) {
if (Flags.checkAndClear(Flags.GTASKS_SUPPRESS_SYNC))
if (metadata.checkAndClearTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC))
return;
if (!metadata.getValue(Metadata.KEY).equals(GtasksMetadata.METADATA_KEY)) //Don't care about non-gtasks metadata
return;
@ -233,7 +233,7 @@ public final class GtasksSyncService {
task.setValue(Task.MODIFICATION_DATE, DateUtilities.now());
gtasksMetadata.setValue(GtasksMetadata.LAST_SYNC, DateUtilities.now() + 1000L);
metadataService.save(gtasksMetadata);
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
taskDao.saveExisting(task);
}
@ -250,7 +250,7 @@ public final class GtasksSyncService {
// Update order metadata from result
if (result != null) {
model.setValue(GtasksMetadata.GTASKS_ORDER, Long.parseLong(result.getPosition()));
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
model.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
metadataDao.saveExisting(model);
}
}

@ -27,6 +27,7 @@ import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.StoreObject;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gtasks.GtasksList;
import com.todoroo.astrid.gtasks.GtasksListService;
@ -44,7 +45,6 @@ import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.sync.SyncResultCallback;
import com.todoroo.astrid.sync.SyncV2Provider;
import com.todoroo.astrid.utility.Flags;
public class GtasksSyncV2Provider extends SyncV2Provider {
@ -270,7 +270,7 @@ public class GtasksSyncV2Provider extends SyncV2Provider {
TaskDao.setDefaultReminders(task.task);
}
if (!TextUtils.isEmpty(task.task.getValue(Task.TITLE))) {
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
task.task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
gtasksMetadataService.saveTaskAndMetadata(task);
}
}

@ -53,6 +53,7 @@ import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.UpdateDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.helper.AsyncImageView;
@ -63,7 +64,6 @@ import com.todoroo.astrid.service.StatisticsConstants;
import com.todoroo.astrid.service.StatisticsService;
import com.todoroo.astrid.sync.SyncResultCallback;
import com.todoroo.astrid.timers.TimerActionControlSet.TimerActionListener;
import com.todoroo.astrid.utility.Flags;
public class EditNoteActivity extends LinearLayout implements TimerActionListener {
@ -436,7 +436,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
Log.e("EditNoteActivity", "Failed to put image to disk...");
}
}
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
update.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
updateDao.createNew(update);
final long updateId = update.getId();

@ -24,13 +24,13 @@ import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Metadata;
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.opencrx.OpencrxCoreUtils;
import com.todoroo.astrid.producteev.sync.ProducteevTask;
import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.utility.Flags;
import com.todoroo.astrid.utility.TitleParser;
@ -122,6 +122,8 @@ public class TaskService {
try {
if(cursor.getCount() > 0) {
Metadata metadata = new Metadata();
newTask.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
newTask.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
taskDao.save(newTask);
long newId = newTask.getId();
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
@ -388,8 +390,6 @@ public class TaskService {
clone.setValue(Task.CALENDAR_URI, ""); //$NON-NLS-1$
GCalHelper.createTaskEventIfEnabled(clone);
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
save(clone);
return clone.getId();
}
@ -405,7 +405,7 @@ public class TaskService {
* @return
*/
public static Task createWithValues(ContentValues values, String title,
TaskService taskService, MetadataService metadataService) {
TaskService taskService, MetadataService metadataService, String...flags) {
Task task = new Task();
if (title != null)
task.setValue(Task.TITLE, title);
@ -430,6 +430,10 @@ public class TaskService {
}
task.mergeWith(forTask);
}
for (String flag : flags) {
task.putTransitory(flag, true);
}
boolean markup = taskService.quickAdd(task);
if (markup)
task.putTransitory(TRANS_QUICK_ADD_MARKUP, true);

@ -1,5 +1,6 @@
package com.todoroo.astrid.ui;
import java.util.ArrayList;
import java.util.HashSet;
import android.app.Activity;
@ -36,6 +37,7 @@ import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.activity.TaskListFragment.OnTaskListItemClickedListener;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.data.SyncFlags;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.gcal.GCalControlSet;
@ -271,14 +273,16 @@ public class QuickAddBar extends LinearLayout {
deadlineControl.isDeadlineSet() ||
!assignedToMe; // Will the quickadd save have any effect?
ArrayList<String> flags = new ArrayList<String>();
if (quickAddChanges)
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
flags.add(SyncFlags.ACTFM_SUPPRESS_SYNC);
if (deadlineControl.isDeadlineSet()) // If deadline is set, second save will trigger push
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
flags.add(SyncFlags.GTASKS_SUPPRESS_SYNC);
Task task = TaskService.createWithValues(fragment.getFilter().valuesForNewTasks, title,
taskService, metadataService);
taskService, metadataService, flags.toArray(new String[flags.size()]));
if (repeatControl.isRecurrenceSet())
repeatControl.writeToModel(task);
@ -305,8 +309,8 @@ public class QuickAddBar extends LinearLayout {
Uri calendarUri = GCalHelper.createTaskEvent(task,
activity.getContentResolver(), new ContentValues());
task.setValue(Task.CALENDAR_URI, calendarUri.toString());
Flags.set(Flags.ACTFM_SUPPRESS_SYNC);
Flags.set(Flags.GTASKS_SUPPRESS_SYNC);
task.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
task.putTransitory(SyncFlags.GTASKS_SUPPRESS_SYNC, true);
taskService.save(task);
}

@ -21,16 +21,6 @@ public class Flags {
*/
public static final int TOAST_ON_SAVE = 1 << 2;
/**
* If set, indicates to suppress the next act.fm sync attempt
*/
public static final int ACTFM_SUPPRESS_SYNC = 1 << 3;
/**
* If set, indicates to suppress the next gtasks sync attempt
*/
public static final int GTASKS_SUPPRESS_SYNC = 1 << 4;
/**
* If set, indicates that the edit popover was dismissed by the edit fragment/back button
*/

Loading…
Cancel
Save