mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-02-27 23:36:47 +00:00
Merge "Follow up change to GridBackupTable per V2 backup / restore (multi-db)" into ub-launcher3-master
This commit is contained in:
@@ -134,7 +134,7 @@ public class BackupRestoreTest {
|
||||
{ APP_ICON, SHORTCUT, SHORTCUT, NO__ICON},
|
||||
}}, 2, OLD_WORK_PROFILE_ID);
|
||||
// simulates the creation of backup upon restore
|
||||
new GridBackupTable(RuntimeEnvironment.application, mDb, mDb, mIdp.numHotseatIcons,
|
||||
new GridBackupTable(RuntimeEnvironment.application, mDb, mIdp.numHotseatIcons,
|
||||
mIdp.numColumns, mIdp.numRows).doBackup(
|
||||
MY_OLD_PROFILE_ID, GridBackupTable.OPTION_REQUIRES_SANITIZATION);
|
||||
// reset favorites table
|
||||
|
||||
@@ -63,7 +63,7 @@ public class GridBackupTableTest {
|
||||
|
||||
@Test
|
||||
public void backupTableCreated() {
|
||||
GridBackupTable backupTable = new GridBackupTable(mContext, mDb, mDb, 4, 4, 4);
|
||||
GridBackupTable backupTable = new GridBackupTable(mContext, mDb, 4, 4, 4);
|
||||
assertFalse(backupTable.backupOrRestoreAsNeeded());
|
||||
Settings.call(mContext.getContentResolver(), Settings.METHOD_REFRESH_BACKUP_TABLE);
|
||||
|
||||
@@ -75,14 +75,14 @@ public class GridBackupTableTest {
|
||||
|
||||
@Test
|
||||
public void backupTableRestored() {
|
||||
assertFalse(new GridBackupTable(mContext, mDb, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
assertFalse(new GridBackupTable(mContext, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
Settings.call(mContext.getContentResolver(), Settings.METHOD_REFRESH_BACKUP_TABLE);
|
||||
|
||||
// Delete entries
|
||||
mDb.delete(TABLE_NAME, null, null);
|
||||
assertEquals(0, queryNumEntries(mDb, TABLE_NAME));
|
||||
|
||||
GridBackupTable backupTable = new GridBackupTable(mContext, mDb, mDb, 3, 3, 3);
|
||||
GridBackupTable backupTable = new GridBackupTable(mContext, mDb, 3, 3, 3);
|
||||
assertTrue(backupTable.backupOrRestoreAsNeeded());
|
||||
|
||||
// Items have been restored
|
||||
@@ -96,7 +96,7 @@ public class GridBackupTableTest {
|
||||
|
||||
@Test
|
||||
public void backupTableRemovedOnAdd() {
|
||||
assertFalse(new GridBackupTable(mContext, mDb, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
assertFalse(new GridBackupTable(mContext, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
Settings.call(mContext.getContentResolver(), Settings.METHOD_REFRESH_BACKUP_TABLE);
|
||||
|
||||
assertTrue(tableExists(mDb, BACKUP_TABLE_NAME));
|
||||
@@ -107,7 +107,7 @@ public class GridBackupTableTest {
|
||||
|
||||
@Test
|
||||
public void backupTableRemovedOnDelete() {
|
||||
assertFalse(new GridBackupTable(mContext, mDb, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
assertFalse(new GridBackupTable(mContext, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
Settings.call(mContext.getContentResolver(), Settings.METHOD_REFRESH_BACKUP_TABLE);
|
||||
|
||||
assertTrue(tableExists(mDb, BACKUP_TABLE_NAME));
|
||||
@@ -118,7 +118,7 @@ public class GridBackupTableTest {
|
||||
|
||||
@Test
|
||||
public void backupTableRetainedOnUpdate() {
|
||||
assertFalse(new GridBackupTable(mContext, mDb, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
assertFalse(new GridBackupTable(mContext, mDb, 4, 4, 4).backupOrRestoreAsNeeded());
|
||||
Settings.call(mContext.getContentResolver(), Settings.METHOD_REFRESH_BACKUP_TABLE);
|
||||
|
||||
assertTrue(tableExists(mDb, BACKUP_TABLE_NAME));
|
||||
|
||||
@@ -33,8 +33,6 @@ import com.android.launcher3.LauncherSettings.Favorites;
|
||||
import com.android.launcher3.LauncherSettings.Settings;
|
||||
import com.android.launcher3.pm.UserCache;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Helper class to backup and restore Favorites table into a separate table
|
||||
* within the same data base.
|
||||
@@ -63,8 +61,7 @@ public class GridBackupTable {
|
||||
private static final int STATE_SANITIZED = 2;
|
||||
|
||||
private final Context mContext;
|
||||
private final SQLiteDatabase mFavoritesDb;
|
||||
private final SQLiteDatabase mBackupDb;
|
||||
private final SQLiteDatabase mDb;
|
||||
|
||||
private final int mOldHotseatSize;
|
||||
private final int mOldGridX;
|
||||
@@ -77,11 +74,10 @@ public class GridBackupTable {
|
||||
@IntDef({STATE_NOT_FOUND, STATE_RAW, STATE_SANITIZED})
|
||||
private @interface BackupState { }
|
||||
|
||||
public GridBackupTable(Context context, SQLiteDatabase favoritesDb, SQLiteDatabase backupDb,
|
||||
int hotseatSize, int gridX, int gridY) {
|
||||
public GridBackupTable(Context context, SQLiteDatabase db, int hotseatSize, int gridX,
|
||||
int gridY) {
|
||||
mContext = context;
|
||||
mFavoritesDb = favoritesDb;
|
||||
mBackupDb = backupDb;
|
||||
mDb = db;
|
||||
|
||||
mOldHotseatSize = hotseatSize;
|
||||
mOldGridX = gridX;
|
||||
@@ -94,7 +90,7 @@ public class GridBackupTable {
|
||||
*/
|
||||
public boolean backupOrRestoreAsNeeded() {
|
||||
// Check if backup table exists
|
||||
if (!tableExists(mBackupDb, BACKUP_TABLE_NAME)) {
|
||||
if (!tableExists(mDb, BACKUP_TABLE_NAME)) {
|
||||
if (Settings.call(mContext.getContentResolver(), Settings.METHOD_WAS_EMPTY_DB_CREATED)
|
||||
.getBoolean(Settings.EXTRA_VALUE, false)) {
|
||||
// No need to copy if empty DB was created.
|
||||
@@ -109,7 +105,7 @@ public class GridBackupTable {
|
||||
}
|
||||
long userSerial = UserCache.INSTANCE.get(mContext).getSerialNumberForUser(
|
||||
Process.myUserHandle());
|
||||
copyTable(mBackupDb, BACKUP_TABLE_NAME, mFavoritesDb, Favorites.TABLE_NAME, userSerial);
|
||||
copyTable(mDb, BACKUP_TABLE_NAME, Favorites.TABLE_NAME, userSerial);
|
||||
Log.d(TAG, "Backup table found");
|
||||
return true;
|
||||
}
|
||||
@@ -122,37 +118,28 @@ public class GridBackupTable {
|
||||
/**
|
||||
* Copy valid grid entries from one table to another.
|
||||
*/
|
||||
private static void copyTable(SQLiteDatabase fromDb, String fromTable, SQLiteDatabase toDb,
|
||||
String toTable, long userSerial) {
|
||||
dropTable(toDb, toTable);
|
||||
Favorites.addTableToDb(toDb, userSerial, false, toTable);
|
||||
if (fromDb != toDb) {
|
||||
toDb.execSQL("ATTACH DATABASE '" + fromDb.getPath() + "' AS from_db");
|
||||
toDb.execSQL(
|
||||
"INSERT INTO " + toTable + " SELECT * FROM from_db." + fromTable
|
||||
+ " where _id > " + ID_PROPERTY);
|
||||
} else {
|
||||
toDb.execSQL("INSERT INTO " + toTable + " SELECT * FROM " + fromTable + " where _id > "
|
||||
+ ID_PROPERTY);
|
||||
}
|
||||
private static void copyTable(SQLiteDatabase db, String from, String to, long userSerial) {
|
||||
dropTable(db, to);
|
||||
Favorites.addTableToDb(db, userSerial, false, to);
|
||||
db.execSQL("INSERT INTO " + to + " SELECT * FROM " + from + " where _id > " + ID_PROPERTY);
|
||||
}
|
||||
|
||||
private void encodeDBProperties(int options) {
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(Favorites._ID, ID_PROPERTY);
|
||||
values.put(KEY_DB_VERSION, mFavoritesDb.getVersion());
|
||||
values.put(KEY_DB_VERSION, mDb.getVersion());
|
||||
values.put(KEY_GRID_X_SIZE, mOldGridX);
|
||||
values.put(KEY_GRID_Y_SIZE, mOldGridY);
|
||||
values.put(KEY_HOTSEAT_SIZE, mOldHotseatSize);
|
||||
values.put(Favorites.OPTIONS, options);
|
||||
mBackupDb.insert(BACKUP_TABLE_NAME, null, values);
|
||||
mDb.insert(BACKUP_TABLE_NAME, null, values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load DB properties from grid backup table.
|
||||
*/
|
||||
public @BackupState int loadDBProperties() {
|
||||
try (Cursor c = mBackupDb.query(BACKUP_TABLE_NAME, new String[] {
|
||||
try (Cursor c = mDb.query(BACKUP_TABLE_NAME, new String[] {
|
||||
KEY_DB_VERSION, // 0
|
||||
KEY_GRID_X_SIZE, // 1
|
||||
KEY_GRID_Y_SIZE, // 2
|
||||
@@ -163,7 +150,7 @@ public class GridBackupTable {
|
||||
Log.e(TAG, "Meta data not found in backup table");
|
||||
return STATE_NOT_FOUND;
|
||||
}
|
||||
if (!validateDBVersion(mBackupDb.getVersion(), c.getInt(0))) {
|
||||
if (!validateDBVersion(mDb.getVersion(), c.getInt(0))) {
|
||||
return STATE_NOT_FOUND;
|
||||
}
|
||||
|
||||
@@ -179,7 +166,7 @@ public class GridBackupTable {
|
||||
* Restore workspace from raw backup if available.
|
||||
*/
|
||||
public boolean restoreFromRawBackupIfAvailable(long oldProfileId) {
|
||||
if (!tableExists(mBackupDb, Favorites.BACKUP_TABLE_NAME)
|
||||
if (!tableExists(mDb, Favorites.BACKUP_TABLE_NAME)
|
||||
|| loadDBProperties() != STATE_RAW
|
||||
|| mOldHotseatSize != mRestoredHotseatSize
|
||||
|| mOldGridX != mRestoredGridX
|
||||
@@ -187,8 +174,7 @@ public class GridBackupTable {
|
||||
// skip restore if dimensions in backup table differs from current setup.
|
||||
return false;
|
||||
}
|
||||
copyTable(mBackupDb, Favorites.BACKUP_TABLE_NAME, mFavoritesDb, Favorites.TABLE_NAME,
|
||||
oldProfileId);
|
||||
copyTable(mDb, Favorites.BACKUP_TABLE_NAME, Favorites.TABLE_NAME, oldProfileId);
|
||||
Log.d(TAG, "Backup restored");
|
||||
return true;
|
||||
}
|
||||
@@ -197,8 +183,7 @@ public class GridBackupTable {
|
||||
* Performs a backup on the workspace layout.
|
||||
*/
|
||||
public void doBackup(long profileId, int options) {
|
||||
copyTable(mFavoritesDb, Favorites.TABLE_NAME, mBackupDb, Favorites.BACKUP_TABLE_NAME,
|
||||
profileId);
|
||||
copyTable(mDb, Favorites.TABLE_NAME, Favorites.BACKUP_TABLE_NAME, profileId);
|
||||
encodeDBProperties(options);
|
||||
}
|
||||
|
||||
|
||||
@@ -909,7 +909,7 @@ public class GridSizeMigrationTask {
|
||||
boolean dbChanged = false;
|
||||
|
||||
GridBackupTable backupTable = new GridBackupTable(context, transaction.getDb(),
|
||||
transaction.getDb(), srcHotseatCount, sourceSize.x, sourceSize.y);
|
||||
srcHotseatCount, sourceSize.x, sourceSize.y);
|
||||
if (backupTable.backupOrRestoreAsNeeded()) {
|
||||
dbChanged = true;
|
||||
srcHotseatCount = backupTable.getRestoreHotseatAndGridSize(sourceSize);
|
||||
|
||||
@@ -108,7 +108,7 @@ public class RestoreDbTask {
|
||||
private void backupWorkspace(Context context, SQLiteDatabase db) throws Exception {
|
||||
InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
||||
// TODO(pinyaoting): Support backing up workspace with multiple grid options.
|
||||
new GridBackupTable(context, db, db, idp.numHotseatIcons, idp.numColumns, idp.numRows)
|
||||
new GridBackupTable(context, db, idp.numHotseatIcons, idp.numColumns, idp.numRows)
|
||||
.doBackup(getDefaultProfileId(db), GridBackupTable.OPTION_REQUIRES_SANITIZATION);
|
||||
}
|
||||
|
||||
@@ -117,8 +117,8 @@ public class RestoreDbTask {
|
||||
throws Exception {
|
||||
// TODO(pinyaoting): Support restoring workspace with multiple grid options.
|
||||
final InvariantDeviceProfile idp = LauncherAppState.getIDP(context);
|
||||
GridBackupTable backupTable = new GridBackupTable(context, db, db,
|
||||
idp.numHotseatIcons, idp.numColumns, idp.numRows);
|
||||
GridBackupTable backupTable = new GridBackupTable(context, db, idp.numHotseatIcons,
|
||||
idp.numColumns, idp.numRows);
|
||||
if (backupTable.restoreFromRawBackupIfAvailable(getDefaultProfileId(db))) {
|
||||
sanitizeDB(helper, db, backupManager);
|
||||
LauncherAppState.getInstance(context).getModel().forceReload();
|
||||
|
||||
Reference in New Issue
Block a user