From 29a96adaabbb1ab111ec2e5a5dfa8e8c2436e10b Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Thu, 10 Feb 2022 13:12:20 +0000 Subject: [PATCH] Fix restore not migrating to new grid - In reinitializeAfterRestore, use db path instead of grid name to check if migration is necessary, so migration will still happen if grid names are renamed. Also, only remove the target db path instead of all non source db paths, which are not necessary to be removed. - In LauncherBackupAgent, remove old files before restoring to avoid old files from overriding restored files e.g. grid name in shared preferences - Make sure InvariantDeviceProfile is intialize before we set pending to false, so unsupported grids can still be initialized and then be migratead - Renamed 6x5 grid so it no longer collides with 4x4 Fix: 218500583 Test: Restore backup from supported and unsupported grids Change-Id: Ic78e0bc7dc44ad86bd217c736b88708ad488ac0b --- .../launcher3/InvariantDeviceProfile.java | 11 ++++++----- .../android/launcher3/LauncherBackupAgent.java | 16 ++++++++++++++++ .../launcher3/provider/RestoreDbTask.java | 6 +++++- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index a381787804..dfe4bb0204 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -250,11 +250,12 @@ public class InvariantDeviceProfile { * Reinitialize the current grid after a restore, where some grids might now be disabled. */ public void reinitializeAfterRestore(Context context) { + String currentGridName = getCurrentGridName(context); String currentDbFile = dbFile; - String gridName = getCurrentGridName(context); - String newGridName = initGrid(context, gridName); - if (!newGridName.equals(gridName)) { - Log.d(TAG, "Restored grid is disabled : " + gridName + String newGridName = initGrid(context, currentGridName); + String newDbFile = dbFile; + if (!newDbFile.equals(currentDbFile)) { + Log.d(TAG, "Restored grid is disabled : " + currentGridName + ", migrating to: " + newGridName + ", removing all other grid db files"); for (String gridDbFile : LauncherFiles.GRID_DB_FILES) { @@ -265,7 +266,7 @@ public class InvariantDeviceProfile { Log.d(TAG, "Removed old grid db file: " + gridDbFile); } } - setCurrentGrid(context, gridName); + setCurrentGrid(context, newGridName); } } diff --git a/src/com/android/launcher3/LauncherBackupAgent.java b/src/com/android/launcher3/LauncherBackupAgent.java index dc533f03cf..3d2700de40 100644 --- a/src/com/android/launcher3/LauncherBackupAgent.java +++ b/src/com/android/launcher3/LauncherBackupAgent.java @@ -8,8 +8,13 @@ import android.os.ParcelFileDescriptor; import com.android.launcher3.logging.FileLog; import com.android.launcher3.provider.RestoreDbTask; +import java.io.File; +import java.io.IOException; + public class LauncherBackupAgent extends BackupAgent { + private static final String TAG = "LauncherBackupAgent"; + @Override public void onCreate() { super.onCreate(); @@ -23,6 +28,17 @@ public class LauncherBackupAgent extends BackupAgent { // Doesn't do incremental backup/restore } + @Override + public void onRestoreFile(ParcelFileDescriptor data, long size, File destination, int type, + long mode, long mtime) throws IOException { + // Remove old files which might contain obsolete attributes like idp_grid_name in shared + // preference that will obstruct backup's attribute from writing to shared preferences. + if (destination.delete()) { + FileLog.d("LauncherBackupAgent", "Removed obsolete file: " + destination); + } + super.onRestoreFile(data, size, destination, type, mode, mtime); + } + @Override public void onBackup( ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState) { diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index d994dbec77..48b3acfbf1 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -79,11 +79,15 @@ public class RestoreDbTask { helper.createEmptyDB(helper.getWritableDatabase()); } + // Obtain InvariantDeviceProfile first before setting pending to false, so + // InvariantDeviceProfile won't switch to new grid when initializing. + InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(context); + // Set is pending to false irrespective of the result, so that it doesn't get // executed again. Utilities.getPrefs(context).edit().remove(RESTORED_DEVICE_TYPE).commit(); - InvariantDeviceProfile.INSTANCE.get(context).reinitializeAfterRestore(context); + idp.reinitializeAfterRestore(context); } private static boolean performRestore(Context context, DatabaseHelper helper) {