Merge "Ensure reparent activity TaskFragment is always within the same Task" into tm-dev

This commit is contained in:
Chris Li
2022-05-13 10:05:24 +00:00
committed by Android (Google) Code Review
2 changed files with 15 additions and 2 deletions

View File

@@ -734,6 +734,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception); sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception);
break; 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); activity.reparent(parent, POSITION_TOP);
effects |= TRANSACT_EFFECTS_LIFECYCLE; effects |= TRANSACT_EFFECTS_LIFECYCLE;
break; break;
@@ -1542,6 +1548,12 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception); sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception);
return; 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()) { while (oldParent.hasChild()) {
oldParent.getChildAt(0).reparent(newParentTF, POSITION_TOP); oldParent.getChildAt(0).reparent(newParentTF, POSITION_TOP);
} }

View File

@@ -511,11 +511,12 @@ public class TaskFragmentOrganizerControllerTest extends WindowTestsBase {
@Test @Test
public void testApplyTransaction_reparentActivityToTaskFragment_triggerLifecycleUpdate() public void testApplyTransaction_reparentActivityToTaskFragment_triggerLifecycleUpdate()
throws RemoteException { throws RemoteException {
final ActivityRecord activity = createActivityRecord(mDefaultDisplay); final Task task = createTask(mDisplayContent);
final ActivityRecord activity = createActivityRecord(task);
mOrganizer.applyTransaction(mTransaction); mOrganizer.applyTransaction(mTransaction);
mController.registerOrganizer(mIOrganizer); mController.registerOrganizer(mIOrganizer);
mTaskFragment = new TaskFragmentBuilder(mAtm) mTaskFragment = new TaskFragmentBuilder(mAtm)
.setCreateParentTask() .setParentTask(task)
.setFragmentToken(mFragmentToken) .setFragmentToken(mFragmentToken)
.build(); .build();
mAtm.mWindowOrganizerController.mLaunchTaskFragments mAtm.mWindowOrganizerController.mLaunchTaskFragments