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

Commit ae190ff8 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Revert "Have consistent All Apps UI between grid size changes."

Revert submission 557031-1571265377317-631e3e5

Reason for revert: Breaks multiwindow and secondary display layout
Reverted Changes:
Idee087e31:Remove numAllAppsColumns, allAppsIconSize, allApps...
I6235862c9:Have consistent All Apps UI between grid size chan...

Change-Id: I64156123a8fbaba1a7d2b64cddd5376671123aa2
parent 2fc1c884
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -118,6 +118,8 @@
        <!-- numHotseatIcons defaults to numColumns, if not specified -->
        <attr name="numHotseatIcons" format="integer" />
        <attr name="dbFile" format="string" />
        <!-- numAllAppsColumns defaults to numColumns, if not specified -->
        <attr name="numAllAppsColumns" format="integer" />
        <attr name="defaultLayoutId" format="reference" />
        <attr name="demoModeLayoutId" format="reference" />
    </declare-styleable>
@@ -133,6 +135,12 @@
        <attr name="iconTextSize" format="float" />
        <!-- If true, this display option is used to determine the default grid -->
        <attr name="canBeDefault" format="boolean" />

        <!-- The following values are only enabled if grid is supported. -->
        <!-- allAppsIconSize defaults to iconSize, if not specified -->
        <attr name="allAppsIconSize" format="float" />
        <!-- allAppsIconTextSize defaults to iconTextSize, if not specified -->
        <attr name="allAppsIconTextSize" format="float" />
    </declare-styleable>

    <declare-styleable name="CellLayout">
+18 −28
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@ import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.Surface;

import androidx.annotation.Nullable;

import com.android.launcher3.CellLayout.ContainerType;
import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.icons.DotRenderer;
@@ -36,8 +34,6 @@ import com.android.launcher3.util.DefaultDisplay;
public class DeviceProfile {

    public final InvariantDeviceProfile inv;
    // IDP with no grid override values.
    @Nullable private final InvariantDeviceProfile originalIdp;

