WindowTokenTests.java revision af691c0be7bbfea63e880dd717c51a38a0bc874a
129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu/* 229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Copyright (C) 2016 The Android Open Source Project 329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * 429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * you may not use this file except in compliance with the License. 629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * You may obtain a copy of the License at 729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * 829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * http://www.apache.org/licenses/LICENSE-2.0 929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * 1029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Unless required by applicable law or agreed to in writing, software 1129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 1229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * See the License for the specific language governing permissions and 1429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * limitations under the License 1529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu */ 1629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 1729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiupackage com.android.server.wm; 1829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 1929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport org.junit.Test; 2029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport org.junit.runner.RunWith; 2129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 2229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport android.platform.test.annotations.Presubmit; 2329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport android.support.test.filters.SmallTest; 2429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport android.support.test.runner.AndroidJUnit4; 2529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 2629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; 2729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; 2829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static android.view.WindowManager.LayoutParams.TYPE_TOAST; 2929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.junit.Assert.assertEquals; 3029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.junit.Assert.assertFalse; 3129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.junit.Assert.assertNotNull; 3229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.junit.Assert.assertNull; 3329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.junit.Assert.assertTrue; 3429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiuimport static org.mockito.Mockito.mock; 3529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 3629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu/** 3729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Tests for the {@link WindowToken} class. 3829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * 3929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Build/Install/Run: 4029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * bit FrameworksServicesTests:com.android.server.wm.WindowTokenTests 4129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu */ 4229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu@SmallTest 4329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu@Presubmit 4429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu@RunWith(AndroidJUnit4.class) 4529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiupublic class WindowTokenTests extends WindowTestsBase { 4629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 4729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu @Test 4829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu public void testAddWindow() throws Exception { 4929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowTestUtils.TestWindowToken token = 5029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu new WindowTestUtils.TestWindowToken(0, sDisplayContent); 5129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 5229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(0, token.getWindowsCount()); 5329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 5429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window1 = createWindow(null, TYPE_APPLICATION, token, "window1"); 5529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window11 = createWindow(window1, FIRST_SUB_WINDOW, token, "window11"); 5629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window12 = createWindow(window1, FIRST_SUB_WINDOW, token, "window12"); 5729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window2 = createWindow(null, TYPE_APPLICATION, token, "window2"); 5829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window3 = createWindow(null, TYPE_APPLICATION, token, "window3"); 5929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 6029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu token.addWindow(window1); 6129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // NOTE: Child windows will not be added to the token as window containers can only 6229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // contain/reference their direct children. 6329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu token.addWindow(window11); 6429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu token.addWindow(window12); 6529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu token.addWindow(window2); 6629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu token.addWindow(window3); 6729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 6829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Should not contain the child windows that were added above. 6929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(3, token.getWindowsCount()); 7029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertTrue(token.hasWindow(window1)); 7129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertFalse(token.hasWindow(window11)); 7229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertFalse(token.hasWindow(window12)); 7329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertTrue(token.hasWindow(window2)); 7429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertTrue(token.hasWindow(window3)); 7529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu } 7629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 7729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu @Test 7829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu public void testChildRemoval() throws Exception { 7929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final DisplayContent dc = sDisplayContent; 8029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowTestUtils.TestWindowToken token = new WindowTestUtils.TestWindowToken(0, dc); 8129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 8229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(token, dc.getWindowToken(token.token)); 8329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 8429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window1 = createWindow(null, TYPE_APPLICATION, token, "window1"); 8529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window2 = createWindow(null, TYPE_APPLICATION, token, "window2"); 8629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 8729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu window2.removeImmediately(); 8829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // The token should still be mapped in the display content since it still has a child. 8929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(token, dc.getWindowToken(token.token)); 9029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 9129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu window1.removeImmediately(); 9229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // The token should have been removed from the display content since it no longer has a 9329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // child. 9429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(null, dc.getWindowToken(token.token)); 9529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu } 9629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 9729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu @Test 9829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu public void testAdjustAnimLayer() throws Exception { 9929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowTestUtils.TestWindowToken token = 10029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu new WindowTestUtils.TestWindowToken(0, sDisplayContent); 10129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window1 = createWindow(null, TYPE_APPLICATION, token, "window1"); 10229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window11 = createWindow(window1, FIRST_SUB_WINDOW, token, "window11"); 10329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window12 = createWindow(window1, FIRST_SUB_WINDOW, token, "window12"); 10429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window2 = createWindow(null, TYPE_APPLICATION, token, "window2"); 10529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window3 = createWindow(null, TYPE_APPLICATION, token, "window3"); 10629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 10729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu window2.mLayer = 100; 10829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu window3.mLayer = 200; 10929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 11029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // We assign layers once, to get the base values computed by 11129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // the controller. 11229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu sLayersController.assignWindowLayers(sDisplayContent); 11329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 11429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final int window1StartLayer = window1.mWinAnimator.mAnimLayer; 11529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final int window11StartLayer = window11.mWinAnimator.mAnimLayer; 11629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final int window12StartLayer = window12.mWinAnimator.mAnimLayer; 11729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final int window2StartLayer = window2.mWinAnimator.mAnimLayer; 11829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final int window3StartLayer = window3.mWinAnimator.mAnimLayer; 11929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 12029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Then we set an adjustment, and assign them again, they should 12129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // be offset. 12229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu int adj = token.adj = 50; 12329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu sLayersController.assignWindowLayers(sDisplayContent); 12429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final int highestLayer = token.getHighestAnimLayer(); 12529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 12629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(window1StartLayer + adj, window1.mWinAnimator.mAnimLayer); 12729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(window11StartLayer + adj, window11.mWinAnimator.mAnimLayer); 12829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(window12StartLayer + adj, window12.mWinAnimator.mAnimLayer); 12929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(window2StartLayer + adj, window2.mWinAnimator.mAnimLayer); 13029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(window3StartLayer + adj, window3.mWinAnimator.mAnimLayer); 13129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(window3StartLayer + adj, highestLayer); 13229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu } 13329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 13429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu /** 13529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Test that a window token isn't orphaned by the system when it is requested to be removed. 13629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu * Tokens should only be removed from the system when all their windows are gone. 13729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu */ 13829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu @Test 13929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu public void testTokenRemovalProcess() throws Exception { 14029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowTestUtils.TestWindowToken token = 14129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu new WindowTestUtils.TestWindowToken(TYPE_TOAST, sDisplayContent, 14229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu true /* persistOnEmpty */); 14329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 14429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token is on the display 14529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertNotNull(sDisplayContent.getWindowToken(token.token)); 14629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 14729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window1 = createWindow(null, TYPE_TOAST, token, "window1"); 14829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu final WindowState window2 = createWindow(null, TYPE_TOAST, token, "window2"); 14929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 15029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu sDisplayContent.removeWindowToken(token.token); 15129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token is no longer mapped on the display 15229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertNull(sDisplayContent.getWindowToken(token.token)); 15329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token is still attached to its parent 15429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertNotNull(token.getParent()); 15529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token windows are still around. 15629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(2, token.getWindowsCount()); 15729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 15829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu window1.removeImmediately(); 15929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token is still attached to its parent 16029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertNotNull(token.getParent()); 16129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the other token window is still around. 16229074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(1, token.getWindowsCount()); 16329074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu 16429074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu window2.removeImmediately(); 16529074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token is no-longer attached to its parent 16629074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertNull(token.getParent()); 16729074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu // Verify that the token windows are no longer attached to it. 16829074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu assertEquals(0, token.getWindowsCount()); 16929074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu } 17029074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu} 17129074fe3d2125eeb33db6b9d4425b54e72036661Peter Qiu