Merge "Fix restore orientation for nosensor in folded state" into udc-qpr-dev
diff --git a/services/core/java/com/android/server/wm/DisplayRotationReversionController.java b/services/core/java/com/android/server/wm/DisplayRotationReversionController.java
index d3a8a82..c934d14 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,10 +113,11 @@
             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);
+        final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation();
+        if (mUserRotationOverridden != ROTATION_UNDEFINED
+                && displayRotation.getUserRotationMode() == USER_ROTATION_LOCKED) {
+            displayRotation.setUserRotation(USER_ROTATION_LOCKED, mUserRotationOverridden);
+            mUserRotationOverridden = ROTATION_UNDEFINED;
             return true;
         } else {
             return false;
@@ -126,10 +125,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();
+    }
+}