diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index e50aff438ecd7..6fb318640a8cd 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2929,7 +2929,8 @@ class ActivityStarter { final boolean onTop = (aOptions == null || !aOptions.getAvoidMoveToFront()) && !mLaunchTaskBehind; - return mRootWindowContainer.getOrCreateRootTask(r, aOptions, task, mSourceRootTask, onTop, + final Task sourceTask = mSourceRecord != null ? mSourceRecord.getTask() : null; + return mRootWindowContainer.getOrCreateRootTask(r, aOptions, task, sourceTask, onTop, mLaunchParams, launchFlags); } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index f3cefca10b065..731a04500b57a 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -2360,6 +2360,20 @@ class Task extends TaskFragment { return parentTask == null ? null : parentTask.getOrganizedTask(); } + /** @return the first create-by-organizer task. */ + @Nullable + Task getCreatedByOrganizerTask() { + if (mCreatedByOrganizer) { + return this; + } + final WindowContainer parent = getParent(); + if (parent == null) { + return null; + } + final Task parentTask = parent.asTask(); + return parentTask == null ? null : parentTask.getCreatedByOrganizerTask(); + } + // TODO(task-merge): Figure out what's the right thing to do for places that used it. boolean isRootTask() { return getRootTask() == this; diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 7bb7870cea808..7a7bf1f877b93 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1125,9 +1125,9 @@ final class TaskDisplayArea extends DisplayArea { if ((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0 && mLaunchAdjacentFlagRootTask != null) { // If the adjacent launch is coming from the same root, launch to adjacent root instead. - if (sourceTask != null - && sourceTask.getRootTask().mTaskId == mLaunchAdjacentFlagRootTask.mTaskId - && mLaunchAdjacentFlagRootTask.getAdjacentTaskFragment() != null) { + if (sourceTask != null && mLaunchAdjacentFlagRootTask.getAdjacentTaskFragment() != null + && (sourceTask == mLaunchAdjacentFlagRootTask + || sourceTask.isDescendantOf(mLaunchAdjacentFlagRootTask))) { return mLaunchAdjacentFlagRootTask.getAdjacentTaskFragment().asTask(); } else { return mLaunchAdjacentFlagRootTask; @@ -1141,18 +1141,22 @@ final class TaskDisplayArea extends DisplayArea { ? launchRootTask.getAdjacentTaskFragment() : null; final Task adjacentRootTask = adjacentTaskFragment != null ? adjacentTaskFragment.asTask() : null; - if (sourceTask != null && sourceTask.getRootTask() == adjacentRootTask) { + if (sourceTask != null && adjacentRootTask != null + && (sourceTask == adjacentRootTask + || sourceTask.isDescendantOf(adjacentRootTask))) { return adjacentRootTask; } else { return launchRootTask; } } } - // For better split UX, If task launch by the source task which root task is created by - // organizer, it should also launch in that root too. - if (sourceTask != null && sourceTask.getRootTask().mCreatedByOrganizer) { - return sourceTask.getRootTask(); + + // For a better split UX, If a task is launching from a created-by-organizer task, it should + // be launched into the same created-by-organizer task as well. + if (sourceTask != null) { + return sourceTask.getCreatedByOrganizerTask(); } + return null; }