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

Commit 6f828594 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Check physical upside down for seamless rotation

The "UpsideDown" field of DisplayRotation stands for reverse portrait.
So the general up side down rotation should be ROTATION_180.

Also move up the condition of movable navigation bar, which should
have higher priority to allow seamless rotation. Because it also
means that upside down is supported.

Fixes: 229671538
Test: atest DisplayRotationTests#testShouldRotateSeamlessly
Change-Id: I9165f44b42fd058cb52753ecdf3cb98789c675d2
parent 0b91be72
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -702,17 +702,17 @@ public class DisplayRotation {
    }

    boolean canRotateSeamlessly(int oldRotation, int newRotation) {
        // If the navigation bar can't change sides, then it will jump when we change orientations
        // and we don't rotate seamlessly - unless that is allowed, eg. with gesture navigation
        // where the navbar is low-profile enough that this isn't very noticeable.
        if (mAllowSeamlessRotationDespiteNavBarMoving || mDisplayPolicy.navigationBarCanMove()) {
            return true;
        }
        // For the upside down rotation we don't rotate seamlessly as the navigation bar moves
        // position. Note most apps (using orientation:sensor or user as opposed to fullSensor)
        // will not enter the reverse portrait orientation, so actually the orientation won't change
        // at all.
        if (oldRotation == mUpsideDownRotation || newRotation == mUpsideDownRotation) {
            return false;
        }
        // If the navigation bar can't change sides, then it will jump when we change orientations
        // and we don't rotate seamlessly - unless that is allowed, eg. with gesture navigation
        // where the navbar is low-profile enough that this isn't very noticeable.
        return mAllowSeamlessRotationDespiteNavBarMoving || mDisplayPolicy.navigationBarCanMove();
        return oldRotation != Surface.ROTATION_180 && newRotation != Surface.ROTATION_180;
    }

    void markForSeamlessRotation(WindowState w, boolean seamlesslyRotated) {
+7 −1
Original line number Diff line number Diff line
@@ -721,14 +721,20 @@ public class DisplayRotationTests {
        doReturn(true).when(mMockDisplayPolicy).navigationBarCanMove();
        doReturn(win).when(mMockDisplayPolicy).getTopFullscreenOpaqueWindow();
        mMockDisplayContent.mCurrentFocus = win;
        mTarget.mUpsideDownRotation = Surface.ROTATION_180;
        // This should not affect the condition of shouldRotateSeamlessly.
        mTarget.mUpsideDownRotation = Surface.ROTATION_90;

        doReturn(true).when(win.mActivityRecord).matchParentBounds();
        // The focused fullscreen opaque window without override bounds should be able to be
        // rotated seamlessly.
        assertTrue(mTarget.shouldRotateSeamlessly(
                Surface.ROTATION_0, Surface.ROTATION_90, false /* forceUpdate */));
        // Reject any 180 degree because non-movable navbar will be placed in a different position.
        doReturn(false).when(mMockDisplayPolicy).navigationBarCanMove();
        assertFalse(mTarget.shouldRotateSeamlessly(
                Surface.ROTATION_90, Surface.ROTATION_180, false /* forceUpdate */));

        doReturn(true).when(mMockDisplayPolicy).navigationBarCanMove();
        doReturn(false).when(win.mActivityRecord).matchParentBounds();
        // No seamless rotation if the window may be positioned with offset after rotation.
        assertFalse(mTarget.shouldRotateSeamlessly(