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

Commit c62ea5ff authored by Massimo Carli's avatar Massimo Carli
Browse files

[58/n] Handle Cutout in Letterbox Surface bounds

Letterbox Surfaces bounds need to take cut out into
account. This is done using the information provided by
the LetterboxPolicy.

Flag: EXEMPT Refactoring
Bug: 377289720
Test: atest WmTests:AppCompatUtilsTest
Test: atest WmTests:TransitionTests

Change-Id: I9f94d9f4f0122edb7e02f36a8df9bffc0fd505d0
parent d3e41843
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -187,14 +187,18 @@ final class AppCompatUtils {
                top.getAppCompatDisplayInsets() != null
                        ? top.getAppCompatDisplayInsets().mAspectRatio
                        : TaskInfo.PROPERTY_VALUE_UNSET;
        final boolean isTopActivityLetterboxed = top.areBoundsLetterboxed();
        final AppCompatLetterboxPolicy letterboxPolicy =
                top.mAppCompatController.getLetterboxPolicy();
        final boolean isTopActivityLetterboxed = letterboxPolicy.isRunning();
        appCompatTaskInfo.setTopActivityLetterboxed(isTopActivityLetterboxed);
        if (isTopActivityLetterboxed) {
            final Rect bounds = top.getBounds();
            appCompatTaskInfo.topActivityLetterboxWidth = bounds.width();
            appCompatTaskInfo.topActivityLetterboxHeight = bounds.height();
            // TODO(b/379824541) Remove duplicate information.
            appCompatTaskInfo.topActivityLetterboxBounds = bounds;
            appCompatTaskInfo.topActivityLetterboxBounds = new Rect();
            letterboxPolicy.getLetterboxInnerBounds(appCompatTaskInfo.topActivityLetterboxBounds);
            appCompatTaskInfo.topActivityLetterboxWidth =
                    appCompatTaskInfo.topActivityLetterboxBounds.width();
            appCompatTaskInfo.topActivityLetterboxHeight =
                    appCompatTaskInfo.topActivityLetterboxBounds.height();
            // We need to consider if letterboxed or pillarboxed.
            // TODO(b/336807329) Encapsulate reachability logic
            appCompatTaskInfo.setLetterboxDoubleTapEnabled(reachabilityOverrides
@@ -323,8 +327,12 @@ final class AppCompatUtils {
    @Nullable
    static AppCompatTransitionInfo createAppCompatTransitionInfo(
            @NonNull ActivityRecord activityRecord) {
        if (activityRecord.areBoundsLetterboxed()) {
            return new AppCompatTransitionInfo(new Rect(activityRecord.getBounds()));
        final AppCompatLetterboxPolicy letterboxPolicy =
                activityRecord.mAppCompatController.getLetterboxPolicy();
        if (letterboxPolicy.isRunning()) {
            final Rect letterboxBounds = new Rect();
            letterboxPolicy.getLetterboxInnerBounds(letterboxBounds);
            return new AppCompatTransitionInfo(letterboxBounds);
        }
        return null;
    }
+21 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
@@ -245,8 +246,9 @@ public class AppCompatUtilsTest extends WindowTestsBase {
                a.createActivityWithComponent();
                a.checkTopActivityInSizeCompatMode(/* inScm */ false);
                a.setIgnoreOrientationRequest(true);
                a.configureTopActivityBounds(new Rect(20, 30, 520, 630));
            });
            robot.setIsLetterboxPolicyRunning(true);
            robot.setLetterboxPolicyLetterboxBounds(new Rect(20, 30, 520, 630));
            robot.setIsLetterboxedForAspectRatioOnly(/* forAspectRatio */ true);


@@ -290,6 +292,9 @@ public class AppCompatUtilsTest extends WindowTestsBase {
                a.configureTopActivityBounds(new Rect(20, 30, 520, 630));
            });

            robot.setIsLetterboxPolicyRunning(true);
            robot.setLetterboxPolicyLetterboxBounds(new Rect(20, 30, 520, 630));

            robot.createAppCompatTransitionInfo();

            robot.checkAppCompatTransitionInfoIsCreated(/* expected */ true);
@@ -327,6 +332,7 @@ public class AppCompatUtilsTest extends WindowTestsBase {
            super.onPostActivityCreation(activity);
            spyOn(activity.mAppCompatController.getAspectRatioPolicy());
            spyOn(activity.mAppCompatController.getSafeRegionPolicy());
            spyOn(activity.mAppCompatController.getLetterboxPolicy());
        }

        @Override
@@ -360,6 +366,20 @@ public class AppCompatUtilsTest extends WindowTestsBase {
            when(mWindowState.isLetterboxedForDisplayCutout()).thenReturn(displayCutout);
        }

        void setIsLetterboxPolicyRunning(boolean isLetterboxRunning) {
            when(activity().top().mAppCompatController.getLetterboxPolicy().isRunning())
                    .thenReturn(isLetterboxRunning);
        }

        void setLetterboxPolicyLetterboxBounds(@NonNull Rect expectedBounds) {
            doAnswer(invocation -> {
                Rect bounds = invocation.getArgument(0);
                bounds.set(expectedBounds);
                return null;
            }).when(activity().top().mAppCompatController.getLetterboxPolicy())
                    .getLetterboxInnerBounds(any(Rect.class));
        }

        void setIsLetterboxedForSafeRegionOnlyAllowed(boolean safeRegionOnly) {
            when(activity().top().mAppCompatController.getSafeRegionPolicy()
                    .isLetterboxedForSafeRegionOnlyAllowed()).thenReturn(safeRegionOnly);
+7 −3
Original line number Diff line number Diff line
@@ -75,7 +75,6 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import static java.lang.Integer.MAX_VALUE;

@@ -111,7 +110,6 @@ import androidx.test.filters.SmallTest;
import com.android.internal.graphics.ColorUtils;
import com.android.server.wm.TransitionController.OnStartCollect;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
@@ -222,7 +220,13 @@ public class TransitionTests extends WindowTestsBase {
                new Rect(10, 10, 200, 300));
        opening.onRequestedOverrideConfigurationChanged(
                opening.getRequestedOverrideConfiguration());
        final Rect letterboxBounds = opening.getBounds();
        final WindowState appWindow = newWindowBuilder("appWindow",
                TYPE_BASE_APPLICATION).setWindowToken(opening).build();
        final Rect letterboxBounds = new Rect();
        final AppCompatLetterboxPolicy letterboxPolicy =
                opening.mAppCompatController.getLetterboxPolicy();
        letterboxPolicy.start(appWindow);
        letterboxPolicy.getLetterboxInnerBounds(letterboxBounds);
        final ActivityTransitionInfo closingActivityTransitionInfo =
                new ActivityTransitionInfo(closing.mActivityComponent, theTask.mTaskId);
        final ActivityTransitionInfo openingActivityTransitionInfo = new ActivityTransitionInfo(