Merge "WindowLayout: Layout IN_SCREEN floating windows in screen" into pi-dev
This commit is contained in:
@@ -87,6 +87,7 @@ import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_BOOT_PROGRESS;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
|
||||
@@ -5411,6 +5412,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
final boolean attachedInParent = attached != null && !layoutInScreen;
|
||||
final boolean requestedHideNavigation =
|
||||
(requestedSysUiFl & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) != 0;
|
||||
|
||||
// TYPE_BASE_APPLICATION windows are never considered floating here because they don't get
|
||||
// cropped / shifted to the displayFrame in WindowState.
|
||||
final boolean floatingInScreenWindow = !attrs.isFullscreen() && layoutInScreen
|
||||
&& type != TYPE_BASE_APPLICATION;
|
||||
|
||||
// Ensure that windows with a DEFAULT or NEVER display cutout mode are laid out in
|
||||
// the cutout safe zone.
|
||||
if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) {
|
||||
@@ -5445,7 +5452,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
|
||||
}
|
||||
// Windows that are attached to a parent and laid out in said parent already avoid
|
||||
// the cutout according to that parent and don't need to be further constrained.
|
||||
if (!attachedInParent) {
|
||||
// Floating IN_SCREEN windows get what they ask for and lay out in the full screen.
|
||||
// They will later be cropped or shifted using the displayFrame in WindowState,
|
||||
// which prevents overlap with the DisplayCutout.
|
||||
if (!attachedInParent && !floatingInScreenWindow) {
|
||||
mTmpRect.set(pf);
|
||||
pf.intersectUnchecked(displayCutoutSafeExceptMaybeBars);
|
||||
parentFrameWasClippedByDisplayCutout |= !mTmpRect.equals(pf);
|
||||
|
||||
@@ -22,6 +22,7 @@ import static android.view.View.SYSTEM_UI_FLAG_FULLSCREEN;
|
||||
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
|
||||
import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
||||
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
|
||||
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
|
||||
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
|
||||
@@ -29,6 +30,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
@@ -259,6 +261,23 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase {
|
||||
assertInsetBy(mAppWindow.decorFrame, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layoutWindowLw_withDisplayCutout_floatingInScreen() {
|
||||
addDisplayCutout();
|
||||
|
||||
mAppWindow.attrs.flags = FLAG_LAYOUT_IN_SCREEN;
|
||||
mAppWindow.attrs.type = TYPE_APPLICATION_OVERLAY;
|
||||
mAppWindow.attrs.width = DISPLAY_WIDTH;
|
||||
mAppWindow.attrs.height = DISPLAY_HEIGHT;
|
||||
mPolicy.addWindow(mAppWindow);
|
||||
|
||||
mPolicy.beginLayoutLw(mFrames, 0 /* UI mode */);
|
||||
mPolicy.layoutWindowLw(mAppWindow, null, mFrames);
|
||||
|
||||
assertInsetByTopBottom(mAppWindow.parentFrame, 0, NAV_BAR_HEIGHT);
|
||||
assertInsetByTopBottom(mAppWindow.displayFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void layoutWindowLw_withDisplayCutout_fullscreenInCutout_landscape() {
|
||||
addDisplayCutout();
|
||||
|
||||
@@ -229,7 +229,8 @@ public class PhoneWindowManagerTestBase {
|
||||
void addWindow(WindowState state) {
|
||||
if (state instanceof FakeWindowState) {
|
||||
((FakeWindowState) state).surfaceLayer =
|
||||
getWindowLayerFromTypeLw(state.getAttrs().type);
|
||||
getWindowLayerFromTypeLw(state.getAttrs().type,
|
||||
true /* canAddInternalSystemWindow */);
|
||||
}
|
||||
adjustWindowParamsLw(state, state.getAttrs(), true /* hasStatusBarPermission */);
|
||||
assertEquals(WindowManagerGlobal.ADD_OKAY, prepareAddWindowLw(state, state.getAttrs()));
|
||||
|
||||
Reference in New Issue
Block a user