diff options
| author | 2020-06-24 10:03:41 +0000 | |
|---|---|---|
| committer | 2020-06-24 10:03:41 +0000 | |
| commit | e99df6dbec822db6321340a35c8fabc289c4e320 (patch) | |
| tree | 35f2bde7385a9763fcf2d721cd5dfb2f0d8998ec | |
| parent | 18905eb623ee5b30c1538a0add0ee1aec33df4be (diff) | |
| parent | 7b5b8cfbcf77b06c12e741e246aaa521bdb89d9d (diff) | |
Merge "Use rotation animation for orientation change of non-occluded activity" into rvc-dev
5 files changed, 28 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 9b5d94ebb1ac..afe40b8d8016 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1185,6 +1185,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } activity.onRemovedFromDisplay(); + if (activity == mFixedRotationLaunchingApp) { + setFixedRotationLaunchingAppUnchecked(null); + } } @Override @@ -1468,6 +1471,12 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // It has been set and not yet finished. 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 (!mAppTransition.isTransitionSet() || !mOpeningApps.contains(r)) { // 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) { 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); if (r.hasFixedRotationTransform()) { // Set the record so we can recognize it to continue to update display orientation diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 2171d75256f2..668f04785bbc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1506,6 +1506,7 @@ public class ActivityRecordTests extends ActivityTestsBase { .setRotation((mActivity.getWindowConfiguration().getRotation() + 1) % 4) .build(); setRotatedScreenOrientationSilently(mActivity); + mActivity.setVisible(false); final IWindowSession session = WindowManagerGlobal.getWindowSession(); spyOn(session); diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java index 4dbf79a4a5a6..1d13788bc523 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java @@ -456,6 +456,7 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test public void testTransferStartingWindowSetFixedRotation() { final ActivityRecord topActivity = createTestActivityRecordForGivenTask(mTask); + topActivity.setVisible(false); mTask.positionChildAt(topActivity, POSITION_TOP); mActivity.addStartingWindow(mPackageName, android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 689674011d30..105af4fce394 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -1081,6 +1081,7 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.onRequestedOverrideConfigurationChanged(config); final ActivityRecord app = mAppWindow.mActivityRecord; + app.setVisible(false); mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */); mDisplayContent.mOpeningApps.add(app); @@ -1135,6 +1136,7 @@ public class DisplayContentTests extends WindowTestsBase { // Launch another activity before the transition is finished. final ActivityRecord app2 = new ActivityTestsBase.StackBuilder(mWm.mRoot) .setDisplay(mDisplayContent).build().getTopMostActivity(); + app2.setVisible(false); mDisplayContent.mOpeningApps.add(app2); app2.setRequestedOrientation(newOrientation); @@ -1277,6 +1279,14 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.setFixedRotationLaunchingAppUnchecked(mAppWindow.mActivityRecord); displayRotation.setRotation((displayRotation.getRotation() + 1) % 4); 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 diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 130e5550b2a2..3c98272311f7 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -517,6 +517,7 @@ public class SizeCompatTests extends ActivityTestsBase { setUpApp(new TestDisplayContent.Builder(mService, dw, dh).setNotch(notchHeight).build()); addStatusBar(mActivity.mDisplayContent); + mActivity.setVisible(false); mActivity.mDisplayContent.prepareAppTransition(WindowManager.TRANSIT_ACTIVITY_OPEN, false /* alwaysKeepCurrent */); mActivity.mDisplayContent.mOpeningApps.add(mActivity); |