    // Device properties
    public final boolean isTablet;
@@ -138,11 +134,10 @@ public class DeviceProfile {
    public DotRenderer mDotRendererAllApps;

    public DeviceProfile(Context context, InvariantDeviceProfile inv,
            InvariantDeviceProfile originalIDP, Point minSize, Point maxSize,
            Point minSize, Point maxSize,
            int width, int height, boolean isLandscape, boolean isMultiWindowMode) {

        this.inv = inv;
        this.originalIdp = inv;
        this.isLandscape = isLandscape;
        this.isMultiWindowMode = isMultiWindowMode;

@@ -234,19 +229,6 @@ public class DeviceProfile {
            // Recalculate the available dimensions using the new hotseat size.
            updateAvailableDimensions(dm, res);
        }

        if (originalIDP != null) {
            // Grid size change should not affect All Apps UI, so we use the original profile
            // measurements here.
            DeviceProfile originalProfile = isLandscape
                    ? originalIDP.landscapeProfile
                    : originalIDP.portraitProfile;
            allAppsIconSizePx = originalProfile.iconSizePx;
            allAppsIconTextSizePx = originalProfile.iconTextSizePx;
            allAppsCellHeightPx = originalProfile.allAppsCellHeightPx;
            allAppsIconDrawablePaddingPx = originalProfile.iconDrawablePaddingOriginalPx;
            allAppsCellWidthPx = allAppsIconSizePx + 2 * allAppsIconDrawablePaddingPx;
        }
        updateWorkspacePadding();

        // This is done last, after iconSizePx is calculated above.
@@ -259,8 +241,8 @@ public class DeviceProfile {

    public DeviceProfile copy(Context context) {
        Point size = new Point(availableWidthPx, availableHeightPx);
        return new DeviceProfile(context, inv, originalIdp, size, size, widthPx, heightPx,
                isLandscape, isMultiWindowMode);
        return new DeviceProfile(context, inv, size, size, widthPx, heightPx, isLandscape,
                isMultiWindowMode);
    }

    public DeviceProfile getMultiWindowProfile(Context context, Point mwSize) {
@@ -271,8 +253,8 @@ public class DeviceProfile {
        // In multi-window mode, we can have widthPx = availableWidthPx
        // and heightPx = availableHeightPx because Launcher uses the InvariantDeviceProfiles'
        // widthPx and heightPx values where it's needed.
        DeviceProfile profile = new DeviceProfile(context, inv, originalIdp, mwSize, mwSize,
                mwSize.x, mwSize.y, isLandscape, true);
        DeviceProfile profile = new DeviceProfile(context, inv, mwSize, mwSize, mwSize.x, mwSize.y,
                isLandscape, true);

        // If there isn't enough vertical cell padding with the labels displayed, hide the labels.
        float workspaceCellPaddingY = profile.getCellSize().y - profile.iconSizePx
@@ -356,11 +338,19 @@ public class DeviceProfile {
        }
        cellWidthPx = iconSizePx + iconDrawablePaddingPx;

        // All apps
        if (allAppsHasDifferentNumColumns()) {
            allAppsIconSizePx = ResourceUtils.pxFromDp(inv.allAppsIconSize, dm);
            allAppsIconTextSizePx = Utilities.pxFromSp(inv.allAppsIconTextSize, dm);
            allAppsCellHeightPx = getCellSize(inv.numAllAppsColumns, inv.numAllAppsColumns).y;
            allAppsIconDrawablePaddingPx = iconDrawablePaddingOriginalPx;
        } else {
            allAppsIconSizePx = iconSizePx;
            allAppsIconTextSizePx = iconTextSizePx;
            allAppsIconDrawablePaddingPx = iconDrawablePaddingPx;
            allAppsCellHeightPx = getCellSize().y;
        allAppsCellWidthPx = allAppsIconSizePx + 2 * allAppsIconDrawablePaddingPx;
        }
        allAppsCellWidthPx = allAppsIconSizePx + allAppsIconDrawablePaddingPx;

        if (isVerticalBarLayout()) {
            // Always hide the Workspace text with vertical bar layout.
+83 −107
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;

import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.graphics.LauncherPreviewRenderer;
import com.android.launcher3.util.ConfigMonitor;
import com.android.launcher3.util.DefaultDisplay;
import com.android.launcher3.util.DefaultDisplay.Info;
@@ -61,7 +60,6 @@ import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class InvariantDeviceProfile {

@@ -107,6 +105,8 @@ public class InvariantDeviceProfile {
    public int iconBitmapSize;
    public int fillResIconDpi;
    public float iconTextSize;
    public float allAppsIconSize;
    public float allAppsIconTextSize;

    private SparseArray<TypedValue> mExtraAttrs;

@@ -149,6 +149,8 @@ public class InvariantDeviceProfile {
        numHotseatIcons = p.numHotseatIcons;
        numAllAppsColumns = p.numAllAppsColumns;
        dbFile = p.dbFile;
        allAppsIconSize = p.allAppsIconSize;
        allAppsIconTextSize = p.allAppsIconTextSize;
        defaultLayoutId = p.defaultLayoutId;
        demoModeLayoutId = p.demoModeLayoutId;
        mExtraAttrs = p.mExtraAttrs;
@@ -157,12 +159,9 @@ public class InvariantDeviceProfile {

    @TargetApi(23)
    private InvariantDeviceProfile(Context context) {
        if (context instanceof LauncherPreviewRenderer.PreviewContext) {
            throw new IllegalArgumentException(
                    "PreviewContext is passed into this IDP constructor");
        }

        String gridName = getCurrentGridName(context);
        String gridName = Utilities.getPrefs(context).getBoolean(GRID_OPTIONS_PREFERENCE_KEY, false)
                ? Utilities.getPrefs(context).getString(KEY_IDP_GRID_NAME, null)
                : null;
        initGrid(context, gridName);
        mConfigMonitor = new ConfigMonitor(context,
                APPLY_CONFIG_AT_RUNTIME.get() ? this::onConfigChanged : this::killProcess);
@@ -211,77 +210,67 @@ public class InvariantDeviceProfile {
        Point smallestSize = new Point(displayInfo.smallestSize);
        Point largestSize = new Point(displayInfo.largestSize);

        ArrayList<DisplayOption> allOptions = getPredefinedDeviceProfiles(context, gridName);
        // This guarantees that width < height
        float minWidthDps = Utilities.dpiFromPx(Math.min(smallestSize.x, smallestSize.y),
                displayInfo.metrics);
        float minHeightDps = Utilities.dpiFromPx(Math.min(largestSize.x, largestSize.y),
                displayInfo.metrics);

        Point realSize = new Point(displayInfo.realSize);
        // The real size never changes. smallSide and largeSide will remain the
        // same in any orientation.
        int smallSide = Math.min(realSize.x, realSize.y);
        int largeSide = Math.max(realSize.x, realSize.y);

        // We want a list of all options as well as the list of filtered options. This allows us
        // to have a consistent UI for areas that the grid size change should not affect
        // ie. All Apps should be consistent between grid sizes.
        ArrayList<DisplayOption> allOptions = new ArrayList<>();
        ArrayList<DisplayOption> filteredOptions = new ArrayList<>();
        getPredefinedDeviceProfiles(context, gridName, filteredOptions, allOptions);

        if (allOptions.isEmpty() && filteredOptions.isEmpty()) {
            throw new RuntimeException("No display option with canBeDefault=true");
        }

        // Sort the profiles based on the closeness to the device size
        Comparator<DisplayOption> comparator = (a, b) -> Float.compare(dist(minWidthDps,
                minHeightDps, a.minWidthDps, a.minHeightDps),
                dist(minWidthDps, minHeightDps, b.minWidthDps, b.minHeightDps));

        // Calculate the device profiles as if there is no grid override.
        Collections.sort(allOptions, comparator);
        Collections.sort(allOptions, (a, b) ->
                Float.compare(dist(minWidthDps, minHeightDps, a.minWidthDps, a.minHeightDps),
                        dist(minWidthDps, minHeightDps, b.minWidthDps, b.minHeightDps)));
        DisplayOption interpolatedDisplayOption =
                invDistWeightedInterpolate(minWidthDps,  minHeightDps, allOptions);
        initGridOption(context, allOptions, interpolatedDisplayOption, displayInfo.metrics);

        // Create IDP with no grid override values.
        InvariantDeviceProfile originalIDP = new InvariantDeviceProfile(this);
        originalIDP.landscapeProfile = new DeviceProfile(context, this, null, smallestSize,
                largestSize, largeSide, smallSide, true /* isLandscape */,
                false /* isMultiWindowMode */);
        originalIDP.portraitProfile = new DeviceProfile(context, this, null, smallestSize,
                largestSize, smallSide, largeSide, false /* isLandscape */,
                false /* isMultiWindowMode */);

        if (filteredOptions.isEmpty()) {
            filteredOptions = allOptions;

            landscapeProfile = originalIDP.landscapeProfile;
            portraitProfile = originalIDP.portraitProfile;
        } else {
            Collections.sort(filteredOptions, comparator);
            interpolatedDisplayOption =
                    invDistWeightedInterpolate(minWidthDps, minHeightDps, filteredOptions);

            initGridOption(context, filteredOptions, interpolatedDisplayOption,
                    displayInfo.metrics);
            numAllAppsColumns = originalIDP.numAllAppsColumns;
        GridOption closestProfile = allOptions.get(0).grid;
        numRows = closestProfile.numRows;
        numColumns = closestProfile.numColumns;
        numHotseatIcons = closestProfile.numHotseatIcons;
        dbFile = closestProfile.dbFile;
        defaultLayoutId = closestProfile.defaultLayoutId;
        demoModeLayoutId = closestProfile.demoModeLayoutId;
        numFolderRows = closestProfile.numFolderRows;
        numFolderColumns = closestProfile.numFolderColumns;
        numAllAppsColumns = closestProfile.numAllAppsColumns;

            landscapeProfile = new DeviceProfile(context, this, originalIDP, smallestSize,
                    largestSize, largeSide, smallSide, true /* isLandscape */,
                    false /* isMultiWindowMode */);
            portraitProfile = new DeviceProfile(context, this, originalIDP, smallestSize,
                    largestSize, smallSide, largeSide, false /* isLandscape */,
                    false /* isMultiWindowMode */);
        }
        mExtraAttrs = closestProfile.extraAttrs;

        GridOption closestProfile = filteredOptions.get(0).grid;
        if (!closestProfile.name.equals(gridName)) {
            Utilities.getPrefs(context).edit()
                    .putString(KEY_IDP_GRID_NAME, closestProfile.name).apply();
        }

        iconSize = interpolatedDisplayOption.iconSize;
        iconShapePath = getIconShapePath(context);
        landscapeIconSize = interpolatedDisplayOption.landscapeIconSize;
        iconBitmapSize = ResourceUtils.pxFromDp(iconSize, displayInfo.metrics);
        iconTextSize = interpolatedDisplayOption.iconTextSize;
        fillResIconDpi = getLauncherIconDensity(iconBitmapSize);

        if (Utilities.getPrefs(context).getBoolean(GRID_OPTIONS_PREFERENCE_KEY, false)) {
            allAppsIconSize = interpolatedDisplayOption.allAppsIconSize;
            allAppsIconTextSize = interpolatedDisplayOption.allAppsIconTextSize;
        } else {
            allAppsIconSize = iconSize;
            allAppsIconTextSize = iconTextSize;
        }

        // If the partner customization apk contains any grid overrides, apply them
        // Supported overrides: numRows, numColumns, iconSize
        applyPartnerDeviceProfileOverrides(context, displayInfo.metrics);

        Point realSize = new Point(displayInfo.realSize);
        // The real size never changes. smallSide and largeSide will remain the
        // same in any orientation.
        int smallSide = Math.min(realSize.x, realSize.y);
        int largeSide = Math.max(realSize.x, realSize.y);

        landscapeProfile = new DeviceProfile(context, this, smallestSize, largestSize,
                largeSide, smallSide, true /* isLandscape */, false /* isMultiWindowMode */);
        portraitProfile = new DeviceProfile(context, this, smallestSize, largestSize,
                smallSide, largeSide, false /* isLandscape */, false /* isMultiWindowMode */);

        // We need to ensure that there is enough extra space in the wallpaper
        // for the intended parallax effects
        if (context.getResources().getConfiguration().smallestScreenWidthDp >= 720) {
@@ -298,34 +287,6 @@ public class InvariantDeviceProfile {
        return closestProfile.name;
    }

    private void initGridOption(Context context, ArrayList<DisplayOption> options,
            DisplayOption displayOption, DisplayMetrics metrics) {
        GridOption closestProfile = options.get(0).grid;
        numRows = closestProfile.numRows;
        numColumns = closestProfile.numColumns;
        numHotseatIcons = closestProfile.numHotseatIcons;
        dbFile = closestProfile.dbFile;
        defaultLayoutId = closestProfile.defaultLayoutId;
        demoModeLayoutId = closestProfile.demoModeLayoutId;
        numFolderRows = closestProfile.numFolderRows;
        numFolderColumns = closestProfile.numFolderColumns;
        numAllAppsColumns = numColumns;

        mExtraAttrs = closestProfile.extraAttrs;

        iconSize = displayOption.iconSize;
        iconShapePath = getIconShapePath(context);
        landscapeIconSize = displayOption.landscapeIconSize;
        iconBitmapSize = ResourceUtils.pxFromDp(iconSize, metrics);
        iconTextSize = displayOption.iconTextSize;
        fillResIconDpi = getLauncherIconDensity(iconBitmapSize);

        // If the partner customization apk contains any grid overrides, apply them
        // Supported overrides: numRows, numColumns, iconSize
        applyPartnerDeviceProfileOverrides(context, metrics);
    }


    @Nullable
    public TypedValue getAttrValue(int attr) {
        return mExtraAttrs == null ? null : mExtraAttrs.get(attr);
@@ -403,13 +364,7 @@ public class InvariantDeviceProfile {
        }
    }

    /**
     * @param gridName The current grid name.
     * @param filteredOptionsOut List filled with all the filtered options based on gridName.
     * @param allOptionsOut List filled with all the options that can be the default option.
     */
    static void getPredefinedDeviceProfiles(Context context, String gridName,
            ArrayList<DisplayOption> filteredOptionsOut, ArrayList<DisplayOption> allOptionsOut) {
    static ArrayList<DisplayOption> getPredefinedDeviceProfiles(Context context, String gridName) {
        ArrayList<DisplayOption> profiles = new ArrayList<>();
        try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
            final int depth = parser.getDepth();
@@ -436,20 +391,27 @@ public class InvariantDeviceProfile {
            throw new RuntimeException(e);
        }

        ArrayList<DisplayOption> filteredProfiles = new ArrayList<>();
        if (!TextUtils.isEmpty(gridName)) {
            for (DisplayOption option : profiles) {
                if (gridName.equals(option.grid.name)) {
                    filteredOptionsOut.add(option);
                    filteredProfiles.add(option);
                }
            }
        }

        if (filteredProfiles.isEmpty()) {
            // No grid found, use the default options
            for (DisplayOption option : profiles) {
                if (option.canBeDefault) {
                allOptionsOut.add(option);
                    filteredProfiles.add(option);
                }
            }
        }
        if (filteredProfiles.isEmpty()) {
            throw new RuntimeException("No display option with canBeDefault=true");
        }
        return filteredProfiles;
    }

    private int getLauncherIconDensity(int requiredSize) {
        // Densities typically defined by an app.
@@ -573,6 +535,8 @@ public class InvariantDeviceProfile {
        private final int numHotseatIcons;

        private final String dbFile;
        private final int numAllAppsColumns;

        private final int defaultLayoutId;
        private final int demoModeLayoutId;

@@ -596,6 +560,8 @@ public class InvariantDeviceProfile {
                    R.styleable.GridDisplayOption_numFolderRows, numRows);
            numFolderColumns = a.getInt(
                    R.styleable.GridDisplayOption_numFolderColumns, numColumns);
            numAllAppsColumns = a.getInt(
                    R.styleable.GridDisplayOption_numAllAppsColumns, numColumns);

            a.recycle();

@@ -615,6 +581,8 @@ public class InvariantDeviceProfile {
        private float iconSize;
        private float iconTextSize;
        private float landscapeIconSize;
        private float allAppsIconSize;
        private float allAppsIconTextSize;

        DisplayOption(GridOption grid, Context context, AttributeSet attrs) {
            this.grid = grid;
@@ -633,6 +601,10 @@ public class InvariantDeviceProfile {
                    iconSize);
            iconTextSize = a.getFloat(R.styleable.ProfileDisplayOption_iconTextSize, 0);

            allAppsIconSize = a.getFloat(R.styleable.ProfileDisplayOption_allAppsIconSize,
                    iconSize);
            allAppsIconTextSize = a.getFloat(R.styleable.ProfileDisplayOption_allAppsIconTextSize,
                    iconTextSize);
            a.recycle();
        }

@@ -647,14 +619,18 @@ public class InvariantDeviceProfile {
        private DisplayOption multiply(float w) {
            iconSize *= w;
            landscapeIconSize *= w;
            allAppsIconSize *= w;
            iconTextSize *= w;
            allAppsIconTextSize *= w;
            return this;
        }

        private DisplayOption add(DisplayOption p) {
            iconSize += p.iconSize;
            landscapeIconSize += p.landscapeIconSize;
            allAppsIconSize += p.allAppsIconSize;
            iconTextSize += p.iconTextSize;
            allAppsIconTextSize += p.allAppsIconTextSize;
            return this;
        }
    }