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