diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 081ee2c82d8ed..ff3b4a5bb44f3 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -734,6 +734,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception); break; } + if (parent.getTask() != activity.getTask()) { + final Throwable exception = new SecurityException("The reparented activity is" + + " not in the same Task as the target TaskFragment."); + sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception); + break; + } activity.reparent(parent, POSITION_TOP); effects |= TRANSACT_EFFECTS_LIFECYCLE; break; @@ -1542,6 +1548,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception); return; } + if (newParentTF.getTask() != oldParent.getTask()) { + final Throwable exception = new SecurityException( + "The new parent is not in the same Task as the old parent."); + sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception); + return; + } while (oldParent.hasChild()) { oldParent.getChildAt(0).reparent(newParentTF, POSITION_TOP); } diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java index 75b5e73a604e4..5340a79f4b94e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentOrganizerControllerTest.java @@ -511,11 +511,12 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase { @Test public void testApplyTransaction_reparentActivityToTaskFragment_triggerLifecycleUpdate() throws RemoteException { - final ActivityRecord activity = createActivityRecord(mDefaultDisplay); + final Task task = createTask(mDisplayContent); + final ActivityRecord activity = createActivityRecord(task); mOrganizer.applyTransaction(mTransaction); mController.registerOrganizer(mIOrganizer); mTaskFragment = new TaskFragmentBuilder(mAtm) - .setCreateParentTask() + .setParentTask(task) .setFragmentToken(mFragmentToken) .build(); mAtm.mWindowOrganizerController.mLaunchTaskFragments