From fb8905f469768a6ac8446a8a250d455f36de5bac Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 11 Apr 2013 18:27:41 -0700 Subject: [PATCH] When logged in user id changes, do a db migration to update the user id properties and clear table pushed at values. Should fix issues when merging accounts --- .../actfm/sync/ActFmSyncV2Provider.java | 13 +++- .../messages/ConvertSelfUserIdsToZero.java | 61 +++++++++++++++++++ .../astrid/service/UpgradeService.java | 7 ++- 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConvertSelfUserIdsToZero.java diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java index 018fdd488..578adbd86 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java @@ -19,6 +19,7 @@ import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.actfm.sync.messages.ConvertSelfUserIdsToZero; import com.todoroo.astrid.billing.BillingConstants; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.RemoteModelDao; @@ -121,8 +122,16 @@ public class ActFmSyncV2Provider extends SyncV2Provider { try { JSONObject status = actFmSyncService.invoke("user_status"); //$NON-NLS-1$ - if (status.has("id")) - Preferences.setLong(ActFmPreferenceService.PREF_USER_ID, status.optLong("id")); + long oldId = Preferences.getLong(ActFmPreferenceService.PREF_USER_ID, -1); + if (status.has("id")) { + long newId = status.optLong("id"); + Preferences.setLong(ActFmPreferenceService.PREF_USER_ID, newId); + if (oldId > 0 && oldId != newId) { + // Migrate all db userIds that = newId to 0 + new ConvertSelfUserIdsToZero().execute(); + ActFmSyncThread.clearTablePushedAtValues(); + } + } if (status.has("name")) Preferences.setString(ActFmPreferenceService.PREF_NAME, status.optString("name")); if (status.has("first_name")) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConvertSelfUserIdsToZero.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConvertSelfUserIdsToZero.java new file mode 100644 index 000000000..4825507cd --- /dev/null +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/ConvertSelfUserIdsToZero.java @@ -0,0 +1,61 @@ +package com.todoroo.astrid.actfm.sync.messages; + +import com.todoroo.andlib.data.AbstractModel; +import com.todoroo.andlib.data.DatabaseDao; +import com.todoroo.andlib.data.Property.StringProperty; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; +import com.todoroo.astrid.dao.HistoryDao; +import com.todoroo.astrid.dao.TagDataDao; +import com.todoroo.astrid.dao.TaskDao; +import com.todoroo.astrid.dao.UserActivityDao; +import com.todoroo.astrid.dao.WaitingOnMeDao; +import com.todoroo.astrid.data.History; +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.UserActivity; +import com.todoroo.astrid.data.WaitingOnMe; + +public class ConvertSelfUserIdsToZero { + + @Autowired + private TaskDao taskDao; + + @Autowired + private TagDataDao tagDataDao; + + @Autowired + private HistoryDao historyDao; + + @Autowired + private UserActivityDao userActivityDao; + + @Autowired + private WaitingOnMeDao waitingOnMeDao; + + public ConvertSelfUserIdsToZero() { + DependencyInjectionService.getInstance().inject(this); + } + + public synchronized void execute() { + String selfId = ActFmPreferenceService.userId(); + if (RemoteModel.isValidUuid(selfId)) { + updateDatabase(taskDao, new Task(), Task.CREATOR_ID, selfId); + updateDatabase(taskDao, new Task(), Task.USER_ID, selfId); + updateDatabase(tagDataDao, new TagData(), TagData.USER_ID, selfId); + updateDatabase(historyDao, new History(), History.USER_UUID, selfId); + updateDatabase(userActivityDao, new UserActivity(), UserActivity.USER_UUID, selfId); + updateDatabase(waitingOnMeDao, new WaitingOnMe(), WaitingOnMe.WAITING_USER_ID, selfId); + } + } + + private void updateDatabase(DatabaseDao dao, T instance, StringProperty property, String selfId) { + instance.setValue(property, Task.USER_ID_SELF); + instance.putTransitory(SyncFlags.ACTFM_SUPPRESS_OUTSTANDING_ENTRIES, true); + dao.update(property.eq(selfId), instance); + } + +} diff --git a/astrid/src/com/todoroo/astrid/service/UpgradeService.java b/astrid/src/com/todoroo/astrid/service/UpgradeService.java index 3bc16bf19..f3cb655de 100644 --- a/astrid/src/com/todoroo/astrid/service/UpgradeService.java +++ b/astrid/src/com/todoroo/astrid/service/UpgradeService.java @@ -26,6 +26,7 @@ import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; import com.todoroo.astrid.actfm.sync.AstridNewSyncMigrator; import com.todoroo.astrid.actfm.sync.EmptyTitleOutstandingEntryMigration; +import com.todoroo.astrid.actfm.sync.messages.ConvertSelfUserIdsToZero; import com.todoroo.astrid.actfm.sync.messages.NameMaps; import com.todoroo.astrid.activity.AstridActivity; import com.todoroo.astrid.activity.Eula; @@ -183,7 +184,7 @@ public final class UpgradeService { Preferences.setInt(AstridPreferences.P_UPGRADE_FROM, from); - int maxWithUpgrade = V4_6_2; // The last version that required a migration + int maxWithUpgrade = V4_6_3; // The last version that required a migration Preferences.setInt(AstridPreferences.P_UPGRADE_FROM, from); @@ -254,6 +255,10 @@ public final class UpgradeService { new EmptyTitleOutstandingEntryMigration().performMigration(); } + if (from < V4_6_3) { + new ConvertSelfUserIdsToZero().execute(); + } + } finally { finished = true; DialogUtilities.dismissDialog(UpgradeActivity.this, dialog);