diff options
3 files changed, 44 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 2bae59a93048..b61af2f9febe 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -1197,7 +1197,10 @@ public class RecentsAnimationController implements DeathRecipient { * this is the target task, CLOSING otherwise). */ RemoteAnimationTarget createRemoteAnimationTarget(int overrideTaskId, int overrideMode) { - final ActivityRecord topApp = mTask.getTopVisibleActivity(); + ActivityRecord topApp = mTask.getTopRealVisibleActivity(); + if (topApp == null) { + topApp = mTask.getTopVisibleActivity(); + } final WindowState mainWindow = topApp != null ? topApp.findMainWindow() : null; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 60c280cb61f9..7ad53f96a80e 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3070,11 +3070,22 @@ class Task extends TaskFragment { }); } + /** + * Return the top visible requested activity. The activity has been requested to be visible, + * but it's possible that the activity has just been created, so no window is yet attached to + * this activity. + */ ActivityRecord getTopVisibleActivity() { - return getActivity((r) -> { - // skip hidden (or about to hide) apps - return !r.mIsExiting && r.isClientVisible() && r.mVisibleRequested; - }); + return getActivity((r) -> !r.mIsExiting && r.isClientVisible() && r.mVisibleRequested); + } + + /** + * Return the top visible activity. The activity has a window on which contents are drawn. + * However it's possible that the activity has already been requested to be invisible, but the + * visibility is not yet committed. + */ + ActivityRecord getTopRealVisibleActivity() { + return getActivity((r) -> !r.mIsExiting && r.isClientVisible() && r.isVisible()); } ActivityRecord getTopWaitSplashScreenActivity() { diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index 021568dd97b4..eba276f99225 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -61,6 +61,7 @@ import android.platform.test.annotations.Presubmit; import android.util.SparseBooleanArray; import android.view.IRecentsAnimationRunner; import android.view.SurfaceControl; +import android.view.WindowManager.LayoutParams; import android.window.TaskSnapshot; import androidx.test.filters.SmallTest; @@ -162,6 +163,30 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { } @Test + public void testLaunchAndStartRecents_expectTargetAndVisible() throws Exception { + mWm.setRecentsAnimationController(mController); + final ActivityRecord homeActivity = createHomeActivity(); + final Task task = createTask(mDefaultDisplay); + // Emulate that activity1 has just launched activity2, but app transition has not yet been + // executed. + final ActivityRecord activity1 = createActivityRecord(task); + activity1.setVisible(true); + activity1.mVisibleRequested = false; + activity1.addWindow(createWindowState(new LayoutParams(TYPE_BASE_APPLICATION), activity1)); + + final ActivityRecord activity2 = createActivityRecord(task); + activity2.setVisible(false); + activity2.mVisibleRequested = true; + + mDefaultDisplay.getConfiguration().windowConfiguration.setRotation( + mDefaultDisplay.getRotation()); + initializeRecentsAnimationController(mController, homeActivity); + mController.startAnimation(); + verify(mMockRunner, never()).onAnimationCanceled(null /* taskIds */, + null /* taskSnapshots */); + } + + @Test public void testWallpaperIncluded_expectTarget() throws Exception { mWm.setRecentsAnimationController(mController); final ActivityRecord homeActivity = createHomeActivity(); |