Loading core/java/android/view/ViewRootImpl.java +31 −28 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONT import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FIT_INSETS_CONTROLLED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; Loading Loading @@ -2462,8 +2463,9 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": baseSize=" + baseSize + ", desiredWindowWidth=" + desiredWindowWidth); if (baseSize != 0 && desiredWindowWidth > baseSize) { childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width, lp.privateFlags); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height, lp.privateFlags); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() Loading @@ -2476,7 +2478,7 @@ public final class ViewRootImpl implements ViewParent, baseSize = (baseSize+desiredWindowWidth)/2; if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": next baseSize=" + baseSize); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width, lp.privateFlags); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")"); Loading @@ -2489,8 +2491,10 @@ public final class ViewRootImpl implements ViewParent, } if (!goodMeasure) { childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width, lp.privateFlags); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height, lp.privateFlags); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) { windowSizeMayChange = true; Loading Loading @@ -3150,8 +3154,10 @@ public final class ViewRootImpl implements ViewParent, if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight() || dispatchApplyInsets || updatedConfiguration) { int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width); int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height); int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width, lp.privateFlags); int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height, lp.privateFlags); if (DEBUG_LAYOUT) Log.v(mTag, "Ooops, something changed! mWidth=" + mWidth + " measuredWidth=" + host.getMeasuredWidth() Loading Loading @@ -3951,19 +3957,16 @@ public final class ViewRootImpl implements ViewParent, * Figures out the measure spec for the root view in a window based on it's * layout params. * * @param windowSize * The available width or height of the window * * @param rootDimension * The layout params for one dimension (width or height) of the * window. * * @param windowSize The available width or height of the window. * @param measurement The layout width or height requested in the layout params. * @param privateFlags The private flags in the layout params of the window. * @return The measure spec to use to measure the root view. */ private static int getRootMeasureSpec(int windowSize, int rootDimension) { private static int getRootMeasureSpec(int windowSize, int measurement, int privateFlags) { int measureSpec; final int rootDimension = (privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0 ? MATCH_PARENT : measurement; switch (rootDimension) { case ViewGroup.LayoutParams.MATCH_PARENT: // Window can't resize. Force root view to be windowSize. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY); Loading core/java/android/view/WindowLayout.java +31 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.view; import static android.view.Gravity.DISPLAY_CLIP_HORIZONTAL; import static android.view.Gravity.DISPLAY_CLIP_VERTICAL; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; Loading @@ -29,6 +31,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; Loading Loading @@ -250,11 +253,39 @@ public class WindowLayout { Gravity.apply(attrs.gravity, w, h, outParentFrame, (int) (x + attrs.horizontalMargin * pw), (int) (y + attrs.verticalMargin * ph), outFrame); // Now make sure the window fits in the overall display frame. if (fitToDisplay) { Gravity.applyDisplay(attrs.gravity, outDisplayFrame, outFrame); } if ((attrs.privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0 && !cutout.isEmpty()) { // If the actual frame covering a display cutout, and the window is requesting to extend // it's requested frame, re-do the frame calculation after getting the new requested // size. mTempRect.set(outFrame); // Do nothing if the display cutout and window don't overlap entirely. This may happen // when the cutout is not on the same side with the window. boolean shouldExpand = false; final Rect [] cutoutBounds = cutout.getBoundingRectsAll(); for (Rect cutoutBound : cutoutBounds) { if (cutoutBound.isEmpty()) continue; if (mTempRect.contains(cutoutBound) || cutoutBound.contains(mTempRect)) { shouldExpand = true; break; } } if (shouldExpand) { // Try to fit move the bar to avoid the display cutout first. Make sure the clip // flags are not set to make the window move. final int clipFlags = DISPLAY_CLIP_VERTICAL | DISPLAY_CLIP_HORIZONTAL; Gravity.applyDisplay(attrs.gravity & ~clipFlags, displayCutoutSafe, mTempRect); outFrame.union(mTempRect); } } if (DEBUG) Log.d(TAG, "computeWindowFrames " + attrs.getTitle() + " outFrame=" + outFrame.toShortString() + " outParentFrame=" + outParentFrame.toShortString() Loading core/java/android/view/WindowManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -2384,6 +2384,16 @@ public interface WindowManager extends ViewManager { */ public static final int PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR = 0x00001000; /** * Flag to indicate that the window frame should be the requested frame adding the display * cutout frame. This will only be applied if a specific size smaller than the parent frame * is given, and the window is covering the display cutout. The extended frame will not be * larger than the parent frame. * * {@hide} */ public static final int PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT = 0x00002000; /** * Flag that will make window ignore app visibility and instead depend purely on the decor * view visibility for determining window visibility. This is used by recents to keep Loading packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +4 −2 Original line number Diff line number Diff line Loading @@ -757,7 +757,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, | WindowManager.LayoutParams.FLAG_SLIPPERY, PixelFormat.TRANSLUCENT); mOrientationParams.setTitle("SecondaryHomeHandle" + mContext.getDisplayId()); mOrientationParams.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION; mOrientationParams.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; mWindowManager.addView(mOrientationHandle, mOrientationParams); mOrientationHandle.setVisibility(View.GONE); mOrientationParams.setFitInsetsTypes(0 /* types*/); Loading Loading @@ -1565,7 +1566,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } lp.token = new Binder(); lp.accessibilityTitle = mContext.getString(R.string.nav_bar); lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; lp.windowAnimations = 0; lp.setTitle("NavigationBar" + mContext.getDisplayId()); Loading services/tests/wmtests/src/com/android/server/wm/WindowLayoutTests.java +18 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; import static org.junit.Assert.assertEquals; Loading Loading @@ -329,6 +330,23 @@ public class WindowLayoutTests { assertInsetBy(WATERFALL_INSETS.left, 0, WATERFALL_INSETS.right, 0, mFrame); } @Test public void layoutExtendedToDisplayCutout() { addDisplayCutout(); final int height = DISPLAY_HEIGHT / 2; mRequestedHeight = UNSPECIFIED_LENGTH; mAttrs.height = height; mAttrs.gravity = Gravity.TOP; mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mAttrs.setFitInsetsTypes(0); mAttrs.privateFlags |= PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; computeFrames(); assertRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayFrame); assertRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, mParentFrame); assertRect(0, 0, DISPLAY_WIDTH, height + DISPLAY_CUTOUT_HEIGHT, mFrame); } @Test public void layoutInDisplayCutoutModeDefaultWithInvisibleSystemBars() { addDisplayCutout(); Loading Loading
core/java/android/view/ViewRootImpl.java +31 −28 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONT import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FIT_INSETS_CONTROLLED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; Loading Loading @@ -2462,8 +2463,9 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": baseSize=" + baseSize + ", desiredWindowWidth=" + desiredWindowWidth); if (baseSize != 0 && desiredWindowWidth > baseSize) { childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width, lp.privateFlags); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height, lp.privateFlags); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() Loading @@ -2476,7 +2478,7 @@ public final class ViewRootImpl implements ViewParent, baseSize = (baseSize+desiredWindowWidth)/2; if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": next baseSize=" + baseSize); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width, lp.privateFlags); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(mTag, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")"); Loading @@ -2489,8 +2491,10 @@ public final class ViewRootImpl implements ViewParent, } if (!goodMeasure) { childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width, lp.privateFlags); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height, lp.privateFlags); performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) { windowSizeMayChange = true; Loading Loading @@ -3150,8 +3154,10 @@ public final class ViewRootImpl implements ViewParent, if (focusChangedDueToTouchMode || mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight() || dispatchApplyInsets || updatedConfiguration) { int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width); int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height); int childWidthMeasureSpec = getRootMeasureSpec(mWidth, lp.width, lp.privateFlags); int childHeightMeasureSpec = getRootMeasureSpec(mHeight, lp.height, lp.privateFlags); if (DEBUG_LAYOUT) Log.v(mTag, "Ooops, something changed! mWidth=" + mWidth + " measuredWidth=" + host.getMeasuredWidth() Loading Loading @@ -3951,19 +3957,16 @@ public final class ViewRootImpl implements ViewParent, * Figures out the measure spec for the root view in a window based on it's * layout params. * * @param windowSize * The available width or height of the window * * @param rootDimension * The layout params for one dimension (width or height) of the * window. * * @param windowSize The available width or height of the window. * @param measurement The layout width or height requested in the layout params. * @param privateFlags The private flags in the layout params of the window. * @return The measure spec to use to measure the root view. */ private static int getRootMeasureSpec(int windowSize, int rootDimension) { private static int getRootMeasureSpec(int windowSize, int measurement, int privateFlags) { int measureSpec; final int rootDimension = (privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0 ? MATCH_PARENT : measurement; switch (rootDimension) { case ViewGroup.LayoutParams.MATCH_PARENT: // Window can't resize. Force root view to be windowSize. measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY); Loading
core/java/android/view/WindowLayout.java +31 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.view; import static android.view.Gravity.DISPLAY_CLIP_HORIZONTAL; import static android.view.Gravity.DISPLAY_CLIP_VERTICAL; import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_STATUS_BAR; Loading @@ -29,6 +31,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; Loading Loading @@ -250,11 +253,39 @@ public class WindowLayout { Gravity.apply(attrs.gravity, w, h, outParentFrame, (int) (x + attrs.horizontalMargin * pw), (int) (y + attrs.verticalMargin * ph), outFrame); // Now make sure the window fits in the overall display frame. if (fitToDisplay) { Gravity.applyDisplay(attrs.gravity, outDisplayFrame, outFrame); } if ((attrs.privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0 && !cutout.isEmpty()) { // If the actual frame covering a display cutout, and the window is requesting to extend // it's requested frame, re-do the frame calculation after getting the new requested // size. mTempRect.set(outFrame); // Do nothing if the display cutout and window don't overlap entirely. This may happen // when the cutout is not on the same side with the window. boolean shouldExpand = false; final Rect [] cutoutBounds = cutout.getBoundingRectsAll(); for (Rect cutoutBound : cutoutBounds) { if (cutoutBound.isEmpty()) continue; if (mTempRect.contains(cutoutBound) || cutoutBound.contains(mTempRect)) { shouldExpand = true; break; } } if (shouldExpand) { // Try to fit move the bar to avoid the display cutout first. Make sure the clip // flags are not set to make the window move. final int clipFlags = DISPLAY_CLIP_VERTICAL | DISPLAY_CLIP_HORIZONTAL; Gravity.applyDisplay(attrs.gravity & ~clipFlags, displayCutoutSafe, mTempRect); outFrame.union(mTempRect); } } if (DEBUG) Log.d(TAG, "computeWindowFrames " + attrs.getTitle() + " outFrame=" + outFrame.toShortString() + " outParentFrame=" + outParentFrame.toShortString() Loading
core/java/android/view/WindowManager.java +10 −0 Original line number Diff line number Diff line Loading @@ -2384,6 +2384,16 @@ public interface WindowManager extends ViewManager { */ public static final int PRIVATE_FLAG_FORCE_SHOW_STATUS_BAR = 0x00001000; /** * Flag to indicate that the window frame should be the requested frame adding the display * cutout frame. This will only be applied if a specific size smaller than the parent frame * is given, and the window is covering the display cutout. The extended frame will not be * larger than the parent frame. * * {@hide} */ public static final int PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT = 0x00002000; /** * Flag that will make window ignore app visibility and instead depend purely on the decor * view visibility for determining window visibility. This is used by recents to keep Loading
packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +4 −2 Original line number Diff line number Diff line Loading @@ -757,7 +757,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, | WindowManager.LayoutParams.FLAG_SLIPPERY, PixelFormat.TRANSLUCENT); mOrientationParams.setTitle("SecondaryHomeHandle" + mContext.getDisplayId()); mOrientationParams.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION; mOrientationParams.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; mWindowManager.addView(mOrientationHandle, mOrientationParams); mOrientationHandle.setVisibility(View.GONE); mOrientationParams.setFitInsetsTypes(0 /* types*/); Loading Loading @@ -1565,7 +1566,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } lp.token = new Binder(); lp.accessibilityTitle = mContext.getString(R.string.nav_bar); lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC; lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC | WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; lp.windowAnimations = 0; lp.setTitle("NavigationBar" + mContext.getDisplayId()); Loading
services/tests/wmtests/src/com/android/server/wm/WindowLayoutTests.java +18 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_INSET_PARENT_FRAME_BY_IME; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; import static org.junit.Assert.assertEquals; Loading Loading @@ -329,6 +330,23 @@ public class WindowLayoutTests { assertInsetBy(WATERFALL_INSETS.left, 0, WATERFALL_INSETS.right, 0, mFrame); } @Test public void layoutExtendedToDisplayCutout() { addDisplayCutout(); final int height = DISPLAY_HEIGHT / 2; mRequestedHeight = UNSPECIFIED_LENGTH; mAttrs.height = height; mAttrs.gravity = Gravity.TOP; mAttrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mAttrs.setFitInsetsTypes(0); mAttrs.privateFlags |= PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT; computeFrames(); assertRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, mDisplayFrame); assertRect(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, mParentFrame); assertRect(0, 0, DISPLAY_WIDTH, height + DISPLAY_CUTOUT_HEIGHT, mFrame); } @Test public void layoutInDisplayCutoutModeDefaultWithInvisibleSystemBars() { addDisplayCutout(); Loading