diff options
| author | 2021-04-22 16:15:30 +0000 | |
|---|---|---|
| committer | 2021-04-22 16:15:30 +0000 | |
| commit | 77abd7aedb1b75efa51e1aab1ba2d76ce470271f (patch) | |
| tree | 34c52a70b59bb52f44137c98b66770bae6864145 | |
| parent | f8cd83ff2df2da135b0074c61c238bdc85845795 (diff) | |
| parent | 530c26e4c53143452bbd7149ea46390c8292f681 (diff) | |
Merge "Added the can host home task flag to TaskDisplayArea" into sc-dev
3 files changed, 72 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index b9fc8b1222ee..2118effe7506 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1686,6 +1686,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return false; } + if (!taskDisplayArea.canHostHomeTask()) { + // Can't launch home on a TaskDisplayArea that does not support root home task + return false; + } + if (taskDisplayArea.getDisplayId() != DEFAULT_DISPLAY && !mService.mSupportsMultiDisplay) { // Can't launch home on secondary display if device does not support multi-display. return false; diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 379906709a2e..4d85e7bda900 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -172,18 +172,33 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { */ final boolean mCreatedByOrganizer; + /** + * True if this TaskDisplayArea can have a home task + * {@link WindowConfiguration#ACTIVITY_TYPE_HOME} + */ + private final boolean mCanHostHomeTask; + + TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, + int displayAreaFeature) { + this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */, + true /* canHostHomeTask */); + } + TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, - int displayAreaFeature) { - this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */); + int displayAreaFeature, boolean createdByOrganizer) { + this(displayContent, service, name, displayAreaFeature, createdByOrganizer, + true /* canHostHomeTask */); } TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, - int displayAreaFeature, boolean createdByOrganizer) { + int displayAreaFeature, boolean createdByOrganizer, + boolean canHostHomeTask) { super(service, Type.ANY, name, displayAreaFeature); mDisplayContent = displayContent; mRootWindowContainer = service.mRoot; mAtmService = service.mAtmService; mCreatedByOrganizer = createdByOrganizer; + mCanHostHomeTask = canHostHomeTask; } /** @@ -1667,7 +1682,9 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { @Nullable Task getOrCreateRootHomeTask(boolean onTop) { Task homeTask = getRootHomeTask(); - if (homeTask == null && mDisplayContent.supportsSystemDecorations()) { + // Take into account if this TaskDisplayArea can have a home task before trying to + // create the root task + if (homeTask == null && canHostHomeTask()) { homeTask = createRootTask(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_HOME, onTop); } return homeTask; @@ -1882,6 +1899,13 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { } /** + * Exposes the home task capability of the TaskDisplayArea + */ + boolean canHostHomeTask() { + return mDisplayContent.supportsSystemDecorations() && mCanHostHomeTask; + } + + /** * Callback for when the order of the root tasks in the display changes. */ interface OnRootTaskOrderChangedListener { diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java index 2a5508352691..147a44f1d297 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java @@ -28,6 +28,7 @@ import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; @@ -48,6 +49,7 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Optional; /** * Tests for the {@link DisplayAreaPolicy}. @@ -183,6 +185,43 @@ public class DisplayAreaPolicyTests extends WindowTestsBase { taskDisplayArea5, taskDisplayArea1); } + @Test + public void testTaskDisplayAreasCanHostHomeTask() { + final WindowManagerService wms = mWm; + final DisplayContent displayContent = mock(DisplayContent.class); + doReturn(true).when(displayContent).isTrusted(); + doReturn(true).when(displayContent).supportsSystemDecorations(); + final RootDisplayArea root = new SurfacelessDisplayAreaRoot(wms); + final TaskDisplayArea taskDisplayAreaWithHome = new TaskDisplayArea(displayContent, wms, + "Tasks1", FEATURE_DEFAULT_TASK_CONTAINER); + final TaskDisplayArea taskDisplayAreaWithNoHome = new TaskDisplayArea(displayContent, wms, + "Tasks2", FEATURE_VENDOR_FIRST + 1, false, false); + final DisplayArea.Tokens ime = new DisplayArea.Tokens(wms, ABOVE_TASKS, "Ime"); + final DisplayAreaPolicy policy = new DisplayAreaPolicyBuilder() + .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(root) + .setImeContainer(ime) + .setTaskDisplayAreas(Lists.newArrayList(taskDisplayAreaWithHome, + taskDisplayAreaWithNoHome)) + ) + .build(wms); + assertTaskDisplayAreaPresentAndCanHaveHome(policy, FEATURE_DEFAULT_TASK_CONTAINER, true); + assertTaskDisplayAreaPresentAndCanHaveHome(policy, FEATURE_VENDOR_FIRST + 1, false); + final Task stackHome = taskDisplayAreaWithHome.getOrCreateRootHomeTask(true); + final Task stackNoHome = taskDisplayAreaWithNoHome.getOrCreateRootHomeTask(true); + assertNotNull(stackHome); + assertNull(stackNoHome); + } + + private void assertTaskDisplayAreaPresentAndCanHaveHome(DisplayAreaPolicy policy, + int featureId, + boolean canHaveHome) { + Optional<DisplayArea> optionalDisplayArea = policy.mRoot.mChildren + .stream().filter(displayArea -> displayArea.mFeatureId == featureId) + .findAny(); + assertTrue(optionalDisplayArea.isPresent()); + assertEquals(canHaveHome, optionalDisplayArea.get().asTaskDisplayArea().canHostHomeTask()); + } + private void assertTaskDisplayAreasOrder(DisplayAreaPolicy policy, TaskDisplayArea... expectTdaOrder) { List<TaskDisplayArea> expectOrder = new ArrayList<>(); |