diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index b545cf439879b..597fa949f4bf6 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -7724,24 +7724,25 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A outAppBounds.set(outBounds); } } else { - outBounds.set(0, 0, mWidth, mHeight); - getFrameByOrientation(outAppBounds, orientation); - if (orientationRequested && !canChangeOrientation - && (outAppBounds.width() > outAppBounds.height()) != (mWidth > mHeight)) { - // The orientation is mismatched but the display cannot rotate. The bounds will - // fit to the short side of display. - if (orientation == ORIENTATION_LANDSCAPE) { - outAppBounds.bottom = (int) ((float) mWidth * mWidth / mHeight); - outAppBounds.right = mWidth; - } else { - outAppBounds.bottom = mHeight; - outAppBounds.right = (int) ((float) mHeight * mHeight / mWidth); + if (orientationRequested) { + getFrameByOrientation(outBounds, orientation); + if ((outBounds.width() > outBounds.height()) != (mWidth > mHeight)) { + // The orientation is mismatched but the display cannot rotate. The bounds + // will fit to the short side of display. + if (orientation == ORIENTATION_LANDSCAPE) { + outBounds.bottom = (int) ((float) mWidth * mWidth / mHeight); + outBounds.right = mWidth; + } else { + outBounds.bottom = mHeight; + outBounds.right = (int) ((float) mHeight * mHeight / mWidth); + } + outBounds.offset( + getHorizontalCenterOffset(mWidth, outBounds.width()), 0 /* dy */); } - outAppBounds.offset(getHorizontalCenterOffset(outBounds.width(), - outAppBounds.width()), 0 /* dy */); } else { - outAppBounds.set(outBounds); + outBounds.set(0, 0, mWidth, mHeight); } + outAppBounds.set(outBounds); } if (rotation != ROTATION_UNDEFINED) { diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index d584d1533807f..15b395c8814e3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -289,14 +289,29 @@ public class SizeCompatTests extends ActivityTestsBase { // Move the non-resizable activity to the new display. mStack.reparent(newDisplay.getDefaultTaskDisplayArea(), true /* onTop */); - // The configuration bounds should keep the same. + // The configuration bounds [820, 0 - 1820, 2500] should keep the same. assertEquals(origWidth, configBounds.width()); assertEquals(origHeight, configBounds.height()); assertScaled(); + final Rect newDisplayBounds = newDisplay.getWindowConfiguration().getBounds(); // The scaled bounds should exclude notch area (1000 - 100 == 360 * 2500 / 1000 = 900). - assertEquals(newDisplay.getBounds().height() - notchHeight, + assertEquals(newDisplayBounds.height() - notchHeight, (int) ((float) mActivity.getBounds().width() * origHeight / origWidth)); + + // Recompute the natural configuration in the new display. + mActivity.clearSizeCompatMode(); + mActivity.ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */); + // Because the display cannot rotate, the portrait activity will fit the short side of + // display with keeping portrait bounds [200, 0 - 700, 1000] in center. + assertEquals(newDisplayBounds.height(), configBounds.height()); + assertEquals(configBounds.height() * newDisplayBounds.height() / newDisplayBounds.width(), + configBounds.width()); + assertFitted(); + // The appBounds should be [200, 100 - 700, 1000]. + final Rect appBounds = mActivity.getWindowConfiguration().getAppBounds(); + assertEquals(configBounds.width(), appBounds.width()); + assertEquals(configBounds.height() - notchHeight, appBounds.height()); } @Test