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

Commit cdba9a44 authored by chaviw's avatar chaviw
Browse files

Moved cutout info into WindowFrames

Test: go/wm-smoke
Bug: 111359087
Change-Id: I8c27f6323adcd7dbc2f8a247b57fff725e987a21
parent 492139a7
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -315,7 +315,8 @@ message WindowStateProto {
    optional .android.graphics.RectProto visible_insets = 30;
    optional .android.graphics.RectProto stable_insets = 31;
    optional .android.graphics.RectProto outsets = 32;
    optional .android.view.DisplayCutoutProto cutout = 33;
    reserved 33;
//    optional .android.view.DisplayCutoutProto cutout = 33;
    optional bool remove_on_exit = 34;
    optional bool destroying = 35;
    optional bool removed = 36;
@@ -399,4 +400,5 @@ message WindowFramesProto {
    optional .android.graphics.RectProto overscan_frame = 7;
    optional .android.graphics.RectProto parent_frame = 8;
    optional .android.graphics.RectProto visible_frame = 9;
    optional .android.view.DisplayCutoutProto cutout = 10;
}
+10 −10
Original line number Diff line number Diff line
@@ -4652,6 +4652,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mDockLayer = 0x10000000;
        mStatusBarLayer = -1;

        mWindowFrames.setDisplayCutout(displayFrames.mDisplayCutout);
        mWindowFrames.setParentFrameWasClippedByDisplayCutout(false);

        if (displayFrames.mDisplayId == DEFAULT_DISPLAY) {
            // For purposes of putting out fake window up to steal focus, we will
            // drive nav being hidden only by whether it is requested.
@@ -4735,8 +4738,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                continue;
            }

            w.computeFrameLw(mWindowFrames, displayFrames.mDisplayCutout,
                    false /* parentFrameWasClippedByDisplayCutout */);
            w.computeFrameLw(mWindowFrames);
            final Rect frame = w.getFrameLw();

            if (frame.left <= 0 && frame.top <= 0) {
@@ -4798,8 +4800,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mStatusBarLayer = mStatusBar.getSurfaceLayer();

        // Let the status bar determine its size.
        mStatusBar.computeFrameLw(mWindowFrames, displayFrames.mDisplayCutout,
                false /* parentFrameWasClippedByDisplayCutout */);
        mStatusBar.computeFrameLw(mWindowFrames);

        // For layout, the status bar is always at the top with our fixed height.
        displayFrames.mStable.top = displayFrames.mUnrestricted.top
@@ -4954,8 +4955,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                navigationFrame /* stableFrame */,
                displayFrames.mDisplayCutoutSafe /* outsetFrame */);

        mNavigationBar.computeFrameLw(mWindowFrames, displayFrames.mDisplayCutout,
                false /* parentFrameWasClippedByDisplayCutout */);
        mNavigationBar.computeFrameLw(mWindowFrames);
        mNavigationBarController.setContentFrame(mNavigationBar.getContentFrameLw());

        if (DEBUG_LAYOUT) Slog.i(TAG, "mNavigationBar frame: " + navigationFrame);
@@ -5095,6 +5095,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        final Rect sf = mWindowFrames.mStableFrame;
        dcf.setEmpty();
        mWindowFrames.mOutsetFrame.setEmpty();
        mWindowFrames.setParentFrameWasClippedByDisplayCutout(false);
        mWindowFrames.setDisplayCutout(displayFrames.mDisplayCutout);

        final boolean hasNavBar = (isDefaultDisplay && mHasNavigationBar
                && mNavigationBar != null && mNavigationBar.isVisibleLw());
@@ -5414,7 +5416,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
        }

        boolean parentFrameWasClippedByDisplayCutout = false;
        final int cutoutMode = attrs.layoutInDisplayCutoutMode;
        final boolean attachedInParent = attached != null && !layoutInScreen;
        final boolean requestedHideNavigation =
@@ -5465,7 +5466,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            if (!attachedInParent && !floatingInScreenWindow) {
                mTmpRect.set(pf);
                pf.intersectUnchecked(displayCutoutSafeExceptMaybeBars);
                parentFrameWasClippedByDisplayCutout |= !mTmpRect.equals(pf);
                mWindowFrames.setParentFrameWasClippedByDisplayCutout(!mTmpRect.equals(pf));
            }
            // Make sure that NO_LIMITS windows clipped to the display don't extend under the
            // cutout.
