Loading services/core/java/com/android/server/wm/DisplayContent.java +9 −0 Original line number Diff line number Diff line Loading @@ -1496,6 +1496,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // intermediate orientation change, it is more stable to freeze the display. return false; } if (r.isState(RESUMED) && !r.getRootTask().mInResumeTopActivity) { // If the activity is executing or has done the lifecycle callback, use normal // rotation animation so the display info can be updated immediately (see // updateDisplayAndOrientation). This prevents a compatibility issue such as // calling setRequestedOrientation in Activity#onCreate and then get display info. // If fixed rotation is applied, the display rotation will still be the old one, // unless the client side gets the rotation again after the adjustments arrive. return false; } } else if (r != topRunningActivity()) { // If the transition has not started yet, the activity must be the top. return false; Loading services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -1275,6 +1275,27 @@ public class DisplayContentTests extends WindowTestsBase { assertTrue(displayContent.getPinnedStackController().isPipActiveOrWindowingModeChanging()); } @Test public void testNoFixedRotationOnResumedScheduledApp() { final ActivityRecord app = new ActivityTestsBase.StackBuilder(mWm.mRoot) .setDisplay(mDisplayContent).build().getTopMostActivity(); app.setVisible(false); app.setState(ActivityStack.ActivityState.RESUMED, "test"); mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */); mDisplayContent.mOpeningApps.add(app); final int newOrientation = getRotatedOrientation(mDisplayContent); app.setRequestedOrientation(newOrientation); // The condition should reject using fixed rotation because the resumed client in real case // might get display info immediately. And the fixed rotation adjustments haven't arrived // client side so the info may be inconsistent with the requested orientation. verify(mDisplayContent).handleTopActivityLaunchingInDifferentOrientation(eq(app), eq(true) /* checkOpening */); assertFalse(app.isFixedRotationTransforming()); assertFalse(mDisplayContent.hasTopFixedRotationLaunchingApp()); } @Test public void testRecentsNotRotatingWithFixedRotation() { final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation(); Loading Loading
services/core/java/com/android/server/wm/DisplayContent.java +9 −0 Original line number Diff line number Diff line Loading @@ -1496,6 +1496,15 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // intermediate orientation change, it is more stable to freeze the display. return false; } if (r.isState(RESUMED) && !r.getRootTask().mInResumeTopActivity) { // If the activity is executing or has done the lifecycle callback, use normal // rotation animation so the display info can be updated immediately (see // updateDisplayAndOrientation). This prevents a compatibility issue such as // calling setRequestedOrientation in Activity#onCreate and then get display info. // If fixed rotation is applied, the display rotation will still be the old one, // unless the client side gets the rotation again after the adjustments arrive. return false; } } else if (r != topRunningActivity()) { // If the transition has not started yet, the activity must be the top. return false; Loading
services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +21 −0 Original line number Diff line number Diff line Loading @@ -1275,6 +1275,27 @@ public class DisplayContentTests extends WindowTestsBase { assertTrue(displayContent.getPinnedStackController().isPipActiveOrWindowingModeChanging()); } @Test public void testNoFixedRotationOnResumedScheduledApp() { final ActivityRecord app = new ActivityTestsBase.StackBuilder(mWm.mRoot) .setDisplay(mDisplayContent).build().getTopMostActivity(); app.setVisible(false); app.setState(ActivityStack.ActivityState.RESUMED, "test"); mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */); mDisplayContent.mOpeningApps.add(app); final int newOrientation = getRotatedOrientation(mDisplayContent); app.setRequestedOrientation(newOrientation); // The condition should reject using fixed rotation because the resumed client in real case // might get display info immediately. And the fixed rotation adjustments haven't arrived // client side so the info may be inconsistent with the requested orientation. verify(mDisplayContent).handleTopActivityLaunchingInDifferentOrientation(eq(app), eq(true) /* checkOpening */); assertFalse(app.isFixedRotationTransforming()); assertFalse(mDisplayContent.hasTopFixedRotationLaunchingApp()); } @Test public void testRecentsNotRotatingWithFixedRotation() { final DisplayRotation displayRotation = mDisplayContent.getDisplayRotation(); Loading