Merge "Use rotation animation for orientation change of non-occluded activity" into rvc-dev

This commit is contained in:
Riddle Hsu
2020-06-24 10:03:41 +00:00
committed by Android (Google) Code Review
5 changed files with 28 additions and 0 deletions

View File

@@ -1185,6 +1185,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
} }
activity.onRemovedFromDisplay(); activity.onRemovedFromDisplay();
if (activity == mFixedRotationLaunchingApp) {
setFixedRotationLaunchingAppUnchecked(null);
}
} }
@Override @Override
@@ -1468,6 +1471,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
// It has been set and not yet finished. // It has been set and not yet finished.
return true; return true;
} }
if (!r.occludesParent() || r.isVisible()) {
// While entering or leaving a translucent or floating activity (e.g. dialog style),
// there is a visible activity in the background. Then it still needs rotation animation
// to cover the activity configuration change.
return false;
}
if (checkOpening) { if (checkOpening) {
if (!mAppTransition.isTransitionSet() || !mOpeningApps.contains(r)) { if (!mAppTransition.isTransitionSet() || !mOpeningApps.contains(r)) {
// Apply normal rotation animation in case of the activity set different requested // Apply normal rotation animation in case of the activity set different requested
@@ -5636,6 +5645,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
*/ */
void onStartRecentsAnimation(@NonNull ActivityRecord r) { void onStartRecentsAnimation(@NonNull ActivityRecord r) {
mAnimatingRecents = r; mAnimatingRecents = r;
if (r.isVisible() && mFocusedApp != null && !mFocusedApp.occludesParent()) {
// The recents activity has shown with the orientation determined by the top
// activity, keep its current orientation to avoid flicking by the configuration
// change of visible activity.
return;
}
rotateInDifferentOrientationIfNeeded(r); rotateInDifferentOrientationIfNeeded(r);
if (r.hasFixedRotationTransform()) { if (r.hasFixedRotationTransform()) {
// Set the record so we can recognize it to continue to update display orientation // Set the record so we can recognize it to continue to update display orientation

View File

@@ -1506,6 +1506,7 @@ public class ActivityRecordTests extends ActivityTestsBase {
.setRotation((mActivity.getWindowConfiguration().getRotation() + 1) % 4) .setRotation((mActivity.getWindowConfiguration().getRotation() + 1) % 4)
.build(); .build();
setRotatedScreenOrientationSilently(mActivity); setRotatedScreenOrientationSilently(mActivity);
mActivity.setVisible(false);
final IWindowSession session = WindowManagerGlobal.getWindowSession(); final IWindowSession session = WindowManagerGlobal.getWindowSession();
spyOn(session); spyOn(session);

View File

@@ -456,6 +456,7 @@ public class AppWindowTokenTests extends WindowTestsBase {
@Test @Test
public void testTransferStartingWindowSetFixedRotation() { public void testTransferStartingWindowSetFixedRotation() {
final ActivityRecord topActivity = createTestActivityRecordForGivenTask(mTask); final ActivityRecord topActivity = createTestActivityRecordForGivenTask(mTask);
topActivity.setVisible(false);
mTask.positionChildAt(topActivity, POSITION_TOP); mTask.positionChildAt(topActivity, POSITION_TOP);
mActivity.addStartingWindow(mPackageName, mActivity.addStartingWindow(mPackageName,
android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true,

View File

@@ -1081,6 +1081,7 @@ public class DisplayContentTests extends WindowTestsBase {
mDisplayContent.onRequestedOverrideConfigurationChanged(config); mDisplayContent.onRequestedOverrideConfigurationChanged(config);
final ActivityRecord app = mAppWindow.mActivityRecord; final ActivityRecord app = mAppWindow.mActivityRecord;
app.setVisible(false);
mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN,
false /* alwaysKeepCurrent */); false /* alwaysKeepCurrent */);
mDisplayContent.mOpeningApps.add(app); mDisplayContent.mOpeningApps.add(app);
@@ -1135,6 +1136,7 @@ public class DisplayContentTests extends WindowTestsBase {
// Launch another activity before the transition is finished. // Launch another activity before the transition is finished.
final ActivityRecord app2 = new ActivityTestsBase.StackBuilder(mWm.mRoot) final ActivityRecord app2 = new ActivityTestsBase.StackBuilder(mWm.mRoot)
.setDisplay(mDisplayContent).build().getTopMostActivity(); .setDisplay(mDisplayContent).build().getTopMostActivity();
app2.setVisible(false);
mDisplayContent.mOpeningApps.add(app2); mDisplayContent.mOpeningApps.add(app2);
app2.setRequestedOrientation(newOrientation); app2.setRequestedOrientation(newOrientation);
@@ -1277,6 +1279,14 @@ public class DisplayContentTests extends WindowTestsBase {
mDisplayContent.setFixedRotationLaunchingAppUnchecked(mAppWindow.mActivityRecord); mDisplayContent.setFixedRotationLaunchingAppUnchecked(mAppWindow.mActivityRecord);
displayRotation.setRotation((displayRotation.getRotation() + 1) % 4); displayRotation.setRotation((displayRotation.getRotation() + 1) % 4);
assertTrue(displayRotation.updateRotationUnchecked(false)); assertTrue(displayRotation.updateRotationUnchecked(false));
// The recents activity should not apply fixed rotation if the top activity is not opaque.
mDisplayContent.mFocusedApp = mAppWindow.mActivityRecord;
doReturn(false).when(mDisplayContent.mFocusedApp).occludesParent();
doReturn(ROTATION_90).when(mDisplayContent).rotationForActivityInDifferentOrientation(
eq(recentsActivity));
mDisplayContent.mFixedRotationTransitionListener.onStartRecentsAnimation(recentsActivity);
assertFalse(recentsActivity.hasFixedRotationTransform());
} }
@Test @Test

View File

@@ -517,6 +517,7 @@ public class SizeCompatTests extends ActivityTestsBase {
setUpApp(new TestDisplayContent.Builder(mService, dw, dh).setNotch(notchHeight).build()); setUpApp(new TestDisplayContent.Builder(mService, dw, dh).setNotch(notchHeight).build());
addStatusBar(mActivity.mDisplayContent); addStatusBar(mActivity.mDisplayContent);
mActivity.setVisible(false);
mActivity.mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, mActivity.mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN,
false /* alwaysKeepCurrent */); false /* alwaysKeepCurrent */);
mActivity.mDisplayContent.mOpeningApps.add(mActivity); mActivity.mDisplayContent.mOpeningApps.add(mActivity);