Merge "Separating the DB upgrade into two paths: > schema update: changes in the table schema > data update: backward compatible changes to the data" into ub-launcher3-dorval

This commit is contained in:
TreeHugger Robot
2017-04-17 16:42:34 +00:00
committed by Android (Google) Code Review

View File

@@ -76,7 +76,18 @@ public class LauncherProvider extends ContentProvider {
private static final String TAG = "LauncherProvider";
private static final boolean LOGD = false;
private static final int DATABASE_VERSION = 28;
/**
* Represents the schema of the database. Changes in scheme need not be backwards compatible.
*/
private static final int SCHEMA_VERSION = 27;
/**
* Represents the actual data. It could include additional validations and normalizations added
* overtime. These must be backwards compatible, else we risk breaking old devices during
* restore or binary version downgrade.
*/
private static final int DATA_VERSION = 2;
private static final String PREF_KEY_DATA_VERISON = "provider_data_version";
public static final String AUTHORITY = ProviderConfig.AUTHORITY;
@@ -599,7 +610,7 @@ public class LauncherProvider extends ContentProvider {
*/
public DatabaseHelper(
Context context, Handler widgetHostResetHandler, String tableName) {
super(new NoLocaleSqliteContext(context), tableName, null, DATABASE_VERSION);
super(new NoLocaleSqliteContext(context), tableName, null, SCHEMA_VERSION);
mContext = context;
mWidgetHostResetHandler = widgetHostResetHandler;
}
@@ -710,6 +721,55 @@ public class LauncherProvider extends ContentProvider {
db.execSQL(removeOrphanedFolderItems);
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
SharedPreferences prefs = mContext
.getSharedPreferences(LauncherFiles.DEVICE_PREFERENCES_KEY, 0);
int oldVersion = prefs.getInt(PREF_KEY_DATA_VERISON, 0);
if (oldVersion != DATA_VERSION) {
// Only run the data upgrade path for an existing db.
if (!Utilities.getPrefs(mContext).getBoolean(EMPTY_DATABASE_CREATED, false)) {
db.beginTransaction();
try {
onDataUpgrade(db, oldVersion);
db.setTransactionSuccessful();
} catch (Exception e) {
Log.d(TAG, "Error updating data version, ignoring", e);
return;
} finally {
db.endTransaction();
}
}
prefs.edit().putInt(PREF_KEY_DATA_VERISON, DATA_VERSION).apply();
}
}
/**
* Called when the data is updated as part of app update. It can be called multiple times
* with old version, even though it had been run before. The changes made here must be
* backwards compatible, else we risk breaking old devices during restore or binary
* version downgrade.
*/
protected void onDataUpgrade(SQLiteDatabase db, int oldVersion) {
switch (oldVersion) {
case 0:
case 1: {
// Remove "profile extra"
UserManagerCompat um = UserManagerCompat.getInstance(mContext);
for (UserHandle user : um.getUserProfiles()) {
long serial = um.getSerialNumberForUser(user);
String sql = "update favorites set intent = replace(intent, "
+ "';l.profile=" + serial + ";', ';') where itemType = 0;";
db.execSQL(sql);
}
}
case 2:
// data updated
return;
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (LOGD) Log.d(TAG, "onUpgrade triggered: " + oldVersion);
@@ -807,30 +867,9 @@ public class LauncherProvider extends ContentProvider {
!LauncherDbUtils.prepareScreenZeroToHostQsb(mContext, db)) {
break;
}
case 27: {
// Remove "profile extra"
db.beginTransaction();
try {
UserManagerCompat um = UserManagerCompat.getInstance(mContext);
for (UserHandle user : um.getUserProfiles()) {
long serial = um.getSerialNumberForUser(user);
String sql = "update favorites set intent = replace(intent, "
+ "';l.profile=" + serial + ";', ';') where itemType = 0;";
db.execSQL(sql);
}
db.setTransactionSuccessful();
} catch (SQLException ex) {
Log.e(TAG, ex.getMessage(), ex);
// Old version remains, which means we wipe old data
break;
} finally {
db.endTransaction();
}
}
case 28: {
case 27:
// DB Upgraded successfully
return;
}
}
// DB was not upgraded
@@ -840,6 +879,11 @@ public class LauncherProvider extends ContentProvider {
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 28 && newVersion == 27) {
// TODO: remove this check. This is only applicable for internal development/testing
// and for any released version of Launcher.
return;
}
// This shouldn't happen -- throw our hands up in the air and start over.
Log.w(TAG, "Database version downgrade from: " + oldVersion + " to " + newVersion +
". Wiping databse.");