Merge "Consider adjacent launch target when recycling an existing task" into tm-dev
This commit is contained in:
@@ -2732,8 +2732,8 @@ class ActivityStarter {
|
|||||||
intentActivity.getTaskFragment().clearLastPausedActivity();
|
intentActivity.getTaskFragment().clearLastPausedActivity();
|
||||||
Task intentTask = intentActivity.getTask();
|
Task intentTask = intentActivity.getTask();
|
||||||
|
|
||||||
// Only update the target-root-task when it is not indicated.
|
|
||||||
if (mTargetRootTask == null) {
|
if (mTargetRootTask == null) {
|
||||||
|
// Update launch target task when it is not indicated.
|
||||||
if (mSourceRecord != null && mSourceRecord.mLaunchRootTask != null) {
|
if (mSourceRecord != null && mSourceRecord.mLaunchRootTask != null) {
|
||||||
// Inherit the target-root-task from source to ensure trampoline activities will be
|
// Inherit the target-root-task from source to ensure trampoline activities will be
|
||||||
// launched into the same root task.
|
// launched into the same root task.
|
||||||
@@ -2742,6 +2742,17 @@ class ActivityStarter {
|
|||||||
mTargetRootTask = getOrCreateRootTask(mStartActivity, mLaunchFlags, intentTask,
|
mTargetRootTask = getOrCreateRootTask(mStartActivity, mLaunchFlags, intentTask,
|
||||||
mOptions);
|
mOptions);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// If a launch target indicated, and the matching task is already in the adjacent task
|
||||||
|
// of the launch target. Adjust to use the adjacent task as its launch target. So the
|
||||||
|
// existing task will be launched into the closer one and won't be reparent redundantly.
|
||||||
|
// TODO(b/231541706): Migrate the logic to wm-shell after having proper APIs to help
|
||||||
|
// resolve target task without actually starting the activity.
|
||||||
|
final Task adjacentTargetTask = mTargetRootTask.getAdjacentTaskFragment() != null
|
||||||
|
? mTargetRootTask.getAdjacentTaskFragment().asTask() : null;
|
||||||
|
if (adjacentTargetTask != null && intentActivity.isDescendantOf(adjacentTargetTask)) {
|
||||||
|
mTargetRootTask = adjacentTargetTask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the target task is not in the front, then we need to bring it to the front...
|
// If the target task is not in the front, then we need to bring it to the front...
|
||||||
@@ -2771,7 +2782,7 @@ class ActivityStarter {
|
|||||||
intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask());
|
intentActivity.setTaskToAffiliateWith(mSourceRecord.getTask());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTargetRootTask == intentActivity.getRootTask()) {
|
if (intentActivity.isDescendantOf(mTargetRootTask)) {
|
||||||
// TODO(b/151572268): Figure out a better way to move tasks in above 2-levels
|
// TODO(b/151572268): Figure out a better way to move tasks in above 2-levels
|
||||||
// tasks hierarchies.
|
// tasks hierarchies.
|
||||||
if (mTargetRootTask != intentTask
|
if (mTargetRootTask != intentTask
|
||||||
@@ -2818,19 +2829,6 @@ class ActivityStarter {
|
|||||||
mTargetRootTask = intentActivity.getRootTask();
|
mTargetRootTask = intentActivity.getRootTask();
|
||||||
mSupervisor.handleNonResizableTaskIfNeeded(intentTask, WINDOWING_MODE_UNDEFINED,
|
mSupervisor.handleNonResizableTaskIfNeeded(intentTask, WINDOWING_MODE_UNDEFINED,
|
||||||
mRootWindowContainer.getDefaultTaskDisplayArea(), mTargetRootTask);
|
mRootWindowContainer.getDefaultTaskDisplayArea(), mTargetRootTask);
|
||||||
|
|
||||||
// We need to check if there is a launch root task in TDA for this target root task.
|
|
||||||
// If it exist, we need to reparent target root task from TDA to launch root task.
|
|
||||||
final TaskDisplayArea tda = mTargetRootTask.getDisplayArea();
|
|
||||||
final Task launchRootTask = tda.getLaunchRootTask(mTargetRootTask.getWindowingMode(),
|
|
||||||
mTargetRootTask.getActivityType(), null /** options */, mSourceRootTask,
|
|
||||||
mLaunchFlags);
|
|
||||||
// If target root task is created by organizer, let organizer handle reparent itself.
|
|
||||||
if (!mTargetRootTask.mCreatedByOrganizer && launchRootTask != null
|
|
||||||
&& launchRootTask != mTargetRootTask) {
|
|
||||||
mTargetRootTask.reparent(launchRootTask, POSITION_TOP);
|
|
||||||
mTargetRootTask = launchRootTask;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resumeTargetRootTaskIfNeeded() {
|
private void resumeTargetRootTaskIfNeeded() {
|
||||||
|
|||||||
@@ -784,6 +784,34 @@ public class ActivityStarterTests extends WindowTestsBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test ensures that {@link ActivityStarter#setTargetRootTaskIfNeeded} will task the
|
||||||
|
* adjacent task of indicated launch target into account. So the existing task will be launched
|
||||||
|
* into closer target.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testAdjustLaunchTargetWithAdjacentTask() {
|
||||||
|
// Create adjacent tasks and put one activity under it
|
||||||
|
final Task parent = new TaskBuilder(mSupervisor).build();
|
||||||
|
final Task adjacentParent = new TaskBuilder(mSupervisor).build();
|
||||||
|
parent.setAdjacentTaskFragment(adjacentParent, true);
|
||||||
|
final ActivityRecord activity = new ActivityBuilder(mAtm)
|
||||||
|
.setParentTask(parent)
|
||||||
|
.setCreateTask(true).build();
|
||||||
|
|
||||||
|
// Launch the activity to its adjacent parent
|
||||||
|
final ActivityOptions options = ActivityOptions.makeBasic()
|
||||||
|
.setLaunchRootTask(adjacentParent.mRemoteToken.toWindowContainerToken());
|
||||||
|
prepareStarter(FLAG_ACTIVITY_NEW_TASK, false /* mockGetRootTask */)
|
||||||
|
.setReason("testAdjustLaunchTargetWithAdjacentTask")
|
||||||
|
.setIntent(activity.intent)
|
||||||
|
.setActivityOptions(options.toBundle())
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
// Verify the activity will be launched into the original parent
|
||||||
|
assertTrue(activity.isDescendantOf(parent));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test ensures that {@link ActivityStarter#setTargetRootTaskIfNeeded} will
|
* This test ensures that {@link ActivityStarter#setTargetRootTaskIfNeeded} will
|
||||||
* move the existing task to front if the current focused root task doesn't have running task.
|
* move the existing task to front if the current focused root task doesn't have running task.
|
||||||
|
|||||||
Reference in New Issue
Block a user