diff options
| author | 2021-09-01 03:10:17 +0800 | |
|---|---|---|
| committer | 2021-09-15 15:12:41 +0800 | |
| commit | 98d61854ef1cc4a4748cd1d62b7fc01d8420ee58 (patch) | |
| tree | d7c8ea5567177ab9cb09351cf3303c84cc706a1d | |
| parent | 3d7ad43140cfbd71f780950e19606306910126e6 (diff) | |
Fixes some issues for embedded Task
1. Don't compute minimum dimensions for embeddedTask in TaskFragment
2. Consider TaskFragment containing ActivityRecord and embedded Task in
Task#getTopResumed(Pausing)Activity
3. Add support to start Activity on top of existing embedded Task in
TaskFragment
Test: SplitActivityLifecycleTest
Bug: 192442647
Change-Id: I8c0988e5070053c6a3b336184aa0a9ebd79adfda
3 files changed, 64 insertions, 25 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 3b43e48a53af..d1f50f3e5b78 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2778,7 +2778,9 @@ class ActivityStarter { // request. If the task was resolved and different than mInTaskFragment, reparent the // task to mInTaskFragment for embedding. if (mInTaskFragment.getTask() != task) { - task.reparent(mInTaskFragment, POSITION_TOP); + if (shouldReparentInTaskFragment(task)) { + task.reparent(mInTaskFragment, POSITION_TOP); + } } else { newParent = mInTaskFragment; } @@ -2797,6 +2799,18 @@ class ActivityStarter { } } + private boolean shouldReparentInTaskFragment(Task task) { + // The task has not been embedded. We should reparent the task to TaskFragment. + if (!task.isEmbedded()) { + return true; + } + WindowContainer<?> parent = task.getParent(); + // If the Activity is going to launch on top of embedded Task in the same TaskFragment, + // we don't need to reparent the Task. Otherwise, the embedded Task should reparent to + // another TaskFragment. + return parent.asTaskFragment() != mInTaskFragment; + } + private int adjustLaunchFlagsToDocumentMode(ActivityRecord r, boolean launchSingleInstance, boolean launchSingleTask, int launchFlags) { if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 424a5aa98afd..ef3065e2f1e8 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1226,7 +1226,7 @@ class Task extends TaskFragment { mRootWindowContainer.updateUIDsPresentOnDisplay(); } - /** Returns the currently topmost resumed activity. */ + @Override @Nullable ActivityRecord getTopResumedActivity() { if (!isLeafTask()) { @@ -1243,15 +1243,7 @@ class Task extends TaskFragment { for (int i = mChildren.size() - 1; i >= 0; --i) { final WindowContainer child = mChildren.get(i); if (child.asTaskFragment() != null) { - final ActivityRecord[] resumedActivity = new ActivityRecord[1]; - child.asTaskFragment().forAllLeafTaskFragments(fragment -> { - if (fragment.getResumedActivity() != null) { - resumedActivity[0] = fragment.getResumedActivity(); - return true; - } - return false; - }); - topResumedActivity = resumedActivity[0]; + topResumedActivity = child.asTaskFragment().getTopResumedActivity(); } else if (taskResumedActivity != null && child.asActivityRecord() == taskResumedActivity) { topResumedActivity = taskResumedActivity; @@ -1263,9 +1255,7 @@ class Task extends TaskFragment { return null; } - /** - * Returns the currently topmost pausing activity. - */ + @Override @Nullable ActivityRecord getTopPausingActivity() { if (!isLeafTask()) { @@ -1282,15 +1272,7 @@ class Task extends TaskFragment { for (int i = mChildren.size() - 1; i >= 0; --i) { final WindowContainer child = mChildren.get(i); if (child.asTaskFragment() != null) { - final ActivityRecord[] pausingActivity = new ActivityRecord[1]; - child.asTaskFragment().forAllLeafTaskFragments(fragment -> { - if (fragment.getPausingActivity() != null) { - pausingActivity[0] = fragment.getPausingActivity(); - return true; - } - return false; - }); - topPausingActivity = pausingActivity[0]; + topPausingActivity = child.asTaskFragment().getTopPausingActivity(); } else if (taskPausingActivity != null && child.asActivityRecord() == taskPausingActivity) { topPausingActivity = taskPausingActivity; diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index ca1d83e2bd15..3cebd739d3ee 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -352,7 +352,29 @@ class TaskFragment extends WindowContainer<WindowContainer> { return mAdjacentTaskFragment; } - /** @return the currently resumed activity. */ + /** Returns the currently topmost resumed activity. */ + @Nullable + ActivityRecord getTopResumedActivity() { + final ActivityRecord taskFragResumedActivity = getResumedActivity(); + for (int i = getChildCount() - 1; i >= 0; --i) { + WindowContainer<?> child = getChildAt(i); + ActivityRecord topResumedActivity = null; + if (taskFragResumedActivity != null && child == taskFragResumedActivity) { + topResumedActivity = child.asActivityRecord(); + } else if (child.asTaskFragment() != null) { + topResumedActivity = child.asTaskFragment().getTopResumedActivity(); + } + if (topResumedActivity != null) { + return topResumedActivity; + } + } + return null; + } + + /** + * Returns the currently resumed activity in this TaskFragment's + * {@link #mChildren direct children} + */ ActivityRecord getResumedActivity() { return mResumedActivity; } @@ -376,6 +398,25 @@ class TaskFragment extends WindowContainer<WindowContainer> { mPausingActivity = pausing; } + /** Returns the currently topmost pausing activity. */ + @Nullable + ActivityRecord getTopPausingActivity() { + final ActivityRecord taskFragPausingActivity = getPausingActivity(); + for (int i = getChildCount() - 1; i >= 0; --i) { + WindowContainer<?> child = getChildAt(i); + ActivityRecord topPausingActivity = null; + if (taskFragPausingActivity != null && child == taskFragPausingActivity) { + topPausingActivity = child.asActivityRecord(); + } else if (child.asTaskFragment() != null) { + topPausingActivity = child.asTaskFragment().getTopPausingActivity(); + } + if (topPausingActivity != null) { + return topPausingActivity; + } + } + return null; + } + ActivityRecord getPausingActivity() { return mPausingActivity; } @@ -1673,7 +1714,9 @@ class TaskFragment extends WindowContainer<WindowContainer> { } final Task thisTask = asTask(); - if (thisTask != null) { + // Embedded Task's configuration should go with parent TaskFragment, so we don't re-compute + // configuration here. + if (thisTask != null && !thisTask.isEmbedded()) { thisTask.resolveLeafTaskOnlyOverrideConfigs(newParentConfig, mTmpBounds /* previousBounds */); } |