Distinguish between landscape and seascape
Symptom:
android:screenOrientation="landscape" does not work. The activity is
shown in seascape mode when the screen orientation is locked in seascape
mode.
Root cause:
DisplayRotation allows showing an activity in seascape mode even
though the activity has SCREEN_ORIENTATION_LANDSCAPE flag. Some
application wants to avoid seascape mode but it can not.
Solution:
Respect android:screenOrientation="landscape" attribute. The screen
should be flipped from seascape to landscape according to the attribute.
Also respect "portrait" in the same way.
Bug: 132665278
Test: atest DisplayRotationTest
Change-Id: Ia5b1115797df78838c8693206f5ed1f0af62c49c
diff --git a/services/core/java/com/android/server/wm/DisplayRotation.java b/services/core/java/com/android/server/wm/DisplayRotation.java
index f08b4fc..3588470 100644
--- a/services/core/java/com/android/server/wm/DisplayRotation.java
+++ b/services/core/java/com/android/server/wm/DisplayRotation.java
@@ -1059,11 +1059,19 @@
preferredRotation = lastRotation;
}
} else if (mUserRotationMode == WindowManagerPolicy.USER_ROTATION_LOCKED
- && orientation != ActivityInfo.SCREEN_ORIENTATION_NOSENSOR) {
- // Apply rotation lock. Does not apply to NOSENSOR.
+ && orientation != ActivityInfo.SCREEN_ORIENTATION_NOSENSOR
+ && orientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
+ && orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+ && orientation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
+ && orientation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
+ // Apply rotation lock. Does not apply to NOSENSOR or specific rotations.
// The idea is that the user rotation expresses a weak preference for the direction
// of gravity and as NOSENSOR is never affected by gravity, then neither should
// NOSENSOR be affected by rotation lock (although it will be affected by docks).
+ // Also avoid setting user rotation when app has preference over one particular rotation
+ // to avoid leaving the rotation to the reverse of it which has the compatible
+ // orientation, but isn't what app wants, when the user rotation is the reverse of the
+ // preferred rotation.
preferredRotation = mUserRotation;
} else {
// No overriding preference.