Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 238aaee0 authored by Alex Chau's avatar Alex Chau
Browse files

Allow 2x2 and 3x3 to be migrated after restore

- Allow disabled grid to be used during restore
- Remove all inactive grid dbFiles to allow grid migration to happen
- Set the proper grid after restore to trigger migration

Bug: 202125760
Test: Restore a 2x2,3x3 grid, icons and widgets are migrated to 4x4 grid
Test: Restore a 4x4 grid, icons and widgetse stays in original position
Change-Id: Ie59e1ca0ca56ed2de52d88cd5f51b980788afa52
parent fa8860a1
Loading
Loading
Loading
Loading
+32 −6
Original line number Diff line number Diff line
@@ -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<DisplayOption> 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<DisplayOption> getPredefinedDeviceProfiles(
            Context context, String gridName, boolean isSplitDisplay) {
            Context context, String gridName, boolean isSplitDisplay, boolean allowDisabledGrid) {
        ArrayList<DisplayOption> 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<DisplayOption> 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);
                }
            }
+11 −2
Original line number Diff line number Diff line
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<String> ALL_FILES = Collections.unmodifiableList(Arrays.asList(
    public static final List<String> 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<String> 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<String> ALL_FILES = Collections.unmodifiableList(
            new ArrayList<String>() {{
                addAll(GRID_DB_FILES);
                addAll(OTHER_FILES);
            }});
}
+2 −0
Original line number Diff line number Diff line
@@ -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) {