From 69d19ffdd0f7816201039461296e2ecb449fe6da Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Thu, 4 Aug 2022 08:14:31 +0000 Subject: [PATCH] Relax the result-to restriction if activity is finishing Because the finishing activity won't get the results anyway. Though, the caller activity was using start-for-result to start a singleTask activity of another app on the caller's task. Bug: 236668365 Bug: 241071379 Test: atest TaskFragmentTest Change-Id: I94e1f0aab35ceec341dc9acb3b9f749ef9c0cf21 --- services/core/java/com/android/server/wm/TaskFragment.java | 5 ++++- .../wmtests/src/com/android/server/wm/TaskFragmentTest.java | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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