Moves the task to front if it is different from the top task
The activities of the source task was finishing, so the task was not moved to front while recycling the task. That also resulted returning START_DELIVERED_TO_TOP result and aborted the transition. Bug: 305993229 Test: use media projection on app Change-Id: I753deaf89acf6d1d32eebac317954e94d74a3f82
This commit is contained in:
parent
64a6d86287
commit
9ef09c943f
@ -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());
|
||||
}
|
||||
|
||||
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;
|
||||
// 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 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(
|
||||
|
Loading…
x
Reference in New Issue
Block a user