diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java index b557b2e1410fc..a158e8d27b809 100644 --- a/services/core/java/com/android/server/wm/LetterboxUiController.java +++ b/services/core/java/com/android/server/wm/LetterboxUiController.java @@ -1311,6 +1311,16 @@ final class LetterboxUiController { final Rect cropBounds = new Rect(mActivityRecord.getBounds()); + // In case of translucent activities we check if the requested size is different from + // the size provided using inherited bounds. In that case we decide to not apply rounded + // corners because we assume the specific layout would. This is the case when the layout + // of the translucent activity uses only a part of all the bounds because of the use of + // LayoutParams.WRAP_CONTENT. + if (hasInheritedLetterboxBehavior() && (cropBounds.width() != mainWindow.mRequestedWidth + || cropBounds.height() != mainWindow.mRequestedHeight)) { + return null; + } + // It is important to call {@link #adjustBoundsIfNeeded} before {@link cropBounds.offsetTo} // because taskbar bounds used in {@link #adjustBoundsIfNeeded} // are in screen coordinates diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java index 81e0fb3c79961..67e7470abc89b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java @@ -454,6 +454,29 @@ public class LetterboxUiControllerTest extends WindowTestsBase { assertTrue(mController.shouldForceRotateForCameraCompat()); } + @Test + public void testGetCropBoundsIfNeeded_handleCropForTransparentActivityBasedOnOpaqueBounds() { + final InsetsSource taskbar = new InsetsSource(/*id=*/ 0, + WindowInsets.Type.navigationBars()); + taskbar.setInsetsRoundedCornerFrame(true); + final WindowState mainWindow = mockForGetCropBoundsAndRoundedCorners(taskbar); + final Rect opaqueBounds = new Rect(0, 0, 500, 300); + doReturn(opaqueBounds).when(mActivity).getBounds(); + // Activity is translucent + spyOn(mActivity.mLetterboxUiController); + doReturn(true).when(mActivity.mLetterboxUiController).hasInheritedLetterboxBehavior(); + + // Makes requested sizes different + mainWindow.mRequestedWidth = opaqueBounds.width() - 1; + mainWindow.mRequestedHeight = opaqueBounds.height() - 1; + assertNull(mActivity.mLetterboxUiController.getCropBoundsIfNeeded(mainWindow)); + + // Makes requested sizes equals + mainWindow.mRequestedWidth = opaqueBounds.width(); + mainWindow.mRequestedHeight = opaqueBounds.height(); + assertNotNull(mActivity.mLetterboxUiController.getCropBoundsIfNeeded(mainWindow)); + } + @Test public void testGetCropBoundsIfNeeded_noCrop() { final InsetsSource taskbar = new InsetsSource(/*id=*/ 0,