mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-19 02:38:20 +00:00
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:
committed by
Android (Google) Code Review
commit
d31692c0e7
@@ -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.");
|
||||
|
||||
Reference in New Issue
Block a user