Loading services/core/java/com/android/server/wm/DisplayRotation.java +12 −9 Original line number Diff line number Diff line Loading @@ -303,8 +303,7 @@ public class DisplayRotation { mOrientationListener.setCurrentRotation(mRotation); mSettingsObserver = new SettingsObserver(uiHandler); mSettingsObserver.observe(); if (mSupportAutoRotation && mContext.getResources().getBoolean( R.bool.config_windowManagerHalfFoldAutoRotateOverride)) { if (mSupportAutoRotation && isFoldable(mContext)) { mFoldController = new FoldController(); } else { mFoldController = null; Loading @@ -314,6 +313,10 @@ public class DisplayRotation { } } private static boolean isFoldable(Context context) { return context.getResources().getIntArray(R.array.config_foldedDeviceStates).length > 0; } @VisibleForTesting @Nullable DisplayRotationImmersiveAppCompatPolicy initImmersiveAppCompatPolicy( Loading Loading @@ -1463,11 +1466,6 @@ public class DisplayRotation { return false; } // Do not show rotation choice when fold controller blocks rotation sensor if (mFoldController != null && mFoldController.shouldIgnoreSensorRotation()) { return false; } // Don't show rotation choice if we are in tabletop or book modes. if (isTabletopAutoRotateOverrideEnabled()) return false; Loading Loading @@ -1775,8 +1773,11 @@ public class DisplayRotation { private SensorEventListener mHingeAngleSensorEventListener; private final Set<Integer> mTabletopRotations; private final Runnable mActivityBoundsUpdateCallback; private final boolean mAllowHalfFoldAutoRotationOverride; FoldController() { mAllowHalfFoldAutoRotationOverride = mContext.getResources().getBoolean( R.bool.config_windowManagerHalfFoldAutoRotateOverride); mTabletopRotations = new ArraySet<>(); int[] tabletop_rotations = mContext.getResources().getIntArray( R.array.config_deviceTabletopRotations); Loading Loading @@ -1894,12 +1895,14 @@ public class DisplayRotation { } boolean overrideFrozenRotation() { return mDeviceState == DeviceStateController.DeviceState.HALF_FOLDED; return mAllowHalfFoldAutoRotationOverride && mDeviceState == DeviceStateController.DeviceState.HALF_FOLDED; } boolean shouldRevertOverriddenRotation() { // When transitioning to open. return mDeviceState == DeviceStateController.DeviceState.OPEN return mAllowHalfFoldAutoRotationOverride && mDeviceState == DeviceStateController.DeviceState.OPEN && !mShouldIgnoreSensorRotation // Ignore if the hinge angle still moving && mInHalfFoldTransition && mDisplayContent.getRotationReversionController().isOverrideActive( Loading services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +48 −6 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.LocalServices; import com.android.server.UiThread; Loading Loading @@ -879,6 +880,33 @@ public class DisplayRotationTests { SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); } @Test public void sensorRotation_locked_halfFolded_configOff_rotationUnchanged() throws Exception { mBuilder.setIsFoldable(true); mBuilder.setSupportHalfFoldAutoRotateOverride(false); mBuilder.build(); configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false, false); enableOrientationSensor(); mTarget.foldStateChanged(DeviceStateController.DeviceState.OPEN); freezeRotation(Surface.ROTATION_270); mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_0)); assertTrue(waitForUiHandler()); // No rotation... assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation( SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); // ... half-fold -> still no rotation mTarget.foldStateChanged(DeviceStateController.DeviceState.HALF_FOLDED); assertTrue(waitForUiHandler()); verify(sMockWm).updateRotation(false, false); assertTrue(waitForUiHandler()); assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation( SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); } // ================================= // Tests for Policy based Rotation // ================================= Loading Loading @@ -1016,7 +1044,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterDisplayChangeBeforeTimeout_ignoresSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setDisplaySwitchRotationBlockTimeMs(1000) .build(); Loading @@ -1034,7 +1062,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterDisplayChangeAfterTimeout_usesSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setDisplaySwitchRotationBlockTimeMs(1000) .build(); Loading @@ -1052,7 +1080,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterHingeEventBeforeTimeout_ignoresSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading @@ -1072,7 +1100,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterHingeEventBeforeTimeoutFlagDisabled_usesSensorData() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(false) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading @@ -1091,7 +1119,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterHingeEventAfterTimeout_usesSensorData() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading @@ -1111,7 +1139,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterLargeHingeEventBeforeTimeout_usesSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading Loading @@ -1228,6 +1256,7 @@ public class DisplayRotationTests { private int mCarDockRotation; private int mDeskDockRotation; private int mUndockedHdmiRotation; private boolean mIsFoldable; private DisplayRotationBuilder setIsDefaultDisplay(boolean isDefaultDisplay) { mIsDefaultDisplay = isDefaultDisplay; Loading Loading @@ -1282,9 +1311,17 @@ public class DisplayRotationTests { return this; } private DisplayRotationBuilder setIsFoldable(boolean value) { mIsFoldable = value; return this; } private DisplayRotationBuilder setSupportHalfFoldAutoRotateOverride( boolean supportHalfFoldAutoRotateOverride) { mSupportHalfFoldAutoRotateOverride = supportHalfFoldAutoRotateOverride; if (supportHalfFoldAutoRotateOverride) { mIsFoldable = true; } return this; } Loading Loading @@ -1429,6 +1466,11 @@ public class DisplayRotationTests { when(mMockContext.getResources().getBoolean( com.android.internal.R.bool.config_windowManagerHalfFoldAutoRotateOverride)) .thenReturn(mSupportHalfFoldAutoRotateOverride); when(mMockContext.getResources().getIntArray( R.array.config_foldedDeviceStates)) .thenReturn(mIsFoldable ? new int[]{0} : new int[]{}); mMockDisplayRotationReversionController = mock(DisplayRotationReversionController.class); when(mMockDisplayContent.getRotationReversionController()) Loading Loading
services/core/java/com/android/server/wm/DisplayRotation.java +12 −9 Original line number Diff line number Diff line Loading @@ -303,8 +303,7 @@ public class DisplayRotation { mOrientationListener.setCurrentRotation(mRotation); mSettingsObserver = new SettingsObserver(uiHandler); mSettingsObserver.observe(); if (mSupportAutoRotation && mContext.getResources().getBoolean( R.bool.config_windowManagerHalfFoldAutoRotateOverride)) { if (mSupportAutoRotation && isFoldable(mContext)) { mFoldController = new FoldController(); } else { mFoldController = null; Loading @@ -314,6 +313,10 @@ public class DisplayRotation { } } private static boolean isFoldable(Context context) { return context.getResources().getIntArray(R.array.config_foldedDeviceStates).length > 0; } @VisibleForTesting @Nullable DisplayRotationImmersiveAppCompatPolicy initImmersiveAppCompatPolicy( Loading Loading @@ -1463,11 +1466,6 @@ public class DisplayRotation { return false; } // Do not show rotation choice when fold controller blocks rotation sensor if (mFoldController != null && mFoldController.shouldIgnoreSensorRotation()) { return false; } // Don't show rotation choice if we are in tabletop or book modes. if (isTabletopAutoRotateOverrideEnabled()) return false; Loading Loading @@ -1775,8 +1773,11 @@ public class DisplayRotation { private SensorEventListener mHingeAngleSensorEventListener; private final Set<Integer> mTabletopRotations; private final Runnable mActivityBoundsUpdateCallback; private final boolean mAllowHalfFoldAutoRotationOverride; FoldController() { mAllowHalfFoldAutoRotationOverride = mContext.getResources().getBoolean( R.bool.config_windowManagerHalfFoldAutoRotateOverride); mTabletopRotations = new ArraySet<>(); int[] tabletop_rotations = mContext.getResources().getIntArray( R.array.config_deviceTabletopRotations); Loading Loading @@ -1894,12 +1895,14 @@ public class DisplayRotation { } boolean overrideFrozenRotation() { return mDeviceState == DeviceStateController.DeviceState.HALF_FOLDED; return mAllowHalfFoldAutoRotationOverride && mDeviceState == DeviceStateController.DeviceState.HALF_FOLDED; } boolean shouldRevertOverriddenRotation() { // When transitioning to open. return mDeviceState == DeviceStateController.DeviceState.OPEN return mAllowHalfFoldAutoRotationOverride && mDeviceState == DeviceStateController.DeviceState.OPEN && !mShouldIgnoreSensorRotation // Ignore if the hinge angle still moving && mInHalfFoldTransition && mDisplayContent.getRotationReversionController().isOverrideActive( Loading
services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +48 −6 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ import android.view.WindowManager; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.internal.util.test.FakeSettingsProvider; import com.android.server.LocalServices; import com.android.server.UiThread; Loading Loading @@ -879,6 +880,33 @@ public class DisplayRotationTests { SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); } @Test public void sensorRotation_locked_halfFolded_configOff_rotationUnchanged() throws Exception { mBuilder.setIsFoldable(true); mBuilder.setSupportHalfFoldAutoRotateOverride(false); mBuilder.build(); configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false, false); enableOrientationSensor(); mTarget.foldStateChanged(DeviceStateController.DeviceState.OPEN); freezeRotation(Surface.ROTATION_270); mOrientationSensorListener.onSensorChanged(createSensorEvent(Surface.ROTATION_0)); assertTrue(waitForUiHandler()); // No rotation... assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation( SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); // ... half-fold -> still no rotation mTarget.foldStateChanged(DeviceStateController.DeviceState.HALF_FOLDED); assertTrue(waitForUiHandler()); verify(sMockWm).updateRotation(false, false); assertTrue(waitForUiHandler()); assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation( SCREEN_ORIENTATION_UNSPECIFIED, Surface.ROTATION_0)); } // ================================= // Tests for Policy based Rotation // ================================= Loading Loading @@ -1016,7 +1044,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterDisplayChangeBeforeTimeout_ignoresSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setDisplaySwitchRotationBlockTimeMs(1000) .build(); Loading @@ -1034,7 +1062,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterDisplayChangeAfterTimeout_usesSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setDisplaySwitchRotationBlockTimeMs(1000) .build(); Loading @@ -1052,7 +1080,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterHingeEventBeforeTimeout_ignoresSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading @@ -1072,7 +1100,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterHingeEventBeforeTimeoutFlagDisabled_usesSensorData() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(false) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading @@ -1091,7 +1119,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterHingeEventAfterTimeout_usesSensorData() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading @@ -1111,7 +1139,7 @@ public class DisplayRotationTests { @Test public void testSensorRotationAfterLargeHingeEventBeforeTimeout_usesSensor() throws Exception { mBuilder.setSupportHalfFoldAutoRotateOverride(true) mBuilder.setIsFoldable(true) .setPauseRotationWhenUnfolding(true) .setMaxHingeAngle(165) .setHingeAngleRotationBlockTimeMs(400) Loading Loading @@ -1228,6 +1256,7 @@ public class DisplayRotationTests { private int mCarDockRotation; private int mDeskDockRotation; private int mUndockedHdmiRotation; private boolean mIsFoldable; private DisplayRotationBuilder setIsDefaultDisplay(boolean isDefaultDisplay) { mIsDefaultDisplay = isDefaultDisplay; Loading Loading @@ -1282,9 +1311,17 @@ public class DisplayRotationTests { return this; } private DisplayRotationBuilder setIsFoldable(boolean value) { mIsFoldable = value; return this; } private DisplayRotationBuilder setSupportHalfFoldAutoRotateOverride( boolean supportHalfFoldAutoRotateOverride) { mSupportHalfFoldAutoRotateOverride = supportHalfFoldAutoRotateOverride; if (supportHalfFoldAutoRotateOverride) { mIsFoldable = true; } return this; } Loading Loading @@ -1429,6 +1466,11 @@ public class DisplayRotationTests { when(mMockContext.getResources().getBoolean( com.android.internal.R.bool.config_windowManagerHalfFoldAutoRotateOverride)) .thenReturn(mSupportHalfFoldAutoRotateOverride); when(mMockContext.getResources().getIntArray( R.array.config_foldedDeviceStates)) .thenReturn(mIsFoldable ? new int[]{0} : new int[]{}); mMockDisplayRotationReversionController = mock(DisplayRotationReversionController.class); when(mMockDisplayContent.getRotationReversionController()) Loading