diff options
author | Tiger Huang <tigerhuang@google.com> | 2020-12-23 19:37:02 +0800 |
---|---|---|
committer | Tiger Huang <tigerhuang@google.com> | 2021-01-05 22:22:38 +0800 |
commit | ec1a69e87cb52a27583bcbce2df56788d93812be (patch) | |
tree | eb76c34eef26f0600d126d724ea8454e59295baa | |
parent | 5e6d61140f22e7dc90053209b4fe04902740ae3b (diff) |
Send display cutout to client via insetsChanged
Since the display cutout is a type of insets and the display cutout can
be obtained from WindowInsets, it makes sense that InsetsState has the
display cutout instance. In this way, we can send the display cutout to
client via W#insetsChanged instead of W#resized.
This can be a step to remove the class of ClientWindowFrames, and can
also be a step to make client compute its window frame locally.
Fix: 175858810
Bug: 161810301
Test: atest WindowAddRemovePerfTest ImeInsetsSourceConsumerTest
InsetsControllerTest InsetsStateTest ViewRootImplTest
WindowInsetsControllerTests ActivityRecordTests
DisplayPolicyLayoutTests LaunchParamsControllerTests
TaskSnapshotSurfaceTest WindowMetricsActivityTests
WindowMetricsWindowContextTests WindowMetricsTest
WindowFrameTests WindowStateTests WmDisplayCutoutTest
Change-Id: I9a930b1d2f7df3cea2b29629b767a4a5f31bca17
35 files changed, 225 insertions, 419 deletions
diff --git a/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java b/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java index 9403e8b72348..c37f6d97aba7 100644 --- a/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java +++ b/apct-tests/perftests/windowmanager/src/android/wm/WindowAddRemovePerfTest.java @@ -107,8 +107,8 @@ public class WindowAddRemovePerfTest extends WindowManagerPerfTestBase long startTime = SystemClock.elapsedRealtimeNanos(); session.addToDisplay(this, mLayoutParams, View.VISIBLE, - Display.DEFAULT_DISPLAY, mRequestedVisibility, mOutFrame, - mOutDisplayCutout, inputChannel, mOutInsetsState, mOutControls); + Display.DEFAULT_DISPLAY, mRequestedVisibility, mOutFrame, inputChannel, + mOutInsetsState, mOutControls); final long elapsedTimeNsOfAdd = SystemClock.elapsedRealtimeNanos() - startTime; state.addExtraResult("add", elapsedTimeNsOfAdd); diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 37637119c70a..507dc7a1d59a 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -881,8 +881,7 @@ public abstract class WallpaperService extends Service { if (mSession.addToDisplay(mWindow, mLayout, View.VISIBLE, mDisplay.getDisplayId(), mInsetsState, mWinFrames.frame, - mWinFrames.displayCutout, inputChannel, mInsetsState, - mTempControls) < 0) { + inputChannel, mInsetsState, mTempControls) < 0) { Log.w(TAG, "Failed to add window while updating wallpaper surface."); return; } @@ -924,13 +923,13 @@ public abstract class WallpaperService extends Service { int w = mWinFrames.frame.width(); int h = mWinFrames.frame.height(); - final DisplayCutout rawCutout = mWinFrames.displayCutout.get(); + final DisplayCutout rawCutout = mInsetsState.getDisplayCutout(); final Configuration config = getResources().getConfiguration(); final Rect visibleFrame = new Rect(mWinFrames.frame); visibleFrame.intersect(mInsetsState.getDisplayFrame()); WindowInsets windowInsets = mInsetsState.calculateInsets(visibleFrame, null /* ignoringVisibilityState */, config.isScreenRound(), - false /* alwaysConsumeSystemBars */, rawCutout, mLayout.softInputMode, + false /* alwaysConsumeSystemBars */, mLayout.softInputMode, mLayout.flags, SYSTEM_UI_FLAG_VISIBLE, mLayout.type, config.windowConfiguration.getWindowingMode(), null /* typeSideMap */); diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java index 3f2dd4d8f557..525ac534612d 100644 --- a/core/java/android/view/DisplayCutout.java +++ b/core/java/android/view/DisplayCutout.java @@ -196,6 +196,12 @@ public final class DisplayCutout { return rects; } + private void scale(float scale) { + for (int i = 0; i < BOUNDS_POSITION_LENGTH; ++i) { + mRects[i].scale(scale); + } + } + @Override public int hashCode() { int result = 0; @@ -871,6 +877,16 @@ public final class DisplayCutout { mInner = cutout; } + public void scale(float scale) { + final Rect safeInsets = mInner.getSafeInsets(); + safeInsets.scale(scale); + final Bounds bounds = new Bounds(mInner.mBounds.mRects, true); + bounds.scale(scale); + final Rect waterfallInsets = mInner.mWaterfallInsets.toRect(); + waterfallInsets.scale(scale); + mInner = new DisplayCutout(safeInsets, Insets.of(waterfallInsets), bounds); + } + @Override public int hashCode() { return mInner.hashCode(); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 025a977d5420..68a6de820f83 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -728,7 +728,7 @@ interface IWindowManager * @return {@code true} if system bars are always comsumed. */ boolean getWindowInsets(in WindowManager.LayoutParams attrs, int displayId, - out DisplayCutout.ParcelableWrapper outDisplayCutout, out InsetsState outInsetsState); + out InsetsState outInsetsState); /** * Called to show global actions. diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index cfdaf8ccc5fb..85498cb6f083 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -47,13 +47,11 @@ import java.util.List; interface IWindowSession { int addToDisplay(IWindow window, in WindowManager.LayoutParams attrs, in int viewVisibility, in int layerStackId, in InsetsState requestedVisibility, - out Rect outFrame, out DisplayCutout.ParcelableWrapper displayCutout, - out InputChannel outInputChannel, out InsetsState insetsState, + out Rect outFrame, out InputChannel outInputChannel, out InsetsState insetsState, out InsetsSourceControl[] activeControls); int addToDisplayAsUser(IWindow window, in WindowManager.LayoutParams attrs, in int viewVisibility, in int layerStackId, in int userId, - in InsetsState requestedVisibility, out Rect outFrame, - out DisplayCutout.ParcelableWrapper displayCutout, out InputChannel outInputChannel, + in InsetsState requestedVisibility, out Rect outFrame, out InputChannel outInputChannel, out InsetsState insetsState, out InsetsSourceControl[] activeControls); int addToDisplayWithoutInputChannel(IWindow window, in WindowManager.LayoutParams attrs, in int viewVisibility, in int layerStackId, out InsetsState insetsState); diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 75dc0c43085d..a89c540eedaf 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -334,8 +334,7 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll private Insets getInsetsFromState(InsetsState state, Rect frame, @Nullable @InternalInsetsSide SparseIntArray typeSideMap) { return state.calculateInsets(frame, null /* ignoringVisibilityState */, - false /* isScreenRound */, - false /* alwaysConsumeSystemBars */, null /* displayCutout */, + false /* isScreenRound */, false /* alwaysConsumeSystemBars */, LayoutParams.SOFT_INPUT_ADJUST_RESIZE /* legacySoftInputMode*/, 0 /* legacyWindowFlags */, 0 /* legacySystemUiFlags */, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, typeSideMap).getInsets(mTypes); diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 80437be1dcd4..8c7a7c302db5 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -522,7 +522,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private int mLastLegacyWindowFlags; private int mLastLegacySystemUiFlags; private int mLastWindowingMode; - private DisplayCutout mLastDisplayCutout; private boolean mStartingAnimation; private int mCaptionInsetsHeight = 0; private boolean mAnimationsDisabled; @@ -589,9 +588,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation WindowInsets insets = state.calculateInsets(mFrame, mState /* ignoringVisibilityState*/, mLastInsets.isRound(), mLastInsets.shouldAlwaysConsumeSystemBars(), - mLastDisplayCutout, mLastLegacySoftInputMode, mLastLegacyWindowFlags, - mLastLegacySystemUiFlags, mWindowType, mLastWindowingMode, - null /* typeSideMap */); + mLastLegacySoftInputMode, mLastLegacyWindowFlags, mLastLegacySystemUiFlags, + mWindowType, mLastWindowingMode, null /* typeSideMap */); mHost.dispatchWindowInsetsAnimationProgress(insets, mUnmodifiableTmpRunningAnims); if (DEBUG) { for (WindowInsetsAnimation anim : mUnmodifiableTmpRunningAnims) { @@ -654,6 +652,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private void updateState(InsetsState newState) { mState.setDisplayFrame(newState.getDisplayFrame()); + mState.setDisplayCutout(newState.getDisplayCutout()); @InsetsType int disabledUserAnimationTypes = 0; @InsetsType int[] cancelledUserAnimationTypes = {0}; for (@InternalInsetsType int type = 0; type < InsetsState.SIZE; type++) { @@ -725,18 +724,16 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation */ @VisibleForTesting public WindowInsets calculateInsets(boolean isScreenRound, boolean alwaysConsumeSystemBars, - DisplayCutout cutout, int windowType, int windowingMode, - int legacySoftInputMode, int legacyWindowFlags, int legacySystemUiFlags) { + int windowType, int windowingMode, int legacySoftInputMode, int legacyWindowFlags, + int legacySystemUiFlags) { mWindowType = windowType; mLastWindowingMode = windowingMode; mLastLegacySoftInputMode = legacySoftInputMode; mLastLegacyWindowFlags = legacyWindowFlags; mLastLegacySystemUiFlags = legacySystemUiFlags; - mLastDisplayCutout = cutout; mLastInsets = mState.calculateInsets(mFrame, null /* ignoringVisibilityState*/, - isScreenRound, alwaysConsumeSystemBars, cutout, - legacySoftInputMode, legacyWindowFlags, legacySystemUiFlags, - windowType, windowingMode, null /* typeSideMap */); + isScreenRound, alwaysConsumeSystemBars, legacySoftInputMode, legacyWindowFlags, + legacySystemUiFlags, windowType, windowingMode, null /* typeSideMap */); return mLastInsets; } diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index b66dd29e02ef..bf377b0bcfd7 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.InsetsStateProto.DISPLAY_CUTOUT; import static android.view.InsetsStateProto.DISPLAY_FRAME; import static android.view.InsetsStateProto.SOURCES; import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE; @@ -165,6 +166,10 @@ public class InsetsState implements Parcelable { */ private final Rect mDisplayFrame = new Rect(); + /** The area cut from the display. */ + private final DisplayCutout.ParcelableWrapper mDisplayCutout = + new DisplayCutout.ParcelableWrapper(); + public InsetsState() { } @@ -186,7 +191,7 @@ public class InsetsState implements Parcelable { * @return The calculated insets. */ public WindowInsets calculateInsets(Rect frame, @Nullable InsetsState ignoringVisibilityState, - boolean isScreenRound, boolean alwaysConsumeSystemBars, DisplayCutout cutout, + boolean isScreenRound, boolean alwaysConsumeSystemBars, int legacySoftInputMode, int legacyWindowFlags, int legacySystemUiFlags, int windowType, @WindowConfiguration.WindowingMode int windowingMode, @Nullable @InternalInsetsSide SparseIntArray typeSideMap) { @@ -236,10 +241,31 @@ public class InsetsState implements Parcelable { } return new WindowInsets(typeInsetsMap, typeMaxInsetsMap, typeVisibilityMap, isScreenRound, - alwaysConsumeSystemBars, cutout, compatInsetsTypes, + alwaysConsumeSystemBars, calculateRelativeCutout(frame), compatInsetsTypes, (legacySystemUiFlags & SYSTEM_UI_FLAG_LAYOUT_STABLE) != 0); } + private DisplayCutout calculateRelativeCutout(Rect frame) { + final DisplayCutout raw = mDisplayCutout.get(); + if (mDisplayFrame.equals(frame)) { + return raw; + } + if (frame == null) { + return DisplayCutout.NO_CUTOUT; + } + final int insetLeft = frame.left - mDisplayFrame.left; + final int insetTop = frame.top - mDisplayFrame.top; + final int insetRight = mDisplayFrame.right - frame.right; + final int insetBottom = mDisplayFrame.bottom - frame.bottom; + if (insetLeft >= raw.getSafeInsetLeft() + && insetTop >= raw.getSafeInsetTop() + && insetRight >= raw.getSafeInsetRight() + && insetBottom >= raw.getSafeInsetBottom()) { + return DisplayCutout.NO_CUTOUT; + } + return raw.inset(insetLeft, insetTop, insetRight, insetBottom); + } + public Rect calculateInsets(Rect frame, @InsetsType int types, boolean ignoreVisibility) { Insets insets = Insets.NONE; for (int type = FIRST_TYPE; type <= LAST_TYPE; type++) { @@ -392,15 +418,6 @@ public class InsetsState implements Parcelable { return mSources[type]; } - public boolean hasSources() { - for (int i = 0; i < SIZE; i++) { - if (mSources[i] != null) { - return true; - } - } - return false; - } - /** * Returns the source visibility or the default visibility if the source doesn't exist. This is * useful if when treating this object as a request. @@ -422,6 +439,14 @@ public class InsetsState implements Parcelable { return mDisplayFrame; } + public void setDisplayCutout(DisplayCutout cutout) { + mDisplayCutout.set(cutout); + } + + public DisplayCutout getDisplayCutout() { + return mDisplayCutout.get(); + } + /** * Modifies the state of this class to exclude a certain type to make it ready for dispatching * to the client. @@ -452,6 +477,7 @@ public class InsetsState implements Parcelable { */ public void scale(float scale) { mDisplayFrame.scale(scale); + mDisplayCutout.scale(scale); for (int i = 0; i < SIZE; i++) { final InsetsSource source = mSources[i]; if (source != null) { @@ -470,6 +496,7 @@ public class InsetsState implements Parcelable { public void set(InsetsState other, boolean copySources) { mDisplayFrame.set(other.mDisplayFrame); + mDisplayCutout.set(other.mDisplayCutout); if (copySources) { for (int i = 0; i < SIZE; i++) { InsetsSource source = other.mSources[i]; @@ -592,6 +619,7 @@ public class InsetsState implements Parcelable { source.dumpDebug(proto, SOURCES); } mDisplayFrame.dumpDebug(proto, DISPLAY_FRAME); + mDisplayCutout.get().dumpDebug(proto, DISPLAY_CUTOUT); proto.end(token); } @@ -669,7 +697,8 @@ public class InsetsState implements Parcelable { InsetsState state = (InsetsState) o; - if (!mDisplayFrame.equals(state.mDisplayFrame)) { + if (!mDisplayFrame.equals(state.mDisplayFrame) + || !mDisplayCutout.equals(state.mDisplayCutout)) { return false; } for (int i = 0; i < SIZE; i++) { @@ -681,7 +710,7 @@ public class InsetsState implements Parcelable { if (source == null && otherSource == null) { continue; } - if (source != null && otherSource == null || source == null && otherSource != null) { + if (source == null || otherSource == null) { return false; } if (!otherSource.equals(source, excludeInvisibleImeFrames)) { @@ -693,7 +722,7 @@ public class InsetsState implements Parcelable { @Override public int hashCode() { - return Objects.hash(mDisplayFrame, Arrays.hashCode(mSources)); + return Objects.hash(mDisplayFrame, mDisplayCutout, Arrays.hashCode(mSources)); } public InsetsState(Parcel in) { @@ -707,7 +736,8 @@ public class InsetsState implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeParcelable(mDisplayFrame, flags); + mDisplayFrame.writeToParcel(dest, flags); + mDisplayCutout.writeToParcel(dest, flags); dest.writeParcelableArray(mSources, 0); } @@ -723,7 +753,8 @@ public class InsetsState implements Parcelable { }; public void readFromParcel(Parcel in) { - mDisplayFrame.set(in.readParcelable(null /* loader */)); + mDisplayFrame.set(Rect.CREATOR.createFromParcel(in)); + mDisplayCutout.set(DisplayCutout.ParcelableWrapper.CREATOR.createFromParcel(in)); mSources = in.readParcelableArray(null, InsetsSource.class); } @@ -738,6 +769,7 @@ public class InsetsState implements Parcelable { } return "InsetsState: {" + "mDisplayFrame=" + mDisplayFrame + + ", mDisplayCutout=" + mDisplayCutout + ", mSources= { " + joiner + " }"; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1d1c87d06939..24b71abe5bc1 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -29071,9 +29071,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ final Rect mCaptionInsets = new Rect(); - final DisplayCutout.ParcelableWrapper mDisplayCutout = - new DisplayCutout.ParcelableWrapper(DisplayCutout.NO_CUTOUT); - /** * In multi-window we force show the system bars. Because we don't want that the surface * size changes in this mode, we instead have a flag whether the system bars sizes should diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 52ce5e709990..51820d6afdfa 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -42,7 +42,6 @@ import static android.view.ViewRootImplProto.HEIGHT; import static android.view.ViewRootImplProto.IS_ANIMATING; import static android.view.ViewRootImplProto.IS_DRAWING; import static android.view.ViewRootImplProto.LAST_WINDOW_INSETS; -import static android.view.ViewRootImplProto.PENDING_DISPLAY_CUTOUT; import static android.view.ViewRootImplProto.REMOVED; import static android.view.ViewRootImplProto.SCROLL_Y; import static android.view.ViewRootImplProto.SOFT_INPUT_MODE; @@ -572,8 +571,6 @@ public final class ViewRootImpl implements ViewParent, final Rect mWinFrame; // frame given by window manager. final Rect mPendingBackDropFrame = new Rect(); - final DisplayCutout.ParcelableWrapper mPendingDisplayCutout = - new DisplayCutout.ParcelableWrapper(DisplayCutout.NO_CUTOUT); boolean mPendingAlwaysConsumeSystemBars; private final InsetsState mTempInsets = new InsetsState(); private final InsetsSourceControl[] mTempControls = new InsetsSourceControl[SIZE]; @@ -1056,8 +1053,7 @@ public final class ViewRootImpl implements ViewParent, res = mWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes, getHostVisibility(), mDisplay.getDisplayId(), userId, mInsetsController.getRequestedVisibility(), mTmpFrames.frame, - mAttachInfo.mDisplayCutout, inputChannel, - mTempInsets, mTempControls); + inputChannel, mTempInsets, mTempControls); if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mTmpFrames.frame); mTranslator.translateInsetsStateInScreenToAppWindow(mTempInsets); @@ -1078,7 +1074,6 @@ public final class ViewRootImpl implements ViewParent, } } - mPendingDisplayCutout.set(mAttachInfo.mDisplayCutout); mAttachInfo.mAlwaysConsumeSystemBars = (res & WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_SYSTEM_BARS) != 0; mPendingAlwaysConsumeSystemBars = mAttachInfo.mAlwaysConsumeSystemBars; @@ -1499,15 +1494,13 @@ public final class ViewRootImpl implements ViewParent, final boolean forceNextWindowRelayout = args.argi1 != 0; final int displayId = args.argi3; final Rect backdropFrame = frames.backdropFrame; - final DisplayCutout displayCutout = frames.displayCutout.get(); final boolean frameChanged = !mWinFrame.equals(frames.frame); - final boolean cutoutChanged = !mPendingDisplayCutout.get().equals(displayCutout); final boolean backdropFrameChanged = !mPendingBackDropFrame.equals(backdropFrame); final boolean configChanged = !mLastReportedMergedConfiguration.equals(mergedConfiguration); final boolean displayChanged = mDisplay.getDisplayId() != displayId; - if (msg == MSG_RESIZED && !frameChanged && !cutoutChanged && !backdropFrameChanged - && !configChanged && !displayChanged && !forceNextWindowRelayout) { + if (msg == MSG_RESIZED && !frameChanged && !backdropFrameChanged && !configChanged + && !displayChanged && !forceNextWindowRelayout) { return; } @@ -1522,7 +1515,6 @@ public final class ViewRootImpl implements ViewParent, setFrame(frames.frame); mTmpFrames.displayFrame.set(frames.displayFrame); - mPendingDisplayCutout.set(displayCutout); mPendingBackDropFrame.set(backdropFrame); mForceNextWindowRelayout = forceNextWindowRelayout; mPendingAlwaysConsumeSystemBars = args.argi2 != 0; @@ -1531,7 +1523,7 @@ public final class ViewRootImpl implements ViewParent, reportNextDraw(); } - if (mView != null && (frameChanged || cutoutChanged || configChanged)) { + if (mView != null && (frameChanged || configChanged)) { forceLayout(mView); } requestLayout(); @@ -2331,8 +2323,7 @@ public final class ViewRootImpl implements ViewParent, final Configuration config = mContext.getResources().getConfiguration(); mLastWindowInsets = mInsetsController.calculateInsets( config.isScreenRound(), mAttachInfo.mAlwaysConsumeSystemBars, - mPendingDisplayCutout.get(), mWindowAttributes.type, - config.windowConfiguration.getWindowingMode(), + mWindowAttributes.type, config.windowConfiguration.getWindowingMode(), mWindowAttributes.softInputMode, mWindowAttributes.flags, (mWindowAttributes.systemUiVisibility | mWindowAttributes.subtreeSystemUiVisibility)); @@ -2514,8 +2505,6 @@ public final class ViewRootImpl implements ViewParent, // Execute enqueued actions on every traversal in case a detached view enqueued an action getRunQueue().executeActions(mAttachInfo.mHandler); - boolean cutoutChanged = false; - boolean layoutRequested = mLayoutRequested && (!mStopped || mReportNextDraw); if (layoutRequested) { @@ -2527,9 +2516,6 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mInTouchMode = !mAddedTouchMode; ensureTouchModeLocally(mAddedTouchMode); } else { - if (!mPendingDisplayCutout.equals(mAttachInfo.mDisplayCutout)) { - cutoutChanged = true; - } if (lp.width == ViewGroup.LayoutParams.WRAP_CONTENT || lp.height == ViewGroup.LayoutParams.WRAP_CONTENT) { windowSizeMayChange = true; @@ -2655,7 +2641,7 @@ public final class ViewRootImpl implements ViewParent, } } - if (mFirst || windowShouldResize || viewVisibilityChanged || cutoutChanged || params != null + if (mFirst || windowShouldResize || viewVisibilityChanged || params != null || mForceNextWindowRelayout) { mForceNextWindowRelayout = false; @@ -2695,7 +2681,6 @@ public final class ViewRootImpl implements ViewParent, relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); if (DEBUG_LAYOUT) Log.v(mTag, "relayout: frame=" + frame.toShortString() - + " cutout=" + mPendingDisplayCutout.get().toString() + " surface=" + mSurface); // If the pending {@link MergedConfiguration} handed back from @@ -2711,7 +2696,6 @@ public final class ViewRootImpl implements ViewParent, updatedConfiguration = true; } - cutoutChanged = !mPendingDisplayCutout.equals(mAttachInfo.mDisplayCutout); surfaceSizeChanged = false; if (!mLastSurfaceSize.equals(mSurfaceSize)) { surfaceSizeChanged = true; @@ -2735,14 +2719,6 @@ public final class ViewRootImpl implements ViewParent, mSurfaceSequenceId++; } - if (cutoutChanged) { - mAttachInfo.mDisplayCutout.set(mPendingDisplayCutout); - if (DEBUG_LAYOUT) { - Log.v(mTag, "DisplayCutout changing to: " + mAttachInfo.mDisplayCutout); - } - // Need to relayout with content insets. - dispatchApplyInsets = true; - } if (alwaysConsumeSystemBarsChanged) { mAttachInfo.mAlwaysConsumeSystemBars = mPendingAlwaysConsumeSystemBars; dispatchApplyInsets = true; @@ -7518,7 +7494,6 @@ public final class ViewRootImpl implements ViewParent, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, frameNumber, mTmpFrames, mPendingMergedConfiguration, mSurfaceControl, mTempInsets, mTempControls, mSurfaceSize); - mPendingDisplayCutout.set(mTmpFrames.displayCutout); mPendingBackDropFrame.set(mTmpFrames.backdropFrame); if (mSurfaceControl.isValid()) { if (!useBLAST()) { @@ -7679,7 +7654,6 @@ public final class ViewRootImpl implements ViewParent, proto.write(IS_DRAWING, mIsDrawing); proto.write(ADDED, mAdded); mWinFrame.dumpDebug(proto, WIN_FRAME); - mPendingDisplayCutout.get().dumpDebug(proto, PENDING_DISPLAY_CUTOUT); proto.write(LAST_WINDOW_INSETS, Objects.toString(mLastWindowInsets)); proto.write(SOFT_INPUT_MODE, InputMethodDebug.softInputModeToString(mSoftInputMode)); proto.write(SCROLL_Y, mScrollY); diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index 3384bbe4fd76..391e55a9050a 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -262,18 +262,15 @@ public final class WindowManagerImpl implements WindowManager { private WindowInsets getWindowInsetsFromServer(WindowManager.LayoutParams attrs, Rect bounds) { try { - final DisplayCutout.ParcelableWrapper displayCutout = - new DisplayCutout.ParcelableWrapper(); final InsetsState insetsState = new InsetsState(); final boolean alwaysConsumeSystemBars = WindowManagerGlobal.getWindowManagerService() - .getWindowInsets(attrs, mContext.getDisplayId(), displayCutout, insetsState); + .getWindowInsets(attrs, mContext.getDisplayId(), insetsState); final Configuration config = mContext.getResources().getConfiguration(); final boolean isScreenRound = config.isScreenRound(); final int windowingMode = config.windowConfiguration.getWindowingMode(); return insetsState.calculateInsets(bounds, null /* ignoringVisibilityState*/, - isScreenRound, alwaysConsumeSystemBars, displayCutout.get(), - SOFT_INPUT_ADJUST_NOTHING, attrs.flags, SYSTEM_UI_FLAG_VISIBLE, attrs.type, - windowingMode, null /* typeSideMap */); + isScreenRound, alwaysConsumeSystemBars, SOFT_INPUT_ADJUST_NOTHING, attrs.flags, + SYSTEM_UI_FLAG_VISIBLE, attrs.type, windowingMode, null /* typeSideMap */); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/view/WindowlessWindowManager.java b/core/java/android/view/WindowlessWindowManager.java index 149338c09126..dd56c15f86f6 100644 --- a/core/java/android/view/WindowlessWindowManager.java +++ b/core/java/android/view/WindowlessWindowManager.java @@ -136,8 +136,8 @@ public class WindowlessWindowManager implements IWindowSession { @Override public int addToDisplay(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, InsetsState requestedVisibility, Rect outFrame, - DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel, - InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { + InputChannel outInputChannel, InsetsState outInsetsState, + InsetsSourceControl[] outActiveControls) { final SurfaceControl.Builder b = new SurfaceControl.Builder(mSurfaceSession) .setFormat(attrs.format) .setBufferSize(getSurfaceWidth(attrs), getSurfaceHeight(attrs)) @@ -171,11 +171,10 @@ public class WindowlessWindowManager implements IWindowSession { @Override public int addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, int userId, InsetsState requestedVisibility, - Rect outFrame, DisplayCutout.ParcelableWrapper outDisplayCutout, - InputChannel outInputChannel, InsetsState outInsetsState, + Rect outFrame, InputChannel outInputChannel, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { return addToDisplay(window, attrs, viewVisibility, displayId, requestedVisibility, - outFrame, outDisplayCutout, outInputChannel, outInsetsState, outActiveControls); + outFrame, outInputChannel, outInsetsState, outActiveControls); } @Override diff --git a/core/java/android/window/ClientWindowFrames.java b/core/java/android/window/ClientWindowFrames.java index 5d7025b57f91..e22a5eb9fe7b 100644 --- a/core/java/android/window/ClientWindowFrames.java +++ b/core/java/android/window/ClientWindowFrames.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; -import android.view.DisplayCutout; /** * The window frame container class used by client side for layout. @@ -39,28 +38,22 @@ public class ClientWindowFrames implements Parcelable { /** The background area while the window is resizing. */ public final @NonNull Rect backdropFrame; - /** The area cut from the display. */ - public final @NonNull DisplayCutout.ParcelableWrapper displayCutout; - public ClientWindowFrames() { frame = new Rect(); displayFrame = new Rect(); backdropFrame = new Rect(); - displayCutout = new DisplayCutout.ParcelableWrapper(); } public ClientWindowFrames(ClientWindowFrames other) { frame = new Rect(other.frame); displayFrame = new Rect(other.displayFrame); backdropFrame = new Rect(other.backdropFrame); - displayCutout = new DisplayCutout.ParcelableWrapper(other.displayCutout.get()); } private ClientWindowFrames(Parcel in) { frame = Rect.CREATOR.createFromParcel(in); displayFrame = Rect.CREATOR.createFromParcel(in); backdropFrame = Rect.CREATOR.createFromParcel(in); - displayCutout = DisplayCutout.ParcelableWrapper.CREATOR.createFromParcel(in); } /** Needed for AIDL out parameters. */ @@ -68,7 +61,6 @@ public class ClientWindowFrames implements Parcelable { frame.set(Rect.CREATOR.createFromParcel(in)); displayFrame.set(Rect.CREATOR.createFromParcel(in)); backdropFrame.set(Rect.CREATOR.createFromParcel(in)); - displayCutout.set(DisplayCutout.ParcelableWrapper.CREATOR.createFromParcel(in)); } @Override @@ -76,7 +68,6 @@ public class ClientWindowFrames implements Parcelable { frame.writeToParcel(dest, flags); displayFrame.writeToParcel(dest, flags); backdropFrame.writeToParcel(dest, flags); - displayCutout.writeToParcel(dest, flags); } @Override @@ -84,8 +75,7 @@ public class ClientWindowFrames implements Parcelable { final StringBuilder sb = new StringBuilder(32); return "ClientWindowFrames{frame=" + frame.toShortString(sb) + " display=" + displayFrame.toShortString(sb) - + " backdrop=" + backdropFrame.toShortString(sb) - + " cutout=" + displayCutout + "}"; + + " backdrop=" + backdropFrame.toShortString(sb) + "}"; } @Override diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index c4c007d8113b..610e0e0b4b89 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -509,7 +509,7 @@ message WindowFramesProto { optional .android.graphics.RectProto overscan_frame = 7 [deprecated=true]; optional .android.graphics.RectProto parent_frame = 8; optional .android.graphics.RectProto visible_frame = 9 [deprecated=true]; - optional .android.view.DisplayCutoutProto cutout = 10; + optional .android.view.DisplayCutoutProto cutout = 10 [deprecated=true]; optional .android.graphics.RectProto content_insets = 11 [deprecated=true]; optional .android.graphics.RectProto overscan_insets = 12 [deprecated=true]; optional .android.graphics.RectProto visible_insets = 13 [deprecated=true]; diff --git a/core/proto/android/view/insetsstate.proto b/core/proto/android/view/insetsstate.proto index 9e9933d72c6c..1cab9821a520 100644 --- a/core/proto/android/view/insetsstate.proto +++ b/core/proto/android/view/insetsstate.proto @@ -16,8 +16,9 @@ syntax = "proto2"; -import "frameworks/base/core/proto/android/view/insetssource.proto"; import "frameworks/base/core/proto/android/graphics/rect.proto"; +import "frameworks/base/core/proto/android/view/displaycutout.proto"; +import "frameworks/base/core/proto/android/view/insetssource.proto"; package android.view; @@ -29,4 +30,5 @@ option java_multiple_files = true; message InsetsStateProto { repeated InsetsSourceProto sources = 1; optional .android.graphics.RectProto display_frame = 2; -}
\ No newline at end of file + optional DisplayCutoutProto display_cutout = 3; +} diff --git a/core/proto/android/view/viewrootimpl.proto b/core/proto/android/view/viewrootimpl.proto index 0abe5e0624e3..181b2bbc987c 100644 --- a/core/proto/android/view/viewrootimpl.proto +++ b/core/proto/android/view/viewrootimpl.proto @@ -38,7 +38,7 @@ message ViewRootImplProto { optional bool is_drawing = 8; optional bool added = 9; optional .android.graphics.RectProto win_frame = 10; - optional DisplayCutoutProto pending_display_cutout = 11; + optional DisplayCutoutProto pending_display_cutout = 11 [deprecated=true]; optional string last_window_insets = 12; optional string soft_input_mode = 13; optional int32 scroll_y = 14; diff --git a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java index db838e81eb28..a6f86a7e54d1 100644 --- a/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java +++ b/core/tests/coretests/src/android/view/ImeInsetsSourceConsumerTest.java @@ -78,11 +78,11 @@ public class ImeInsetsSourceConsumerTest { mController = Mockito.spy(new InsetsController( new ViewRootInsetsControllerHost(viewRootImpl))); final Rect rect = new Rect(5, 5, 5, 5); + mController.getState().setDisplayCutout(new DisplayCutout( + Insets.of(10, 10, 10, 10), rect, rect, rect, rect)); mController.calculateInsets( false, false, - new DisplayCutout( - Insets.of(10, 10, 10, 10), rect, rect, rect, rect), TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, SOFT_INPUT_ADJUST_RESIZE, 0, 0); mImeConsumer = (ImeInsetsSourceConsumer) mController.getSourceConsumer(ITYPE_IME); diff --git a/core/tests/coretests/src/android/view/InsetsControllerTest.java b/core/tests/coretests/src/android/view/InsetsControllerTest.java index 7b84f68c0f2c..af13cc07ced1 100644 --- a/core/tests/coretests/src/android/view/InsetsControllerTest.java +++ b/core/tests/coretests/src/android/view/InsetsControllerTest.java @@ -151,11 +151,11 @@ public class InsetsControllerTest { new Rect(0, 90, 100, 100)); mController.getState().getSource(ITYPE_IME).setFrame(new Rect(0, 50, 100, 100)); mController.getState().setDisplayFrame(new Rect(0, 0, 100, 100)); + mController.getState().setDisplayCutout(new DisplayCutout( + Insets.of(10, 10, 10, 10), rect, rect, rect, rect)); mController.calculateInsets( false, false, - new DisplayCutout( - Insets.of(10, 10, 10, 10), rect, rect, rect, rect), TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, SOFT_INPUT_ADJUST_RESIZE, 0, 0); mController.onFrameChanged(new Rect(0, 0, 100, 100)); diff --git a/core/tests/coretests/src/android/view/InsetsStateTest.java b/core/tests/coretests/src/android/view/InsetsStateTest.java index 8a000a034702..9705284d7d74 100644 --- a/core/tests/coretests/src/android/view/InsetsStateTest.java +++ b/core/tests/coretests/src/android/view/InsetsStateTest.java @@ -37,6 +37,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; @@ -82,8 +83,8 @@ public class InsetsStateTest { mState.getSource(ITYPE_IME).setVisible(true); SparseIntArray typeSideMap = new SparseIntArray(); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_RESIZE, 0, 0, - TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, typeSideMap); + false, SOFT_INPUT_ADJUST_RESIZE, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, + typeSideMap); assertEquals(Insets.of(0, 100, 0, 100), insets.getSystemWindowInsets()); assertEquals(Insets.of(0, 100, 0, 100), insets.getInsets(Type.all())); assertEquals(ISIDE_TOP, typeSideMap.get(ITYPE_STATUS_BAR)); @@ -99,8 +100,8 @@ public class InsetsStateTest { mState.getSource(ITYPE_IME).setFrame(new Rect(0, 100, 100, 300)); mState.getSource(ITYPE_IME).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_RESIZE, 0, 0, - TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); + false, SOFT_INPUT_ADJUST_RESIZE, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, + null); assertEquals(100, insets.getStableInsetBottom()); assertEquals(Insets.of(0, 0, 0, 100), insets.getInsetsIgnoringVisibility(systemBars())); assertEquals(Insets.of(0, 0, 0, 200), insets.getSystemWindowInsets()); @@ -116,8 +117,7 @@ public class InsetsStateTest { mState.getSource(ITYPE_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300)); mState.getSource(ITYPE_NAVIGATION_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, 0, 0, 0, TYPE_APPLICATION, - WINDOWING_MODE_UNDEFINED, null); + false, 0, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets()); assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(statusBars())); assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(navigationBars())); @@ -130,8 +130,7 @@ public class InsetsStateTest { mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300)); mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, 0, 0, 0, TYPE_APPLICATION, - WINDOWING_MODE_UNDEFINED, null); + false, 0, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); // ITYPE_CLIMATE_BAR is a type of status bar and ITYPE_EXTRA_NAVIGATION_BAR is a type // of navigation bar. assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets()); @@ -146,8 +145,8 @@ public class InsetsStateTest { mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300)); mState.getSource(ITYPE_IME).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, 0, 0, - TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); + false, SOFT_INPUT_ADJUST_NOTHING, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, + null); assertEquals(0, insets.getSystemWindowInsetBottom()); assertEquals(100, insets.getInsets(ime()).bottom); assertTrue(insets.isVisible(ime())); @@ -160,12 +159,12 @@ public class InsetsStateTest { mState.getSource(ITYPE_IME).setFrame(new Rect(0, 200, 100, 300)); mState.getSource(ITYPE_IME).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, 0, - SYSTEM_UI_FLAG_LAYOUT_STABLE, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); + false, SOFT_INPUT_ADJUST_NOTHING, 0, SYSTEM_UI_FLAG_LAYOUT_STABLE, TYPE_APPLICATION, + WINDOWING_MODE_UNDEFINED, null); assertEquals(100, insets.getSystemWindowInsetTop()); insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false, - DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, 0, - 0 /* legacySystemUiFlags */, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); + SOFT_INPUT_ADJUST_NOTHING, 0, 0 /* legacySystemUiFlags */, TYPE_APPLICATION, + WINDOWING_MODE_UNDEFINED, null); assertEquals(0, insets.getSystemWindowInsetTop()); } @@ -174,12 +173,12 @@ public class InsetsStateTest { mState.getSource(ITYPE_STATUS_BAR).setFrame(new Rect(0, 0, 100, 100)); mState.getSource(ITYPE_STATUS_BAR).setVisible(false); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, FLAG_FULLSCREEN, - SYSTEM_UI_FLAG_LAYOUT_STABLE, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); + false, SOFT_INPUT_ADJUST_NOTHING, FLAG_FULLSCREEN, SYSTEM_UI_FLAG_LAYOUT_STABLE, + TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); assertEquals(0, insets.getSystemWindowInsetTop()); insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false, - DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, 0, - 0 /* legacySystemUiFlags */, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); + SOFT_INPUT_ADJUST_NOTHING, 0, 0 /* legacySystemUiFlags */, TYPE_APPLICATION, + WINDOWING_MODE_UNDEFINED, null); assertEquals(0, insets.getSystemWindowInsetTop()); } @@ -188,19 +187,19 @@ public class InsetsStateTest { mState.getSource(ITYPE_STATUS_BAR).setFrame(new Rect(0, 0, 100, 100)); mState.getSource(ITYPE_STATUS_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, + false, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, 0 /* legacySystemUiFlags */, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); assertEquals(0, insets.getSystemWindowInsetTop()); insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, + false, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, 0 /* legacySystemUiFlags */, TYPE_SYSTEM_ERROR, WINDOWING_MODE_UNDEFINED, null); assertEquals(100, insets.getSystemWindowInsetTop()); insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, + false, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, 0 /* legacySystemUiFlags */, TYPE_WALLPAPER, WINDOWING_MODE_UNDEFINED, null); assertEquals(100, insets.getSystemWindowInsetTop()); insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, + false, SOFT_INPUT_ADJUST_NOTHING, FLAG_LAYOUT_NO_LIMITS, 0 /* legacySystemUiFlags */, TYPE_APPLICATION, WINDOWING_MODE_FREEFORM, null); assertEquals(100, insets.getSystemWindowInsetTop()); } @@ -235,8 +234,7 @@ public class InsetsStateTest { mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300)); mState.getSource(ITYPE_EXTRA_NAVIGATION_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, 0, 0, 0, TYPE_APPLICATION, - WINDOWING_MODE_UNDEFINED, null); + false, 0, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets()); assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(statusBars())); assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(navigationBars())); @@ -249,8 +247,7 @@ public class InsetsStateTest { mState.getSource(ITYPE_NAVIGATION_BAR).setFrame(new Rect(80, 0, 100, 300)); mState.getSource(ITYPE_NAVIGATION_BAR).setVisible(true); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, - false, DisplayCutout.NO_CUTOUT, 0, 0, 0, TYPE_APPLICATION, - WINDOWING_MODE_UNDEFINED, null); + false, 0, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); assertEquals(Insets.of(0, 100, 20, 0), insets.getSystemWindowInsets()); assertEquals(Insets.of(0, 100, 0, 0), insets.getInsets(statusBars())); assertEquals(Insets.of(0, 0, 20, 0), insets.getInsets(navigationBars())); @@ -264,8 +261,7 @@ public class InsetsStateTest { mState.getSource(ITYPE_IME).setVisible(true); mState.removeSource(ITYPE_IME); WindowInsets insets = mState.calculateInsets(new Rect(0, 0, 100, 300), null, false, false, - DisplayCutout.NO_CUTOUT, SOFT_INPUT_ADJUST_RESIZE, 0, 0, TYPE_APPLICATION, - WINDOWING_MODE_UNDEFINED, null); + SOFT_INPUT_ADJUST_RESIZE, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, null); assertEquals(0, insets.getSystemWindowInsetBottom()); } @@ -406,6 +402,31 @@ public class InsetsStateTest { mState.calculateUncontrollableInsetsFromFrame(new Rect(50, 0, 150, 300))); } + @Test + public void testCalculateRelativeCutout() { + mState.setDisplayFrame(new Rect(0, 0, 200, 300)); + mState.setDisplayCutout(new DisplayCutout(Insets.of(1, 2, 3, 4), + new Rect(0, 0, 1, 2), + new Rect(0, 0, 1, 2), + new Rect(197, 296, 200, 300), + new Rect(197, 296, 200, 300))); + DisplayCutout cutout = mState.calculateInsets(new Rect(1, 1, 199, 300), null, false, false, + SOFT_INPUT_ADJUST_UNSPECIFIED, 0, 0, TYPE_APPLICATION, WINDOWING_MODE_UNDEFINED, + new SparseIntArray()).getDisplayCutout(); + assertEquals(0, cutout.getSafeInsetLeft()); + assertEquals(1, cutout.getSafeInsetTop()); + assertEquals(2, cutout.getSafeInsetRight()); + assertEquals(4, cutout.getSafeInsetBottom()); + assertEquals(new Rect(-1, -1, 0, 1), + cutout.getBoundingRectLeft()); + assertEquals(new Rect(-1, -1, 0, 1), + cutout.getBoundingRectTop()); + assertEquals(new Rect(196, 295, 199, 299), + cutout.getBoundingRectRight()); + assertEquals(new Rect(196, 295, 199, 299), + cutout.getBoundingRectBottom()); + } + private void assertEqualsAndHashCode() { assertEquals(mState, mState2); assertEquals(mState.hashCode(), mState2.hashCode()); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java index e66d85f55ca9..319872556365 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/TaskSnapshotWindow.java @@ -221,8 +221,7 @@ public class TaskSnapshotWindow { mainExecutor.execute(() -> { try { final int res = session.addToDisplay(window, layoutParams, View.GONE, - displayId, mTmpInsetsState, tmpFrames.frame, - tmpFrames.displayCutout, tmpInputChannel/* outInputChannel */, + displayId, mTmpInsetsState, tmpFrames.frame, tmpInputChannel, mTmpInsetsState, mTempControls); if (res < 0) { Slog.w(TAG, "Failed to add snapshot starting window res=" + res); diff --git a/services/core/java/com/android/server/wm/DisplayFrames.java b/services/core/java/com/android/server/wm/DisplayFrames.java index 7f3cb49d20e5..38d0c21f99fb 100644 --- a/services/core/java/com/android/server/wm/DisplayFrames.java +++ b/services/core/java/com/android/server/wm/DisplayFrames.java @@ -16,11 +16,17 @@ package com.android.server.wm; +import static android.view.InsetsState.ITYPE_BOTTOM_DISPLAY_CUTOUT; +import static android.view.InsetsState.ITYPE_LEFT_DISPLAY_CUTOUT; +import static android.view.InsetsState.ITYPE_RIGHT_DISPLAY_CUTOUT; +import static android.view.InsetsState.ITYPE_TOP_DISPLAY_CUTOUT; + import android.annotation.NonNull; import android.graphics.Rect; import android.util.proto.ProtoOutputStream; import android.view.DisplayCutout; import android.view.DisplayInfo; +import android.view.InsetsState; import com.android.server.wm.utils.WmDisplayCutout; @@ -67,25 +73,41 @@ public class DisplayFrames { mDisplayInfoCutout = displayCutout != null ? displayCutout : WmDisplayCutout.NO_CUTOUT; } - public void onBeginLayout() { - mUnrestricted.set(0, 0, mDisplayWidth, mDisplayHeight); + public void onBeginLayout(InsetsState state) { mDisplayCutout = mDisplayInfoCutout; - mDisplayCutoutSafe.set(Integer.MIN_VALUE, Integer.MIN_VALUE, - Integer.MAX_VALUE, Integer.MAX_VALUE); - if (!mDisplayCutout.getDisplayCutout().isEmpty()) { - final DisplayCutout c = mDisplayCutout.getDisplayCutout(); - if (c.getSafeInsetLeft() > 0) { - mDisplayCutoutSafe.left = mUnrestricted.left + c.getSafeInsetLeft(); + final Rect unrestricted = mUnrestricted; + final Rect safe = mDisplayCutoutSafe; + final DisplayCutout cutout = mDisplayCutout.getDisplayCutout(); + unrestricted.set(0, 0, mDisplayWidth, mDisplayHeight); + safe.set(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE); + state.setDisplayFrame(unrestricted); + state.setDisplayCutout(cutout); + if (!cutout.isEmpty()) { + if (cutout.getSafeInsetLeft() > 0) { + safe.left = unrestricted.left + cutout.getSafeInsetLeft(); } - if (c.getSafeInsetTop() > 0) { - mDisplayCutoutSafe.top = mUnrestricted.top + c.getSafeInsetTop(); + if (cutout.getSafeInsetTop() > 0) { + safe.top = unrestricted.top + cutout.getSafeInsetTop(); } - if (c.getSafeInsetRight() > 0) { - mDisplayCutoutSafe.right = mUnrestricted.right - c.getSafeInsetRight(); + if (cutout.getSafeInsetRight() > 0) { + safe.right = unrestricted.right - cutout.getSafeInsetRight(); } - if (c.getSafeInsetBottom() > 0) { - mDisplayCutoutSafe.bottom = mUnrestricted.bottom - c.getSafeInsetBottom(); + if (cutout.getSafeInsetBottom() > 0) { + safe.bottom = unrestricted.bottom - cutout.getSafeInsetBottom(); } + state.getSource(ITYPE_LEFT_DISPLAY_CUTOUT).setFrame( + unrestricted.left, unrestricted.top, safe.left, unrestricted.bottom); + state.getSource(ITYPE_TOP_DISPLAY_CUTOUT).setFrame( + unrestricted.left, unrestricted.top, unrestricted.right, safe.top); + state.getSource(ITYPE_RIGHT_DISPLAY_CUTOUT).setFrame( + safe.right, unrestricted.top, unrestricted.right, unrestricted.bottom); + state.getSource(ITYPE_BOTTOM_DISPLAY_CUTOUT).setFrame( + unrestricted.left, safe.bottom, unrestricted.right, unrestricted.bottom); + } else { + state.removeSource(ITYPE_LEFT_DISPLAY_CUTOUT); + state.removeSource(ITYPE_TOP_DISPLAY_CUTOUT); + state.removeSource(ITYPE_RIGHT_DISPLAY_CUTOUT); + state.removeSource(ITYPE_BOTTOM_DISPLAY_CUTOUT); } } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index cd02e00c4383..fb005b33f1e2 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -25,20 +25,16 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND import static android.content.res.Configuration.UI_MODE_TYPE_CAR; import static android.content.res.Configuration.UI_MODE_TYPE_MASK; import static android.view.Display.TYPE_INTERNAL; -import static android.view.InsetsState.ITYPE_BOTTOM_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_BOTTOM_GESTURES; import static android.view.InsetsState.ITYPE_BOTTOM_TAPPABLE_ELEMENT; import static android.view.InsetsState.ITYPE_CAPTION_BAR; import static android.view.InsetsState.ITYPE_CLIMATE_BAR; import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_IME; -import static android.view.InsetsState.ITYPE_LEFT_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_LEFT_GESTURES; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; -import static android.view.InsetsState.ITYPE_RIGHT_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_RIGHT_GESTURES; import static android.view.InsetsState.ITYPE_STATUS_BAR; -import static android.view.InsetsState.ITYPE_TOP_DISPLAY_CUTOUT; import static android.view.InsetsState.ITYPE_TOP_GESTURES; import static android.view.InsetsState.ITYPE_TOP_TAPPABLE_ELEMENT; import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; @@ -1408,15 +1404,13 @@ public class DisplayPolicy { * @param attrs The LayoutParams of the window. * @param windowToken The token of the window. * @param outFrame The frame of the window. - * @param outDisplayCutout The area that has been cut away from the display. * @param outInsetsState The insets state of this display from the client's perspective. * @param localClient Whether the client is from the our process. * @return Whether to always consume the system bars. * See {@link #areSystemBarsForcedShownLw(WindowState)}. */ boolean getLayoutHint(LayoutParams attrs, WindowToken windowToken, Rect outFrame, - DisplayCutout.ParcelableWrapper outDisplayCutout, InsetsState outInsetsState, - boolean localClient) { + InsetsState outInsetsState, boolean localClient) { final boolean isFixedRotationTransforming = windowToken != null && windowToken.isFixedRotationTransforming(); final ActivityRecord activity = windowToken != null ? windowToken.asActivityRecord() : null; @@ -1432,19 +1426,6 @@ public class DisplayPolicy { outFrame.intersect(taskBounds); } - final int fl = attrs.flags; - final boolean layoutInScreenAndInsetDecor = (fl & FLAG_LAYOUT_IN_SCREEN) != 0 - && (fl & FLAG_LAYOUT_INSET_DECOR) != 0; - final DisplayFrames displayFrames = isFixedRotationTransforming - ? windowToken.getFixedRotationTransformDisplayFrames() - : mDisplayContent.mDisplayFrames; - if (layoutInScreenAndInsetDecor) { - outDisplayCutout.set( - displayFrames.mDisplayCutout.calculateRelativeTo(outFrame).getDisplayCutout()); - } else { - outDisplayCutout.set(DisplayCutout.NO_CUTOUT); - } - final boolean inSizeCompatMode = WindowState.inSizeCompatMode(attrs, windowToken); outInsetsState.set(state, inSizeCompatMode || localClient); if (inSizeCompatMode) { @@ -1523,9 +1504,7 @@ public class DisplayPolicy { */ void simulateLayoutDisplay(DisplayFrames displayFrames, InsetsState insetsState, SparseArray<Rect> barContentFrames) { - displayFrames.onBeginLayout(); - updateInsetsStateForDisplayCutout(displayFrames, insetsState); - insetsState.setDisplayFrame(displayFrames.mUnrestricted); + displayFrames.onBeginLayout(insetsState); final WindowFrames simulatedWindowFrames = new WindowFrames(); if (mNavigationBar != null) { simulateLayoutDecorWindow(mNavigationBar, displayFrames, insetsState, @@ -1547,10 +1526,7 @@ public class DisplayPolicy { * @param uiMode The current uiMode in configuration. */ public void beginLayoutLw(DisplayFrames displayFrames, int uiMode) { - displayFrames.onBeginLayout(); - final InsetsState state = mDisplayContent.getInsetsStateController().getRawInsetsState(); - updateInsetsStateForDisplayCutout(displayFrames, state); - state.setDisplayFrame(displayFrames.mUnrestricted); + displayFrames.onBeginLayout(mDisplayContent.getInsetsStateController().getRawInsetsState()); mSystemGestures.screenWidth = displayFrames.mUnrestricted.width(); mSystemGestures.screenHeight = displayFrames.mUnrestricted.height(); @@ -1595,23 +1571,6 @@ public class DisplayPolicy { } } - private static void updateInsetsStateForDisplayCutout(DisplayFrames displayFrames, - InsetsState state) { - if (displayFrames.mDisplayCutout.getDisplayCutout().isEmpty()) { - state.removeSource(ITYPE_LEFT_DISPLAY_CUTOUT); - state.removeSource(ITYPE_TOP_DISPLAY_CUTOUT); - state.removeSource(ITYPE_RIGHT_DISPLAY_CUTOUT); - state.removeSource(ITYPE_BOTTOM_DISPLAY_CUTOUT); - return; - } - final Rect u = displayFrames.mUnrestricted; - final Rect s = displayFrames.mDisplayCutoutSafe; - state.getSource(ITYPE_LEFT_DISPLAY_CUTOUT).setFrame(u.left, u.top, s.left, u.bottom); - state.getSource(ITYPE_TOP_DISPLAY_CUTOUT).setFrame(u.left, u.top, u.right, s.top); - state.getSource(ITYPE_RIGHT_DISPLAY_CUTOUT).setFrame(s.right, u.top, u.right, u.bottom); - state.getSource(ITYPE_BOTTOM_DISPLAY_CUTOUT).setFrame(u.left, s.bottom, u.right, u.bottom); - } - private void layoutStatusBar(DisplayFrames displayFrames, Rect simulatedContentFrame) { // decide where the status bar goes ahead of time if (mStatusBar == null) { @@ -1623,7 +1582,7 @@ public class DisplayPolicy { windowFrames.setFrames(sTmpStatusFrame /* parentFrame */, sTmpStatusFrame /* displayFrame */); // Let the status bar determine its size. - mStatusBar.computeFrame(displayFrames); + mStatusBar.computeFrameAndUpdateSourceFrame(); // For layout, the status bar is always at the top with our fixed height. int statusBarBottom = displayFrames.mUnrestricted.top @@ -1690,7 +1649,7 @@ public class DisplayPolicy { final WindowFrames windowFrames = mNavigationBar.getLayoutingWindowFrames(); windowFrames.setFrames(navigationFrame /* parentFrame */, navigationFrame /* displayFrame */); - mNavigationBar.computeFrame(displayFrames); + mNavigationBar.computeFrameAndUpdateSourceFrame(); final Rect contentFrame = sTmpRect; contentFrame.set(windowFrames.mFrame); contentFrame.intersect(displayFrames.mDisplayCutoutSafe); @@ -1872,7 +1831,7 @@ public class DisplayPolicy { windowFrames.setContentChanged(true); } - win.computeFrame(displayFrames); + win.computeFrameAndUpdateSourceFrame(); } WindowState getTopFullscreenOpaqueWindow() { diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index 57d48c6bb9f4..0cefa9592757 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -61,7 +61,6 @@ import android.text.TextUtils; import android.util.ArraySet; import android.util.MergedConfiguration; import android.util.Slog; -import android.view.DisplayCutout; import android.view.IWindow; import android.view.IWindowId; import android.view.IWindowSession; @@ -185,22 +184,21 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { @Override public int addToDisplay(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, InsetsState requestedVisibility, Rect outFrame, - DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel, - InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { + InputChannel outInputChannel, InsetsState outInsetsState, + InsetsSourceControl[] outActiveControls) { return mService.addWindow(this, window, attrs, viewVisibility, displayId, - UserHandle.getUserId(mUid), requestedVisibility, outFrame, outDisplayCutout, - outInputChannel, outInsetsState, outActiveControls); + UserHandle.getUserId(mUid), requestedVisibility, outFrame, outInputChannel, + outInsetsState, outActiveControls); } @Override public int addToDisplayAsUser(IWindow window, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, int userId, InsetsState requestedVisibility, - Rect outFrame, DisplayCutout.ParcelableWrapper outDisplayCutout, - InputChannel outInputChannel, InsetsState outInsetsState, + Rect outFrame, InputChannel outInputChannel, InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { return mService.addWindow(this, window, attrs, viewVisibility, displayId, userId, - requestedVisibility, outFrame, outDisplayCutout, outInputChannel, outInsetsState, + requestedVisibility, outFrame, outInputChannel, outInsetsState, outActiveControls); } @@ -209,8 +207,8 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { int viewVisibility, int displayId, InsetsState outInsetsState) { return mService.addWindow(this, window, attrs, viewVisibility, displayId, UserHandle.getUserId(mUid), mDummyRequestedVisibility, - new Rect() /* outFrame */, new DisplayCutout.ParcelableWrapper() /* cutout */, - null /* outInputChannel */, outInsetsState, mDummyControls); + new Rect() /* outFrame */, null /* outInputChannel */, outInsetsState, + mDummyControls); } @Override diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 8c458a207cc3..09df71c21dac 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -227,7 +227,7 @@ class TaskSnapshotSurface implements StartingSurface { int displayId = activity.getDisplayContent().getDisplayId(); try { final int res = session.addToDisplay(window, layoutParams, - View.GONE, displayId, mTmpInsetsState, tmpFrames.frame, tmpFrames.displayCutout, + View.GONE, displayId, mTmpInsetsState, tmpFrames.frame, null /* outInputChannel */, mTmpInsetsState, mTempControls); if (res < 0) { Slog.w(TAG, "Failed to add snapshot starting window res=" + res); diff --git a/services/core/java/com/android/server/wm/WindowFrames.java b/services/core/java/com/android/server/wm/WindowFrames.java index 7991ec6ad59e..361694b325f9 100644 --- a/services/core/java/com/android/server/wm/WindowFrames.java +++ b/services/core/java/com/android/server/wm/WindowFrames.java @@ -17,7 +17,6 @@ package com.android.server.wm; import static com.android.server.wm.WindowFramesProto.CONTAINING_FRAME; -import static com.android.server.wm.WindowFramesProto.CUTOUT; import static com.android.server.wm.WindowFramesProto.DISPLAY_FRAME; import static com.android.server.wm.WindowFramesProto.FRAME; import static com.android.server.wm.WindowFramesProto.PARENT_FRAME; @@ -25,9 +24,6 @@ import static com.android.server.wm.WindowFramesProto.PARENT_FRAME; import android.annotation.NonNull; import android.graphics.Rect; import android.util.proto.ProtoOutputStream; -import android.view.DisplayCutout; - -import com.android.server.wm.utils.WmDisplayCutout; import java.io.PrintWriter; @@ -96,30 +92,11 @@ public class WindowFrames { */ 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. - */ - private WmDisplayCutout mLastDisplayCutout = WmDisplayCutout.NO_CUTOUT; - - private boolean mDisplayCutoutChanged; - boolean mLastForceReportingResized = false; boolean mForceReportingResized = false; private boolean mContentChanged; - public WindowFrames() { - } - - public WindowFrames(Rect parentFrame, Rect displayFrame) { - setFrames(parentFrame, displayFrame); - } - public void setFrames(Rect parentFrame, Rect displayFrame) { mParentFrame.set(parentFrame); mDisplayFrame.set(displayFrame); @@ -134,10 +111,6 @@ public class WindowFrames { return mParentFrameWasClippedByDisplayCutout; } - public void setDisplayCutout(WmDisplayCutout displayCutout) { - mDisplayCutout = displayCutout; - } - /** * @return true if the width or height has changed since last reported to the client. */ @@ -157,8 +130,7 @@ public class WindowFrames { boolean setReportResizeHints() { mLastForceReportingResized |= mForceReportingResized; mFrameSizeChanged |= didFrameSizeChange(); - mDisplayCutoutChanged |= !mLastDisplayCutout.equals(mDisplayCutout); - return mLastForceReportingResized || mFrameSizeChanged || mDisplayCutoutChanged; + return mLastForceReportingResized || mFrameSizeChanged; } /** @@ -168,7 +140,6 @@ public class WindowFrames { void clearReportResizeHints() { mLastForceReportingResized = false; mFrameSizeChanged = false; - mDisplayCutoutChanged = false; } /** @@ -176,7 +147,6 @@ public class WindowFrames { */ void onResizeHandled() { mForceReportingResized = false; - mLastDisplayCutout = mDisplayCutout; } /** @@ -207,7 +177,6 @@ public class WindowFrames { mDisplayFrame.dumpDebug(proto, DISPLAY_FRAME); mContainingFrame.dumpDebug(proto, CONTAINING_FRAME); mFrame.dumpDebug(proto, FRAME); - mDisplayCutout.getDisplayCutout().dumpDebug(proto, CUTOUT); proto.end(token); } @@ -219,12 +188,9 @@ public class WindowFrames { + " display=" + mDisplayFrame.toShortString(sTmpSB)); pw.println(prefix + "mFrame=" + mFrame.toShortString(sTmpSB) + " last=" + mLastFrame.toShortString(sTmpSB)); - pw.println(prefix + " cutout=" + mDisplayCutout.getDisplayCutout() - + " last=" + mLastDisplayCutout.getDisplayCutout()); } String getInsetsChangedInfo() { - return "forceReportingResized=" + mLastForceReportingResized - + " displayCutoutChanged=" + mDisplayCutoutChanged; + return "forceReportingResized=" + mLastForceReportingResized; } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1f3d15a7af6d..9e1bfdb1c2bb 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -140,7 +140,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.app.ActivityManager; -import android.window.TaskSnapshot; import android.app.ActivityManagerInternal; import android.app.ActivityTaskManager; import android.app.ActivityThread; @@ -221,7 +220,6 @@ import android.util.TypedValue; import android.util.proto.ProtoOutputStream; import android.view.Choreographer; import android.view.Display; -import android.view.DisplayCutout; import android.view.DisplayInfo; import android.view.Gravity; import android.view.IAppTransitionAnimationSpecsFuture; @@ -267,6 +265,7 @@ import android.view.WindowManager.RemoveContentMode; import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicyConstants.PointerEventListener; import android.window.ClientWindowFrames; +import android.window.TaskSnapshot; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; @@ -1445,8 +1444,8 @@ public class WindowManagerService extends IWindowManager.Stub public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility, int displayId, int requestUserId, InsetsState requestedVisibility, Rect outFrame, - DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel, - InsetsState outInsetsState, InsetsSourceControl[] outActiveControls) { + InputChannel outInputChannel, InsetsState outInsetsState, + InsetsSourceControl[] outActiveControls) { Arrays.fill(outActiveControls, null); int[] appOp = new int[1]; final boolean isRoundedCornerOverlay = (attrs.privateFlags @@ -1759,8 +1758,8 @@ public class WindowManagerService extends IWindowManager.Stub prepareNoneTransitionForRelaunching(activity); } - if (displayPolicy.getLayoutHint(win.mAttrs, token, outFrame, outDisplayCutout, - outInsetsState, win.isClientLocal())) { + if (displayPolicy.getLayoutHint(win.mAttrs, token, outFrame, outInsetsState, + win.isClientLocal())) { res |= WindowManagerGlobal.ADD_FLAG_ALWAYS_CONSUME_SYSTEM_BARS; } @@ -8392,7 +8391,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public boolean getWindowInsets(WindowManager.LayoutParams attrs, int displayId, - DisplayCutout.ParcelableWrapper outDisplayCutout, InsetsState outInsetsState) { + InsetsState outInsetsState) { final boolean fromLocal = Binder.getCallingPid() == myPid(); final long origId = Binder.clearCallingIdentity(); try { @@ -8404,7 +8403,7 @@ public class WindowManagerService extends IWindowManager.Stub } final WindowToken windowToken = dc.getWindowToken(attrs.token); return dc.getDisplayPolicy().getLayoutHint(attrs, windowToken, - mTmpRect /* outFrame */, outDisplayCutout, outInsetsState, fromLocal); + mTmpRect /* outFrame */, outInsetsState, fromLocal); } } finally { Binder.restoreCallingIdentity(origId); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 1805dddad69f..9bde204b9eaf 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -252,7 +252,6 @@ import com.android.internal.util.ToBooleanFunction; import com.android.server.policy.WindowManagerPolicy; import com.android.server.wm.LocalAnimationAdapter.AnimationSpec; import com.android.server.wm.SurfaceAnimator.AnimationType; -import com.android.server.wm.utils.WmDisplayCutout; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -1071,8 +1070,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP frame.inset(left, top, right, bottom); } - void computeFrame(DisplayFrames displayFrames) { - getLayoutingWindowFrames().setDisplayCutout(displayFrames.mDisplayCutout); + void computeFrameAndUpdateSourceFrame() { computeFrame(); // Update the source frame to provide insets to other windows during layout. If the // simulated frames exist, then this is not computing a stable result so just skip. @@ -1213,9 +1211,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } - windowFrames.setDisplayCutout( - windowFrames.mDisplayCutout.calculateRelativeTo(windowFrames.mFrame)); - // Offset the actual frame by the amount layout frame is off. windowFrames.offsetFrames(-layoutXDiff, -layoutYDiff); @@ -1292,10 +1287,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return mWindowFrames.mContainingFrame; } - WmDisplayCutout getWmDisplayCutout() { - return mWindowFrames.mDisplayCutout; - } - void getCompatFrameSize(Rect outFrame) { outFrame.set(0, 0, mWindowFrames.mCompatFrame.width(), mWindowFrames.mCompatFrame.height()); } @@ -3577,7 +3568,6 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final DisplayInfo displayInfo = getDisplayInfo(); backdropFrame.set(0, 0, displayInfo.logicalWidth, displayInfo.logicalHeight); } - outFrames.displayCutout.set(mWindowFrames.mDisplayCutout.getDisplayCutout()); } void reportResized() { diff --git a/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java b/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java index 46fff032e053..ee3f4f4d20f8 100644 --- a/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java +++ b/services/core/java/com/android/server/wm/utils/WmDisplayCutout.java @@ -57,55 +57,6 @@ public class WmDisplayCutout { } /** - * Insets the reference frame of the cutout in the given directions. - * - * @return a copy of this instance which has been inset - * @hide - */ - public WmDisplayCutout inset(int insetLeft, int insetTop, int insetRight, int insetBottom) { - DisplayCutout newInner = mInner.inset(insetLeft, insetTop, insetRight, insetBottom); - - if (mInner == newInner) { - return this; - } - - Size frame = mFrameSize == null ? null : new Size( - mFrameSize.getWidth() - insetLeft - insetRight, - mFrameSize.getHeight() - insetTop - insetBottom); - - return new WmDisplayCutout(newInner, frame); - } - - /** - * Recalculates the cutout relative to the given reference frame. - * - * The safe insets must already have been computed, e.g. with {@link #computeSafeInsets}. - * - * @return a copy of this instance with the safe insets recalculated - * @hide - */ - public WmDisplayCutout calculateRelativeTo(Rect frame) { - if (mFrameSize == null) { - return this; - } - final int insetRight = mFrameSize.getWidth() - frame.right; - final int insetBottom = mFrameSize.getHeight() - frame.bottom; - if (frame.left == 0 && frame.top == 0 && insetRight == 0 && insetBottom == 0) { - return this; - } - if (frame.left >= mInner.getSafeInsetLeft() - && frame.top >= mInner.getSafeInsetTop() - && insetRight >= mInner.getSafeInsetRight() - && insetBottom >= mInner.getSafeInsetBottom()) { - return NO_CUTOUT; - } - if (mInner.isEmpty()) { - return this; - } - return inset(frame.left, frame.top, insetRight, insetBottom); - } - - /** * Calculates the safe insets relative to the given display size. * * @return a copy of this instance with the safe insets calculated diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 95a1b61bb5a3..92d268a01e83 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1660,8 +1660,8 @@ public class ActivityRecordTests extends WindowTestsBase { any() /* window */, any() /* attrs */, anyInt() /* viewVisibility */, anyInt() /* displayId */, any() /* requestedVisibility */, any() /* outFrame */, - any() /* outDisplayCutout */, any() /* outInputChannel */, - any() /* outInsetsState */, any() /* outActiveControls */); + any() /* outInputChannel */, any() /* outInsetsState */, + any() /* outActiveControls */); mAtm.mWindowManager.mStartingSurfaceController .createTaskSnapshotSurface(activity, snapshot); } catch (RemoteException ignored) { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index 378a0a82c12f..0f03f68eccb6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -689,7 +689,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { final InsetsState outState = new InsetsState(); mDisplayPolicy.getLayoutHint(mWindow.mAttrs, null /* windowToken */, outFrame, - outDisplayCutout, outState, true /* localClient */); + outState, true /* localClient */); assertThat(outFrame, is(outState.getDisplayFrame())); assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); @@ -716,8 +716,8 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { new DisplayCutout.ParcelableWrapper(); final InsetsState outState = new InsetsState(); - mDisplayPolicy.getLayoutHint(mWindow.mAttrs, mWindow.mToken, outFrame, outDisplayCutout, - outState, true /* localClient */); + mDisplayPolicy.getLayoutHint(mWindow.mAttrs, mWindow.mToken, outFrame, outState, + true /* localClient */); assertThat(outFrame, is(taskBounds)); assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); @@ -756,8 +756,8 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { new DisplayCutout.ParcelableWrapper(); final InsetsState outState = new InsetsState(); - mDisplayPolicy.getLayoutHint(mWindow.mAttrs, mWindow.mToken, outFrame, outDisplayCutout, - outState, true /* localClient */); + mDisplayPolicy.getLayoutHint(mWindow.mAttrs, mWindow.mToken, outFrame, outState, + true /* localClient */); assertThat(outFrame, is(taskBounds)); assertThat(outDisplayCutout, is(new DisplayCutout.ParcelableWrapper())); diff --git a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java index 089fd2082412..61140d63d033 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/LaunchParamsControllerTests.java @@ -495,7 +495,7 @@ public class LaunchParamsControllerTests extends WindowTestsBase { // We didn't set up the overall environment for this test, so we need to mute the side // effect of layout passes that loosen the stable frame. - doNothing().when(display.mDisplayContent.mDisplayFrames).onBeginLayout(); + doNothing().when(display.mDisplayContent.mDisplayFrames).onBeginLayout(any()); return display; } } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java index aa6386903746..03ba6f9cdf34 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java @@ -37,7 +37,6 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import android.app.ActivityManager.TaskDescription; -import android.window.TaskSnapshot; import android.content.ComponentName; import android.graphics.Canvas; import android.graphics.Color; @@ -52,6 +51,7 @@ import android.view.InsetsState; import android.view.Surface; import android.view.SurfaceControl; import android.view.WindowManager; +import android.window.TaskSnapshot; import androidx.test.filters.SmallTest; @@ -145,7 +145,7 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase { assertThat(surface).isNotNull(); verify(session).addToDisplay(any(), argThat(this::isTrustedOverlay), anyInt(), anyInt(), - any(), any(), any(), any(), any(), any()); + any(), any(), any(), any(), any()); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java index 4a6906b88710..1607f013ee81 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java @@ -19,8 +19,6 @@ package com.android.server.wm; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; -import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; -import static android.view.DisplayCutout.fromBoundingRect; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_STATUS_BAR; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; @@ -42,8 +40,6 @@ import android.view.WindowManager; import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; -import com.android.server.wm.utils.WmDisplayCutout; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -258,30 +254,6 @@ public class WindowFrameTests extends WindowTestsBase { } @Test - @FlakyTest(bugId = 130388666) - public void testDisplayCutout() { - // Regular fullscreen task and window - WindowState w = createWindow(); - w.mAttrs.gravity = Gravity.LEFT | Gravity.TOP; - - final Rect pf = new Rect(0, 0, 1000, 2000); - // Create a display cutout of size 50x50, aligned top-center - final WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( - fromBoundingRect(500, 0, 550, 50, BOUNDS_POSITION_TOP), - pf.width(), pf.height()); - - final WindowFrames windowFrames = w.getWindowFrames(); - windowFrames.setFrames(pf, pf); - windowFrames.setDisplayCutout(cutout); - w.computeFrame(); - - assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetTop(), 50); - assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetBottom(), 0); - assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetLeft(), 0); - assertEquals(w.getWmDisplayCutout().getDisplayCutout().getSafeInsetRight(), 0); - } - - @Test public void testFreeformContentInsets() { removeGlobalMinSizeRestriction(); // fullscreen task doesn't use bounds for computeFrame diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index 592580a44b85..663cb09c730c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -67,14 +67,11 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.when; -import android.graphics.Insets; import android.graphics.Matrix; import android.graphics.Rect; import android.os.IBinder; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; -import android.util.Size; -import android.view.DisplayCutout; import android.view.InputWindowHandle; import android.view.InsetsState; import android.view.SurfaceControl; @@ -82,8 +79,6 @@ import android.view.WindowManager; import androidx.test.filters.SmallTest; -import com.android.server.wm.utils.WmDisplayCutout; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -527,24 +522,6 @@ public class WindowStateTests extends WindowTestsBase { } @Test - public void testDisplayCutoutIsCalculatedRelativeToFrame() { - final WindowState app = createWindow(null, TYPE_APPLICATION, "app"); - WindowFrames wf = app.getWindowFrames(); - wf.mParentFrame.set(7, 10, 185, 380); - wf.mDisplayFrame.set(wf.mParentFrame); - final DisplayCutout cutout = new DisplayCutout( - Insets.of(0, 15, 0, 22) /* safeInset */, - null /* boundLeft */, - new Rect(95, 0, 105, 15), - null /* boundRight */, - new Rect(95, 378, 105, 400)); - wf.setDisplayCutout(new WmDisplayCutout(cutout, new Size(200, 400))); - - app.computeFrame(); - assertThat(app.getWmDisplayCutout().getDisplayCutout(), is(cutout.inset(7, 10, 5, 20))); - } - - @Test public void testVisibilityChangeSwitchUser() { final WindowState window = createWindow(null, TYPE_APPLICATION, "app"); window.mHasSurface = true; diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java index a283476bfdf0..39976a5a2af1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/utils/WmDisplayCutoutTest.java @@ -23,10 +23,8 @@ import static android.view.DisplayCutout.BOUNDS_POSITION_TOP; import static android.view.DisplayCutout.NO_CUTOUT; import static android.view.DisplayCutout.fromBoundingRect; -import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertThat; import android.graphics.Insets; import android.graphics.Rect; @@ -54,52 +52,6 @@ public class WmDisplayCutoutTest { null /* boundRight */, null /* boundBottom */); @Test - public void calculateRelativeTo_top() { - WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( - fromBoundingRect(0, 0, 100, 20, BOUNDS_POSITION_TOP), 200, 400) - .calculateRelativeTo(new Rect(5, 5, 95, 195)); - - assertEquals(new Rect(0, 15, 0, 0), cutout.getDisplayCutout().getSafeInsets()); - } - - @Test - public void calculateRelativeTo_left() { - WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( - fromBoundingRect(0, 0, 20, 100, BOUNDS_POSITION_LEFT), 400, 200) - .calculateRelativeTo(new Rect(5, 5, 195, 95)); - - assertEquals(new Rect(15, 0, 0, 0), cutout.getDisplayCutout().getSafeInsets()); - } - - @Test - public void calculateRelativeTo_bottom() { - WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( - fromBoundingRect(0, 180, 100, 200, BOUNDS_POSITION_BOTTOM), 100, 200) - .calculateRelativeTo(new Rect(5, 5, 95, 195)); - - assertEquals(new Rect(0, 0, 0, 15), cutout.getDisplayCutout().getSafeInsets()); - } - - @Test - public void calculateRelativeTo_right() { - WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( - fromBoundingRect(180, 0, 200, 100, BOUNDS_POSITION_RIGHT), 200, 100) - .calculateRelativeTo(new Rect(5, 5, 195, 95)); - - assertEquals(new Rect(0, 0, 15, 0), cutout.getDisplayCutout().getSafeInsets()); - } - - @Test - public void calculateRelativeTo_bounds() { - WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( - fromBoundingRect(0, 0, 100, 20, BOUNDS_POSITION_TOP), 200, 400) - .calculateRelativeTo(new Rect(5, 10, 95, 180)); - - assertThat(cutout.getDisplayCutout().getBoundingRectTop(), - equalTo(new Rect(-5, -10, 95, 10))); - } - - @Test public void computeSafeInsets_cutoutTop() { WmDisplayCutout cutout = WmDisplayCutout.computeSafeInsets( fromBoundingRect(80, 0, 120, 20, BOUNDS_POSITION_TOP), 200, 400); |