diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index ca07249b06..1b2f177ff2 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -46,6 +46,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.launcher3.model.DeviceGridState; +import com.android.launcher3.provider.RestoreDbTask; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.IntArray; @@ -204,11 +205,11 @@ public class InvariantDeviceProfile { // Get the display info based on default display and interpolate it to existing display DisplayOption defaultDisplayOption = invDistWeightedInterpolate( DisplayController.INSTANCE.get(context).getInfo(), - getPredefinedDeviceProfiles(context, gridName, false), false); + getPredefinedDeviceProfiles(context, gridName, false, false), false); Info myInfo = new Info(context, display); DisplayOption myDisplayOption = invDistWeightedInterpolate( - myInfo, getPredefinedDeviceProfiles(context, gridName, false), false); + myInfo, getPredefinedDeviceProfiles(context, gridName, false, false), false); DisplayOption result = new DisplayOption(defaultDisplayOption.grid) .add(myDisplayOption); @@ -227,6 +228,29 @@ public class InvariantDeviceProfile { initGrid(context, myInfo, result, false); } + /** + * Reinitialize the current grid after a restore, where some grids might now be disabled. + */ + public void reinitializeAfterRestore(Context 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 + + ", migrating to: " + newGridName + + ", removing all other grid db files"); + for (String gridDbFile : LauncherFiles.GRID_DB_FILES) { + if (gridDbFile.equals(currentDbFile)) { + continue; + } + if (context.getDatabasePath(gridDbFile).delete()) { + Log.d(TAG, "Removed old grid db file: " + gridDbFile); + } + } + setCurrentGrid(context, gridName); + } + } + public static String getCurrentGridName(Context context) { return Utilities.isGridOptionsEnabled(context) ? Utilities.getPrefs(context).getString(KEY_IDP_GRID_NAME, null) : null; @@ -240,7 +264,8 @@ public class InvariantDeviceProfile { displayInfo.supportedBounds.size() >= 4 && ENABLE_TWO_PANEL_HOME.get(); ArrayList allOptions = - getPredefinedDeviceProfiles(context, gridName, isSplitDisplay); + getPredefinedDeviceProfiles(context, gridName, isSplitDisplay, + RestoreDbTask.isPending(context)); DisplayOption displayOption = invDistWeightedInterpolate(displayInfo, allOptions, isSplitDisplay); initGrid(context, displayInfo, displayOption, isSplitDisplay); @@ -366,7 +391,7 @@ public class InvariantDeviceProfile { } private static ArrayList getPredefinedDeviceProfiles( - Context context, String gridName, boolean isSplitDisplay) { + Context context, String gridName, boolean isSplitDisplay, boolean allowDisabledGrid) { ArrayList profiles = new ArrayList<>(); try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) { final int depth = parser.getDepth(); @@ -378,7 +403,7 @@ public class InvariantDeviceProfile { GridOption gridOption = new GridOption(context, Xml.asAttributeSet(parser), isSplitDisplay); - if (gridOption.isEnabled) { + if (gridOption.isEnabled || allowDisabledGrid) { final int displayDepth = parser.getDepth(); while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > displayDepth) @@ -400,7 +425,8 @@ public class InvariantDeviceProfile { ArrayList filteredProfiles = new ArrayList<>(); if (!TextUtils.isEmpty(gridName)) { for (DisplayOption option : profiles) { - if (gridName.equals(option.grid.name) && option.grid.isEnabled) { + if (gridName.equals(option.grid.name) + && (option.grid.isEnabled || allowDisabledGrid)) { filteredProfiles.add(option); } } diff --git a/src/com/android/launcher3/LauncherFiles.java b/src/com/android/launcher3/LauncherFiles.java index 6c0daa4da9..64f1d951dc 100644 --- a/src/com/android/launcher3/LauncherFiles.java +++ b/src/com/android/launcher3/LauncherFiles.java @@ -1,5 +1,6 @@ package com.android.launcher3; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -29,16 +30,24 @@ public class LauncherFiles { public static final String WIDGET_PREVIEWS_DB = "widgetpreviews.db"; public static final String APP_ICONS_DB = "app_icons.db"; - public static final List ALL_FILES = Collections.unmodifiableList(Arrays.asList( + public static final List GRID_DB_FILES = Collections.unmodifiableList(Arrays.asList( LAUNCHER_DB, LAUNCHER_4_BY_5_DB, LAUNCHER_4_BY_4_DB, LAUNCHER_3_BY_3_DB, - LAUNCHER_2_BY_2_DB, + LAUNCHER_2_BY_2_DB)); + + public static final List OTHER_FILES = Collections.unmodifiableList(Arrays.asList( BACKUP_DB, SHARED_PREFERENCES_KEY + XML, WIDGET_PREVIEWS_DB, MANAGED_USER_PREFERENCES_KEY + XML, DEVICE_PREFERENCES_KEY + XML, APP_ICONS_DB)); + + public static final List ALL_FILES = Collections.unmodifiableList( + new ArrayList() {{ + addAll(GRID_DB_FILES); + addAll(OTHER_FILES); + }}); } diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index d59429d5f8..257d732e4c 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -81,6 +81,8 @@ public class RestoreDbTask { // 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); } private static boolean performRestore(Context context, DatabaseHelper helper) {