WindowTestsBase.java revision 7cd7c2d333c1b4f77a5b1a9f08cbaaebb242700c
13a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2016 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpackage com.android.server.wm;
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentimport android.content.res.Configuration;
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.graphics.Rect;
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.Binder;
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.view.IApplicationToken;
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport org.junit.Assert;
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport org.junit.Before;
257562408b2261d38415453378b6188f74fda99d88Mathias Agopian
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.content.Context;
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.os.IBinder;
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.support.test.InstrumentationRegistry;
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.view.IWindow;
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport android.view.WindowManager;
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.app.ActivityManager.StackId.FIRST_DYNAMIC_STACK_ID;
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.app.AppOpsManager.OP_NONE;
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
355876f2f28f31c1bd99864ba3bb1590e3d6765018Glenn Kastenimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.content.res.Configuration.EMPTY;
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static com.android.server.wm.WindowContainer.POSITION_TOP;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectimport static org.mockito.Mockito.mock;
50c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
51c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent/**
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Common base class for window manager unit test classes.
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
54c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurentclass WindowTestsBase {
55c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    static WindowManagerService sWm = null;
56c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    private final IWindow mIWindow = new TestIWindow();
57c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    private final Session mMockSession = mock(Session.class);
58c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    static int sNextStackId = FIRST_DYNAMIC_STACK_ID;
59c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent    private static int sNextTaskId = 0;
60c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
61f0ee6f4055e26fb35d9c526a596668a4dc9da5baEric Laurent    private static boolean sOneTimeSetupDone = false;
62342e9cf388cceb807def720e40e8b0a217f4bcaaEric Laurent    static DisplayContent sDisplayContent;
6305bca2fde53bfe3063d2a0a877f2b6bfdd6052cfEric Laurent    static WindowLayersController sLayersController;
64be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    static WindowState sWallpaperWindow;
65be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    static WindowState sImeWindow;
663a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    static WindowState sImeDialogWindow;
673a34befc6fb04a4945a849e8bda8b84e4bf973feMarco Nelissen    static WindowState sStatusBarWindow;
68be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    static WindowState sDockedDividerWindow;
69ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent    static WindowState sNavBarWindow;
70be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    static WindowState sAppWindow;
71de070137f11d346fba77605bd76a44c040a618fcEric Laurent    static WindowState sChildAppWindowAbove;
72a4c5a550e2a3bc237179b8684e51718e05894492Eric Laurent    static WindowState sChildAppWindowBelow;
73cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten
74cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    @Before
75cc0f1cfb69ce8b8985fc2c0984847a06a13ad22dGlenn Kasten    public void setUp() throws Exception {
764182c4e2a07e2441fcd5c22eaff0ddfe7f826f61Glenn Kasten        if (sOneTimeSetupDone) {
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return;
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sOneTimeSetupDone = true;
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        final Context context = InstrumentationRegistry.getTargetContext();
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sWm = TestWindowManagerPolicy.getWindowManagerService(context);
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sLayersController = new WindowLayersController(sWm);
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sDisplayContent = new DisplayContent(context.getDisplay(), sWm, sLayersController,
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                new WallpaperController(sWm));
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sWm.mRoot.addChild(sDisplayContent, 0);
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        // Set-up some common windows.
88fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        sWallpaperWindow = createWindow(null, TYPE_WALLPAPER, sDisplayContent, "wallpaperWindow");
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sImeWindow = createWindow(null, TYPE_INPUT_METHOD, sDisplayContent, "sImeWindow");
9058f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        sImeDialogWindow =
91dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten                createWindow(null, TYPE_INPUT_METHOD_DIALOG, sDisplayContent, "sImeDialogWindow");
92e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten        sStatusBarWindow = createWindow(null, TYPE_STATUS_BAR, sDisplayContent, "sStatusBarWindow");
93e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        sNavBarWindow =
9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                createWindow(null, TYPE_NAVIGATION_BAR, sDisplayContent, "sNavBarWindow");
9572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        sDockedDividerWindow =
963acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten                createWindow(null, TYPE_DOCK_DIVIDER, sDisplayContent, "sDockedDividerWindow");
97be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        sAppWindow = createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "sAppWindow");
98d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten        sChildAppWindowAbove = createWindow(sAppWindow,
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                TYPE_APPLICATION_ATTACHED_DIALOG, sAppWindow.mToken, "sChildAppWindowAbove");
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        sChildAppWindowBelow = createWindow(sAppWindow,
10189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                TYPE_APPLICATION_MEDIA_OVERLAY, sAppWindow.mToken, "sChildAppWindowBelow");
1025841db78dff14898538200287d246577b1fc37e2Eric Laurent    }
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
104fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    /** Asserts that the first entry is greater than the second entry. */
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void assertGreaterThan(int first, int second) throws Exception {
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Assert.assertTrue("Excepted " + first + " to be greater than " + second, first > second);
1070d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi    }
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
109b26e3e9f2ab0334bff21a4fa4851dbf6e57fba5dGlenn Kasten    private WindowToken createWindowToken(DisplayContent dc, int type) {
110e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten        if (type < FIRST_APPLICATION_WINDOW || type > LAST_APPLICATION_WINDOW) {
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return new TestWindowToken(type, dc);
11272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        }
1133acbd053c842e76e1a40fc8a0bf62de87eebf00fGlenn Kasten
114be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        final TaskStack stack = createTaskStackOnDisplay(dc);
115be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        final Task task = createTaskInStack(stack, 0 /* userId */);
116be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        final TestAppWindowToken token = new TestAppWindowToken(dc);
117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        task.addChild(token, 0);
118be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return token;
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block    WindowState createWindow(WindowState parent, int type, String name) {
1225841db78dff14898538200287d246577b1fc37e2Eric Laurent        return (parent == null)
123e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                ? createWindow(parent, type, sDisplayContent, name)
124e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten                : createWindow(parent, type, parent.mToken, name);
125e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten    }
126e0b07179a48ee50fda931d2aa1b3c751d167e4d7Glenn Kasten
127be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    WindowState createAppWindow(Task task, int type, String name) {
128be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        final AppWindowToken token = new TestAppWindowToken(sDisplayContent);
129be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        task.addChild(token, 0);
130be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        return createWindow(null, type, token, name);
131d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten    }
1325841db78dff14898538200287d246577b1fc37e2Eric Laurent
1335841db78dff14898538200287d246577b1fc37e2Eric Laurent    WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name) {
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        final WindowToken token = createWindowToken(dc, type);
135507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten        return createWindow(parent, type, token, name);
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1385841db78dff14898538200287d246577b1fc37e2Eric Laurent    WindowState createWindow(WindowState parent, int type, WindowToken token, String name) {
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        attrs.setTitle(name);
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        final WindowState w = new WindowState(sWm, mMockSession, mIWindow, token, parent, OP_NONE,
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                0, attrs, 0, 0);
14458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        // TODO: Probably better to make this call in the WindowState ctor to avoid errors with
14528b76b334f92a15a2be3cc9e2f7d229a3275d1acGlenn Kasten        // adding it to the token...
146e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten        token.addWindow(w);
147eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        return w;
1481879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten    }
149be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /** Creates a {@link TaskStack} and adds it to the specified {@link DisplayContent}. */
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    TaskStack createTaskStackOnDisplay(DisplayContent dc) {
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        final int stackId = sNextStackId++;
1535841db78dff14898538200287d246577b1fc37e2Eric Laurent        dc.addStackToDisplay(stackId, true);
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return sWm.mStackIdToStack.get(stackId);
15572ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    }
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
1580d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi    Task createTaskInStack(TaskStack stack, int userId) {
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        final Task newTask = new Task(sNextTaskId++, stack, userId, sWm, null, EMPTY, false, 0,
160eeca32671896739e84050da5992d5f151a1629deGlenn Kasten                false, null);
161eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        stack.addTask(newTask, POSITION_TOP);
1621879fff068422852c1483dcf8365c2ff0e2fadfcGlenn Kasten        return newTask;
163be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    }
164be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
165be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    /* Used so we can gain access to some protected members of the {@link WindowToken} class */
166be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent    class TestWindowToken extends WindowToken {
167be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
1685841db78dff14898538200287d246577b1fc37e2Eric Laurent        TestWindowToken(int type, DisplayContent dc) {
1695841db78dff14898538200287d246577b1fc37e2Eric Laurent            this(type, dc, false /* persistOnEmpty */);
17029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        }
1715841db78dff14898538200287d246577b1fc37e2Eric Laurent
172eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        TestWindowToken(int type, DisplayContent dc, boolean persistOnEmpty) {
173eeca32671896739e84050da5992d5f151a1629deGlenn Kasten            super(sWm, mock(IBinder.class), type, persistOnEmpty, dc);
174eeca32671896739e84050da5992d5f151a1629deGlenn Kasten        }
175eeca32671896739e84050da5992d5f151a1629deGlenn Kasten
176be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        int getWindowsCount() {
177be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent            return mChildren.size();
178be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent        }
179be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent
1805841db78dff14898538200287d246577b1fc37e2Eric Laurent        boolean hasWindow(WindowState w) {
1815841db78dff14898538200287d246577b1fc37e2Eric Laurent            return mChildren.contains(w);
1825841db78dff14898538200287d246577b1fc37e2Eric Laurent        }
183507b2860cfe0bb4a712064f1c503caa9a7325886Glenn Kasten    }
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /** Used so we can gain access to some protected members of the {@link AppWindowToken} class. */
1865841db78dff14898538200287d246577b1fc37e2Eric Laurent    class TestAppWindowToken extends AppWindowToken {
18789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TestAppWindowToken(DisplayContent dc) {
18972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            super(sWm, null, false, dc);
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        int getWindowsCount() {
19372ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten            return mChildren.size();
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        boolean hasWindow(WindowState w) {
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return mChildren.contains(w);
19872ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        }
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        WindowState getFirstChild() {
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return mChildren.getFirst();
20272ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        }
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20458f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten        WindowState getLastChild() {
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return mChildren.getLast();
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
20772ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    }
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /* Used so we can gain access to some protected members of the {@link Task} class */
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class TestTask extends Task {
21172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        boolean mShouldDeferRemoval = false;
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        boolean mOnDisplayChangedCalled = false;
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TestTask(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
21672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten                Configuration overrideConfig, boolean isOnTopLauncher, int resizeMode,
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                boolean homeTask, TaskWindowContainerController controller) {
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super(taskId, stack, userId, service, bounds, overrideConfig, isOnTopLauncher,
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    resizeMode, homeTask, controller);
22072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        }
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        boolean shouldDeferRemoval() {
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return mShouldDeferRemoval;
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        int positionInParent() {
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return getParent().mChildren.indexOf(this);
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        @Override
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        void onDisplayChanged(DisplayContent dc) {
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super.onDisplayChanged(dc);
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mOnDisplayChangedCalled = true;
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    /**
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * Used so we can gain access to some protected members of {@link TaskWindowContainerController}
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     * class.
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project     */
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class TestTaskWindowContainerController extends TaskWindowContainerController {
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TestTaskWindowContainerController() {
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            this(createTaskStackOnDisplay(sDisplayContent).mStackId);
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TestTaskWindowContainerController(int stackId) {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super(sNextTaskId++, stackId, 0 /* userId */, null /* bounds */,
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    EMPTY /* overrideConfig*/, RESIZE_MODE_UNRESIZEABLE, false /* homeTask*/,
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    false /* isOnTopLauncher */, true /* toTop*/, true /* showForAllUsers */);
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        @Override
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TestTask createTask(int taskId, TaskStack stack, int userId, Rect bounds,
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                Configuration overrideConfig, int resizeMode, boolean homeTask,
25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                boolean isOnTopLauncher) {
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return new TestTask(taskId, stack, userId, mService, bounds, overrideConfig,
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    isOnTopLauncher, resizeMode, homeTask, this);
25972ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        }
26072ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten    }
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class TestAppWindowContainerController extends AppWindowContainerController {
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
264fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        final IApplicationToken mToken;
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        TestAppWindowContainerController(TestTaskWindowContainerController taskController) {
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            this(taskController, new TestIApplicationToken());
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        TestAppWindowContainerController(TestTaskWindowContainerController taskController,
271fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                IApplicationToken token) {
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super(taskController, token, null /* listener */, 0 /* index */,
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    SCREEN_ORIENTATION_UNSPECIFIED, true /* fullscreen */,
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    true /* showForAllUsers */, 0 /* configChanges */, false /* voiceInteraction */,
275fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten                    false /* launchTaskBehind */, false /* alwaysFocusable */,
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    0 /* targetSdkVersion */, 0 /* rotationAnimationHint */,
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project                    0 /* inputDispatchingTimeoutNanos */, sWm);
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mToken = token;
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28172ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten
28289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class TestIApplicationToken implements IApplicationToken {
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        private final Binder mBinder = new Binder();
285fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        @Override
28672ef00de10fa95bfcb948ed88ab9b7a177ed0b48Glenn Kasten        public IBinder asBinder() {
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return mBinder;
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
291fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten    /** Used to track resize reports. */
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    class TestWindowState extends WindowState {
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        boolean resizeReported;
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
295fff6d715a8db0daf08a50634f242c40268de3d49Glenn Kasten        TestWindowState(WindowManager.LayoutParams attrs, WindowToken token) {
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super(sWm, mMockSession, mIWindow, token, null, OP_NONE, 0, attrs, 0, 0);
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        @Override
300f78aee70d15daf4690de7e7b4983ee68b0d1381dGlenn Kasten        void reportResized() {
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super.reportResized();
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            resizeReported = true;
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
30489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
305c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent        @Override
30689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        public boolean isGoneForLayoutLw() {
30789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return false;
30889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
309c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
31089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        @Override
31189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        void updateResizingWindowIfNeeded() {
31289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            // Used in AppWindowTokenTests#testLandscapeSeascapeRotationRelayout to deceive
313c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            // the system that it can actually update the window.
314c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent            boolean hadSurface = mHasSurface;
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mHasSurface = true;
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            super.updateResizingWindowIfNeeded();
318c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent
31989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            mHasSurface = hadSurface;
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
322c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent}
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project