Merge "Added the can host home task flag to TaskDisplayArea" into sc-dev

This commit is contained in:
Darryl Johnson
2021-04-22 16:15:30 +00:00
committed by Android (Google) Code Review
3 changed files with 72 additions and 4 deletions

View File

@@ -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;

View File

@@ -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 */);
int displayAreaFeature) {
this(displayContent, service, name, displayAreaFeature, false /* createdByOrganizer */,
true /* canHostHomeTask */);
}
TaskDisplayArea(DisplayContent displayContent, WindowManagerService service, String name,
int displayAreaFeature, boolean createdByOrganizer) {
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;
}
/**
@@ -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;
@@ -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.
*/

View File

@@ -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<>();