Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7795d599 authored by Jeff Chang's avatar Jeff Chang
Browse files

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
parent 5ff31f23
Loading
Loading
Loading
Loading
+17 −13
Original line number Diff line number Diff line
@@ -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;
@@ -1540,7 +1540,8 @@ class ActivityStarter {
    private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,
            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
            int startFlags, boolean doResume, ActivityOptions options, Task inTask,
                boolean restrictedBgActivity, NeededUriGrants intentGrants) {
            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
+26 −0
Original line number Diff line number Diff line
@@ -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);