Merge "Use normal rotation if orientation is changed by resume-scheduled app" into rvc-qpr-dev am: 75a288bf07

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12735136

Change-Id: I90985605c563686b09b332f5928a18f0b3d67699
This commit is contained in:
TreeHugger Robot
2020-10-02 02:41:33 +00:00
committed by Automerger Merge Worker
2 changed files with 30 additions and 0 deletions

View File

@@ -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;

View File

@@ -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();