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
This commit is contained in:
committed by
Garfield Tan
parent
22562664e9
commit
3e595fe8d4
@@ -1059,11 +1059,19 @@ public class DisplayRotation {
|
||||
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.
|
||||
|
||||
@@ -238,15 +238,55 @@ public class DisplayRotationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReturnsUserRotation_UserRotationLocked_CompatibleAppRequest()
|
||||
public void testReturnsLandscape_UserRotationLockedSeascape_AppRequestsLandscape()
|
||||
throws Exception {
|
||||
mBuilder.build();
|
||||
configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false, false);
|
||||
configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false /* isCar */,
|
||||
false /* isTv */);
|
||||
|
||||
freezeRotation(Surface.ROTATION_180);
|
||||
|
||||
assertEquals(Surface.ROTATION_0, mTarget.rotationForOrientation(
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, Surface.ROTATION_90));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReturnsSeascape_UserRotationLockedSeascape_AppRequestsSeascape()
|
||||
throws Exception {
|
||||
mBuilder.build();
|
||||
configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false /* isCar */,
|
||||
false /* isTv */);
|
||||
|
||||
freezeRotation(Surface.ROTATION_180);
|
||||
|
||||
assertEquals(Surface.ROTATION_180, mTarget.rotationForOrientation(
|
||||
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE, Surface.ROTATION_90));
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE, Surface.ROTATION_90));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReturnsPortrait_UserRotationLockedPortrait_AppRequestsPortrait()
|
||||
throws Exception {
|
||||
mBuilder.build();
|
||||
configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false /* isCar */,
|
||||
false /* isTv */);
|
||||
|
||||
freezeRotation(Surface.ROTATION_270);
|
||||
|
||||
assertEquals(Surface.ROTATION_270, mTarget.rotationForOrientation(
|
||||
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT, Surface.ROTATION_0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testReturnsUpsideDown_UserRotationLockedUpsideDown_AppRequestsUpsideDown()
|
||||
throws Exception {
|
||||
mBuilder.build();
|
||||
configureDisplayRotation(SCREEN_ORIENTATION_LANDSCAPE, false /* isCar */,
|
||||
false /* isTv */);
|
||||
|
||||
freezeRotation(Surface.ROTATION_90);
|
||||
|
||||
assertEquals(Surface.ROTATION_90, mTarget.rotationForOrientation(
|
||||
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT, Surface.ROTATION_0));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user