Fix restore orientation for nosensor in folded state
We should save and restore the user rotation only if the
current user rotation mode is USER_ROTATION_LOCKED
Fix: 289023967
Test: tested locally
Test: atest WmTests:DisplayRotationReversionControllerTests
Test: atest WmTests:DisplayRotationCompatPolicyTests
Test: atest WmTests:DisplayContentTests
Change-Id: I2692845f8f624d1bdf0d944dfb350b4bc0983081
diff --git a/services/core/java/com/android/server/wm/DisplayRotationReversionController.java b/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
index 4eb2d88..50b29ec 100644
--- a/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
+++ b/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
@@ -16,17 +16,17 @@
package com.android.server.wm;
+import static android.app.WindowConfiguration.ROTATION_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
+import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_LOCKED;
import android.annotation.Nullable;
-import android.app.WindowConfiguration;
import android.content.ActivityInfoProto;
import android.view.Surface;
import com.android.internal.protolog.common.ProtoLog;
-import com.android.server.policy.WindowManagerPolicy;
/**
* Defines the behavior of reversion from device rotation overrides.
@@ -51,9 +51,7 @@
private static final int NUM_SLOTS = 3;
@Surface.Rotation
- private int mUserRotationOverridden = WindowConfiguration.ROTATION_UNDEFINED;
- @WindowManagerPolicy.UserRotationMode
- private int mUserRotationModeOverridden;
+ private int mUserRotationOverridden = ROTATION_UNDEFINED;
private final boolean[] mSlots = new boolean[NUM_SLOTS];
private final DisplayContent mDisplayContent;
@@ -115,11 +113,12 @@
return false;
}
// Only override if the rotation is frozen and there are no other active slots.
- if (mDisplayContent.getDisplayRotation().isRotationFrozen()) {
- mDisplayContent.getDisplayRotation().setUserRotation(
- mUserRotationModeOverridden,
- mUserRotationOverridden,
- /* caller= */ "DisplayRotationReversionController#revertOverride");
+ final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
+ if (mUserRotationOverridden != ROTATION_UNDEFINED
+ && displayRotation.getUserRotationMode() == USER_ROTATION_LOCKED) {
+ displayRotation.setUserRotation(USER_ROTATION_LOCKED, mUserRotationOverridden,
+ /* caller= */ "DisplayRotationReversionController#revertOverride");
+ mUserRotationOverridden = ROTATION_UNDEFINED;
return true;
} else {
return false;
@@ -127,10 +126,10 @@
}
private void maybeSaveUserRotation() {
- if (!isAnyOverrideActive()) {
- mUserRotationModeOverridden =
- mDisplayContent.getDisplayRotation().getUserRotationMode();
- mUserRotationOverridden = mDisplayContent.getDisplayRotation().getUserRotation();
+ final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
+ if (!isAnyOverrideActive()
+ && displayRotation.getUserRotationMode() == USER_ROTATION_LOCKED) {
+ mUserRotationOverridden = displayRotation.getUserRotation();
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationReversionControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationReversionControllerTests.java
new file mode 100644
index 0000000..81471dd
--- /dev/null
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationReversionControllerTests.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm;
+
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_FREE;
+import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_LOCKED;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Test class for {@link DisplayRotationReversionController}.
+ *
+ * Build/Install/Run:
+ * atest WmTests:DisplayRotationReversionControllerTests
+ */
+@SmallTest
+@Presubmit
+public class DisplayRotationReversionControllerTests {
+
+ private DisplayContent mDisplayContent;
+
+ private DisplayRotationReversionController mDisplayRotationReversionController;
+
+ @Before
+ public void setUp() {
+ mDisplayContent = mock(DisplayContent.class);
+ mDisplayRotationReversionController = new DisplayRotationReversionController(
+ mDisplayContent);
+ }
+
+ @Test
+ public void beforeOverrideApplied_useDisplayRotationWhenUserRotationLocked() {
+ final DisplayRotation displayRotation = mock(DisplayRotation.class);
+ doReturn(displayRotation).when(mDisplayContent).getDisplayRotation();
+ doReturn(USER_ROTATION_LOCKED).when(displayRotation).getUserRotationMode();
+
+ mDisplayRotationReversionController.beforeOverrideApplied(0);
+
+ verify(displayRotation).getUserRotation();
+ }
+
+ @Test
+ public void beforeOverrideApplied_dontUseDisplayRotationWhenNotUserRotationLocked() {
+ final DisplayRotation displayRotation = mock(DisplayRotation.class);
+ doReturn(displayRotation).when(mDisplayContent).getDisplayRotation();
+ doReturn(USER_ROTATION_FREE).when(displayRotation).getUserRotationMode();
+
+ mDisplayRotationReversionController.beforeOverrideApplied(0);
+
+ verify(displayRotation, never()).getUserRotation();
+ }
+}