diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityRecord.java | 14 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java | 13 |
2 files changed, 27 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 647ca9456393..89f29b3b2288 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3643,6 +3643,20 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } finishing = true; + + // Transfer the launch cookie to the next running activity above this in the same task. + if (mLaunchCookie != null && mState != RESUMED && task != null && !task.mInRemoveTask + && !task.isClearingToReuseTask()) { + final ActivityRecord nextCookieTarget = task.getActivity( + // Intend to only associate the same app by checking uid. + r -> r.mLaunchCookie == null && !r.finishing && r.isUid(getUid()), + this, false /* includeBoundary */, false /* traverseTopToBottom */); + if (nextCookieTarget != null) { + nextCookieTarget.mLaunchCookie = mLaunchCookie; + mLaunchCookie = null; + } + } + final TaskFragment taskFragment = getTaskFragment(); if (taskFragment != null) { final Task task = taskFragment.getTask(); 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 a89c5a1fbf1f..40ab8eb70c04 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2217,6 +2217,19 @@ public class ActivityRecordTests extends WindowTestsBase { assertTrue(activity.pictureInPictureArgs.isLaunchIntoPip()); } + @Test + public void testTransferLaunchCookieWhenFinishing() { + final ActivityRecord activity1 = createActivityWithTask(); + final Binder launchCookie = new Binder(); + activity1.mLaunchCookie = launchCookie; + final ActivityRecord activity2 = createActivityRecord(activity1.getTask()); + activity1.setState(PAUSED, "test"); + activity1.makeFinishingLocked(); + + assertEquals(launchCookie, activity2.mLaunchCookie); + assertNull(activity1.mLaunchCookie); + } + private void verifyProcessInfoUpdate(ActivityRecord activity, State state, boolean shouldUpdate, boolean activityChange) { reset(activity.app); |