Cherry pick some uuid generation code

pull/14/head
Sam Bosley 12 years ago
parent 58e1bdc455
commit ce7aba15cf

@ -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);
}

@ -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);

@ -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);

@ -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);

@ -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

@ -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 <RTYPE>
*/
public class RemoteModelDao<RTYPE extends RemoteModel> extends DatabaseDao<RTYPE> {
public RemoteModelDao(Class<RTYPE> modelClass) {
super(modelClass);
}
@Override
public boolean createNew(RTYPE item) {
if (!item.containsValue(RemoteModel.REMOTE_ID_PROPERTY)) {
Pair<Long, String> uuidPair = UUIDHelper.newUUID();
item.setValue(RemoteModel.REMOTE_ID_PROPERTY, uuidPair.getLeft());
item.setValue(RemoteModel.PROOF_TEXT_PROPERTY, uuidPair.getRight());
}
return super.createNew(item);
};
}

@ -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 <tim@todoroo.com>
*
*/
public class TagDataDao extends DatabaseDao<TagData> {
public class TagDataDao extends RemoteModelDao<TagData> {
@Autowired Database database;
@ -31,7 +30,8 @@ public class TagDataDao extends DatabaseDao<TagData> {
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

@ -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 <tim@todoroo.com>
*
*/
public class TaskDao extends DatabaseDao<Task> {
public class TaskDao extends RemoteModelDao<Task> {
@Autowired
private MetadataDao metadataDao;
@ -321,7 +320,8 @@ public class TaskDao extends DatabaseDao<Task> {
Task.DETAILS.name,
Task.DETAILS_DATE.name,
Task.CALENDAR_URI.name,
Task.REMOTE_ID.name
Task.REMOTE_ID.name,
Task.PROOF_TEXT.name
};
@Override

@ -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 <tim@todoroo.com>
*
*/
public class UpdateDao extends DatabaseDao<Update> {
public class UpdateDao extends RemoteModelDao<Update> {
@Autowired Database database;

@ -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<Long, String> 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);
}
}

@ -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 {

Loading…
Cancel
Save