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

Commit 24307a6b authored by Mariia Sandrikova's avatar Mariia Sandrikova
Browse files

Remember original orientation in size compat mode.

We should use the original orientation of the activity when the new requested orientation is undefinded to avoid forcing the activity in the opposite orientation.

Fix: 227642889
Test: atest WmTests:SizeCompatTests
Change-Id: If7fcca5009d543b70f8f46f3116e4c8a14aee0ad
parent 9640eb5e
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -8071,6 +8071,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
        final boolean orientationRequested = requestedOrientation != ORIENTATION_UNDEFINED;
        final int orientation = orientationRequested
                ? requestedOrientation
                // We should use the original orientation of the activity when possible to avoid
                // forcing the activity in the opposite orientation.
                : mCompatDisplayInsets.mOriginalRequestedOrientation != ORIENTATION_UNDEFINED
                        ? mCompatDisplayInsets.mOriginalRequestedOrientation
                        : newParentConfiguration.orientation;
        int rotation = newParentConfiguration.windowConfiguration.getRotation();
        final boolean isFixedToUserRotation = mDisplayContent == null
@@ -9339,8 +9343,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
     * compatibility mode activity compute the configuration without relying on its current display.
     */
    static class CompatDisplayInsets {
        /** The original rotation the compat insets were computed in */
        /** The original rotation the compat insets were computed in. */
        final @Rotation int mOriginalRotation;
        /** The original requested orientation for the activity. */
        final @Configuration.Orientation int mOriginalRequestedOrientation;
        /** The container width on rotation 0. */
        private final int mWidth;
        /** The container height on rotation 0. */
@@ -9369,6 +9375,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
                @Nullable Rect fixedOrientationBounds) {
            mOriginalRotation = display.getRotation();
            mIsFloating = container.getWindowConfiguration().tasksAreFloating();
            mOriginalRequestedOrientation = container.getRequestedConfigurationOrientation();
            if (mIsFloating) {
                final Rect containerBounds = container.getWindowConfiguration().getBounds();
                mWidth = containerBounds.width();
+21 −0
Original line number Diff line number Diff line
@@ -1528,6 +1528,27 @@ public class SizeCompatTests extends WindowTestsBase {
                newActivityBounds.width());
    }

    @Test
    public void testDisplayIgnoreOrientationRequest_orientationChangedToUnspecified() {
        // Set up a display in landscape and ignoring orientation request.
        setUpDisplaySizeWithApp(2800, 1400);
        final DisplayContent display = mActivity.mDisplayContent;
        display.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */);

        // Portrait fixed app without max aspect.
        prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT);

        assertTrue(mActivity.isLetterboxedForFixedOrientationAndAspectRatio());
        assertFalse(mActivity.inSizeCompatMode());

        mActivity.setRequestedOrientation(SCREEN_ORIENTATION_UNSPECIFIED);

        assertTrue(mActivity.inSizeCompatMode());
        // We should remember the original orientation.
        assertEquals(mActivity.getResolvedOverrideConfiguration().orientation,
                Configuration.ORIENTATION_PORTRAIT);
    }

    @Test
    public void testDisplayIgnoreOrientationRequest_newLaunchedMaxAspectApp() {
        // Set up a display in landscape and ignoring orientation request.