blob: 1dd9365825cf41a8ab52199a8142aa2647f54c19 [file] [log] [blame]
/*
* 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(this);
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(this);
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(mDisplayContent);
final WindowTestUtils.TestTaskWindowContainerController taskController =
new WindowTestUtils.TestTaskWindowContainerController(stackController1);
final StackWindowController stackController2 =
createStackControllerOnDisplay(mDisplayContent);
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(mDisplayContent);
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(mDisplayContent);
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(mDisplayContent, 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);
}
}