Try reusing old remoteId property as the new uuid property by recasting it as a string

pull/14/head
Sam Bosley 13 years ago
parent 0db2ff6089
commit 9079309539

@ -50,6 +50,15 @@ abstract public class RemoteModel extends AbstractModel {
/** constant value for no uuid */ /** constant value for no uuid */
public static final String NO_UUID = "0"; //$NON-NLS-1$ public static final String NO_UUID = "0"; //$NON-NLS-1$
public static final boolean isValidUuid(String uuid) {
try {
long value = Long.parseLong(uuid);
return value > 0;
} catch (NumberFormatException e) {
return isUuidEmpty(uuid);
}
}
/** /**
* Utility method to get the identifier of the model, if it exists. * Utility method to get the identifier of the model, if it exists.
* *

@ -278,7 +278,8 @@ public abstract class CommentsFragment extends ListFragment {
if (hasModel()) { if (hasModel()) {
performFetch(manual, doneRunnable); performFetch(manual, doneRunnable);
} else { } else {
actFmSyncService.fetchPersonalUpdates(manual, doneRunnable); // actFmSyncService.fetchPersonalUpdates(manual, doneRunnable);
doneRunnable.run();
} }
callback.incrementProgress(50); callback.incrementProgress(50);
} }

@ -110,7 +110,8 @@ public class TagCommentsFragment extends CommentsFragment {
@Override @Override
protected void performFetch(boolean manual, Runnable done) { protected void performFetch(boolean manual, Runnable done) {
actFmSyncService.fetchUpdatesForTag(tagData, manual, done); done.run();
// actFmSyncService.fetchUpdatesForTag(tagData, manual, done);
} }
@Override @Override
@ -120,7 +121,7 @@ public class TagCommentsFragment extends CommentsFragment {
update.setValue(Update.MESSAGE, addCommentField.getText().toString()); update.setValue(Update.MESSAGE, addCommentField.getText().toString());
update.setValue(Update.ACTION_CODE, "tag_comment"); update.setValue(Update.ACTION_CODE, "tag_comment");
update.setValue(Update.USER_ID, Task.USER_ID_SELF); update.setValue(Update.USER_ID, Task.USER_ID_SELF);
update.setValue(Update.TAGS, "," + tagData.getValue(TagData.REMOTE_ID) + ","); update.setValue(Update.TAGS, "," + tagData.getValue(TagData.UUID) + ",");
update.setValue(Update.TAGS_LOCAL, "," + tagData.getId() + ","); update.setValue(Update.TAGS_LOCAL, "," + tagData.getId() + ",");
update.setValue(Update.CREATION_DATE, DateUtilities.now()); update.setValue(Update.CREATION_DATE, DateUtilities.now());
update.setValue(Update.TARGET_NAME, tagData.getValue(TagData.NAME)); update.setValue(Update.TARGET_NAME, tagData.getValue(TagData.NAME));
@ -134,8 +135,8 @@ public class TagCommentsFragment extends CommentsFragment {
@Override @Override
protected void setLastViewed() { protected void setLastViewed() {
if(tagData != null && tagData.getValue(TagData.REMOTE_ID) > 0) { if(tagData != null && RemoteModel.isValidUuid(tagData.getValue(TagData.UUID))) {
Preferences.setLong(UPDATES_LAST_VIEWED + tagData.getValue(TagData.REMOTE_ID), DateUtilities.now()); Preferences.setLong(UPDATES_LAST_VIEWED + tagData.getValue(TagData.UUID), DateUtilities.now());
Activity activity = getActivity(); Activity activity = getActivity();
if (activity instanceof TaskListActivity) if (activity instanceof TaskListActivity)
((TaskListActivity) activity).setCommentsCount(0); ((TaskListActivity) activity).setCommentsCount(0);

@ -55,11 +55,11 @@ public class TaskCommentsFragment extends CommentsFragment {
@Override @Override
protected Cursor getCursor() { protected Cursor getCursor() {
if (!task.containsNonNullValue(Task.REMOTE_ID)) if (!task.containsNonNullValue(Task.UUID))
return updateDao.query(Query.select(Update.PROPERTIES).where(Update.TASK_LOCAL.eq(task.getId())).orderBy(Order.desc(Update.CREATION_DATE))); return updateDao.query(Query.select(Update.PROPERTIES).where(Update.TASK_LOCAL.eq(task.getId())).orderBy(Order.desc(Update.CREATION_DATE)));
else else
return updateDao.query(Query.select(Update.PROPERTIES).where(Criterion.or( return updateDao.query(Query.select(Update.PROPERTIES).where(Criterion.or(
Update.TASK.eq(task.getValue(Task.REMOTE_ID)), Update.TASK_LOCAL.eq(task.getId()))).orderBy(Order.desc(Update.CREATION_DATE))); Update.TASK.eq(task.getValue(Task.UUID)), Update.TASK_LOCAL.eq(task.getId()))).orderBy(Order.desc(Update.CREATION_DATE)));
} }
@Override @Override
@ -79,7 +79,8 @@ public class TaskCommentsFragment extends CommentsFragment {
@Override @Override
protected void performFetch(boolean manual, Runnable done) { protected void performFetch(boolean manual, Runnable done) {
actFmSyncService.fetchUpdatesForTask(task, manual, done); done.run();
// actFmSyncService.fetchUpdatesForTask(task, manual, done);
} }
@Override @Override
@ -88,7 +89,7 @@ public class TaskCommentsFragment extends CommentsFragment {
update.setValue(Update.MESSAGE, addCommentField.getText().toString()); update.setValue(Update.MESSAGE, addCommentField.getText().toString());
update.setValue(Update.ACTION_CODE, UpdateAdapter.UPDATE_TASK_COMMENT); update.setValue(Update.ACTION_CODE, UpdateAdapter.UPDATE_TASK_COMMENT);
update.setValue(Update.USER_ID, Task.USER_ID_SELF); update.setValue(Update.USER_ID, Task.USER_ID_SELF);
if (task.containsNonNullValue(Task.REMOTE_ID)) if (task.containsNonNullValue(Task.UUID))
update.setValue(Update.TASK_UUID, task.getValue(Task.UUID)); update.setValue(Update.TASK_UUID, task.getValue(Task.UUID));
update.setValue(Update.TASK_LOCAL, task.getId()); update.setValue(Update.TASK_LOCAL, task.getId());
update.setValue(Update.CREATION_DATE, DateUtilities.now()); update.setValue(Update.CREATION_DATE, DateUtilities.now());

@ -10,7 +10,6 @@ import org.json.JSONObject;
import android.content.Context; import android.content.Context;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
@ -20,9 +19,9 @@ import com.todoroo.andlib.sql.Functions;
import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Join;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.dao.UserDao; import com.todoroo.astrid.dao.UserDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.service.MetadataService;
@ -57,32 +56,6 @@ public final class ActFmDataService {
// --- task and metadata methods // --- task and metadata methods
/**
* Currently, this method does nothing, there is an alternate method to create tasks
* @param properties
* @return
*/
public TodorooCursor<Task> getLocallyCreated(Property<?>[] properties) {
return taskDao.query(Query.select(properties).where(Criterion.and(TaskCriteria.isActive(),
Task.REMOTE_ID.isNull())));
}
/**
* Gets tasks that were modified since last sync
* @param properties
* @return null if never sync'd
*/
public TodorooCursor<Task> getLocallyUpdated(Property<?>[] properties) {
long lastSyncDate = actFmPreferenceService.getLastSyncDate();
if(lastSyncDate == 0)
return taskDao.query(Query.select(properties).where(Criterion.none));
return
taskDao.query(Query.select(properties).
where(Criterion.and(Task.REMOTE_ID.isNotNull(),
Task.MODIFICATION_DATE.gt(lastSyncDate),
Task.MODIFICATION_DATE.gt(Task.LAST_SYNC))).groupBy(Task.ID));
}
/** /**
* Save / Merge JSON tagData * Save / Merge JSON tagData
* @param tagObject * @param tagObject
@ -91,8 +64,8 @@ public final class ActFmDataService {
@SuppressWarnings("nls") @SuppressWarnings("nls")
public void saveTagData(JSONObject tagObject) throws JSONException { public void saveTagData(JSONObject tagObject) throws JSONException {
TodorooCursor<TagData> cursor = tagDataService.query(Query.select(TagData.PROPERTIES).where( TodorooCursor<TagData> cursor = tagDataService.query(Query.select(TagData.PROPERTIES).where(
Criterion.or(TagData.REMOTE_ID.eq(tagObject.get("id")), Criterion.or(TagData.UUID.eq(tagObject.get("id")),
Criterion.and(TagData.REMOTE_ID.eq(0), Criterion.and(TagData.UUID.eq(RemoteModel.NO_UUID),
TagData.NAME.eqCaseInsensitive(tagObject.getString("name")))))); TagData.NAME.eqCaseInsensitive(tagObject.getString("name"))))));
try { try {
cursor.moveToNext(); cursor.moveToNext();
@ -122,7 +95,7 @@ public final class ActFmDataService {
@SuppressWarnings("nls") @SuppressWarnings("nls")
public void saveFeaturedList(JSONObject featObject) throws JSONException { public void saveFeaturedList(JSONObject featObject) throws JSONException {
TodorooCursor<TagData> cursor = tagDataService.query(Query.select(TagData.PROPERTIES).where( TodorooCursor<TagData> cursor = tagDataService.query(Query.select(TagData.PROPERTIES).where(
Criterion.and(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0), TagData.REMOTE_ID.eq(featObject.get("id"))))); Criterion.and(Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).gt(0), TagData.UUID.eq(featObject.get("id")))));
try { try {
cursor.moveToNext(); cursor.moveToNext();
TagData tagData = new TagData(); TagData tagData = new TagData();

@ -22,13 +22,11 @@ import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.ContextManager;
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.Join;
import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.Preferences; import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.billing.BillingConstants; import com.todoroo.astrid.billing.BillingConstants;
import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.dao.UserDao; import com.todoroo.astrid.dao.UserDao;
import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagData;
@ -42,8 +40,8 @@ import com.todoroo.astrid.service.TaskService;
import com.todoroo.astrid.subtasks.SubtasksUpdater; import com.todoroo.astrid.subtasks.SubtasksUpdater;
import com.todoroo.astrid.sync.SyncResultCallback; import com.todoroo.astrid.sync.SyncResultCallback;
import com.todoroo.astrid.sync.SyncV2Provider; import com.todoroo.astrid.sync.SyncV2Provider;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.tags.TagService; import com.todoroo.astrid.tags.TagService;
import com.todoroo.astrid.tags.TaskToTagMetadata;
import com.todoroo.astrid.utility.Flags; import com.todoroo.astrid.utility.Flags;
/** /**
@ -107,7 +105,7 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
@Override @Override
public void pushRemoteModel(User model) { public void pushRemoteModel(User model) {
actFmSyncService.pushUser(model); // actFmSyncService.pushUser(model);
} }
}; };
@ -115,14 +113,14 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
@Override @Override
public void pushRemoteModel(Metadata model) { public void pushRemoteModel(Metadata model) {
long taskId = model.getValue(Metadata.TASK); // long taskId = model.getValue(Metadata.TASK);
Task localTask = taskService.fetchById(taskId, Task.REMOTE_ID); // Task localTask = taskService.fetchById(taskId, Task.REMOTE_ID);
long remoteTaskId = localTask.getValue(Task.REMOTE_ID); // long remoteTaskId = localTask.getValue(Task.REMOTE_ID);
//
if (model.getValue(FileMetadata.DELETION_DATE) > 0) // if (model.getValue(FileMetadata.DELETION_DATE) > 0)
actFmSyncService.deleteAttachment(model); // actFmSyncService.deleteAttachment(model);
else if (remoteTaskId > 0) // else if (remoteTaskId > 0)
actFmSyncService.pushAttachment(remoteTaskId, model); // actFmSyncService.pushAttachment(remoteTaskId, model);
}; };
public Metadata getRemoteModelInstance(TodorooCursor<Metadata> cursor) { public Metadata getRemoteModelInstance(TodorooCursor<Metadata> cursor) {
@ -239,21 +237,21 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
int time = Preferences.getInt(LAST_USERS_FETCH_TIME, 0); // int time = Preferences.getInt(LAST_USERS_FETCH_TIME, 0);
try { // try {
pushQueuedUsers(callback, finisher); // pushQueuedUsers(callback, finisher);
time = actFmSyncService.fetchUsers(); // time = actFmSyncService.fetchUsers();
Preferences.setInt(LAST_USERS_FETCH_TIME, time); // Preferences.setInt(LAST_USERS_FETCH_TIME, time);
} catch (JSONException e) { // } catch (JSONException e) {
handler.handleException("actfm-sync", e, e.toString()); //$NON-NLS-1$ // handler.handleException("actfm-sync", e, e.toString()); //$NON-NLS-1$
} catch (IOException e) { // } catch (IOException e) {
handler.handleException("actfm-sync", e, e.toString()); //$NON-NLS-1$ // handler.handleException("actfm-sync", e, e.toString()); //$NON-NLS-1$
} finally { // } finally {
callback.incrementProgress(20); // callback.incrementProgress(20);
if(finisher.decrementAndGet() == 0) { // if(finisher.decrementAndGet() == 0) {
finishSync(callback); // finishSync(callback);
} // }
} // }
} }
}).start(); }).start();
} }
@ -286,15 +284,15 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
/** fetch changes to personal updates and push unpushed updates */ /** fetch changes to personal updates and push unpushed updates */
private void startUpdatesFetcher(final boolean manual, final SyncResultCallback callback, private void startUpdatesFetcher(final boolean manual, final SyncResultCallback callback,
final AtomicInteger finisher) { final AtomicInteger finisher) {
actFmSyncService.fetchPersonalUpdates(manual, new Runnable() { // Also pushes queued updates // actFmSyncService.fetchPersonalUpdates(manual, new Runnable() { // Also pushes queued updates
@Override // @Override
public void run() { // public void run() {
callback.incrementProgress(20); // callback.incrementProgress(20);
if (finisher.decrementAndGet() == 0) { // if (finisher.decrementAndGet() == 0) {
finishSync(callback); // finishSync(callback);
} // }
} // }
}); // });
} }
/** fetch changes to tags */ /** fetch changes to tags */
@ -392,48 +390,48 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
private void pushQueuedTasks(final SyncResultCallback callback, private void pushQueuedTasks(final SyncResultCallback callback,
final AtomicInteger finisher) { final AtomicInteger finisher) {
TodorooCursor<Task> taskCursor; // TodorooCursor<Task> taskCursor;
Query query = Query.select(Task.PROPERTIES). // Query query = Query.select(Task.PROPERTIES).
where(Criterion.or( // where(Criterion.or(
Criterion.and(TaskCriteria.isActive(), // Criterion.and(TaskCriteria.isActive(),
Task.REMOTE_ID.isNull()), // Task.REMOTE_ID.isNull()),
Criterion.and(Task.REMOTE_ID.isNotNull(), // Criterion.and(Task.REMOTE_ID.isNotNull(),
Task.MODIFICATION_DATE.gt(Task.LAST_SYNC)))); // Task.MODIFICATION_DATE.gt(Task.LAST_SYNC))));
taskCursor = taskService.query(query); // taskCursor = taskService.query(query);
//
try { // try {
pushQueued(callback, finisher, taskCursor, true, taskPusher); // pushQueued(callback, finisher, taskCursor, true, taskPusher);
} finally { // } finally {
taskCursor.close(); // taskCursor.close();
} // }
//
if (ActFmPreferenceService.isPremiumUser()) { // if (ActFmPreferenceService.isPremiumUser()) {
TodorooCursor<Metadata> filesCursor = metadataService.query(Query.select(Metadata.PROPERTIES) // TodorooCursor<Metadata> filesCursor = metadataService.query(Query.select(Metadata.PROPERTIES)
.where(Criterion.and( // .where(Criterion.and(
MetadataCriteria.withKey(FileMetadata.METADATA_KEY), // MetadataCriteria.withKey(FileMetadata.METADATA_KEY),
Criterion.or(FileMetadata.REMOTE_ID.eq(0), FileMetadata.DELETION_DATE.gt(0))))); // Criterion.or(FileMetadata.REMOTE_ID.eq(0), FileMetadata.DELETION_DATE.gt(0)))));
try { // try {
pushQueued(callback, finisher, filesCursor, false, filesPusher); // pushQueued(callback, finisher, filesCursor, false, filesPusher);
} finally { // } finally {
filesCursor.close(); // filesCursor.close();
} // }
} // }
} }
private void pushQueuedTags(final SyncResultCallback callback, private void pushQueuedTags(final SyncResultCallback callback,
final AtomicInteger finisher, int lastTagSyncTime) { final AtomicInteger finisher, int lastTagSyncTime) {
TodorooCursor<TagData> tagDataCursor = tagDataService.query(Query.select(TagData.PROPERTIES) // TodorooCursor<TagData> tagDataCursor = tagDataService.query(Query.select(TagData.PROPERTIES)
.where(Criterion.and( // .where(Criterion.and(
Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).eq(0), // Functions.bitwiseAnd(TagData.FLAGS, TagData.FLAG_FEATURED).eq(0),
Criterion.or( // Criterion.or(
TagData.REMOTE_ID.eq(0), // TagData.REMOTE_ID.eq(0),
Criterion.and(TagData.REMOTE_ID.gt(0), // Criterion.and(TagData.REMOTE_ID.gt(0),
TagData.MODIFICATION_DATE.gt(lastTagSyncTime)))))); // TagData.MODIFICATION_DATE.gt(lastTagSyncTime))))));
try { // try {
pushQueued(callback, finisher, tagDataCursor, true, tagPusher); // pushQueued(callback, finisher, tagDataCursor, true, tagPusher);
} finally { // } finally {
tagDataCursor.close(); // tagDataCursor.close();
} // }
} }
@ -487,24 +485,24 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
} }
private void synchronizeUser(final User user, final boolean manual, final SyncResultCallback callback) { private void synchronizeUser(final User user, final boolean manual, final SyncResultCallback callback) {
if (user.getValue(User.REMOTE_ID) == 0) // if (user.getValue(User.REMOTE_ID) == 0)
return; // return;
//
new Thread(new Runnable() { // new Thread(new Runnable() {
@Override // @Override
public void run() { // public void run() {
callback.started(); // callback.started();
callback.incrementMax(100); // callback.incrementMax(100);
//
actFmSyncService.waitUntilEmpty(); // actFmSyncService.waitUntilEmpty();
actFmSyncService.fetchTasksForUser(user, manual, new Runnable() { // actFmSyncService.fetchTasksForUser(user, manual, new Runnable() {
public void run() { // public void run() {
callback.finished(); // callback.finished();
} // }
}); // });
callback.incrementProgress(50); // callback.incrementProgress(50);
} // }
}).start(); // }).start();
} }
private void fetchTagData(final TagData tagData, final boolean noRemoteId, private void fetchTagData(final TagData tagData, final boolean noRemoteId,
@ -541,14 +539,14 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
private void fetchUpdatesForTag(final TagData tagData, boolean manual, final SyncResultCallback callback, private void fetchUpdatesForTag(final TagData tagData, boolean manual, final SyncResultCallback callback,
final AtomicInteger finisher) { final AtomicInteger finisher) {
actFmSyncService.fetchUpdatesForTag(tagData, manual, new Runnable() { // actFmSyncService.fetchUpdatesForTag(tagData, manual, new Runnable() {
@Override // @Override
public void run() { // public void run() {
callback.incrementProgress(20); // callback.incrementProgress(20);
if(finisher.decrementAndGet() == 0) // if(finisher.decrementAndGet() == 0)
callback.finished(); // callback.finished();
} // }
}); // });
} }
private void fetchTasksForTag(final TagData tagData, boolean manual, final boolean pushOrder, final SyncResultCallback callback, private void fetchTasksForTag(final TagData tagData, boolean manual, final boolean pushOrder, final SyncResultCallback callback,
@ -587,19 +585,19 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
allTagged.close(); allTagged.close();
} }
TodorooCursor<Task> taskCursor = taskService.query(Query.select(Task.PROPERTIES) // TodorooCursor<Task> taskCursor = taskService.query(Query.select(Task.PROPERTIES)
.join(Join.inner(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(TaskToTagMetadata.KEY), Metadata.TASK.eq(Task.ID), // .join(Join.inner(Metadata.TABLE, Criterion.and(Metadata.KEY.eq(TaskToTagMetadata.KEY), Metadata.TASK.eq(Task.ID),
TaskToTagMetadata.TAG_NAME.eqCaseInsensitive(tagData.getValue(TagData.NAME))))) // TaskToTagMetadata.TAG_NAME.eqCaseInsensitive(tagData.getValue(TagData.NAME)))))
.where(Criterion.or( // .where(Criterion.or(
Criterion.and(TaskCriteria.isActive(), // Criterion.and(TaskCriteria.isActive(),
Task.REMOTE_ID.isNull()), // Task.REMOTE_ID.isNull()),
Criterion.and(Task.REMOTE_ID.isNotNull(), // Criterion.and(Task.REMOTE_ID.isNotNull(),
Task.MODIFICATION_DATE.gt(Task.LAST_SYNC))))); // Task.MODIFICATION_DATE.gt(Task.LAST_SYNC)))));
try { // try {
pushQueued(callback, finisher, taskCursor, true, taskPusher); // pushQueued(callback, finisher, taskCursor, true, taskPusher);
} finally { // } finally {
taskCursor.close(); // taskCursor.close();
} // }
TodorooCursor<Metadata> filesCursor = metadataService.query(Query.select(Metadata.PROPERTIES) TodorooCursor<Metadata> filesCursor = metadataService.query(Query.select(Metadata.PROPERTIES)
.where(Criterion.and( .where(Criterion.and(

@ -79,10 +79,10 @@ public class AstridNewSyncMigrator {
// -------------- // --------------
// Then ensure that every remote model has a remote id, by generating one using the uuid generator for all those without one // Then ensure that every remote model has a remote id, by generating one using the uuid generator for all those without one
// -------------- // --------------
Query tagsQuery = Query.select(TagData.ID, TagData.REMOTE_ID).where(Criterion.all); Query tagsQuery = Query.select(TagData.ID, TagData.UUID).where(Criterion.or(TagData.UUID.eq(RemoteModel.NO_UUID), TagData.UUID.isNull()));
assertUUIDsExist(tagsQuery, new TagData(), tagDataDao, null); assertUUIDsExist(tagsQuery, new TagData(), tagDataDao, null);
Query tasksQuery = Query.select(Task.ID, Task.REMOTE_ID, Task.RECURRENCE, Task.FLAGS).where(Criterion.all); Query tasksQuery = Query.select(Task.ID, Task.UUID, Task.RECURRENCE, Task.FLAGS).where(Criterion.all);
assertUUIDsExist(tasksQuery, new Task(), taskDao, new UUIDAssertionExtras<Task>() { assertUUIDsExist(tasksQuery, new Task(), taskDao, new UUIDAssertionExtras<Task>() {
@Override @Override
public void beforeSave(Task instance) { public void beforeSave(Task instance) {
@ -109,7 +109,7 @@ public class AstridNewSyncMigrator {
} }
}); });
Query updatesWithoutUUIDQuery = Query.select(Update.ID, Update.REMOTE_ID, Update.TASK).where(Criterion.all); Query updatesWithoutUUIDQuery = Query.select(Update.ID, Update.UUID, Update.TASK).where(Criterion.all);
assertUUIDsExist(updatesWithoutUUIDQuery, new Update(), updateDao, new UUIDAssertionExtras<Update>() { assertUUIDsExist(updatesWithoutUUIDQuery, new Update(), updateDao, new UUIDAssertionExtras<Update>() {
@Override @Override
public void beforeSave(Update instance) { public void beforeSave(Update instance) {
@ -173,12 +173,9 @@ public class AstridNewSyncMigrator {
try { try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
instance.readPropertiesFromCursor(cursor); instance.readPropertiesFromCursor(cursor);
if (!instance.containsNonNullValue(RemoteModel.REMOTE_ID_PROPERTY) || instance.getValue(RemoteModel.REMOTE_ID_PROPERTY) == 0) { if (!instance.containsNonNullValue(RemoteModel.UUID_PROPERTY) || RemoteModel.NO_UUID.equals(instance.getValue(RemoteModel.UUID_PROPERTY))) {
// No remote id exists, just create a UUID // No remote id exists, just create a UUID
instance.setValue(RemoteModel.UUID_PROPERTY, UUIDHelper.newUUID()); instance.setValue(RemoteModel.UUID_PROPERTY, UUIDHelper.newUUID());
} else {
// Migrate remote id to uuid field
instance.setValue(RemoteModel.UUID_PROPERTY, Long.toString(instance.getValue(RemoteModel.REMOTE_ID_PROPERTY)));
} }
if (extras != null) if (extras != null)
extras.beforeSave(instance); extras.beforeSave(instance);

@ -416,13 +416,15 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene
} }
actFmSyncService.fetchUpdatesForTask(task, manual, new Runnable() { // actFmSyncService.fetchUpdatesForTask(task, manual, new Runnable() {
@Override // @Override
public void run() { // public void run() {
// callback.incrementProgress(50);
// callback.finished();
// }
// });
callback.incrementProgress(50); callback.incrementProgress(50);
callback.finished(); callback.finished();
}
});
callback.incrementProgress(50); callback.incrementProgress(50);
} }

@ -86,7 +86,7 @@ public class PeopleFilterExposer extends BroadcastReceiver {
String email = user.getValue(User.EMAIL); String email = user.getValue(User.EMAIL);
Criterion criterion; Criterion criterion;
if (TextUtils.isEmpty(email) || "null".equals(email)) if (TextUtils.isEmpty(email) || "null".equals(email))
criterion = Task.USER_ID.eq(user.getValue(User.REMOTE_ID)); criterion = Task.USER_ID.eq(user.getValue(User.UUID));
else else
criterion = Criterion.or(Task.USER_ID.eq(user.getValue(User.UUID)), criterion = Criterion.or(Task.USER_ID.eq(user.getValue(User.UUID)),
Task.USER.like("%" + email + "%")); // Deprecated field OK for backwards compatibility Task.USER.like("%" + email + "%")); // Deprecated field OK for backwards compatibility

@ -203,7 +203,7 @@ public class PersonViewFragment extends TaskListFragment {
public void run() { public void run() {
// TODO: Fix friend status logic for new sync scheme // TODO: Fix friend status logic for new sync scheme
if (!TextUtils.isEmpty(user.getValue(User.PENDING_STATUS))) { if (!TextUtils.isEmpty(user.getValue(User.PENDING_STATUS))) {
actFmSyncService.pushUser(user); // actFmSyncService.pushUser(user);
user = userDao.fetch(user.getId(), User.PROPERTIES); user = userDao.fetch(user.getId(), User.PROPERTIES);
} }
// SyncResultCallback callback; // SyncResultCallback callback;

@ -147,23 +147,23 @@ public class SubtasksHelper {
if (localToRemote) if (localToRemote)
criterion = Task.ID.in(localIds); criterion = Task.ID.in(localIds);
else else
criterion = Task.REMOTE_ID.in(localIds); criterion = Task.UUID.in(localIds);
TodorooCursor<Task> tasks = PluginServices.getTaskService().query(Query.select(Task.ID, Task.REMOTE_ID).where(criterion)); TodorooCursor<Task> tasks = PluginServices.getTaskService().query(Query.select(Task.ID, Task.UUID).where(criterion));
try { try {
Task t = new Task(); Task t = new Task();
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) { for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
t.clear(); t.clear();
t.readFromCursor(tasks); t.readFromCursor(tasks);
if (t.containsNonNullValue(Task.REMOTE_ID)) { if (t.containsNonNullValue(Task.UUID)) {
Long key; Long key;
Long value; Long value;
if (localToRemote) { if (localToRemote) {
key = t.getId(); key = t.getId();
value = t.getValue(Task.REMOTE_ID); value = Long.parseLong(t.getValue(Task.UUID));
} else { } else {
key = t.getValue(Task.REMOTE_ID); key = Long.parseLong(t.getValue(Task.UUID));
value = t.getId(); value = t.getId();
} }

@ -53,8 +53,8 @@ public class TagCaseMigrator {
if (first.tag.equalsIgnoreCase(second.tag)) { if (first.tag.equalsIgnoreCase(second.tag)) {
shouldShowDialog = true; shouldShowDialog = true;
markForRenaming(first.tag, first.remoteId); markForRenaming(first.tag, Long.parseLong(first.uuid));
markForRenaming(second.tag, second.remoteId); markForRenaming(second.tag, Long.parseLong(second.uuid));
} }
} }
@ -92,9 +92,9 @@ public class TagCaseMigrator {
private void updateTagData(String tag) { private void updateTagData(String tag) {
long remoteId = nameToRemoteId.get(tag); long remoteId = nameToRemoteId.get(tag);
TodorooCursor<TagData> tagData = tagDataService.query(Query.select(TagData.NAME, TagData.REMOTE_ID) TodorooCursor<TagData> tagData = tagDataService.query(Query.select(TagData.NAME, TagData.UUID)
.where(Criterion.and( .where(Criterion.and(
TagData.NAME.eq(tag), TagData.REMOTE_ID.eq(remoteId)))); TagData.NAME.eq(tag), TagData.UUID.eq(remoteId))));
try { try {
for (tagData.moveToFirst(); !tagData.isAfterLast(); tagData.moveToNext()) { for (tagData.moveToFirst(); !tagData.isAfterLast(); tagData.moveToNext()) {
TagData curr = new TagData(tagData); TagData curr = new TagData(tagData);

@ -111,8 +111,6 @@ public final class TagService {
public String userId; public String userId;
public long memberCount; public long memberCount;
@Deprecated public long remoteId;
public static Tag tagFromUUID(String uuid) { public static Tag tagFromUUID(String uuid) {
TodorooCursor<TagData> tagData = PluginServices.getTagDataService().query(Query.select(TagData.PROPERTIES).where(TagData.UUID.eq(uuid))); TodorooCursor<TagData> tagData = PluginServices.getTagDataService().query(Query.select(TagData.PROPERTIES).where(TagData.UUID.eq(uuid)));
try { try {
@ -132,7 +130,6 @@ public final class TagService {
id = tagData.getId(); id = tagData.getId();
tag = tagData.getValue(TagData.NAME); tag = tagData.getValue(TagData.NAME);
count = tagData.getValue(TagData.TASK_COUNT); count = tagData.getValue(TagData.TASK_COUNT);
remoteId = tagData.getValue(TagData.REMOTE_ID);
uuid = tagData.getValue(TagData.UUID); uuid = tagData.getValue(TagData.UUID);
image = tagData.getPictureUrl(TagData.PICTURE, RemoteModel.PICTURE_THUMB); image = tagData.getPictureUrl(TagData.PICTURE, RemoteModel.PICTURE_THUMB);
userId = tagData.getValue(TagData.USER_ID); userId = tagData.getValue(TagData.USER_ID);

@ -207,7 +207,7 @@ public class Database extends AbstractDatabase {
database.execSQL(createTableSql(visitor, Update.TABLE.name, Update.PROPERTIES)); database.execSQL(createTableSql(visitor, Update.TABLE.name, Update.PROPERTIES));
onCreateTables(); onCreateTables();
Property<?>[] properties = new Property<?>[] { Task.REMOTE_ID, Property<?>[] properties = new Property<?>[] { Task.UUID,
Task.USER_ID }; Task.USER_ID };
for(Property<?> property : properties) { for(Property<?> property : properties) {
@ -291,7 +291,7 @@ public class Database extends AbstractDatabase {
case 20: try { case 20: try {
String tasks = Task.TABLE.name; String tasks = Task.TABLE.name;
String id = Task.ID.name; String id = Task.ID.name;
String remoteId = Task.REMOTE_ID.name; String remoteId = Task.UUID.name;
// Delete any items that have duplicate remote ids // Delete any items that have duplicate remote ids
String deleteDuplicates = String.format("DELETE FROM %s WHERE %s IN (SELECT %s.%s FROM %s, %s AS t2 WHERE %s.%s < t2.%s AND %s.%s = t2.%s AND %s.%s > 0 GROUP BY %s.%s)", String deleteDuplicates = String.format("DELETE FROM %s WHERE %s IN (SELECT %s.%s FROM %s, %s AS t2 WHERE %s.%s < t2.%s AND %s.%s = t2.%s AND %s.%s > 0 GROUP BY %s.%s)",
@ -363,18 +363,14 @@ public class Database extends AbstractDatabase {
database.execSQL(createTableSql(visitor, TagMetadata.TABLE.name, TagMetadata.PROPERTIES)); database.execSQL(createTableSql(visitor, TagMetadata.TABLE.name, TagMetadata.PROPERTIES));
database.execSQL(addColumnSql(Task.TABLE, Task.PUSHED_AT, visitor, null)); database.execSQL(addColumnSql(Task.TABLE, Task.PUSHED_AT, visitor, null));
database.execSQL(addColumnSql(Task.TABLE, Task.UUID, visitor, null));
database.execSQL(addColumnSql(Task.TABLE, Task.IS_PUBLIC, visitor, "0")); database.execSQL(addColumnSql(Task.TABLE, Task.IS_PUBLIC, visitor, "0"));
database.execSQL(addColumnSql(Task.TABLE, Task.IS_READONLY, visitor, "0")); database.execSQL(addColumnSql(Task.TABLE, Task.IS_READONLY, visitor, "0"));
database.execSQL(addColumnSql(Task.TABLE, Task.CLASSIFICATION, visitor, null)); database.execSQL(addColumnSql(Task.TABLE, Task.CLASSIFICATION, visitor, null));
database.execSQL(addColumnSql(TagData.TABLE, TagData.PUSHED_AT, visitor, null)); database.execSQL(addColumnSql(TagData.TABLE, TagData.PUSHED_AT, visitor, null));
database.execSQL(addColumnSql(TagData.TABLE, TagData.UUID, visitor, null));
database.execSQL(addColumnSql(Update.TABLE, Update.PUSHED_AT, visitor, null)); database.execSQL(addColumnSql(Update.TABLE, Update.PUSHED_AT, visitor, null));
database.execSQL(addColumnSql(Update.TABLE, Update.UUID, visitor, null));
database.execSQL(addColumnSql(Update.TABLE, Update.TASK_UUID, visitor, null)); database.execSQL(addColumnSql(Update.TABLE, Update.TASK_UUID, visitor, null));
database.execSQL(addColumnSql(Metadata.TABLE, Metadata.DELETION_DATE, visitor, "0")); database.execSQL(addColumnSql(Metadata.TABLE, Metadata.DELETION_DATE, visitor, "0"));
database.execSQL(addColumnSql(User.TABLE, User.PUSHED_AT, visitor, null)); database.execSQL(addColumnSql(User.TABLE, User.PUSHED_AT, visitor, null));
database.execSQL(addColumnSql(User.TABLE, User.UUID, visitor, null));
database.execSQL(addColumnSql(User.TABLE, User.FIRST_NAME, visitor, null)); database.execSQL(addColumnSql(User.TABLE, User.FIRST_NAME, visitor, null));
database.execSQL(addColumnSql(User.TABLE, User.LAST_NAME, visitor, null)); database.execSQL(addColumnSql(User.TABLE, User.LAST_NAME, visitor, null));
} catch (SQLiteException e) { } catch (SQLiteException e) {

@ -300,14 +300,14 @@ public class StartupService {
// For some reason these properties are missing for some users. // For some reason these properties are missing for some users.
// Make them exist! // Make them exist!
try { try {
TodorooCursor<Task> tasks = taskService.query(Query.select(Task.REMOTE_ID, Task.USER_ID, Task.USER).limit(1)); TodorooCursor<Task> tasks = taskService.query(Query.select(Task.UUID, Task.USER_ID, Task.USER).limit(1));
try { try {
System.err.println(tasks.getCount()); System.err.println(tasks.getCount());
} finally { } finally {
tasks.close(); tasks.close();
} }
} catch (SQLiteException e) { } catch (SQLiteException e) {
database.tryAddColumn(Task.TABLE, Task.REMOTE_ID, "0"); //$NON-NLS-1$ database.tryAddColumn(Task.TABLE, Task.UUID, "'0'"); //$NON-NLS-1$
database.tryAddColumn(Task.TABLE, Task.USER_ID, "0"); //$NON-NLS-1$ database.tryAddColumn(Task.TABLE, Task.USER_ID, "0"); //$NON-NLS-1$
database.tryAddColumn(Task.TABLE, Task.USER, null); database.tryAddColumn(Task.TABLE, Task.USER, null);
} }

@ -14,21 +14,21 @@ public class SubtasksHelperTest extends SubtasksTestCase {
updater.initializeFromSerializedTree(SubtasksUpdater.ACTIVE_TASKS_ORDER, filter, DEFAULT_SERIALIZED_TREE); updater.initializeFromSerializedTree(SubtasksUpdater.ACTIVE_TASKS_ORDER, filter, DEFAULT_SERIALIZED_TREE);
} }
private Task createTask(String title, long remoteId) { private Task createTask(String title, String uuid) {
Task t = new Task(); Task t = new Task();
t.setValue(Task.TITLE, title); t.setValue(Task.TITLE, title);
t.setValue(Task.REMOTE_ID, remoteId); t.setValue(Task.UUID, uuid);
PluginServices.getTaskService().save(t); PluginServices.getTaskService().save(t);
return t; return t;
} }
private void createTasks() { private void createTasks() {
A = createTask("A", 6); // Local id 1 A = createTask("A", "6"); // Local id 1
B = createTask("B", 4); // Local id 2 B = createTask("B", "4"); // Local id 2
C = createTask("C", 3); // Local id 3 C = createTask("C", "3"); // Local id 3
D = createTask("D", 1); // Local id 4 D = createTask("D", "1"); // Local id 4
E = createTask("E", 2); // Local id 5 E = createTask("E", "2"); // Local id 5
F = createTask("F", 5); // Local id 6 F = createTask("F", "5"); // Local id 6
} }
private static final Long[] EXPECTED_ORDER = {-1L, 1L, 2L, 3L, 4L, 5L, 6L }; private static final Long[] EXPECTED_ORDER = {-1L, 1L, 2L, 3L, 4L, 5L, 6L };

Loading…
Cancel
Save