summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Riddle Hsu <riddlehsu@google.com> 2020-06-15 16:48:19 +0800
committer Riddle Hsu <riddlehsu@google.com> 2020-06-15 12:41:29 +0000
commit080ae841998502c709a9f2f4a2d0f44cd7c959a3 (patch)
tree398076fd31228f97635b1888eb98341447e40fda
parent6dca466770a982bcc34df7813a8f86532eeec4d4 (diff)
Set pillar box bounds in fixed orientation display
Assume a non-resizable fixed portrait activity launched in a fixed landscape display, the activity should keep its portrait bounds by fitting the height to display and the width with the same ratio to height. Previously the pillar box bounds are only set to app bounds that causes the activity shown in landscape size compat mode. This change makes them consistent. Fixes: 158863196 Test: SizeCompatTests#testMoveToDifferentOrientDisplay Change-Id: Ib7c2b07d9b252a88d2e965cc16ca93f7804b16d0
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java31
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java19
2 files changed, 33 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index be2f9d410475..95444b4a0e32 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -7720,24 +7720,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 665cf83cd33c..8ac2d916d219 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -288,14 +288,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