Fix Transparent bounds from client layout

If the client uses a layout with LayoutParams.WRAP_CONTENT it
might happen that the requeste size for the translucent activity
is smaller than the one provided by core through Configuration.
In that case we need to adjust the bounds we use for cropping
when applying rounded corners.

Fix: 278525445
Test: Run atest WmTests:LetterboxUiControllerTest

Change-Id: Ife63ab94c7fb7dd27d3d6c773806d9c49cd8eae8
This commit is contained in:
Massimo Carli
2023-04-17 18:01:21 +00:00
parent 3b1304d65c
commit 9af423f3c3
2 changed files with 33 additions and 0 deletions

View File

@@ -1280,6 +1280,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

View File

@@ -452,6 +452,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,