Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e1ee5e5 authored by Oleg Blinnikov's avatar Oleg Blinnikov
Browse files

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
parent 84e751f9
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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
+48 −0
Original line number Diff line number Diff line
@@ -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;