Loading services/core/java/com/android/server/wm/DisplayRotation.java +21 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.Display.TYPE_EXTERNAL; import static android.view.Display.TYPE_OVERLAY; import static android.view.Display.TYPE_VIRTUAL; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE; Loading Loading @@ -1794,20 +1795,36 @@ public class DisplayRotation { } } @VisibleForTesting int getDemoUserRotationOverride() { return SystemProperties.getInt("persist.demo.userrotation", Surface.ROTATION_0); } @VisibleForTesting @NonNull String getDemoUserRotationPackage() { return SystemProperties.get("persist.demo.userrotation.package_name"); } @Surface.Rotation private int getUserRotationOverride() { final int userRotationOverride = SystemProperties.getInt("persist.demo.userrotation", Surface.ROTATION_0); final int userRotationOverride = getDemoUserRotationOverride(); if (userRotationOverride == Surface.ROTATION_0) { return userRotationOverride; } final var display = mDisplayContent.mDisplay; final var display = mDisplayContent.getDisplay(); if (display.getType() == TYPE_EXTERNAL || display.getType() == TYPE_OVERLAY) { // TODO b/329442350 add chromecast virtual displays here return userRotationOverride; } if (display.getType() == TYPE_VIRTUAL) { final var packageName = getDemoUserRotationPackage(); if (!packageName.isEmpty() && packageName.equals(display.getOwnerPackageName())) { return userRotationOverride; } } return Surface.ROTATION_0; } Loading services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +76 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.same; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; Loading Loading @@ -66,6 +67,7 @@ import android.os.PowerManagerInternal; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; import android.provider.Settings; import android.view.Display; import android.view.DisplayAddress; import android.view.IRotationWatcher; import android.view.Surface; Loading Loading @@ -216,6 +218,79 @@ public class DisplayRotationTests { WindowManagerPolicy.USER_ROTATION_LOCKED, Surface.ROTATION_180); } @Test public void testUserRotationSystemProperty_NonDefault_InternalDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_INTERNAL); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(Surface.ROTATION_270, mTarget.getUserRotation()); assertEquals(WindowManagerPolicy.USER_ROTATION_FREE, mTarget.getUserRotationMode()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testUserRotationSystemProperty_NonDefault_ExternalDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_EXTERNAL); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotationMode()); assertEquals(Surface.ROTATION_90, mTarget.getUserRotation()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testUserRotationSystemProperty_NonDefault_OverlayDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_OVERLAY); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotationMode()); assertEquals(Surface.ROTATION_90, mTarget.getUserRotation()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testUserRotationSystemProperty_NonDefault_VirtualDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_VIRTUAL); final var packageName = "abc"; when(mMockDisplayContent.getDisplay().getOwnerPackageName()).thenReturn(packageName); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); // Without package name when(mTarget.getDemoUserRotationPackage()).thenReturn(""); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_FREE, mTarget.getUserRotationMode()); assertEquals(Surface.ROTATION_270, mTarget.getUserRotation()); assertEquals(0, mTarget.getFixedToUserRotationMode()); // Use package name when(mTarget.getDemoUserRotationPackage()).thenReturn(packageName); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotation()); assertEquals(Surface.ROTATION_90, mTarget.getUserRotationMode()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testPersistUserRotation_UnlockRotation_DefaultDisplay() throws Exception { mBuilder.build(); Loading Loading @@ -1450,6 +1525,7 @@ public class DisplayRotationTests { mMockContext = mock(Context.class); mMockDisplayContent = mock(DisplayContent.class); when(mMockDisplayContent.getDisplay()).thenReturn(mock(Display.class)); mMockDisplayContent.isDefaultDisplay = mIsDefaultDisplay; when(mMockDisplayContent.calculateDisplayCutoutForRotation(anyInt())) .thenReturn(NO_CUTOUT); Loading Loading
services/core/java/com/android/server/wm/DisplayRotation.java +21 −4 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.Display.TYPE_EXTERNAL; import static android.view.Display.TYPE_OVERLAY; import static android.view.Display.TYPE_VIRTUAL; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT; import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_ROTATE; Loading Loading @@ -1794,20 +1795,36 @@ public class DisplayRotation { } } @VisibleForTesting int getDemoUserRotationOverride() { return SystemProperties.getInt("persist.demo.userrotation", Surface.ROTATION_0); } @VisibleForTesting @NonNull String getDemoUserRotationPackage() { return SystemProperties.get("persist.demo.userrotation.package_name"); } @Surface.Rotation private int getUserRotationOverride() { final int userRotationOverride = SystemProperties.getInt("persist.demo.userrotation", Surface.ROTATION_0); final int userRotationOverride = getDemoUserRotationOverride(); if (userRotationOverride == Surface.ROTATION_0) { return userRotationOverride; } final var display = mDisplayContent.mDisplay; final var display = mDisplayContent.getDisplay(); if (display.getType() == TYPE_EXTERNAL || display.getType() == TYPE_OVERLAY) { // TODO b/329442350 add chromecast virtual displays here return userRotationOverride; } if (display.getType() == TYPE_VIRTUAL) { final var packageName = getDemoUserRotationPackage(); if (!packageName.isEmpty() && packageName.equals(display.getOwnerPackageName())) { return userRotationOverride; } } return Surface.ROTATION_0; } Loading
services/tests/wmtests/src/com/android/server/wm/DisplayRotationTests.java +76 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq; import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.reset; import static com.android.dx.mockito.inline.extended.ExtendedMockito.same; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; Loading Loading @@ -66,6 +67,7 @@ import android.os.PowerManagerInternal; import android.os.SystemClock; import android.platform.test.annotations.Presubmit; import android.provider.Settings; import android.view.Display; import android.view.DisplayAddress; import android.view.IRotationWatcher; import android.view.Surface; Loading Loading @@ -216,6 +218,79 @@ public class DisplayRotationTests { WindowManagerPolicy.USER_ROTATION_LOCKED, Surface.ROTATION_180); } @Test public void testUserRotationSystemProperty_NonDefault_InternalDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_INTERNAL); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(Surface.ROTATION_270, mTarget.getUserRotation()); assertEquals(WindowManagerPolicy.USER_ROTATION_FREE, mTarget.getUserRotationMode()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testUserRotationSystemProperty_NonDefault_ExternalDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_EXTERNAL); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotationMode()); assertEquals(Surface.ROTATION_90, mTarget.getUserRotation()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testUserRotationSystemProperty_NonDefault_OverlayDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_OVERLAY); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotationMode()); assertEquals(Surface.ROTATION_90, mTarget.getUserRotation()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testUserRotationSystemProperty_NonDefault_VirtualDisplay() throws Exception { mBuilder.setIsDefaultDisplay(false).build(); when(mMockDisplayContent.getDisplay().getType()).thenReturn(Display.TYPE_VIRTUAL); final var packageName = "abc"; when(mMockDisplayContent.getDisplay().getOwnerPackageName()).thenReturn(packageName); spyOn(mTarget); when(mTarget.getDemoUserRotationOverride()).thenReturn(Surface.ROTATION_90); // Without package name when(mTarget.getDemoUserRotationPackage()).thenReturn(""); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_FREE, mTarget.getUserRotationMode()); assertEquals(Surface.ROTATION_270, mTarget.getUserRotation()); assertEquals(0, mTarget.getFixedToUserRotationMode()); // Use package name when(mTarget.getDemoUserRotationPackage()).thenReturn(packageName); mTarget.restoreSettings(WindowManagerPolicy.USER_ROTATION_FREE, Surface.ROTATION_270, /*fixedToUserRotation=*/ 0); assertEquals(WindowManagerPolicy.USER_ROTATION_LOCKED, mTarget.getUserRotation()); assertEquals(Surface.ROTATION_90, mTarget.getUserRotationMode()); assertEquals(0, mTarget.getFixedToUserRotationMode()); } @Test public void testPersistUserRotation_UnlockRotation_DefaultDisplay() throws Exception { mBuilder.build(); Loading Loading @@ -1450,6 +1525,7 @@ public class DisplayRotationTests { mMockContext = mock(Context.class); mMockDisplayContent = mock(DisplayContent.class); when(mMockDisplayContent.getDisplay()).thenReturn(mock(Display.class)); mMockDisplayContent.isDefaultDisplay = mIsDefaultDisplay; when(mMockDisplayContent.calculateDisplayCutoutForRotation(anyInt())) .thenReturn(NO_CUTOUT); Loading