Loading services/core/java/com/android/server/wm/RootWindowContainer.java +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading services/core/java/com/android/server/wm/TaskDisplayArea.java +28 −4 Original line number Diff line number Diff line Loading @@ -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 */); this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */, true /* canHostHomeTask */); } TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, int displayAreaFeature, boolean createdByOrganizer) { this(displayContent, service, name, displayAreaFeature, createdByOrganizer, true /* canHostHomeTask */); } TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, int displayAreaFeature, boolean createdByOrganizer, boolean canHostHomeTask) { super(service, Type.ANY, name, displayAreaFeature); mDisplayContent = displayContent; mRootWindowContainer = service.mRoot; mAtmService = service.mAtmService; mCreatedByOrganizer = createdByOrganizer; mCanHostHomeTask = canHostHomeTask; } /** Loading Loading @@ -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; Loading Loading @@ -1881,6 +1898,13 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { return true; } /** * 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. */ Loading services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java +39 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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}. Loading Loading @@ -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<>(); Loading Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +5 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
services/core/java/com/android/server/wm/TaskDisplayArea.java +28 −4 Original line number Diff line number Diff line Loading @@ -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 */); this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */, true /* canHostHomeTask */); } TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, int displayAreaFeature, boolean createdByOrganizer) { this(displayContent, service, name, displayAreaFeature, createdByOrganizer, true /* canHostHomeTask */); } TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name, int displayAreaFeature, boolean createdByOrganizer, boolean canHostHomeTask) { super(service, Type.ANY, name, displayAreaFeature); mDisplayContent = displayContent; mRootWindowContainer = service.mRoot; mAtmService = service.mAtmService; mCreatedByOrganizer = createdByOrganizer; mCanHostHomeTask = canHostHomeTask; } /** Loading Loading @@ -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; Loading Loading @@ -1881,6 +1898,13 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { return true; } /** * 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. */ Loading
services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java +39 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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}. Loading Loading @@ -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<>(); Loading