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