From ce7aba15cf7707597c7b3f435ddeb6add72308ac Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Fri, 14 Sep 2012 14:15:09 -0700 Subject: [PATCH] Cherry pick some uuid generation code --- .../com/todoroo/astrid/data/RemoteModel.java | 6 ++ api/src/com/todoroo/astrid/data/TagData.java | 4 ++ api/src/com/todoroo/astrid/data/Task.java | 4 ++ api/src/com/todoroo/astrid/data/Update.java | 4 ++ .../src/com/todoroo/astrid/dao/Database.java | 8 +++ .../todoroo/astrid/dao/RemoteModelDao.java | 34 +++++++++++ .../com/todoroo/astrid/dao/TagDataDao.java | 6 +- .../src/com/todoroo/astrid/dao/TaskDao.java | 6 +- .../src/com/todoroo/astrid/dao/UpdateDao.java | 3 +- .../com/todoroo/astrid/helper/UUIDHelper.java | 57 +++++++++++++++++++ .../astrid/service/StartupService.java | 4 ++ 11 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 astrid/src/com/todoroo/astrid/dao/RemoteModelDao.java create mode 100644 astrid/src/com/todoroo/astrid/helper/UUIDHelper.java diff --git a/api/src/com/todoroo/astrid/data/RemoteModel.java b/api/src/com/todoroo/astrid/data/RemoteModel.java index b2d039dc7..0ac5ab3fe 100644 --- a/api/src/com/todoroo/astrid/data/RemoteModel.java +++ b/api/src/com/todoroo/astrid/data/RemoteModel.java @@ -35,4 +35,10 @@ abstract public class RemoteModel extends AbstractModel { /** user json property */ public static final StringProperty USER_JSON_PROPERTY = new StringProperty(null, USER_JSON_PROPERTY_NAME); + /** proof text property name */ + protected static final String PROOF_TEXT_PROPERTY_NAME = "proofText"; //$NON-NLS-1$ + + /** proof text property */ + public static final StringProperty PROOF_TEXT_PROPERTY = new StringProperty(null, PROOF_TEXT_PROPERTY_NAME); + } diff --git a/api/src/com/todoroo/astrid/data/TagData.java b/api/src/com/todoroo/astrid/data/TagData.java index 9aa7b422f..901bdc7b3 100644 --- a/api/src/com/todoroo/astrid/data/TagData.java +++ b/api/src/com/todoroo/astrid/data/TagData.java @@ -117,6 +117,10 @@ public final class TagData extends RemoteModel { public static final StringProperty TAG_DESCRIPTION = new StringProperty( TABLE, "tagDescription"); + /** UUID proof text */ + public static final StringProperty PROOF_TEXT = new StringProperty( + TABLE, PROOF_TEXT_PROPERTY_NAME); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(TagData.class); diff --git a/api/src/com/todoroo/astrid/data/Task.java b/api/src/com/todoroo/astrid/data/Task.java index 80f95324c..e08072a23 100644 --- a/api/src/com/todoroo/astrid/data/Task.java +++ b/api/src/com/todoroo/astrid/data/Task.java @@ -162,6 +162,10 @@ public final class Task extends RemoteModel { public static final LongProperty LAST_SYNC = new LongProperty( TABLE, "lastSync"); + /** UUID proof text */ + public static final StringProperty PROOF_TEXT = new StringProperty( + TABLE, PROOF_TEXT_PROPERTY_NAME); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(Task.class); diff --git a/api/src/com/todoroo/astrid/data/Update.java b/api/src/com/todoroo/astrid/data/Update.java index 9a13fbfe0..a9566304c 100644 --- a/api/src/com/todoroo/astrid/data/Update.java +++ b/api/src/com/todoroo/astrid/data/Update.java @@ -101,6 +101,10 @@ public class Update extends RemoteModel { public static final LongProperty CREATION_DATE = new LongProperty( TABLE, "created"); + /** UUID proof text */ + public static final StringProperty PROOF_TEXT = new StringProperty( + TABLE, PROOF_TEXT_PROPERTY_NAME); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(Update.class); diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index 8e8d0ba0e..cf126d2e9 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -337,6 +337,10 @@ public class Database extends AbstractDatabase { case 25: try { database.execSQL(createTableSql(visitor, TaskOutstanding.TABLE.name, TaskOutstanding.PROPERTIES)); database.execSQL(createTableSql(visitor, TagOutstanding.TABLE.name, TagOutstanding.PROPERTIES)); + + database.execSQL(addColumnSql(Task.TABLE, Task.PROOF_TEXT, visitor)); + database.execSQL(addColumnSql(TagData.TABLE, TagData.PROOF_TEXT, visitor)); + database.execSQL(addColumnSql(Update.TABLE, Update.PROOF_TEXT, visitor)); } catch (SQLiteException e) { Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e); } @@ -347,6 +351,10 @@ public class Database extends AbstractDatabase { return false; } + private static String addColumnSql(Table table, Property property, SqlConstructorVisitor visitor) { + return "ALTER TABLE " + table.name + " ADD " + property.accept(visitor, null); + } + /** * Create table generation SQL * @param sql diff --git a/astrid/src/com/todoroo/astrid/dao/RemoteModelDao.java b/astrid/src/com/todoroo/astrid/dao/RemoteModelDao.java new file mode 100644 index 000000000..1724e4f50 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/dao/RemoteModelDao.java @@ -0,0 +1,34 @@ +package com.todoroo.astrid.dao; + +import com.todoroo.andlib.data.DatabaseDao; +import com.todoroo.andlib.utility.Pair; +import com.todoroo.astrid.data.RemoteModel; +import com.todoroo.astrid.helper.UUIDHelper; + +/** + * This class is meant to be subclassed for daos whose models + * require UUID generation (i.e., most RemoteModels). The createNew + * method takes care of automatically generating a new UUID for each newly + * created model if one doesn't already exist. + * @author Sam + * + * @param + */ +public class RemoteModelDao extends DatabaseDao { + + public RemoteModelDao(Class modelClass) { + super(modelClass); + } + + @Override + public boolean createNew(RTYPE item) { + if (!item.containsValue(RemoteModel.REMOTE_ID_PROPERTY)) { + Pair uuidPair = UUIDHelper.newUUID(); + item.setValue(RemoteModel.REMOTE_ID_PROPERTY, uuidPair.getLeft()); + item.setValue(RemoteModel.PROOF_TEXT_PROPERTY, uuidPair.getRight()); + } + return super.createNew(item); + }; + + +} diff --git a/astrid/src/com/todoroo/astrid/dao/TagDataDao.java b/astrid/src/com/todoroo/astrid/dao/TagDataDao.java index 963dcfa28..673d61d6a 100644 --- a/astrid/src/com/todoroo/astrid/dao/TagDataDao.java +++ b/astrid/src/com/todoroo/astrid/dao/TagDataDao.java @@ -5,7 +5,6 @@ */ package com.todoroo.astrid.dao; -import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.sql.Criterion; @@ -18,7 +17,7 @@ import com.todoroo.astrid.data.TagData; * @author Tim Su * */ -public class TagDataDao extends DatabaseDao { +public class TagDataDao extends RemoteModelDao { @Autowired Database database; @@ -31,7 +30,8 @@ public class TagDataDao extends DatabaseDao { private static final String[] IGNORE_OUTSTANDING_COLUMNS = new String[] { TagData.MODIFICATION_DATE.name, - TagData.REMOTE_ID.name + TagData.REMOTE_ID.name, + TagData.PROOF_TEXT.name }; @Override diff --git a/astrid/src/com/todoroo/astrid/dao/TaskDao.java b/astrid/src/com/todoroo/astrid/dao/TaskDao.java index f82554e22..f994bee09 100644 --- a/astrid/src/com/todoroo/astrid/dao/TaskDao.java +++ b/astrid/src/com/todoroo/astrid/dao/TaskDao.java @@ -11,7 +11,6 @@ import android.content.Intent; import android.database.sqlite.SQLiteConstraintException; import com.timsu.astrid.R; -import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; @@ -40,7 +39,7 @@ import com.todoroo.astrid.utility.AstridPreferences; * @author Tim Su * */ -public class TaskDao extends DatabaseDao { +public class TaskDao extends RemoteModelDao { @Autowired private MetadataDao metadataDao; @@ -321,7 +320,8 @@ public class TaskDao extends DatabaseDao { Task.DETAILS.name, Task.DETAILS_DATE.name, Task.CALENDAR_URI.name, - Task.REMOTE_ID.name + Task.REMOTE_ID.name, + Task.PROOF_TEXT.name }; @Override diff --git a/astrid/src/com/todoroo/astrid/dao/UpdateDao.java b/astrid/src/com/todoroo/astrid/dao/UpdateDao.java index b049adef2..b14d8e8bb 100644 --- a/astrid/src/com/todoroo/astrid/dao/UpdateDao.java +++ b/astrid/src/com/todoroo/astrid/dao/UpdateDao.java @@ -5,7 +5,6 @@ */ package com.todoroo.astrid.dao; -import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.astrid.data.Update; @@ -16,7 +15,7 @@ import com.todoroo.astrid.data.Update; * @author Tim Su * */ -public class UpdateDao extends DatabaseDao { +public class UpdateDao extends RemoteModelDao { @Autowired Database database; diff --git a/astrid/src/com/todoroo/astrid/helper/UUIDHelper.java b/astrid/src/com/todoroo/astrid/helper/UUIDHelper.java new file mode 100644 index 000000000..e6d0bbbac --- /dev/null +++ b/astrid/src/com/todoroo/astrid/helper/UUIDHelper.java @@ -0,0 +1,57 @@ +package com.todoroo.astrid.helper; + +import java.security.SecureRandom; +import java.util.UUID; + +import com.todoroo.andlib.utility.Pair; +import com.todoroo.andlib.utility.Preferences; +import com.todoroo.astrid.actfm.sync.ActFmPreferenceService; + +public class UUIDHelper { + + private static final String PREF_DEVICE_ID = "pref_device_id"; //$NON-NLS-1$ + + private static final String PREF_LAST_KNOWN_USER = "pref_last_known_user"; //$NON-NLS-1$ + + public static String getDeviceId() { + long lastUser = Preferences.getLong(PREF_LAST_KNOWN_USER, 0); + long currentUser = ActFmPreferenceService.userId(); + if (currentUser > 0 && lastUser > 0 && currentUser != lastUser) { // User has changed + Preferences.clear(PREF_DEVICE_ID); + Preferences.setLong(PREF_LAST_KNOWN_USER, currentUser); + } else if (currentUser > 0 && lastUser <= 0) { + Preferences.setLong(PREF_LAST_KNOWN_USER, currentUser); + } + + String saved = Preferences.getStringValue(PREF_DEVICE_ID); + if (saved != null) + return saved; + + saved = UUID.randomUUID().toString(); + Preferences.setString(PREF_DEVICE_ID, saved); + return saved; + } + + private static final SecureRandom RANDOM = new SecureRandom(); + private static final long MIN_UUID = 100000000; + + /** + * @return a pair consisting of the newly + * generated uuid and the corresponding proof text + */ + public static Pair newUUID() { + long uuid = 0; + String proofText = ""; //$NON-NLS-1$ + do { + byte[] chars = new byte[40]; + RANDOM.nextBytes(chars); + String s = new String(chars); + String d = getDeviceId(); + + proofText = d + "," + s; //$NON-NLS-1$ + uuid = MIN_UUID * 2; // TODO: Replace with hash + } while (uuid < MIN_UUID); + return Pair.create(uuid, proofText); + } + +} diff --git a/astrid/src/com/todoroo/astrid/service/StartupService.java b/astrid/src/com/todoroo/astrid/service/StartupService.java index 8b3c6732c..e53965fb5 100644 --- a/astrid/src/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/com/todoroo/astrid/service/StartupService.java @@ -44,6 +44,7 @@ import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService; +import com.todoroo.astrid.helper.UUIDHelper; import com.todoroo.astrid.opencrx.OpencrxCoreUtils; import com.todoroo.astrid.producteev.ProducteevUtilities; import com.todoroo.astrid.reminders.ReengagementService; @@ -142,6 +143,9 @@ public class StartupService { Toast.makeText(context, R.string.TLA_notification_volume_low, Toast.LENGTH_LONG).show(); } + // Initializes the device id + UUIDHelper.getDeviceId(); + // read current version int latestSetVersion = 0; try {