Fix rounded corners cropping for letterbox
When using two apps in horizontal split-screen, taskbar is shown, and the bottom app is "portrait-only" and letterboxed, this bottom application is partially covered by taskbar. This is because, the top of taskbar is calculated relative to the whole screen, while cropBounds.offsetTo(0, 0) makes cropBounds coordinates relative to the lower part of the screen. Reordering the statements of "adjustment of crop bounds" and "offsetting coordinates" fixes this issue Change-Id: Id1ac9252fbf102e321a89330aefda9ca2624fe66 Merged-In: Id1ac9252fbf102e321a89330aefda9ca2624fe66 Test: atest SizeCompatTests Bug: 245521412
This commit is contained in:
@@ -501,12 +501,16 @@ final class LetterboxUiController {
|
||||
|
||||
if (hasVisibleTaskbar(mainWindow)) {
|
||||
cropBounds = new Rect(mActivityRecord.getBounds());
|
||||
|
||||
// Rounded corners should be displayed above the taskbar.
|
||||
// It is important to call adjustBoundsForTaskbarUnchecked before offsetTo
|
||||
// because taskbar bounds are in screen coordinates
|
||||
adjustBoundsForTaskbarUnchecked(mainWindow, cropBounds);
|
||||
|
||||
// Activity bounds are in screen coordinates while (0,0) for activity's surface
|
||||
// control is at the top left corner of an app window so offsetting bounds
|
||||
// accordingly.
|
||||
cropBounds.offsetTo(0, 0);
|
||||
// Rounded corners should be displayed above the taskbar.
|
||||
adjustBoundsForTaskbarUnchecked(mainWindow, cropBounds);
|
||||
}
|
||||
|
||||
transaction
|
||||
|
||||
@@ -25,6 +25,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
|
||||
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
|
||||
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
|
||||
import static android.provider.DeviceConfig.NAMESPACE_CONSTRAIN_DISPLAY_APIS;
|
||||
import static android.view.InsetsState.ITYPE_EXTRA_NAVIGATION_BAR;
|
||||
import static android.view.InsetsState.ITYPE_STATUS_BAR;
|
||||
import static android.view.Surface.ROTATION_0;
|
||||
import static android.view.Surface.ROTATION_180;
|
||||
@@ -69,6 +70,7 @@ import static org.mockito.ArgumentMatchers.same;
|
||||
import static org.mockito.Mockito.atLeastOnce;
|
||||
import static org.mockito.Mockito.clearInvocations;
|
||||
import static org.mockito.Mockito.doCallRealMethod;
|
||||
import static org.mockito.Mockito.times;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.ActivityManager;
|
||||
@@ -84,6 +86,7 @@ import android.os.UserHandle;
|
||||
import android.platform.test.annotations.Presubmit;
|
||||
import android.provider.DeviceConfig;
|
||||
import android.provider.DeviceConfig.Properties;
|
||||
import android.view.InsetsSource;
|
||||
import android.view.InsetsVisibilities;
|
||||
import android.view.WindowManager;
|
||||
|
||||
@@ -103,6 +106,9 @@ import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.TestRule;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Tests for Size Compatibility mode.
|
||||
@@ -2368,6 +2374,48 @@ public class SizeCompatTests extends WindowTestsBase {
|
||||
any(InsetsVisibilities.class), isNull(), eq(expectedLetterboxDetails));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLetterboxDetailsForTaskBar_letterboxNotOverlappingTaskBar() {
|
||||
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||
final int screenHeight = 2200;
|
||||
final int screenWidth = 1400;
|
||||
final int taskbarHeight = 200;
|
||||
setUpDisplaySizeWithApp(screenWidth, screenHeight);
|
||||
|
||||
final TestSplitOrganizer organizer =
|
||||
new TestSplitOrganizer(mAtm, mActivity.getDisplayContent());
|
||||
|
||||
// Move first activity to split screen which takes half of the screen.
|
||||
organizer.mPrimary.setBounds(0, screenHeight / 2, screenWidth, screenHeight);
|
||||
organizer.putTaskToPrimary(mTask, true);
|
||||
|
||||
final InsetsSource navSource = new InsetsSource(ITYPE_EXTRA_NAVIGATION_BAR);
|
||||
navSource.setFrame(new Rect(0, screenHeight - taskbarHeight, screenWidth, screenHeight));
|
||||
|
||||
mActivity.mWmService.mLetterboxConfiguration.setLetterboxActivityCornersRadius(15);
|
||||
|
||||
final WindowState w1 = addWindowToActivity(mActivity);
|
||||
w1.mAboveInsetsState.addSource(navSource);
|
||||
|
||||
// Prepare unresizable activity with max aspect ratio
|
||||
prepareUnresizable(mActivity, /* maxAspect */ 1.1f, SCREEN_ORIENTATION_UNSPECIFIED);
|
||||
|
||||
// Refresh the letterboxes
|
||||
mActivity.mRootWindowContainer.performSurfacePlacement();
|
||||
|
||||
final ArgumentCaptor<Rect> cropCapturer = ArgumentCaptor.forClass(Rect.class);
|
||||
verify(mTransaction, times(2)).setWindowCrop(
|
||||
eq(w1.getSurfaceControl()),
|
||||
cropCapturer.capture()
|
||||
);
|
||||
final List<Rect> capturedCrops = cropCapturer.getAllValues();
|
||||
|
||||
final int expectedHeight = screenHeight / 2 - taskbarHeight;
|
||||
assertEquals(2, capturedCrops.size());
|
||||
assertEquals(expectedHeight, capturedCrops.get(0).bottom);
|
||||
assertEquals(expectedHeight, capturedCrops.get(1).bottom);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSplitScreenLetterboxDetailsForStatusBar_twoLetterboxedApps() {
|
||||
mAtm.mDevEnableNonResizableMultiWindow = true;
|
||||
|
||||
Reference in New Issue
Block a user