Merge "Do not scale Letterbox Inner bounds" into tm-qpr-dev am: 35a96232ca

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

Change-Id: I7b0b65e06289f4675d8a21b0da0247e6eb14de5c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Oleg Blinnikov
2023-02-15 10:17:35 +00:00
committed by Automerger Merge Worker
2 changed files with 68 additions and 10 deletions

View File

@@ -648,10 +648,9 @@ final class LetterboxUiController {
if (mLetterbox != null) { if (mLetterbox != null) {
outBounds.set(mLetterbox.getInnerFrame()); outBounds.set(mLetterbox.getInnerFrame());
final WindowState w = mActivityRecord.findMainWindow(); final WindowState w = mActivityRecord.findMainWindow();
if (w == null) { if (w != null) {
return; adjustBoundsForTaskbar(w, outBounds);
} }
adjustBoundsIfNeeded(w, outBounds);
} else { } else {
outBounds.setEmpty(); outBounds.setEmpty();
} }
@@ -1086,7 +1085,12 @@ final class LetterboxUiController {
// It is important to call {@link #adjustBoundsIfNeeded} before {@link cropBounds.offsetTo} // It is important to call {@link #adjustBoundsIfNeeded} before {@link cropBounds.offsetTo}
// because taskbar bounds used in {@link #adjustBoundsIfNeeded} // because taskbar bounds used in {@link #adjustBoundsIfNeeded}
// are in screen coordinates // 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 // 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 // control is in the top left corner of an app window so offsetting bounds
@@ -1139,7 +1143,7 @@ final class LetterboxUiController {
return null; 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, // 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 // 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. // rounded corners since apps are expected to handle navigation bar inset.
@@ -1153,11 +1157,6 @@ final class LetterboxUiController {
// Rounded corners should be displayed above the expanded taskbar. // Rounded corners should be displayed above the expanded taskbar.
bounds.bottom = Math.min(bounds.bottom, expandedTaskbarOrNull.getFrame().top); 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( private int getInsetsStateCornerRadius(

View File

@@ -1433,6 +1433,65 @@ public class SizeCompatTests extends WindowTestsBase {
activity.getBounds().width(), 0.5); activity.getBounds().width(), 0.5);
} }
@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 @Test
public void testLaunchWithFixedRotationTransform() { public void testLaunchWithFixedRotationTransform() {
final int dw = 1000; final int dw = 1000;