| /* |
| * Copyright (C) 2017 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 android.platform.test.annotations.Presubmit; |
| import android.support.test.filters.SmallTest; |
| import android.support.test.runner.AndroidJUnit4; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNotNull; |
| import static org.junit.Assert.assertNull; |
| import static org.junit.Assert.assertTrue; |
| |
| /** |
| * Test class for {@link TaskWindowContainerController}. |
| * |
| * Build/Install/Run: |
| * bit FrameworksServicesTests:com.android.server.wm.TaskWindowContainerControllerTests |
| */ |
| @SmallTest |
| @Presubmit |
| @RunWith(AndroidJUnit4.class) |
| public class TaskWindowContainerControllerTests extends WindowTestsBase { |
| |
| @Test |
| public void testRemoveContainer() throws Exception { |
| final WindowTestUtils.TestTaskWindowContainerController taskController = |
| new WindowTestUtils.TestTaskWindowContainerController(); |
| final WindowTestUtils.TestAppWindowContainerController appController = |
| new WindowTestUtils.TestAppWindowContainerController(taskController); |
| |
| taskController.removeContainer(); |
| // Assert that the container was removed. |
| assertNull(taskController.mContainer); |
| assertNull(appController.mContainer); |
| } |
| |
| @Test |
| public void testRemoveContainer_deferRemoval() throws Exception { |
| final WindowTestUtils.TestTaskWindowContainerController taskController = |
| new WindowTestUtils.TestTaskWindowContainerController(); |
| final WindowTestUtils.TestAppWindowContainerController appController = |
| new WindowTestUtils.TestAppWindowContainerController(taskController); |
| |
| final WindowTestUtils.TestTask task = (WindowTestUtils.TestTask) taskController.mContainer; |
| final AppWindowToken app = appController.mContainer; |
| task.mShouldDeferRemoval = true; |
| |
| taskController.removeContainer(); |
| // For the case of deferred removal the task controller will no longer be connected to the |
| // container, but the app controller will still be connected to the its container until |
| // the task window container is removed. |
| assertNull(taskController.mContainer); |
| assertNull(task.getController()); |
| assertNotNull(appController.mContainer); |
| assertNotNull(app.getController()); |
| |
| task.removeImmediately(); |
| assertNull(appController.mContainer); |
| assertNull(app.getController()); |
| } |
| |
| @Test |
| public void testReparent() throws Exception { |
| final StackWindowController stackController1 = |
| createStackControllerOnDisplay(sDisplayContent); |
| final WindowTestUtils.TestTaskWindowContainerController taskController = |
| new WindowTestUtils.TestTaskWindowContainerController(stackController1); |
| final StackWindowController stackController2 = |
| createStackControllerOnDisplay(sDisplayContent); |
| final WindowTestUtils.TestTaskWindowContainerController taskController2 = |
| new WindowTestUtils.TestTaskWindowContainerController(stackController2); |
| |
| boolean gotException = false; |
| try { |
| taskController.reparent(stackController1, 0, false/* moveParents */); |
| } catch (IllegalArgumentException e) { |
| gotException = true; |
| } |
| assertTrue("Should not be able to reparent to the same parent", gotException); |
| |
| final StackWindowController stackController3 = |
| createStackControllerOnDisplay(sDisplayContent); |
| stackController3.setContainer(null); |
| gotException = false; |
| try { |
| taskController.reparent(stackController3, 0, false/* moveParents */); |
| } catch (IllegalArgumentException e) { |
| gotException = true; |
| } |
| assertTrue("Should not be able to reparent to a stack that doesn't have a container", |
| gotException); |
| |
| taskController.reparent(stackController2, 0, false/* moveParents */); |
| assertEquals(stackController2.mContainer, taskController.mContainer.getParent()); |
| assertEquals(0, ((WindowTestUtils.TestTask) taskController.mContainer).positionInParent()); |
| assertEquals(1, ((WindowTestUtils.TestTask) taskController2.mContainer).positionInParent()); |
| } |
| |
| @Test |
| public void testReparent_BetweenDisplays() throws Exception { |
| // Create first stack on primary display. |
| final StackWindowController stack1Controller = |
| createStackControllerOnDisplay(sDisplayContent); |
| final TaskStack stack1 = stack1Controller.mContainer; |
| final WindowTestUtils.TestTaskWindowContainerController taskController = |
| new WindowTestUtils.TestTaskWindowContainerController(stack1Controller); |
| final WindowTestUtils.TestTask task1 = (WindowTestUtils.TestTask) taskController.mContainer; |
| task1.mOnDisplayChangedCalled = false; |
| assertEquals(sDisplayContent, stack1.getDisplayContent()); |
| |
| // Create second display and put second stack on it. |
| final DisplayContent dc = createNewDisplay(); |
| final StackWindowController stack2Controller = createStackControllerOnDisplay(dc); |
| final TaskStack stack2 = stack2Controller.mContainer; |
| final WindowTestUtils.TestTaskWindowContainerController taskController2 = |
| new WindowTestUtils.TestTaskWindowContainerController(stack2Controller); |
| final WindowTestUtils.TestTask task2 = |
| (WindowTestUtils.TestTask) taskController2.mContainer; |
| |
| // Reparent and check state |
| taskController.reparent(stack2Controller, 0, false /* moveParents */); |
| assertEquals(stack2, task1.getParent()); |
| assertEquals(0, task1.positionInParent()); |
| assertEquals(1, task2.positionInParent()); |
| assertTrue(task1.mOnDisplayChangedCalled); |
| } |
| } |