diff options
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); |