Merge "Set pillar box bounds in fixed orientation display" into rvc-dev am: 541633e3d6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11862406

Change-Id: Idba37654b3bf3298b8a7c8a6a2e122aab450af0c
This commit is contained in:
Riddle Hsu
2020-06-15 14:40:42 +00:00
committed by Automerger Merge Worker
2 changed files with 33 additions and 17 deletions

View File

@@ -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) {

View File

@@ -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