summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Blinnikov <olb@google.com>2023-02-14 11:14:06 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-02-16 02:00:48 +0000
commit50f097403b610e8f0a700e71fa3af67fe561d212 (patch)
treeb648347f1b2f3a99199641c5ee9ab4bcb4592298
parent95c516ed4a6059c2f16c19814ffcb05bf36ae9b9 (diff)
downloadbase-50f097403b610e8f0a700e71fa3af67fe561d212.tar.gz
Do not scale Letterbox Inner bounds
getLetterboxInnerBounds is assumed to return unscaled bounds, just like getLetterboxOuterBounds. This CL fixes this behaviour in getLetterboxInnerBounds by applying scaling only in getCropBoundsIfNeeded, and never in adjustBoundsForTaskbar. Bug: 269030028 Test: atest SizeCompatTests Change-Id: I697e246bedced19009af24d0b7e81fc3d8f9a48c (cherry picked from commit 9e23ff5cde35b8f452cedf3350289da18b197ef8) Merged-In: I697e246bedced19009af24d0b7e81fc3d8f9a48c
-rw-r--r--services/core/java/com/android/server/wm/LetterboxUiController.java19
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java59
2 files changed, 68 insertions, 10 deletions
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index 9681789347cf..8f9c8d606930 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -641,10 +641,9 @@ final class LetterboxUiController {
if (mLetterbox != null) {
outBounds.set(mLetterbox.getInnerFrame());
final WindowState w = mActivityRecord.findMainWindow();
- if (w == null) {
- return;
+ if (w != null) {
+ adjustBoundsForTaskbar(w, outBounds);
}
- adjustBoundsIfNeeded(w, outBounds);
} else {
outBounds.setEmpty();
}
@@ -1079,7 +1078,12 @@ final class LetterboxUiController {
// It is important to call {@link #adjustBoundsIfNeeded} before {@link cropBounds.offsetTo}
// because taskbar bounds used in {@link #adjustBoundsIfNeeded}
// are in screen coordinates
- adjustBoundsIfNeeded(mainWindow, cropBounds);
+ adjustBoundsForTaskbar(mainWindow, cropBounds);
+
+ final float scale = mainWindow.mInvGlobalScale;
+ if (scale != 1f && scale > 0f) {
+ cropBounds.scale(scale);
+ }
// ActivityRecord bounds are in screen coordinates while (0,0) for activity's surface
// control is in the top left corner of an app window so offsetting bounds
@@ -1132,7 +1136,7 @@ final class LetterboxUiController {
return null;
}
- private void adjustBoundsIfNeeded(final WindowState mainWindow, final Rect bounds) {
+ private void adjustBoundsForTaskbar(final WindowState mainWindow, final Rect bounds) {
// Rounded corners should be displayed above the taskbar. When taskbar is hidden,
// an insets frame is equal to a navigation bar which shouldn't affect position of
// rounded corners since apps are expected to handle navigation bar inset.
@@ -1146,11 +1150,6 @@ final class LetterboxUiController {
// Rounded corners should be displayed above the expanded taskbar.
bounds.bottom = Math.min(bounds.bottom, expandedTaskbarOrNull.getFrame().top);
}
-
- final float scale = mainWindow.mInvGlobalScale;
- if (scale != 1f && scale > 0f) {
- bounds.scale(scale);
- }
}
private int getInsetsStateCornerRadius(
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 fb5fda16408e..9f6120658dd2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -1389,6 +1389,65 @@ public class SizeCompatTests extends WindowTestsBase {
}
@Test
+ public void testGetLetterboxInnerBounds_noScalingApplied() {
+ // Set up a display in portrait and ignoring orientation request.
+ final int dw = 1400;
+ final int dh = 2800;
+ setUpDisplaySizeWithApp(dw, dh);
+ mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);
+
+ // Rotate display to landscape.
+ rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
+
+ // Portrait fixed app without max aspect.
+ prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_LANDSCAPE);
+
+ // Need a window to call adjustBoundsForTaskbar with.
+ addWindowToActivity(mActivity);
+
+ // App should launch in fullscreen.
+ assertFalse(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ assertFalse(mActivity.inSizeCompatMode());
+
+ // Activity inherits max bounds from TaskDisplayArea.
+ assertMaxBoundsInheritDisplayAreaBounds();
+
+ // Rotate display to portrait.
+ rotateDisplay(mActivity.mDisplayContent, ROTATION_0);
+
+ final Rect rotatedDisplayBounds = new Rect(mActivity.mDisplayContent.getBounds());
+ final Rect rotatedActivityBounds = new Rect(mActivity.getBounds());
+ assertTrue(rotatedDisplayBounds.width() < rotatedDisplayBounds.height());
+
+ // App should be in size compat.
+ assertFalse(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
+ assertScaled();
+ assertThat(mActivity.inSizeCompatMode()).isTrue();
+ assertActivityMaxBoundsSandboxed();
+
+
+ final int scale = dh / dw;
+
+ // App bounds should be dh / scale x dw / scale
+ assertEquals(dw, rotatedDisplayBounds.width());
+ assertEquals(dh, rotatedDisplayBounds.height());
+
+ assertEquals(dh / scale, rotatedActivityBounds.width());
+ assertEquals(dw / scale, rotatedActivityBounds.height());
+
+ // Compute the frames of the window and invoke {@link ActivityRecord#layoutLetterbox}.
+ mActivity.mRootWindowContainer.performSurfacePlacement();
+
+ LetterboxDetails letterboxDetails = mActivity.mLetterboxUiController.getLetterboxDetails();
+
+ assertEquals(dh / scale, letterboxDetails.getLetterboxInnerBounds().width());
+ assertEquals(dw / scale, letterboxDetails.getLetterboxInnerBounds().height());
+
+ assertEquals(dw, letterboxDetails.getLetterboxFullBounds().width());
+ assertEquals(dh, letterboxDetails.getLetterboxFullBounds().height());
+ }
+
+ @Test
public void testLaunchWithFixedRotationTransform() {
final int dw = 1000;
final int dh = 2500;