1d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian/*
2d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * Copyright (C) 2016 The Android Open Source Project
3d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian *
4d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * Licensed under the Apache License, Version 2.0 (the "License");
5d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * you may not use this file except in compliance with the License.
6d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * You may obtain a copy of the License at
7d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian *
8d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian *      http://www.apache.org/licenses/LICENSE-2.0
9d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian *
10d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * Unless required by applicable law or agreed to in writing, software
11d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * distributed under the License is distributed on an "AS IS" BASIS,
12d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * See the License for the specific language governing permissions and
14d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * limitations under the License
15d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian */
16d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
17d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianpackage com.android.server.wm;
18d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
1944f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
2044f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
2144f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static org.junit.Assert.assertEquals;
2244f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static org.junit.Assert.assertFalse;
2344f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static org.junit.Assert.assertNotNull;
2444f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static org.junit.Assert.assertNull;
2544f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwaleimport static org.junit.Assert.assertTrue;
26d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
27d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianimport org.junit.Test;
28d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianimport org.junit.runner.RunWith;
291666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwaleimport org.junit.Before;
301666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwaleimport org.junit.After;
31d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
32d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianimport android.platform.test.annotations.Presubmit;
33d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianimport android.support.test.filters.SmallTest;
34d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianimport android.support.test.runner.AndroidJUnit4;
35d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
36d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian/**
37d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * Tests for the {@link DisplayContent.TaskStackContainers} container in {@link DisplayContent}.
38d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian *
39d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian * Build/Install/Run:
40d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian *  bit FrameworksServicesTests:com.android.server.wm.TaskStackContainersTests
41d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian */
42d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian@SmallTest
43d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian@Presubmit
44d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian@RunWith(AndroidJUnit4.class)
45d276563b38907647ce70940e1e90603826df6ab4Andrii Kulianpublic class TaskStackContainersTests extends WindowTestsBase {
46d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
471666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    private TaskStack mPinnedStack;
481666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale
491666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    @Before
501666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    public void setUp() throws Exception {
511666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        super.setUp();
5244f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwale        mPinnedStack = createStackControllerOnStackOnDisplay(
5344f036fd5a5ea3253f8df979898f720edbc1af82Wale Ogunwale                WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, mDisplayContent).mContainer;
541666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        // Stack should contain visible app window to be considered visible.
551666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        final Task pinnedTask = createTaskInStack(mPinnedStack, 0 /* userId */);
561666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        assertFalse(mPinnedStack.isVisible());
5797d2820cf89eab4ca7e86b4f9022b3f45d8e461fchaviw        final WindowTestUtils.TestAppWindowToken pinnedApp =
5897d2820cf89eab4ca7e86b4f9022b3f45d8e461fchaviw                WindowTestUtils.createTestAppWindowToken(mDisplayContent);
591666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        pinnedTask.addChild(pinnedApp, 0 /* addPos */);
601666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        assertTrue(mPinnedStack.isVisible());
611666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    }
621666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale
631666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    @After
641666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    public void tearDown() throws Exception {
651666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        mPinnedStack.removeImmediately();
661666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    }
671666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale
68d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian    @Test
69d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian    public void testStackPositionChildAt() throws Exception {
70d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        // Test that always-on-top stack can't be moved to position other than top.
7111cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent);
7211cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        final TaskStack stack2 = createTaskStackOnDisplay(mDisplayContent);
73d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
74d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        final WindowContainer taskStackContainer = stack1.getParent();
75d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
76d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        final int stack1Pos = taskStackContainer.mChildren.indexOf(stack1);
77d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        final int stack2Pos = taskStackContainer.mChildren.indexOf(stack2);
781666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        final int pinnedStackPos = taskStackContainer.mChildren.indexOf(mPinnedStack);
79cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        assertGreaterThan(pinnedStackPos, stack2Pos);
80cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        assertGreaterThan(stack2Pos, stack1Pos);
81d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
821666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        taskStackContainer.positionChildAt(WindowContainer.POSITION_BOTTOM, mPinnedStack, false);
83d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        assertEquals(taskStackContainer.mChildren.get(stack1Pos), stack1);
84d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        assertEquals(taskStackContainer.mChildren.get(stack2Pos), stack2);
851666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        assertEquals(taskStackContainer.mChildren.get(pinnedStackPos), mPinnedStack);
86d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
871666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        taskStackContainer.positionChildAt(1, mPinnedStack, false);
88d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        assertEquals(taskStackContainer.mChildren.get(stack1Pos), stack1);
89d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        assertEquals(taskStackContainer.mChildren.get(stack2Pos), stack2);
901666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        assertEquals(taskStackContainer.mChildren.get(pinnedStackPos), mPinnedStack);
91d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian    }
921666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale
93cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian    @Test
94cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian    public void testStackPositionBelowPinnedStack() throws Exception {
95cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        // Test that no stack can be above pinned stack.
9611cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        final TaskStack stack1 = createTaskStackOnDisplay(mDisplayContent);
97cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian
98cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        final WindowContainer taskStackContainer = stack1.getParent();
99cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian
100cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        final int stackPos = taskStackContainer.mChildren.indexOf(stack1);
1011666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        final int pinnedStackPos = taskStackContainer.mChildren.indexOf(mPinnedStack);
102cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        assertGreaterThan(pinnedStackPos, stackPos);
103cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian
104cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        taskStackContainer.positionChildAt(WindowContainer.POSITION_TOP, stack1, false);
105cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        assertEquals(taskStackContainer.mChildren.get(stackPos), stack1);
1061666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        assertEquals(taskStackContainer.mChildren.get(pinnedStackPos), mPinnedStack);
107cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian
108cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        taskStackContainer.positionChildAt(taskStackContainer.mChildren.size() - 1, stack1, false);
109cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian        assertEquals(taskStackContainer.mChildren.get(stackPos), stack1);
1101666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        assertEquals(taskStackContainer.mChildren.get(pinnedStackPos), mPinnedStack);
111cd5dcb8b3d7d8b6759232a02c0a5c8ae21e22e33Andrii Kulian    }
112d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian}
113