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

Commit 4c736a09 authored by Will Osborn's avatar Will Osborn
Browse files

Fix tabletop autorotate freezing the device in portrait

Test: locally tested in multiple configurations
Bug: 260549749
Change-Id: I43e87c35c9bca0bf6b27ae6db74d34996e227c58
parent 96c49780
Loading
Loading
Loading
Loading
+25 −8
Original line number Diff line number Diff line
@@ -1537,6 +1537,7 @@ public class DisplayRotation {
        private int mHalfFoldSavedRotation = -1; // No saved rotation
        private DeviceStateController.FoldState mFoldState =
                DeviceStateController.FoldState.UNKNOWN;
        private boolean mInHalfFoldTransition = false;

        boolean overrideFrozenRotation() {
            return mFoldState == DeviceStateController.FoldState.HALF_FOLDED;
@@ -1544,6 +1545,7 @@ public class DisplayRotation {

        boolean shouldRevertOverriddenRotation() {
            return mFoldState == DeviceStateController.FoldState.OPEN // When transitioning to open.
                    && mInHalfFoldTransition
                    && mHalfFoldSavedRotation != -1 // Ignore if we've already reverted.
                    && mUserRotationMode
                    == WindowManagerPolicy.USER_ROTATION_LOCKED; // Ignore if we're unlocked.
@@ -1552,6 +1554,7 @@ public class DisplayRotation {
        int revertOverriddenRotation() {
            int savedRotation = mHalfFoldSavedRotation;
            mHalfFoldSavedRotation = -1;
            mInHalfFoldTransition = false;
            return savedRotation;
        }

@@ -1577,16 +1580,11 @@ public class DisplayRotation {
                mService.updateRotation(false /* alwaysSendConfiguration */,
                        false /* forceRelayout */);
            } else {
                // Revert the rotation to our saved value if we transition from HALF_FOLDED.
                if (mHalfFoldSavedRotation != -1) {
                    mRotation = mHalfFoldSavedRotation;
                }
                // Tell the device to update its orientation (mFoldState is still HALF_FOLDED here
                // so we will override USER_ROTATION_LOCKED and allow a rotation).
                mInHalfFoldTransition = true;
                mFoldState = newState;
                // Tell the device to update its orientation.
                mService.updateRotation(false /* alwaysSendConfiguration */,
                        false /* forceRelayout */);
                // Once we are rotated, set mFoldstate, effectively removing the lock override.
                mFoldState = newState;
            }
        }
    }
@@ -1683,6 +1681,7 @@ public class DisplayRotation {

    private static class RotationHistory {
        private static final int MAX_SIZE = 8;
        private static final int NO_FOLD_CONTROLLER = -2;
        private static class Record {
            final @Surface.Rotation int mFromRotation;
            final @Surface.Rotation int mToRotation;
@@ -1694,6 +1693,9 @@ public class DisplayRotation {
            final String mLastOrientationSource;
            final @ActivityInfo.ScreenOrientation int mSourceOrientation;
            final long mTimestamp = System.currentTimeMillis();
            final int mHalfFoldSavedRotation;
            final boolean mInHalfFoldTransition;
            final DeviceStateController.FoldState mFoldState;

            Record(DisplayRotation dr, int fromRotation, int toRotation) {
                mFromRotation = fromRotation;
@@ -1719,6 +1721,15 @@ public class DisplayRotation {
                    mLastOrientationSource = null;
                    mSourceOrientation = SCREEN_ORIENTATION_UNSET;
                }
                if (dr.mFoldController != null) {
                    mHalfFoldSavedRotation = dr.mFoldController.mHalfFoldSavedRotation;
                    mInHalfFoldTransition = dr.mFoldController.mInHalfFoldTransition;
                    mFoldState = dr.mFoldController.mFoldState;
                } else {
                    mHalfFoldSavedRotation = NO_FOLD_CONTROLLER;
                    mInHalfFoldTransition = false;
                    mFoldState = DeviceStateController.FoldState.UNKNOWN;
                }
            }

            void dump(String prefix, PrintWriter pw) {
@@ -1735,6 +1746,12 @@ public class DisplayRotation {
                if (mNonDefaultRequestingTaskDisplayArea != null) {
                    pw.println(prefix + "  requestingTda=" + mNonDefaultRequestingTaskDisplayArea);
                }
                if (mHalfFoldSavedRotation != NO_FOLD_CONTROLLER) {
                    pw.println(prefix + " halfFoldSavedRotation="
                            + mHalfFoldSavedRotation
                            + " mInHalfFoldTransition=" + mInHalfFoldTransition
                            + " mFoldState=" + mFoldState);
                }
            }
        }