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

Commit a77d7425 authored by Naomi Musgrave's avatar Naomi Musgrave
Browse files

PossibleMaximumWindowMetrics reports physical display insets for each

DisplayInfo (current and non-current display)

Changes behaviour from dumbly applying the insets of the current
DisplayInfo to all other DisplayInfo, to reading the insets of each
DisplayInfo into WindowMetrics. Additionally, applies the appropriate
rotation to the insets of each DisplayInfo, so the WindowMetrics
contain the correctly-rotated insets.

Bug: 201546646
Test: Manual
Change-Id: I5756a768b7544939d55d5759f838b27278ca1da6
parent b4fabe9b
Loading
Loading
Loading
Loading
+16 −19
Original line number Diff line number Diff line
@@ -352,25 +352,11 @@ public final class WindowManagerImpl implements WindowManager {
            throw e.rethrowFromSystemServer();
        }

        int size = possibleDisplayInfos.size();
        Set<WindowMetrics> maxMetrics = new HashSet<>();
        WindowInsets windowInsets;
        DisplayInfo currentDisplayInfo;
        WindowInsets windowInsets = null;
        if (size > 0) {
            currentDisplayInfo = possibleDisplayInfos.get(0);

        final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
            final boolean isScreenRound = (currentDisplayInfo.flags & Display.FLAG_ROUND) != 0;
            // TODO(181127261) not computing insets correctly - need to have underlying
            // frame reflect the faked orientation.
            windowInsets = getWindowInsetsFromServerForDisplay(
                    currentDisplayInfo.displayId, params,
                    new Rect(0, 0, currentDisplayInfo.getNaturalWidth(),
                            currentDisplayInfo.getNaturalHeight()), isScreenRound,
                    WINDOWING_MODE_FULLSCREEN);
        }

        Set<WindowMetrics> maxMetrics = new HashSet<>();
        for (int i = 0; i < size; i++) {
        for (int i = 0; i < possibleDisplayInfos.size(); i++) {
            currentDisplayInfo = possibleDisplayInfos.get(i);

            // Calculate max bounds for this rotation and state.
@@ -378,7 +364,18 @@ public final class WindowManagerImpl implements WindowManager {
                    currentDisplayInfo.logicalHeight);

            // Calculate insets for the rotated max bounds.
            // TODO(181127261) calculate insets for each display rotation and state.
            final boolean isScreenRound = (currentDisplayInfo.flags & Display.FLAG_ROUND) != 0;
            // Initialize insets based upon display rotation. Note any window-provided insets
            // will not be set.
            windowInsets = getWindowInsetsFromServerForDisplay(
                    currentDisplayInfo.displayId, params,
                    new Rect(0, 0, currentDisplayInfo.getNaturalWidth(),
                            currentDisplayInfo.getNaturalHeight()), isScreenRound,
                    WINDOWING_MODE_FULLSCREEN);
            // Set the hardware-provided insets.
            windowInsets = new WindowInsets.Builder(windowInsets).setRoundedCorners(
                    currentDisplayInfo.roundedCorners)
                    .setDisplayCutout(currentDisplayInfo.displayCutout).build();

            maxMetrics.add(new WindowMetrics(maxBounds, windowInsets));
        }
+14 −8
Original line number Diff line number Diff line
@@ -588,7 +588,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
    /** Caches the value whether told display manager that we have content. */
    private boolean mLastHasContent;

    private DisplayRotationUtil mRotationUtil = new DisplayRotationUtil();
    private static DisplayRotationUtil sRotationUtil = new DisplayRotationUtil();

    /**
     * The input method window for this display.
@@ -2053,29 +2053,35 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        return mDisplayCutoutCache.getOrCompute(mInitialDisplayCutout, rotation);
    }

    private WmDisplayCutout calculateDisplayCutoutForRotationUncached(
            DisplayCutout cutout, int rotation) {
    static WmDisplayCutout calculateDisplayCutoutForRotationAndDisplaySizeUncached(
            DisplayCutout cutout, int rotation, int displayWidth, int displayHeight) {
        if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
            return WmDisplayCutout.NO_CUTOUT;
        }
        if (rotation == ROTATION_0) {
            return WmDisplayCutout.computeSafeInsets(
                    cutout, mInitialDisplayWidth, mInitialDisplayHeight);
                    cutout, displayWidth, displayHeight);
        }
        final Insets waterfallInsets =
                RotationUtils.rotateInsets(cutout.getWaterfallInsets(), rotation);
        final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
        final Rect[] newBounds = mRotationUtil.getRotatedBounds(
        final Rect[] newBounds = sRotationUtil.getRotatedBounds(
                cutout.getBoundingRectsAll(),
                rotation, mInitialDisplayWidth, mInitialDisplayHeight);
                rotation, displayWidth, displayHeight);
        final CutoutPathParserInfo info = cutout.getCutoutPathParserInfo();
        final CutoutPathParserInfo newInfo = new CutoutPathParserInfo(
                info.getDisplayWidth(), info.getDisplayHeight(), info.getDensity(),
                info.getCutoutSpec(), rotation, info.getScale());
        return WmDisplayCutout.computeSafeInsets(
                DisplayCutout.constructDisplayCutout(newBounds, waterfallInsets, newInfo),
                rotated ? mInitialDisplayHeight : mInitialDisplayWidth,
                rotated ? mInitialDisplayWidth : mInitialDisplayHeight);
                rotated ? displayHeight : displayWidth,
                rotated ? displayWidth : displayHeight);
    }

    private WmDisplayCutout calculateDisplayCutoutForRotationUncached(
            DisplayCutout cutout, int rotation) {
        return calculateDisplayCutoutForRotationAndDisplaySizeUncached(cutout, rotation,
                mInitialDisplayWidth, mInitialDisplayHeight);
    }

    RoundedCorners calculateRoundedCornersForRotation(int rotation) {
+8 −1
Original line number Diff line number Diff line
@@ -120,8 +120,15 @@ public class PossibleDisplayInfoMapper {
            @Surface.Rotation int rotation) {
        DisplayInfo updatedDisplayInfo = new DisplayInfo();
        updatedDisplayInfo.copyFrom(displayInfo);
        updatedDisplayInfo.rotation = rotation;
        // Apply rotations before updating width and height
        updatedDisplayInfo.roundedCorners = updatedDisplayInfo.roundedCorners.rotate(rotation,
                updatedDisplayInfo.logicalWidth, updatedDisplayInfo.logicalHeight);
        updatedDisplayInfo.displayCutout =
                DisplayContent.calculateDisplayCutoutForRotationAndDisplaySizeUncached(
                        updatedDisplayInfo.displayCutout, rotation, updatedDisplayInfo.logicalWidth,
                        updatedDisplayInfo.logicalHeight).getDisplayCutout();

        updatedDisplayInfo.rotation = rotation;
        final int naturalWidth = updatedDisplayInfo.getNaturalWidth();
        final int naturalHeight = updatedDisplayInfo.getNaturalHeight();
        updatedDisplayInfo.logicalWidth = naturalWidth;