diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 3b25f2876de4e..8d94324a1414f 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -586,7 +586,10 @@ class TaskFragment extends WindowContainer { } // Cannot embed activity across TaskFragments for activity result. - if (a.resultTo != null && a.resultTo.getTaskFragment() != this) { + // If the activity that started for result is finishing, it's likely that this start mode + // is used to place an activity in the same task. Since the finishing activity won't be + // able to get the results, so it's OK to embed in a different TaskFragment. + if (a.resultTo != null && !a.resultTo.finishing && a.resultTo.getTaskFragment() != this) { return EMBEDDING_DISALLOWED_NEW_TASK_FRAGMENT; } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 1096351524d77..88eadfceedb63 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -32,6 +32,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.wm.ActivityRecord.State.RESUMED; +import static com.android.server.wm.TaskFragment.EMBEDDING_ALLOWED; import static com.android.server.wm.TaskFragment.EMBEDDING_DISALLOWED_MIN_DIMENSION_VIOLATION; import static com.android.server.wm.TaskFragment.EMBEDDING_DISALLOWED_NEW_TASK_FRAGMENT; import static com.android.server.wm.TaskFragment.EMBEDDING_DISALLOWED_UNTRUSTED_HOST; @@ -468,6 +469,10 @@ public class TaskFragmentTest extends WindowTestsBase { newActivity.resultTo = activity; assertEquals(EMBEDDING_DISALLOWED_NEW_TASK_FRAGMENT, newTaskFragment.isAllowedToEmbedActivity(newActivity)); + + // Allow embedding if the resultTo activity is finishing. + activity.finishing = true; + assertEquals(EMBEDDING_ALLOWED, newTaskFragment.isAllowedToEmbedActivity(newActivity)); } @Test