Fix creating unexpected letterbox surfaces

With fixed rotation, the rotated activity should compare bounds
with rotated display. Otherwise AR#isLetterboxedAppWindow will
return false and create unnecessary letterbox surfaces.

Note that fixed rotation only applies when display area matches
display bounds.

The method matchesDisplayBounds is removed because the only usage
in WS#computeFrame uses parent frame, that is computed from
configuration bounds which doesn't tie to an actual display.

Fix: 186407859
Test: DisplayContentTests#testApplyTopFixedRotationTransform
Change-Id: I8cd978844f0ba8f9739f90c5c624d0c5fc3dc339
This commit is contained in:
Riddle Hsu
2021-04-26 23:05:02 +08:00
parent 5b6127dffb
commit 2eee0e623a
3 changed files with 11 additions and 13 deletions

View File

@@ -1575,7 +1575,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
return false;
}
if (!r.getParent().matchParentBounds()) {
if (!r.getDisplayArea().matchParentBounds()) {
// Because the fixed rotated configuration applies to activity directly, if its parent
// has it own policy for bounds, the activity bounds based on parent is unknown.
return false;

View File

@@ -1265,7 +1265,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
mHaveFrame = true;
final Task task = getTask();
final boolean isFullscreenAndFillsDisplay = !inMultiWindowMode() && matchesDisplayBounds();
final boolean isFullscreenAndFillsArea = !inMultiWindowMode() && matchesDisplayAreaBounds();
final boolean windowsAreFloating = task != null && task.isFloating();
final DisplayContent dc = getDisplayContent();
final DisplayInfo displayInfo = getDisplayInfo();
@@ -1290,7 +1290,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
: isImeLayeringTarget();
final boolean isImeTarget =
imeWin != null && imeWin.isVisibleNow() && isInputMethodAdjustTarget;
if (isFullscreenAndFillsDisplay || layoutInParentFrame()) {
if (isFullscreenAndFillsArea || layoutInParentFrame()) {
// We use the parent frame as the containing frame for fullscreen and child windows
windowFrames.mContainingFrame.set(windowFrames.mParentFrame);
layoutDisplayFrame = windowFrames.mDisplayFrame;
@@ -2272,19 +2272,15 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
&& mWindowFrames.mFrame.bottom >= displayInfo.appHeight;
}
private boolean matchesDisplayBounds() {
final Rect displayBounds = mToken.getFixedRotationTransformDisplayBounds();
if (displayBounds != null) {
// If the rotated display bounds are available, the window bounds are also rotated.
return displayBounds.equals(getBounds());
}
return getDisplayContent().getBounds().equals(getBounds());
}
boolean matchesDisplayAreaBounds() {
final Rect rotatedDisplayBounds = mToken.getFixedRotationTransformDisplayBounds();
if (rotatedDisplayBounds != null) {
// If the rotated display bounds are available, the window bounds are also rotated.
return rotatedDisplayBounds.equals(getBounds());
}
final DisplayArea displayArea = getDisplayArea();
if (displayArea == null) {
return matchesDisplayBounds();
return getDisplayContent().getBounds().equals(getBounds());
}
return displayArea.getBounds().equals(getBounds());
}

View File

@@ -1320,6 +1320,8 @@ public class DisplayContentTests extends WindowTestsBase {
app.setRequestedOrientation(newOrientation);
assertTrue(app.isFixedRotationTransforming());
assertTrue(mAppWindow.matchesDisplayAreaBounds());
assertFalse(mAppWindow.isLetterboxedAppWindow());
assertTrue(mDisplayContent.getDisplayRotation().shouldRotateSeamlessly(
ROTATION_0 /* oldRotation */, ROTATION_90 /* newRotation */,
false /* forceUpdate */));