@@ -5523,8 +5524,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                + " sf=" + sf.toShortString()
                + " osf=" + mWindowFrames.mOutsetFrame.toShortString());

        win.computeFrameLw(mWindowFrames, displayFrames.mDisplayCutout,
                parentFrameWasClippedByDisplayCutout);
        win.computeFrameLw(mWindowFrames);
        // Dock windows carve out the bottom of the screen, so normal windows
        // can't appear underneath them.
        if (type == TYPE_INPUT_METHOD && win.isVisibleLw()
+1 −5
Original line number Diff line number Diff line
@@ -201,12 +201,8 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants {
         *
         * @param windowFrames Container for all the window frames that affect how the window is
         *                     laid out.
         * @param displayCutout the display cutout
         * @param parentFrameWasClippedByDisplayCutout true if the parent frame would have been
         * different if there was no display cutout.
         */
        public void computeFrameLw(WindowFrames windowFrames, WmDisplayCutout displayCutout,
                boolean parentFrameWasClippedByDisplayCutout);
        public void computeFrameLw(WindowFrames windowFrames);

        /**
         * Retrieve the current frame of the window that has been assigned by
+50 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.wm;

import static com.android.server.wm.WindowFramesProto.CONTAINING_FRAME;
import static com.android.server.wm.WindowFramesProto.CONTENT_FRAME;
import static com.android.server.wm.WindowFramesProto.CUTOUT;
import static com.android.server.wm.WindowFramesProto.DECOR_FRAME;
import static com.android.server.wm.WindowFramesProto.DISPLAY_FRAME;
import static com.android.server.wm.WindowFramesProto.FRAME;
@@ -31,6 +32,9 @@ import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;

import java.io.PrintWriter;
import android.view.DisplayCutout;

import com.android.server.wm.utils.WmDisplayCutout;

/**
 * Container class for all the window frames that affect how windows are laid out.
@@ -113,6 +117,21 @@ public class WindowFrames {
     */
    final Rect mLastFrame = new Rect();

    /**
     * Whether the parent frame would have been different if there was no display cutout.
     */
    private boolean mParentFrameWasClippedByDisplayCutout;

    /**
     * Part of the display that has been cut away. See {@link DisplayCutout}.
     */
    WmDisplayCutout mDisplayCutout = WmDisplayCutout.NO_CUTOUT;

    /**
     * The last cutout that has been reported to the client.
     */
    WmDisplayCutout mLastDisplayCutout = WmDisplayCutout.NO_CUTOUT;

    public WindowFrames() {
    }

@@ -135,6 +154,33 @@ public class WindowFrames {
        mOutsetFrame.set(outsetFrame);
    }

    public void setParentFrameWasClippedByDisplayCutout(
            boolean parentFrameWasClippedByDisplayCutout) {
        mParentFrameWasClippedByDisplayCutout = parentFrameWasClippedByDisplayCutout;
    }

    boolean parentFrameWasClippedByDisplayCutout() {
        return mParentFrameWasClippedByDisplayCutout;
    }

    public void setDisplayCutout(WmDisplayCutout displayCutout) {
        mDisplayCutout = displayCutout;
    }

    /**
     * @return true if the width or height has changed since last reported to the client.
     */
    boolean didFrameSizeChange() {
        return (mLastFrame.width() != mFrame.width()) || (mLastFrame.height() != mFrame.height());
    }

    /**
     * @return true if the display cutout has changed since last reported to the client.
     */
    boolean didDisplayCutoutChange() {
        return !mLastDisplayCutout.equals(mDisplayCutout);
    }

    public void writeToProto(@NonNull ProtoOutputStream proto, long fieldId) {
        final long token = proto.start(fieldId);
        mParentFrame.writeToProto(proto, PARENT_FRAME);
@@ -146,6 +192,7 @@ public class WindowFrames {
        mOutsetFrame.writeToProto(proto, OUTSET_FRAME);
        mContainingFrame.writeToProto(proto, CONTAINING_FRAME);
        mFrame.writeToProto(proto, FRAME);
        mDisplayCutout.getDisplayCutout().writeToProto(proto, CUTOUT);
        proto.end(token);
    }

@@ -171,6 +218,8 @@ public class WindowFrames {
        pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw);
                pw.print(" last="); mLastFrame.printShortString(pw);
                pw.println();
        pw.print(prefix); pw.print(" cutout=" + mDisplayCutout.getDisplayCutout());
                pw.print(" last=" + mLastDisplayCutout.getDisplayCutout());
                pw.println();
    }

}
+1 −1
Original line number Diff line number Diff line
@@ -2164,7 +2164,7 @@ public class WindowManagerService extends IWindowManager.Stub
            win.mLastRelayoutContentInsets.set(win.mContentInsets);
            outVisibleInsets.set(win.mVisibleInsets);
            outStableInsets.set(win.mStableInsets);
            outCutout.set(win.mDisplayCutout.getDisplayCutout());
            outCutout.set(win.getWmDisplayCutout().getDisplayCutout());
            outOutsets.set(win.mOutsets);
            outBackdropFrame.set(win.getBackdropFrame(win.getFrameLw()));
            if (localLOGV) Slog.v(
Loading