diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 20ed0c6d625db..7e1a4e76f9a26 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1606,9 +1606,15 @@ class Task extends TaskFragment { } else { forAllActivities((r) -> { if (r.finishing) return; - // TODO: figure-out how to avoid object creation due to capture of reason variable. - r.finishIfPossible(Activity.RESULT_CANCELED, - null /* resultData */, null /* resultGrants */, reason, false /* oomAdj */); + // Prevent the transition from being executed too early if the top activity is + // resumed but the mVisibleRequested of any other activity is true, the transition + // should wait until next activity resumed. + if (r.isState(RESUMED) || (r.isVisible() + && !mDisplayContent.mAppTransition.containsTransitRequest(TRANSIT_CLOSE))) { + r.finishIfPossible(reason, false /* oomAdj */); + } else { + r.destroyIfPossible(reason); + } }); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java index 53bae4156d6bf..0d0cec7f5dce1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java @@ -102,6 +102,20 @@ public class AppTransitionControllerTest extends WindowTestsBase { mDisplayContent.mChangingContainers, null, null, false)); } + @Test + public void testClearTaskSkipAppExecuteTransition() { + final ActivityRecord behind = createActivityRecord(mDisplayContent, + WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD); + final Task task = behind.getTask(); + final ActivityRecord top = createActivityRecord(task); + top.setState(ActivityRecord.State.RESUMED, "test"); + behind.setState(ActivityRecord.State.STARTED, "test"); + behind.mVisibleRequested = true; + + task.performClearTask("test"); + assertFalse(mDisplayContent.mAppTransition.isReady()); + } + @Test public void testTranslucentOpen() { final ActivityRecord behind = createActivityRecord(mDisplayContent,