summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java14
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java13
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);