From 7795d599c8818d425dc2836b878c941804091903 Mon Sep 17 00:00:00 2001 From: Jeff Chang Date: Fri, 9 Jul 2021 19:12:13 +0800 Subject: [PATCH] Fix the target TaskFragment lost in ActivityStarter TaskFragment is reset during setInitialState. This CL pass the taskFragment from the activity start request to startActivityInner when launch activity in taskFragment. Bug: 193193958 Test: testStartActivityInner_inTaskFragment Change-Id: I12fe8204e82626c83e2c17bc385220aba59bee49 --- .../android/server/wm/ActivityStarter.java | 30 +++++++++++-------- .../server/wm/ActivityStarterTests.java | 26 ++++++++++++++++ 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 10c1f6b252096..9954693275338 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -840,7 +840,7 @@ class ActivityStarter { final int startFlags = request.startFlags; final SafeActivityOptions options = request.activityOptions; Task inTask = request.inTask; - mInTaskFragment = request.inTaskFragment; + TaskFragment inTaskFragment = request.inTaskFragment; int err = ActivityManager.START_SUCCESS; // Pull the optional Ephemeral Installer-only bundle out of the options early. @@ -1181,8 +1181,8 @@ class ActivityStarter { } mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession, - request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask, - restrictedBgActivity, intentGrants); + request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, + inTask, inTaskFragment, restrictedBgActivity, intentGrants); if (request.outActivity != null) { request.outActivity[0] = mLastStartActivityRecord; @@ -1538,9 +1538,10 @@ class ActivityStarter { * Here also ensures that the starting activity is removed if the start wasn't successful. */ private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, - IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - int startFlags, boolean doResume, ActivityOptions options, Task inTask, - boolean restrictedBgActivity, NeededUriGrants intentGrants) { + IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, + int startFlags, boolean doResume, ActivityOptions options, Task inTask, + TaskFragment inTaskFragment, boolean restrictedBgActivity, + NeededUriGrants intentGrants) { int result = START_CANCELED; final Task startedActivityRootTask; @@ -1565,7 +1566,8 @@ class ActivityStarter { mService.deferWindowLayout(); Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "startActivityInner"); result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor, - startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants); + startFlags, doResume, options, inTask, inTaskFragment, restrictedBgActivity, + intentGrants); } finally { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); startedActivityRootTask = handleStartResult(r, result); @@ -1668,9 +1670,10 @@ class ActivityStarter { int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, Task inTask, - boolean restrictedBgActivity, NeededUriGrants intentGrants) { - setInitialState(r, options, inTask, doResume, startFlags, sourceRecord, voiceSession, - voiceInteractor, restrictedBgActivity); + TaskFragment inTaskFragment, boolean restrictedBgActivity, + NeededUriGrants intentGrants) { + setInitialState(r, options, inTask, inTaskFragment, doResume, startFlags, sourceRecord, + voiceSession, voiceInteractor, restrictedBgActivity); computeLaunchingTaskFlags(); @@ -2238,9 +2241,9 @@ class ActivityStarter { } private void setInitialState(ActivityRecord r, ActivityOptions options, Task inTask, - boolean doResume, int startFlags, ActivityRecord sourceRecord, - IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, - boolean restrictedBgActivity) { + TaskFragment inTaskFragment, boolean doResume, int startFlags, + ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, + IVoiceInteractor voiceInteractor, boolean restrictedBgActivity) { reset(false /* clearRequest */); mStartActivity = r; @@ -2343,6 +2346,7 @@ class ActivityStarter { Slog.w(TAG, "Starting activity in task not in recents: " + inTask); mInTask = null; } + mInTaskFragment = inTaskFragment; mStartFlags = startFlags; // If the onlyIfNeeded flag is set, then we can do this if the activity being launched diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index 0a36af2d586ac..b7648e1c6870f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -1135,6 +1135,7 @@ public class ActivityStarterTests extends WindowTestsBase { /* doResume */true, /* options */null, /* inTask */null, + /* inTaskFragment */ null, /* restrictedBgActivity */false, /* intentGrants */null); @@ -1144,6 +1145,31 @@ public class ActivityStarterTests extends WindowTestsBase { assertTrue(targetRecord.mVisibleRequested); } + @Test + public void testStartActivityInner_inTaskFragment() { + final ActivityStarter starter = prepareStarter(0, false); + final ActivityRecord targetRecord = new ActivityBuilder(mAtm).build(); + final ActivityRecord sourceRecord = new ActivityBuilder(mAtm).setCreateTask(true).build(); + final TaskFragment taskFragment = new TaskFragment(mAtm, sourceRecord.token, + true /* createdByOrganizer */); + sourceRecord.getTask().addChild(taskFragment, POSITION_TOP); + + starter.startActivityInner( + /* r */targetRecord, + /* sourceRecord */ sourceRecord, + /* voiceSession */null, + /* voiceInteractor */ null, + /* startFlags */ 0, + /* doResume */true, + /* options */null, + /* inTask */null, + /* inTaskFragment */ taskFragment, + /* restrictedBgActivity */false, + /* intentGrants */null); + + assertTrue(taskFragment.hasChild()); + } + @Test public void testLaunchCookie_newAndExistingTask() { final ActivityStarter starter = prepareStarter(0, false);