diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 630b9e1394565233336550187b191f7225f08b7f..b5e5d848c75c3cf013b41554385ffa5978c2aaa6 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2767,10 +2767,7 @@ class ActivityStarter { } } - // If the target task is not in the front, then we need to bring it to the front... - // except... well, with SINGLE_TASK_LAUNCH it's not entirely clear. We'd like to have - // the same behavior as if a new instance was being started, which means not bringing it - // to the front if the caller is not itself in the front. + // If the target task is not in the front, then we need to bring it to the front. final boolean differentTopTask; if (mTargetRootTask.getDisplayArea() == mPreferredTaskDisplayArea) { final Task focusRootTask = mTargetRootTask.mDisplayContent.getFocusedRootTask(); @@ -2787,49 +2784,47 @@ class ActivityStarter { if (differentTopTask && !avoidMoveToFront()) { mStartActivity.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); - if (mSourceRecord == null || inTopNonFinishingTask(mSourceRecord)) { - // We really do want to push this one into the user's face, right now. - if (mLaunchTaskBehind && mSourceRecord != null) { - intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask()); + // We really do want to push this one into the user's face, right now. + if (mLaunchTaskBehind && mSourceRecord != null) { + intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask()); + } + + if (intentActivity.isDescendantOf(mTargetRootTask)) { + // TODO(b/151572268): Figure out a better way to move tasks in above 2-levels + // tasks hierarchies. + if (mTargetRootTask != intentTask + && mTargetRootTask != intentTask.getParent().asTask()) { + intentTask.getParent().positionChildAt(POSITION_TOP, intentTask, + false /* includingParents */); + intentTask = intentTask.getParent().asTaskFragment().getTask(); } - - if (intentActivity.isDescendantOf(mTargetRootTask)) { - // TODO(b/151572268): Figure out a better way to move tasks in above 2-levels - // tasks hierarchies. - if (mTargetRootTask != intentTask - && mTargetRootTask != intentTask.getParent().asTask()) { - intentTask.getParent().positionChildAt(POSITION_TOP, intentTask, - false /* includingParents */); - intentTask = intentTask.getParent().asTaskFragment().getTask(); - } - // If the activity is visible in multi-windowing mode, it may already be on - // the top (visible to user but not the global top), then the result code - // should be START_DELIVERED_TO_TOP instead of START_TASK_TO_FRONT. - final boolean wasTopOfVisibleRootTask = intentActivity.isVisibleRequested() - && intentActivity.inMultiWindowMode() - && intentActivity == mTargetRootTask.topRunningActivity() - && !intentActivity.mTransitionController.isTransientHide( - mTargetRootTask); - // We only want to move to the front, if we aren't going to launch on a - // different root task. If we launch on a different root task, we will put the - // task on top there. - // Defer resuming the top activity while moving task to top, since the - // current task-top activity may not be the activity that should be resumed. - mTargetRootTask.moveTaskToFront(intentTask, mNoAnimation, mOptions, - mStartActivity.appTimeTracker, DEFER_RESUME, - "bringingFoundTaskToFront"); - mMovedToFront = !wasTopOfVisibleRootTask; - } else if (intentActivity.getWindowingMode() != WINDOWING_MODE_PINNED) { - // Leaves reparenting pinned task operations to task organizer to make sure it - // dismisses pinned task properly. - // TODO(b/199997762): Consider leaving all reparent operation of organized tasks - // to task organizer. - intentTask.reparent(mTargetRootTask, ON_TOP, REPARENT_MOVE_ROOT_TASK_TO_FRONT, - ANIMATE, DEFER_RESUME, "reparentToTargetRootTask"); - mMovedToFront = true; - } - mOptions = null; - } + // If the activity is visible in multi-windowing mode, it may already be on + // the top (visible to user but not the global top), then the result code + // should be START_DELIVERED_TO_TOP instead of START_TASK_TO_FRONT. + final boolean wasTopOfVisibleRootTask = intentActivity.isVisibleRequested() + && intentActivity.inMultiWindowMode() + && intentActivity == mTargetRootTask.topRunningActivity() + && !intentActivity.mTransitionController.isTransientHide( + mTargetRootTask); + // We only want to move to the front, if we aren't going to launch on a + // different root task. If we launch on a different root task, we will put the + // task on top there. + // Defer resuming the top activity while moving task to top, since the + // current task-top activity may not be the activity that should be resumed. + mTargetRootTask.moveTaskToFront(intentTask, mNoAnimation, mOptions, + mStartActivity.appTimeTracker, DEFER_RESUME, + "bringingFoundTaskToFront"); + mMovedToFront = !wasTopOfVisibleRootTask; + } else if (intentActivity.getWindowingMode() != WINDOWING_MODE_PINNED) { + // Leaves reparenting pinned task operations to task organizer to make sure it + // dismisses pinned task properly. + // TODO(b/199997762): Consider leaving all reparent operation of organized tasks + // to task organizer. + intentTask.reparent(mTargetRootTask, ON_TOP, REPARENT_MOVE_ROOT_TASK_TO_FRONT, + ANIMATE, DEFER_RESUME, "reparentToTargetRootTask"); + mMovedToFront = true; + } + mOptions = null; } if (differentTopTask) { logPIOnlyCreatorAllowsBAL(); @@ -2850,20 +2845,6 @@ class ActivityStarter { mRootWindowContainer.getDefaultTaskDisplayArea(), mTargetRootTask); } - private boolean inTopNonFinishingTask(ActivityRecord r) { - if (r == null || r.getTask() == null) { - return false; - } - - final Task rTask = r.getTask(); - final Task parent = rTask.getCreatedByOrganizerTask() != null - ? rTask.getCreatedByOrganizerTask() : r.getRootTask(); - final ActivityRecord topNonFinishingActivity = parent != null - ? parent.getTopNonFinishingActivity() : null; - - return topNonFinishingActivity != null && topNonFinishingActivity.getTask() == rTask; - } - private void resumeTargetRootTaskIfNeeded() { if (mDoResume) { final ActivityRecord next = mTargetRootTask.topRunningActivity(