Fix some places that inadvertently removed split root tasks

LaunchParamsController shouldn't change windowing-mode for non
root tasks. Non-root tasks either inherit their windowing mode
from the root or are being controlled in a transient state.

Also, don't remove stacks that are created-by-organizer, it's
up to the organizer to remove those.

Bug: 168770671
Test: atest AssistantStackTests#testTranslucentAssistantActivityStackVisibility
      on device with freeform display
Change-Id: Ibf1e504f04b7aa10dfe2f6976102bcf4836524f1
This commit is contained in:
Evan Rosky
2020-10-02 15:25:55 -07:00
parent e3c1e22e32
commit 5ae76b1c72
3 changed files with 30 additions and 7 deletions

View File

@@ -144,11 +144,11 @@ class LaunchParamsController {
mTmpParams.mPreferredTaskDisplayArea, true /* onTop */);
}
if (mTmpParams.hasWindowingMode()
&& mTmpParams.mWindowingMode != task.getRootTask().getWindowingMode()) {
if (mTmpParams.hasWindowingMode() && task.isRootTask()
&& mTmpParams.mWindowingMode != task.getWindowingMode()) {
final int activityType = activity != null
? activity.getActivityType() : task.getActivityType();
task.getRootTask().setWindowingMode(task.getDisplayArea().validateWindowingMode(
task.setWindowingMode(task.getDisplayArea().validateWindowingMode(
mTmpParams.mWindowingMode, activity, task, activityType));
}

View File

@@ -1305,10 +1305,9 @@ final class TaskDisplayArea extends DisplayArea<Task> {
final int windowingMode = windowingModes[j];
for (int i = getStackCount() - 1; i >= 0; --i) {
final Task stack = getStackAt(i);
if (!stack.isActivityTypeStandardOrUndefined()) {
continue;
}
if (stack.getWindowingMode() != windowingMode) {
if (stack.mCreatedByOrganizer
|| !stack.isActivityTypeStandardOrUndefined()
|| stack.getWindowingMode() != windowingMode) {
continue;
}
stacks.add(stack);

View File

@@ -19,6 +19,7 @@ package com.android.server.wm;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
import static android.view.Display.INVALID_DISPLAY;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
@@ -318,6 +319,29 @@ public class LaunchParamsControllerTests extends WindowTestsBase {
assertEquals(windowingMode, afterWindowMode);
}
/**
* Ensures that {@link LaunchParamsModifier} doesn't alter non-root tasks' windowingMode.
*/
@Test
public void testLayoutNonRootTaskWindowingModeChange() {
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.mStackSupervisor).setCreateParentTask(true).build();
task.getRootTask().setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
mController.registerModifier(positioner);
final int beforeWindowMode = task.getWindowingMode();
assertNotEquals(windowingMode, beforeWindowMode);
mController.layoutTask(task, null /* windowLayout */);
final int afterWindowMode = task.getWindowingMode();
assertEquals(afterWindowMode, beforeWindowMode);
}
/**
* Ensures that {@link LaunchParamsModifier} requests specifying bounds during
* layout are honored if window is in freeform.