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();
+    }
+}