blob: 5a47493c12cd548059759e696729664dada8a498 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wm;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
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.mockito.Mockito.mock;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
import com.android.server.wm.DisplayAreaPolicyBuilderTest.SurfacelessDisplayAreaRoot;
import com.google.android.collect.Lists;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Tests for the {@link DisplayAreaPolicy}.
*
* Build/Install/Run:
* atest WmTests:DisplayAreaPolicyTests
*/
@SmallTest
@Presubmit
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<WindowContainer> ime = new DisplayArea<>(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() {
assertEquals(mTaskDisplayArea1, mPolicy.getDefaultTaskDisplayArea());
}
@Test
public void testTaskDisplayArea_taskPositionChanged_updatesTaskDisplayAreaPosition() {
final Task stack1 = mTaskDisplayArea1.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
final Task stack2 = mTaskDisplayArea2.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
// Initial order
assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2);
// Move stack in tda1 to top
stack1.getParent().positionChildAt(POSITION_TOP, stack1, true /* includingParents */);
assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea2, mTaskDisplayArea1);
// Move stack in tda2 to top, but not including parents
stack2.getParent().positionChildAt(POSITION_TOP, stack2, false /* includingParents */);
assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea2, mTaskDisplayArea1);
// Move stack in tda1 to bottom
stack1.getParent().positionChildAt(POSITION_BOTTOM, stack1, true /* includingParents */);
assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2);
// Move stack in tda2 to bottom, but not including parents
stack2.getParent().positionChildAt(POSITION_BOTTOM, stack2, false /* includingParents */);
assertTaskDisplayAreasOrder(mPolicy, mTaskDisplayArea1, mTaskDisplayArea2);
}
@Test
public void testDisplayAreaGroup_taskPositionChanged_updatesDisplayAreaGroupPosition() {
final WindowManagerService wms = mSystemServices.getWindowManagerService();
final DisplayContent displayContent = mock(DisplayContent.class);
doReturn(true).when(displayContent).isTrusted();
final RootDisplayArea root = new SurfacelessDisplayAreaRoot(wms);
final RootDisplayArea group1 = new SurfacelessDisplayAreaRoot(wms, "group1",
FEATURE_VENDOR_FIRST + 1);
final RootDisplayArea group2 = new SurfacelessDisplayAreaRoot(wms, "group2",
FEATURE_VENDOR_FIRST + 2);
final TaskDisplayArea taskDisplayArea1 = new TaskDisplayArea(displayContent, wms, "Tasks1",
FEATURE_DEFAULT_TASK_CONTAINER);
final TaskDisplayArea taskDisplayArea2 = new TaskDisplayArea(displayContent, wms, "Tasks2",
FEATURE_VENDOR_FIRST + 3);
final TaskDisplayArea taskDisplayArea3 = new TaskDisplayArea(displayContent, wms, "Tasks3",
FEATURE_VENDOR_FIRST + 4);
final TaskDisplayArea taskDisplayArea4 = new TaskDisplayArea(displayContent, wms, "Tasks4",
FEATURE_VENDOR_FIRST + 5);
final TaskDisplayArea taskDisplayArea5 = new TaskDisplayArea(displayContent, wms, "Tasks5",
FEATURE_VENDOR_FIRST + 6);
final DisplayArea<WindowContainer> ime = new DisplayArea<>(wms, ABOVE_TASKS, "Ime");
final DisplayAreaPolicy policy = new DisplayAreaPolicyBuilder()
.setRootHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(root)
.setImeContainer(ime)
.setTaskDisplayAreas(Lists.newArrayList(taskDisplayArea1, taskDisplayArea2))
)
.addDisplayAreaGroupHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(group1)
.setTaskDisplayAreas(Lists.newArrayList(taskDisplayArea3, taskDisplayArea4))
)
.addDisplayAreaGroupHierarchy(new DisplayAreaPolicyBuilder.HierarchyBuilder(group2)
.setTaskDisplayAreas(Lists.newArrayList(taskDisplayArea5)))
.build(wms);
final Task stack1 = taskDisplayArea1.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
final Task stack3 = taskDisplayArea3.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
final Task stack4 = taskDisplayArea4.createRootTask(
WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
// Initial order
assertTaskDisplayAreasOrder(policy, taskDisplayArea1, taskDisplayArea2, taskDisplayArea3,
taskDisplayArea4, taskDisplayArea5);
// Move bottom stack in tda1 to top
stack1.getParent().positionChildAt(POSITION_TOP, stack1, true /* includingParents */);
assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea3, taskDisplayArea4,
taskDisplayArea5, taskDisplayArea1);
// Move bottom stack in tda2 to top
stack3.getParent().positionChildAt(POSITION_TOP, stack3, true /* includingParents */);
assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea5, taskDisplayArea1,
taskDisplayArea4, taskDisplayArea3);
// Move bottom stack in tda2 to top
stack4.getParent().positionChildAt(POSITION_TOP, stack4, true /* includingParents */);
assertTaskDisplayAreasOrder(policy, taskDisplayArea2, taskDisplayArea5, taskDisplayArea1,
taskDisplayArea3, taskDisplayArea4);
// Move top stack in tda2 to bottom
stack4.getParent().positionChildAt(POSITION_BOTTOM, stack4, true /* includingParents */);
assertTaskDisplayAreasOrder(policy, taskDisplayArea4, taskDisplayArea3, taskDisplayArea2,
taskDisplayArea5, taskDisplayArea1);
}
private void assertTaskDisplayAreasOrder(DisplayAreaPolicy policy,
TaskDisplayArea... expectTdaOrder) {
List<TaskDisplayArea> expectOrder = new ArrayList<>();
Collections.addAll(expectOrder, expectTdaOrder);
// Verify hierarchy
List<TaskDisplayArea> actualOrder = new ArrayList<>();
policy.mRoot.forAllTaskDisplayAreas(taskDisplayArea -> {
actualOrder.add(taskDisplayArea);
}, false /* traverseTopToBottom */);
assertEquals(expectOrder, actualOrder);
}
}