Fix tabletop autorotate freezing the device in portrait
Test: locally tested in multiple configurations Bug: 260549749 Change-Id: I43e87c35c9bca0bf6b27ae6db74d34996e227c58
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user