Loading services/core/java/com/android/server/wm/DisplayAreaPolicy.java +24 −36 Original line number Diff line number Diff line Loading @@ -99,41 +99,23 @@ public abstract class DisplayAreaPolicy { // Define the features that will be supported under the root of the whole logical // display. The policy will build the DisplayArea hierarchy based on this. final HierarchyBuilder rootHierarchy = new HierarchyBuilder(root); if (content.isTrusted()) { // Only trusted display can have system decorations. configureTrustedHierarchyBuilder(rootHierarchy, wmService, content); } // Set the essential containers (even the display doesn't support IME). rootHierarchy.setImeContainer(imeContainer).setTaskDisplayAreas(tdaList); // Instantiate the policy with the hierarchy defined above. This will create and attach // all the necessary DisplayAreas to the root. return new DisplayAreaPolicyBuilder().setRootHierarchy(rootHierarchy).build(wmService); } private void configureTrustedHierarchyBuilder(HierarchyBuilder rootHierarchy, WindowManagerService wmService, DisplayContent content) { HierarchyBuilder rootHierarchy = new HierarchyBuilder(root) // WindowedMagnification should be on the top so that there is only one surface // to be magnified. rootHierarchy.addFeature(new Feature.Builder(wmService.mPolicy, "WindowedMagnification", .addFeature(new Feature.Builder(wmService.mPolicy, "WindowedMagnification", FEATURE_WINDOWED_MAGNIFICATION) .upTo(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY) .except(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY) // Make the DA dimmable so that the magnify window also mirrors the dim layer. // Make the DA dimmable so that the magnify window also mirrors the dim // layer .setNewDisplayAreaSupplier(DisplayArea.Dimmable::new) .build()); if (content.isDefaultDisplay) { // Only default display can have cutout. // See LocalDisplayAdapter.LocalDisplayDevice#getDisplayDeviceInfoLocked. rootHierarchy.addFeature(new Feature.Builder(wmService.mPolicy, "HideDisplayCutout", .build()) .addFeature(new Feature.Builder(wmService.mPolicy, "HideDisplayCutout", FEATURE_HIDE_DISPLAY_CUTOUT) .all() .except(TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL, TYPE_STATUS_BAR, TYPE_NOTIFICATION_SHADE) .build()); } rootHierarchy .except(TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL, TYPE_STATUS_BAR, TYPE_NOTIFICATION_SHADE) .build()) .addFeature(new Feature.Builder(wmService.mPolicy, "OneHanded", FEATURE_ONE_HANDED) .all() Loading @@ -149,7 +131,13 @@ public abstract class DisplayAreaPolicy { .addFeature(new Feature.Builder(wmService.mPolicy, "ImePlaceholder", FEATURE_IME_PLACEHOLDER) .and(TYPE_INPUT_METHOD, TYPE_INPUT_METHOD_DIALOG) .build()); .build()) .setImeContainer(imeContainer) .setTaskDisplayAreas(tdaList); // Instantiate the policy with the hierarchy defined above. This will create and attach // all the necessary DisplayAreas to the root. return new DisplayAreaPolicyBuilder().setRootHierarchy(rootHierarchy).build(wmService); } } Loading services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +0 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import static com.android.server.wm.DisplayAreaPolicyBuilder.Feature; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertThrows; Loading Loading @@ -102,7 +101,6 @@ public class DisplayAreaPolicyBuilderTest { mRoot = new SurfacelessDisplayAreaRoot(mWms); mImeContainer = new DisplayArea.Tokens(mWms, ABOVE_TASKS, "ImeContainer"); mDisplayContent = mock(DisplayContent.class); doReturn(true).when(mDisplayContent).isTrusted(); mDefaultTaskDisplayArea = new TaskDisplayArea(mDisplayContent, mWms, "Tasks", FEATURE_DEFAULT_TASK_CONTAINER); mTaskDisplayAreaList = new ArrayList<>(); Loading services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java +44 −53 Original line number Diff line number Diff line Loading @@ -22,18 +22,15 @@ import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.DisplayArea.Type.ABOVE_TASKS; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import android.platform.test.annotations.Presubmit; import android.util.Pair; import android.view.Display; import android.view.DisplayInfo; import androidx.test.filters.SmallTest; Loading @@ -41,8 +38,9 @@ import com.android.server.wm.DisplayAreaPolicyBuilderTest.SurfacelessDisplayArea import com.google.android.collect.Lists; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.Collections; Loading @@ -56,65 +54,78 @@ import java.util.List; */ @SmallTest @Presubmit @RunWith(WindowTestRunner.class) public class DisplayAreaPolicyTests extends WindowTestsBase { public class DisplayAreaPolicyTests { @Rule public final SystemServicesTestRule mSystemServices = new SystemServicesTestRule(); private DisplayAreaPolicyBuilder.Result mPolicy; private TaskDisplayArea mTaskDisplayArea1; private TaskDisplayArea mTaskDisplayArea2; private RootDisplayArea mRoot; @Before public void setUp() throws Exception { WindowManagerService wms = mSystemServices.getWindowManagerService(); mRoot = new SurfacelessDisplayAreaRoot(wms); spyOn(mRoot); DisplayArea.Tokens ime = new DisplayArea.Tokens(wms, ABOVE_TASKS, "Ime"); DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); mTaskDisplayArea1 = new TaskDisplayArea(displayContent, wms, "Tasks1", FEATURE_DEFAULT_TASK_CONTAINER); mTaskDisplayArea2 = new TaskDisplayArea(displayContent, wms, "Tasks2", FEATURE_VENDOR_FIRST); List<TaskDisplayArea> taskDisplayAreaList = new ArrayList<>(); taskDisplayAreaList.add(mTaskDisplayArea1); taskDisplayAreaList.add(mTaskDisplayArea2); mPolicy = new DisplayAreaPolicyBuilder() .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(mRoot) .setImeContainer(ime) .setTaskDisplayAreas(taskDisplayAreaList)) .build(wms); } @Test public void testGetDefaultTaskDisplayArea() { final Pair<DisplayAreaPolicy, List<TaskDisplayArea>> result = createPolicyWith2TaskDisplayAreas(); final DisplayAreaPolicy policy = result.first; final TaskDisplayArea taskDisplayArea1 = result.second.get(0); assertEquals(taskDisplayArea1, policy.getDefaultTaskDisplayArea()); assertEquals(mTaskDisplayArea1, mPolicy.getDefaultTaskDisplayArea()); } @Test public void testTaskDisplayArea_taskPositionChanged_updatesTaskDisplayAreaPosition() { final Pair<DisplayAreaPolicy, List<TaskDisplayArea>> result = createPolicyWith2TaskDisplayAreas(); final DisplayAreaPolicy policy = result.first; final TaskDisplayArea taskDisplayArea1 = result.second.get(0); final TaskDisplayArea taskDisplayArea2 = result.second.get(1); final Task stack1 = taskDisplayArea1.createRootTask( final Task stack1 = mTaskDisplayArea1.createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final Task stack2 = taskDisplayArea2.createRootTask( final Task stack2 = mTaskDisplayArea2.createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Initial order assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2); // Move stack in tda1 to top stack1.getParent().positionChildAt(POSITION_TOP, stack1, true /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea1); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea2, mTaskDisplayArea1); // Move stack in tda2 to top, but not including parents stack2.getParent().positionChildAt(POSITION_TOP, stack2, false /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea1); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea2, mTaskDisplayArea1); // Move stack in tda1 to bottom stack1.getParent().positionChildAt(POSITION_BOTTOM, stack1, true /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2); // Move stack in tda2 to bottom, but not including parents stack2.getParent().positionChildAt(POSITION_BOTTOM, stack2, false /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2); } @Test public void testEmptyFeaturesOnUntrustedDisplay() { final DisplayInfo info = new DisplayInfo(mDisplayInfo); info.flags &= ~Display.FLAG_TRUSTED; final DisplayContent untrustedDisplay = new TestDisplayContent.Builder(mAtm, info).build(); assertTrue(untrustedDisplay.mFeatures.isEmpty()); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2); } @Test public void testDisplayAreaGroup_taskPositionChanged_updatesDisplayAreaGroupPosition() { final WindowManagerService wms = mWm; final WindowManagerService wms = mSystemServices.getWindowManagerService(); final DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); final RootDisplayArea root = new SurfacelessDisplayAreaRoot(wms); Loading Loading @@ -192,24 +203,4 @@ public class DisplayAreaPolicyTests extends WindowTestsBase { }, false /* traverseTopToBottom */); assertEquals(expectOrder, actualOrder); } private Pair<DisplayAreaPolicy, List<TaskDisplayArea>> createPolicyWith2TaskDisplayAreas() { final SurfacelessDisplayAreaRoot root = new SurfacelessDisplayAreaRoot(mWm); final DisplayArea.Tokens ime = new DisplayArea.Tokens(mWm, ABOVE_TASKS, "Ime"); final DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); final TaskDisplayArea taskDisplayArea1 = new TaskDisplayArea(displayContent, mWm, "Tasks1", FEATURE_DEFAULT_TASK_CONTAINER); final TaskDisplayArea taskDisplayArea2 = new TaskDisplayArea(displayContent, mWm, "Tasks2", FEATURE_VENDOR_FIRST); final List<TaskDisplayArea> taskDisplayAreaList = new ArrayList<>(); taskDisplayAreaList.add(taskDisplayArea1); taskDisplayAreaList.add(taskDisplayArea2); return Pair.create(new DisplayAreaPolicyBuilder() .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(root) .setImeContainer(ime) .setTaskDisplayAreas(taskDisplayAreaList)) .build(mWm), taskDisplayAreaList); } } Loading
services/core/java/com/android/server/wm/DisplayAreaPolicy.java +24 −36 Original line number Diff line number Diff line Loading @@ -99,41 +99,23 @@ public abstract class DisplayAreaPolicy { // Define the features that will be supported under the root of the whole logical // display. The policy will build the DisplayArea hierarchy based on this. final HierarchyBuilder rootHierarchy = new HierarchyBuilder(root); if (content.isTrusted()) { // Only trusted display can have system decorations. configureTrustedHierarchyBuilder(rootHierarchy, wmService, content); } // Set the essential containers (even the display doesn't support IME). rootHierarchy.setImeContainer(imeContainer).setTaskDisplayAreas(tdaList); // Instantiate the policy with the hierarchy defined above. This will create and attach // all the necessary DisplayAreas to the root. return new DisplayAreaPolicyBuilder().setRootHierarchy(rootHierarchy).build(wmService); } private void configureTrustedHierarchyBuilder(HierarchyBuilder rootHierarchy, WindowManagerService wmService, DisplayContent content) { HierarchyBuilder rootHierarchy = new HierarchyBuilder(root) // WindowedMagnification should be on the top so that there is only one surface // to be magnified. rootHierarchy.addFeature(new Feature.Builder(wmService.mPolicy, "WindowedMagnification", .addFeature(new Feature.Builder(wmService.mPolicy, "WindowedMagnification", FEATURE_WINDOWED_MAGNIFICATION) .upTo(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY) .except(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY) // Make the DA dimmable so that the magnify window also mirrors the dim layer. // Make the DA dimmable so that the magnify window also mirrors the dim // layer .setNewDisplayAreaSupplier(DisplayArea.Dimmable::new) .build()); if (content.isDefaultDisplay) { // Only default display can have cutout. // See LocalDisplayAdapter.LocalDisplayDevice#getDisplayDeviceInfoLocked. rootHierarchy.addFeature(new Feature.Builder(wmService.mPolicy, "HideDisplayCutout", .build()) .addFeature(new Feature.Builder(wmService.mPolicy, "HideDisplayCutout", FEATURE_HIDE_DISPLAY_CUTOUT) .all() .except(TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL, TYPE_STATUS_BAR, TYPE_NOTIFICATION_SHADE) .build()); } rootHierarchy .except(TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL, TYPE_STATUS_BAR, TYPE_NOTIFICATION_SHADE) .build()) .addFeature(new Feature.Builder(wmService.mPolicy, "OneHanded", FEATURE_ONE_HANDED) .all() Loading @@ -149,7 +131,13 @@ public abstract class DisplayAreaPolicy { .addFeature(new Feature.Builder(wmService.mPolicy, "ImePlaceholder", FEATURE_IME_PLACEHOLDER) .and(TYPE_INPUT_METHOD, TYPE_INPUT_METHOD_DIALOG) .build()); .build()) .setImeContainer(imeContainer) .setTaskDisplayAreas(tdaList); // Instantiate the policy with the hierarchy defined above. This will create and attach // all the necessary DisplayAreas to the root. return new DisplayAreaPolicyBuilder().setRootHierarchy(rootHierarchy).build(wmService); } } Loading
services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +0 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import static com.android.server.wm.DisplayAreaPolicyBuilder.Feature; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertThrows; Loading Loading @@ -102,7 +101,6 @@ public class DisplayAreaPolicyBuilderTest { mRoot = new SurfacelessDisplayAreaRoot(mWms); mImeContainer = new DisplayArea.Tokens(mWms, ABOVE_TASKS, "ImeContainer"); mDisplayContent = mock(DisplayContent.class); doReturn(true).when(mDisplayContent).isTrusted(); mDefaultTaskDisplayArea = new TaskDisplayArea(mDisplayContent, mWms, "Tasks", FEATURE_DEFAULT_TASK_CONTAINER); mTaskDisplayAreaList = new ArrayList<>(); Loading
services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyTests.java +44 −53 Original line number Diff line number Diff line Loading @@ -22,18 +22,15 @@ import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.server.wm.DisplayArea.Type.ABOVE_TASKS; import static com.android.server.wm.WindowContainer.POSITION_BOTTOM; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import android.platform.test.annotations.Presubmit; import android.util.Pair; import android.view.Display; import android.view.DisplayInfo; import androidx.test.filters.SmallTest; Loading @@ -41,8 +38,9 @@ import com.android.server.wm.DisplayAreaPolicyBuilderTest.SurfacelessDisplayArea import com.google.android.collect.Lists; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.Collections; Loading @@ -56,65 +54,78 @@ import java.util.List; */ @SmallTest @Presubmit @RunWith(WindowTestRunner.class) public class DisplayAreaPolicyTests extends WindowTestsBase { public class DisplayAreaPolicyTests { @Rule public final SystemServicesTestRule mSystemServices = new SystemServicesTestRule(); private DisplayAreaPolicyBuilder.Result mPolicy; private TaskDisplayArea mTaskDisplayArea1; private TaskDisplayArea mTaskDisplayArea2; private RootDisplayArea mRoot; @Before public void setUp() throws Exception { WindowManagerService wms = mSystemServices.getWindowManagerService(); mRoot = new SurfacelessDisplayAreaRoot(wms); spyOn(mRoot); DisplayArea.Tokens ime = new DisplayArea.Tokens(wms, ABOVE_TASKS, "Ime"); DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); mTaskDisplayArea1 = new TaskDisplayArea(displayContent, wms, "Tasks1", FEATURE_DEFAULT_TASK_CONTAINER); mTaskDisplayArea2 = new TaskDisplayArea(displayContent, wms, "Tasks2", FEATURE_VENDOR_FIRST); List<TaskDisplayArea> taskDisplayAreaList = new ArrayList<>(); taskDisplayAreaList.add(mTaskDisplayArea1); taskDisplayAreaList.add(mTaskDisplayArea2); mPolicy = new DisplayAreaPolicyBuilder() .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(mRoot) .setImeContainer(ime) .setTaskDisplayAreas(taskDisplayAreaList)) .build(wms); } @Test public void testGetDefaultTaskDisplayArea() { final Pair<DisplayAreaPolicy, List<TaskDisplayArea>> result = createPolicyWith2TaskDisplayAreas(); final DisplayAreaPolicy policy = result.first; final TaskDisplayArea taskDisplayArea1 = result.second.get(0); assertEquals(taskDisplayArea1, policy.getDefaultTaskDisplayArea()); assertEquals(mTaskDisplayArea1, mPolicy.getDefaultTaskDisplayArea()); } @Test public void testTaskDisplayArea_taskPositionChanged_updatesTaskDisplayAreaPosition() { final Pair<DisplayAreaPolicy, List<TaskDisplayArea>> result = createPolicyWith2TaskDisplayAreas(); final DisplayAreaPolicy policy = result.first; final TaskDisplayArea taskDisplayArea1 = result.second.get(0); final TaskDisplayArea taskDisplayArea2 = result.second.get(1); final Task stack1 = taskDisplayArea1.createRootTask( final Task stack1 = mTaskDisplayArea1.createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); final Task stack2 = taskDisplayArea2.createRootTask( final Task stack2 = mTaskDisplayArea2.createRootTask( WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */); // Initial order assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2); // Move stack in tda1 to top stack1.getParent().positionChildAt(POSITION_TOP, stack1, true /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea1); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea2, mTaskDisplayArea1); // Move stack in tda2 to top, but not including parents stack2.getParent().positionChildAt(POSITION_TOP, stack2, false /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea1); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea2, mTaskDisplayArea1); // Move stack in tda1 to bottom stack1.getParent().positionChildAt(POSITION_BOTTOM, stack1, true /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2); // Move stack in tda2 to bottom, but not including parents stack2.getParent().positionChildAt(POSITION_BOTTOM, stack2, false /* includingParents */); assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2); } @Test public void testEmptyFeaturesOnUntrustedDisplay() { final DisplayInfo info = new DisplayInfo(mDisplayInfo); info.flags &= ~Display.FLAG_TRUSTED; final DisplayContent untrustedDisplay = new TestDisplayContent.Builder(mAtm, info).build(); assertTrue(untrustedDisplay.mFeatures.isEmpty()); assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2); } @Test public void testDisplayAreaGroup_taskPositionChanged_updatesDisplayAreaGroupPosition() { final WindowManagerService wms = mWm; final WindowManagerService wms = mSystemServices.getWindowManagerService(); final DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); final RootDisplayArea root = new SurfacelessDisplayAreaRoot(wms); Loading Loading @@ -192,24 +203,4 @@ public class DisplayAreaPolicyTests extends WindowTestsBase { }, false /* traverseTopToBottom */); assertEquals(expectOrder, actualOrder); } private Pair<DisplayAreaPolicy, List<TaskDisplayArea>> createPolicyWith2TaskDisplayAreas() { final SurfacelessDisplayAreaRoot root = new SurfacelessDisplayAreaRoot(mWm); final DisplayArea.Tokens ime = new DisplayArea.Tokens(mWm, ABOVE_TASKS, "Ime"); final DisplayContent displayContent = mock(DisplayContent.class); doReturn(true).when(displayContent).isTrusted(); final TaskDisplayArea taskDisplayArea1 = new TaskDisplayArea(displayContent, mWm, "Tasks1", FEATURE_DEFAULT_TASK_CONTAINER); final TaskDisplayArea taskDisplayArea2 = new TaskDisplayArea(displayContent, mWm, "Tasks2", FEATURE_VENDOR_FIRST); final List<TaskDisplayArea> taskDisplayAreaList = new ArrayList<>(); taskDisplayAreaList.add(taskDisplayArea1); taskDisplayAreaList.add(taskDisplayArea2); return Pair.create(new DisplayAreaPolicyBuilder() .setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(root) .setImeContainer(ime) .setTaskDisplayAreas(taskDisplayAreaList)) .build(mWm), taskDisplayAreaList); } }