Do not reparent task or set windowing mode when layout task

#layoutTask is called while launching an activity, but the
TDA and the task windowing mode should already be resolved
earlier in RWC#getOrCreateRootTask. The result should not
be overridden again simply based on LaunchParams.

Bug: 219380819
Test: atest LaunchParamsControllerTests
Test: atest RootWindowContainerTests
Change-Id: I8c934a7b09d780f0d74513398decc3ac17f11b19
This commit is contained in:
Louis Chang
2022-03-14 16:51:48 +08:00
parent 9675d3b877
commit aaaece7a64
3 changed files with 9 additions and 64 deletions

View File

@@ -142,18 +142,6 @@ class LaunchParamsController {
mService.deferWindowLayout();
try {
if (mTmpParams.mPreferredTaskDisplayArea != null
&& task.getDisplayArea() != mTmpParams.mPreferredTaskDisplayArea) {
mService.mRootWindowContainer.moveRootTaskToTaskDisplayArea(task.getRootTaskId(),
mTmpParams.mPreferredTaskDisplayArea, true /* onTop */);
}
if (mTmpParams.hasWindowingMode() && task.isRootTask()
&& mTmpParams.mWindowingMode != task.getWindowingMode()) {
task.setWindowingMode(task.getDisplayArea().validateWindowingMode(
mTmpParams.mWindowingMode, activity, task));
}
if (mTmpParams.mBounds.isEmpty()) {
return false;
}

View File

@@ -23,9 +23,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.Display.INVALID_DISPLAY;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyBoolean;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyInt;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
@@ -278,51 +276,6 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
eq(source), eq(options), any(), eq(PHASE_BOUNDS), any(), any());
}
/**
* Ensures that {@link LaunchParamsModifier} requests specifying display id during
* layout are honored.
*/
@Test
public void testLayoutTaskPreferredDisplayChange() {
final LaunchParams params = new LaunchParams();
final TestDisplayContent display = createNewDisplayContent();
final TaskDisplayArea preferredTaskDisplayArea = display.getDefaultTaskDisplayArea();
params.mPreferredTaskDisplayArea = preferredTaskDisplayArea;
final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params);
final Task task = new TaskBuilder(mAtm.mTaskSupervisor).build();
mController.registerModifier(positioner);
doNothing().when(mRootWindowContainer).moveRootTaskToTaskDisplayArea(anyInt(), any(),
anyBoolean());
mController.layoutTask(task, null /* windowLayout */);
verify(mRootWindowContainer, times(1)).moveRootTaskToTaskDisplayArea(
eq(task.getRootTaskId()), eq(preferredTaskDisplayArea), anyBoolean());
}
/**
* Ensures that {@link LaunchParamsModifier} requests specifying windowingMode during
* layout are honored.
*/
@Test
public void testLayoutTaskWindowingModeChange() {
final LaunchParams params = new LaunchParams();
final int windowingMode = WINDOWING_MODE_FREEFORM;
params.mWindowingMode = windowingMode;
final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params);
final Task task = new TaskBuilder(mAtm.mTaskSupervisor).build();
mController.registerModifier(positioner);
final int beforeWindowMode = task.getRootTask().getWindowingMode();
assertNotEquals(windowingMode, beforeWindowMode);
mController.layoutTask(task, null /* windowLayout */);
final int afterWindowMode = task.getRootTask().getWindowingMode();
assertEquals(windowingMode, afterWindowMode);
}
/**
* Ensures that {@link LaunchParamsModifier} doesn't alter non-root tasks' windowingMode.
*/
@@ -355,10 +308,10 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
final Rect expected = new Rect(10, 20, 30, 40);
final LaunchParams params = new LaunchParams();
params.mWindowingMode = WINDOWING_MODE_FREEFORM;
params.mBounds.set(expected);
final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params);
final Task task = new TaskBuilder(mAtm.mTaskSupervisor).build();
final Task task = new TaskBuilder(mAtm.mTaskSupervisor)
.setWindowingMode(WINDOWING_MODE_FREEFORM).build();
mController.registerModifier(positioner);
@@ -380,10 +333,10 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
final Rect expected = new Rect(10, 20, 30, 40);
final LaunchParams params = new LaunchParams();
params.mWindowingMode = WINDOWING_MODE_MULTI_WINDOW;
params.mBounds.set(expected);
final InstrumentedPositioner positioner = new InstrumentedPositioner(RESULT_DONE, params);
final Task task = new TaskBuilder(mAtm.mTaskSupervisor).build();
final Task task = new TaskBuilder(mAtm.mTaskSupervisor)
.setWindowingMode(WINDOWING_MODE_MULTI_WINDOW).build();
mController.registerModifier(positioner);

View File

@@ -20,6 +20,7 @@ import static android.app.KeyguardManager.ACTION_CONFIRM_DEVICE_CREDENTIAL_WITH_
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
@@ -945,14 +946,16 @@ public class RootWindowContainerTests extends WindowTestsBase {
mWm, "TDA", FEATURE_VENDOR_FIRST);
display.addChild(taskDisplayArea, POSITION_BOTTOM);
// Making sure getting the root task from the preferred TDA
// Making sure getting the root task from the preferred TDA and the preferred windowing mode
LaunchParamsController.LaunchParams launchParams =
new LaunchParamsController.LaunchParams();
launchParams.mPreferredTaskDisplayArea = taskDisplayArea;
launchParams.mWindowingMode = WINDOWING_MODE_FREEFORM;
Task root = mRootWindowContainer.getOrCreateRootTask(null /* r */, null /* options */,
null /* candidateTask */, null /* sourceTask */, true /* onTop */, launchParams,
0 /* launchParams */);
assertEquals(taskDisplayArea, root.getTaskDisplayArea());
assertEquals(WINDOWING_MODE_FREEFORM, root.getWindowingMode());
// Making sure still getting the root task from the preferred TDA when passing in a
// launching activity.
@@ -961,6 +964,7 @@ public class RootWindowContainerTests extends WindowTestsBase {
null /* candidateTask */, null /* sourceTask */, true /* onTop */, launchParams,
0 /* launchParams */);
assertEquals(taskDisplayArea, root.getTaskDisplayArea());
assertEquals(WINDOWING_MODE_FREEFORM, root.getWindowingMode());
}
@Test