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:
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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 */));
|
||||
|
||||
Reference in New Issue
Block a user