summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Darryl Johnson <darryljohnson@google.com> 2021-04-22 16:15:30 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-04-22 16:15:30 +0000
commit77abd7aedb1b75efa51e1aab1ba2d76ce470271f (patch)
tree34c52a70b59bb52f44137c98b66770bae6864145
parentf8cd83ff2df2da135b0074c61c238bdc85845795 (diff)
parent530c26e4c53143452bbd7149ea46390c8292f681 (diff)
Merge "Added the can host home task flag to TaskDisplayArea" into sc-dev
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java5
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java32
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java39
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<>();