diff --git a/api/src/com/todoroo/andlib/utility/DialogUtilities.java b/api/src/com/todoroo/andlib/utility/DialogUtilities.java index fd7303884..1d9d30da4 100644 --- a/api/src/com/todoroo/andlib/utility/DialogUtilities.java +++ b/api/src/com/todoroo/andlib/utility/DialogUtilities.java @@ -200,13 +200,13 @@ public class DialogUtilities { * @param text * @return */ - public static ProgressDialog progressDialog(Context context, String text) { + public static ProgressDialog progressDialog(Activity context, String text) { ProgressDialog dialog = new ProgressDialog(context); dialog.setIndeterminate(true); dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); dialog.setMessage(text); dialog.show(); - dialog.setOwnerActivity((Activity)context); + dialog.setOwnerActivity(context); return dialog; } diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java index cd08a440e..d06990982 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/ActFmLoginActivity.java @@ -8,6 +8,7 @@ package com.todoroo.astrid.actfm; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; +import java.util.HashMap; import java.util.Random; import org.json.JSONException; @@ -52,11 +53,13 @@ import com.google.android.googlelogin.GoogleLoginServiceConstants; import com.google.android.googlelogin.GoogleLoginServiceHelper; import com.timsu.astrid.GCMIntentService; import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.sql.Criterion; +import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DialogUtilities; @@ -69,7 +72,9 @@ import com.todoroo.astrid.actfm.sync.messages.ConstructOutstandingTableFromMaste import com.todoroo.astrid.actfm.sync.messages.NameMaps; import com.todoroo.astrid.activity.Eula; import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.dao.RemoteModelDao; import com.todoroo.astrid.dao.TagDataDao; +import com.todoroo.astrid.dao.TagMetadataDao; import com.todoroo.astrid.dao.TagOutstandingDao; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskListMetadataDao; @@ -78,6 +83,7 @@ import com.todoroo.astrid.dao.TaskOutstandingDao; import com.todoroo.astrid.dao.UserActivityDao; import com.todoroo.astrid.dao.UserActivityOutstandingDao; import com.todoroo.astrid.dao.UserDao; +import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.TagData; import com.todoroo.astrid.data.TagOutstanding; import com.todoroo.astrid.data.Task; @@ -87,6 +93,7 @@ import com.todoroo.astrid.data.TaskOutstanding; import com.todoroo.astrid.data.UserActivity; import com.todoroo.astrid.data.UserActivityOutstanding; import com.todoroo.astrid.gtasks.auth.ModernAuthManager; +import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.service.AstridDependencyInjector; import com.todoroo.astrid.service.MarketStrategy.AmazonMarketStrategy; import com.todoroo.astrid.service.StatisticsConstants; @@ -132,6 +139,8 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener @Autowired private TaskListMetadataOutstandingDao taskListMetadataOutstandingDao; + @Autowired + private TagMetadataDao tagMetadataDao; @Autowired protected SyncV2Service syncService; @@ -572,11 +581,11 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener StatisticsService.reportEvent(StatisticsConstants.ACTFM_NEW_USER, "provider", provider); } // Successful login, create outstanding entries - if (!TextUtils.isEmpty(token)) { - new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASKS, taskDao, taskOutstandingDao, Task.CREATION_DATE).execute(); - new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TAGS, tagDataDao, tagOutstandingDao, TagData.CREATION_DATE).execute(); - new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_USER_ACTIVITY, userActivityDao, userActivityOutstandingDao, UserActivity.CREATED_AT).execute(); - new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASK_LIST_METADATA, taskListMetadataDao, taskListMetadataOutstandingDao, null).execute(); + long lastId = Preferences.getLong(ActFmPreferenceService.PREF_USER_ID, 0); + long newUser = result.optLong("id"); + + if (!TextUtils.isEmpty(token) && (lastId == 0 || lastId == newUser)) { + constructOutstandingTables(); } runOnUiThread(new Runnable() { public void run() { @@ -600,13 +609,21 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener }.start(); } + private void constructOutstandingTables() { + new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASKS, taskDao, taskOutstandingDao, Task.CREATION_DATE).execute(); + new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TAGS, tagDataDao, tagOutstandingDao, TagData.CREATION_DATE).execute(); + new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_USER_ACTIVITY, userActivityDao, userActivityOutstandingDao, UserActivity.CREATED_AT).execute(); + new ConstructOutstandingTableFromMasterTable(NameMaps.TABLE_ID_TASK_LIST_METADATA, taskListMetadataDao, taskListMetadataOutstandingDao, null).execute(); + } + @SuppressWarnings("nls") private void postAuthenticate(final JSONObject result, final String token) { long lastLoggedInUser = Preferences.getLong(ActFmPreferenceService.PREF_USER_ID, 0); if (lastLoggedInUser > 0) { long newUserId = result.optLong("id"); if (lastLoggedInUser != newUserId) { - // Prompt for input + // In this case, we need to either make all data private or clear all data + // Prompt for choice DialogUtilities.okCancelCustomDialog(this, getString(R.string.actfm_logged_in_different_user_title), getString(R.string.actfm_logged_in_different_user_body), @@ -617,11 +634,37 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener @Override public void onClick(DialogInterface dialog, int which) { // TODO: Make all data private - taskService.deleteWhere(Task.USER_ID.neq(0)); - userDao.deleteWhere(Criterion.all); - // Delete all outstanding tables - // Generate new uuids for all tasks/tags and update links - finishSignIn(result, token); + final ProgressDialog pd = DialogUtilities.progressDialog(ActFmLoginActivity.this, getString(R.string.actfm_logged_in_different_user_processing)); + new Thread(new Runnable() { + @Override + public void run() { + // Delete all tasks not assigned to self + taskService.deleteWhere(Task.USER_ID.neq(0)); + // Delete user table + userDao.deleteWhere(Criterion.all); + + // Clear all outstanding tables + taskOutstandingDao.deleteWhere(Criterion.all); + tagOutstandingDao.deleteWhere(Criterion.all); + userActivityOutstandingDao.deleteWhere(Criterion.all); + taskListMetadataOutstandingDao.deleteWhere(Criterion.all); + + // Make all tags private + tagMetadataDao.deleteWhere(Criterion.all); + + // Generate new uuids for all tasks/tags/user activity/task list metadata and update links + generateNewUuids(); + + constructOutstandingTables(); + runOnUiThread(new Runnable() { + @Override + public void run() { + finishSignIn(result, token); + } + }); + pd.dismiss(); + } + }); } }, new DialogInterface.OnClickListener() { @@ -639,6 +682,31 @@ public class ActFmLoginActivity extends FragmentActivity implements AuthListener } } + private void generateNewUuids() { + HashMap uuidTaskMap = new HashMap(); + HashMap uuidTagMap = new HashMap(); + HashMap uuidUserActivityMap = new HashMap(); + HashMap uuidTaskListMetadataMap = new HashMap(); + + mapUuids(taskDao, uuidTaskMap); + mapUuids(tagDataDao, uuidTagMap); + mapUuids(userActivityDao, uuidUserActivityMap); + mapUuids(taskListMetadataDao, uuidTaskListMetadataMap); + + // TODO: Use maps to rebuild tables + } + + private void mapUuids(RemoteModelDao dao, HashMap map) { + TodorooCursor items = dao.query(Query.select(RemoteModel.UUID_PROPERTY)); + try { + for (items.moveToFirst(); !items.isAfterLast(); items.moveToNext()) { + map.put(items.get(RemoteModel.UUID_PROPERTY), UUIDHelper.newUUID()); + } + } finally { + items.close(); + } + } + @SuppressWarnings("nls") private void finishSignIn(JSONObject result, String token) { actFmPreferenceService.setToken(token); diff --git a/astrid/res/values/strings-actfm.xml b/astrid/res/values/strings-actfm.xml index 44986592c..b5120523a 100644 --- a/astrid/res/values/strings-actfm.xml +++ b/astrid/res/values/strings-actfm.xml @@ -362,6 +362,7 @@ This device was previously signed in under a different user account. Do you want to keep existing data or clear everything? (This cannot be undone) Keep data Clear all data + Processing existing data...