144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale/*
244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * Copyright (C) 2016 The Android Open Source Project
344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale *
444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * Licensed under the Apache License, Version 2.0 (the "License");
544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * you may not use this file except in compliance with the License.
644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * You may obtain a copy of the License at
744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale *
844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale *      http://www.apache.org/licenses/LICENSE-2.0
944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale *
1044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * Unless required by applicable law or agreed to in writing, software
1144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * distributed under the License is distributed on an "AS IS" BASIS,
1244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * See the License for the specific language governing permissions and
1444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * limitations under the License
1544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale */
1644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
1744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwalepackage com.android.server.wm;
1844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
1911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwaleimport static android.view.Display.DEFAULT_DISPLAY;
20469395638813abdb7423d0b91d6c42c2b1dcb78aDavid Stevensimport static android.view.View.VISIBLE;
21469395638813abdb7423d0b91d6c42c2b1dcb78aDavid Stevens
22c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwaleimport android.graphics.Rect;
23367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulianimport android.hardware.display.DisplayManagerGlobal;
24367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulianimport android.view.Display;
25367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulianimport android.view.DisplayInfo;
2644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport org.junit.Assert;
2717f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwaleimport org.junit.After;
2844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport org.junit.Before;
299bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggiimport org.mockito.MockitoAnnotations;
3044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
3144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport android.content.Context;
3244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport android.support.test.InstrumentationRegistry;
3344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport android.view.IWindow;
3444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport android.view.WindowManager;
3544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
3644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport static android.app.ActivityManager.StackId.FIRST_DYNAMIC_STACK_ID;
378347163dbb64fb61012c0393163283106a0a351eWinson Chungimport static android.app.ActivityManager.StackId.INVALID_STACK_ID;
3844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport static android.app.AppOpsManager.OP_NONE;
39367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulianimport static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
4044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
41342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwaleimport static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
4244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
433c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
443c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
453c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
463c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
473c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
483c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
493c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
503c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
513c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwaleimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
5244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwaleimport static org.mockito.Mockito.mock;
5344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
549bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggiimport com.android.server.AttributeCache;
5517f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale
5617f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwaleimport java.util.HashSet;
57342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwaleimport java.util.LinkedList;
589bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi
5944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale/**
6044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale * Common base class for window manager unit test classes.
6144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale */
6226c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwaleclass WindowTestsBase {
6344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    static WindowManagerService sWm = null;
6411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    private static final IWindow sIWindow = new TestIWindow();
6511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    private static final Session sMockSession = mock(Session.class);
66310de9e5ee7b57b928e7a6613d61bcfb1c0bf166Bryce Lee    // The default display is removed in {@link #setUp} and then we iterate over all displays to
67310de9e5ee7b57b928e7a6613d61bcfb1c0bf166Bryce Lee    // make sure we don't collide with any existing display. If we run into no other display, the
686272c7f83fd1e78ec610d84621abfd0b87680465Bryce Lee    // added display should be treated as default. This cannot be the default display
6911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    private static int sNextDisplayId = DEFAULT_DISPLAY + 1;
70af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    private static int sNextStackId = FIRST_DYNAMIC_STACK_ID;
7144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
723c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwale    private static boolean sOneTimeSetupDone = false;
7311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    DisplayContent mDisplayContent;
7411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    DisplayInfo mDisplayInfo = new DisplayInfo();
7511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowLayersController mLayersController;
7611cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mWallpaperWindow;
7711cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mImeWindow;
7811cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mImeDialogWindow;
7911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mStatusBarWindow;
8011cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mDockedDividerWindow;
8111cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mNavBarWindow;
8211cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mAppWindow;
8311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mChildAppWindowAbove;
8411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState mChildAppWindowBelow;
8511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    HashSet<WindowState> mCommonWindows;
863c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwale
8744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    @Before
8844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    public void setUp() throws Exception {
8911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        if (!sOneTimeSetupDone) {
9011cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale            sOneTimeSetupDone = true;
9111cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale            MockitoAnnotations.initMocks(this);
923c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwale        }
9311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale
9444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        final Context context = InstrumentationRegistry.getTargetContext();
959bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi        AttributeCache.init(context);
9644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        sWm = TestWindowManagerPolicy.getWindowManagerService(context);
9711cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mLayersController = new WindowLayersController(sWm);
986272c7f83fd1e78ec610d84621abfd0b87680465Bryce Lee
9911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        context.getDisplay().getDisplayInfo(mDisplayInfo);
10011cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mDisplayContent = createNewDisplay();
1019bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi        sWm.mDisplayEnabled = true;
1029bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi        sWm.mDisplayReady = true;
1033c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwale
1043c1170d849dc0af79623dc0f67eda0fbc66a724fWale Ogunwale        // Set-up some common windows.
10511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mCommonWindows = new HashSet();
10611cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mWallpaperWindow = createCommonWindow(null, TYPE_WALLPAPER, "wallpaperWindow");
10711cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mImeWindow = createCommonWindow(null, TYPE_INPUT_METHOD, "mImeWindow");
10811cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        sWm.mInputMethodWindow = mImeWindow;
10911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mImeDialogWindow = createCommonWindow(null, TYPE_INPUT_METHOD_DIALOG, "mImeDialogWindow");
11011cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mStatusBarWindow = createCommonWindow(null, TYPE_STATUS_BAR, "mStatusBarWindow");
11111cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mNavBarWindow = createCommonWindow(null, TYPE_NAVIGATION_BAR, "mNavBarWindow");
11211cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mDockedDividerWindow = createCommonWindow(null, TYPE_DOCK_DIVIDER, "mDockedDividerWindow");
11311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mAppWindow = createCommonWindow(null, TYPE_BASE_APPLICATION, "mAppWindow");
11411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mChildAppWindowAbove = createCommonWindow(mAppWindow, TYPE_APPLICATION_ATTACHED_DIALOG,
11511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                "mChildAppWindowAbove");
11611cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mChildAppWindowBelow = createCommonWindow(mAppWindow, TYPE_APPLICATION_MEDIA_OVERLAY,
11711cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                "mChildAppWindowBelow");
118153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi
119153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi        // Adding a display will cause freezing the display. Make sure to wait until it's unfrozen
120153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi        // to not run into race conditions with the tests.
121153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi        waitUntilHandlersIdle();
12217f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    }
12317f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale
12417f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    @After
12517f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    public void tearDown() throws Exception {
126342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwale        final LinkedList<WindowState> nonCommonWindows = new LinkedList();
127027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale
128027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale        synchronized (sWm.mWindowMap) {
129027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale            sWm.mRoot.forAllWindows(w -> {
130027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale                if (!mCommonWindows.contains(w)) {
131027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale                    nonCommonWindows.addLast(w);
132027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale                }
133027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale            }, true /* traverseTopToBottom */);
134027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale
135027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale            while (!nonCommonWindows.isEmpty()) {
136027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale                nonCommonWindows.pollLast().removeImmediately();
13717f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale            }
138342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwale
139027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale            mDisplayContent.removeImmediately();
140027f4753bcdbef5a830ed877f974701727e98d19Wale Ogunwale            sWm.mInputMethodTarget = null;
141342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwale        }
142153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi
143153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi        // Wait until everything is really cleaned up.
144153badbf417c3b32fb2702c723185882ca1b3ba2Jorim Jaggi        waitUntilHandlersIdle();
14517f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    }
14617f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale
14711cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    private WindowState createCommonWindow(WindowState parent, int type, String name) {
14817f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale        final WindowState win = createWindow(parent, type, name);
14911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        mCommonWindows.add(win);
150342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwale        // Prevent common windows from been IMe targets
151342479581e113a6cf05f6e1d6470a86ad6032bcbWale Ogunwale        win.mAttrs.flags |= FLAG_NOT_FOCUSABLE;
15217f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale        return win;
15344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    }
15444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
15544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    /** Asserts that the first entry is greater than the second entry. */
15644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    void assertGreaterThan(int first, int second) throws Exception {
15744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        Assert.assertTrue("Excepted " + first + " to be greater than " + second, first > second);
15844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    }
15944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
1609bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi    /**
1619bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi     * Waits until the main handler for WM has processed all messages.
1629bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi     */
163ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    void waitUntilHandlersIdle() {
1649bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi        sWm.mH.runWithScissors(() -> { }, 0);
165ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        sWm.mAnimationHandler.runWithScissors(() -> { }, 0);
1669bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi    }
1679bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi
16811cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    private WindowToken createWindowToken(DisplayContent dc, int stackId, int type) {
16944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        if (type < FIRST_APPLICATION_WINDOW || type > LAST_APPLICATION_WINDOW) {
170af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return new WindowTestUtils.TestWindowToken(type, dc);
17144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        }
17244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
1738347163dbb64fb61012c0393163283106a0a351eWinson Chung        final TaskStack stack = stackId == INVALID_STACK_ID
1748347163dbb64fb61012c0393163283106a0a351eWinson Chung                ? createTaskStackOnDisplay(dc)
1758347163dbb64fb61012c0393163283106a0a351eWinson Chung                : createStackControllerOnStackOnDisplay(stackId, dc).mContainer;
176d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian        final Task task = createTaskInStack(stack, 0 /* userId */);
177af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        final WindowTestUtils.TestAppWindowToken token = new WindowTestUtils.TestAppWindowToken(dc);
17872919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale        task.addChild(token, 0);
17944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        return token;
18044fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    }
18144fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
18211cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState createWindow(WindowState parent, int type, String name) {
183805d9ecc476134ffafc85a07b05e94a14b1d398cWale Ogunwale        return (parent == null)
18411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                ? createWindow(parent, type, mDisplayContent, name)
185805d9ecc476134ffafc85a07b05e94a14b1d398cWale Ogunwale                : createWindow(parent, type, parent.mToken, name);
186805d9ecc476134ffafc85a07b05e94a14b1d398cWale Ogunwale    }
187805d9ecc476134ffafc85a07b05e94a14b1d398cWale Ogunwale
18811cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState createWindowOnStack(WindowState parent, int stackId, int type,
1898347163dbb64fb61012c0393163283106a0a351eWinson Chung            DisplayContent dc, String name) {
1908347163dbb64fb61012c0393163283106a0a351eWinson Chung        final WindowToken token = createWindowToken(dc, stackId, type);
1918347163dbb64fb61012c0393163283106a0a351eWinson Chung        return createWindow(parent, type, token, name);
1928347163dbb64fb61012c0393163283106a0a351eWinson Chung    }
1938347163dbb64fb61012c0393163283106a0a351eWinson Chung
19402886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    WindowState createAppWindow(Task task, int type, String name) {
19511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        final AppWindowToken token = new WindowTestUtils.TestAppWindowToken(mDisplayContent);
19602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        task.addChild(token, 0);
19702886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        return createWindow(null, type, token, name);
19802886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    }
19902886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
20011cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name) {
2018347163dbb64fb61012c0393163283106a0a351eWinson Chung        final WindowToken token = createWindowToken(dc, INVALID_STACK_ID, type);
20244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        return createWindow(parent, type, token, name);
20344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    }
20444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
20511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    WindowState createWindow(WindowState parent, int type, DisplayContent dc, String name,
20617f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale            boolean ownerCanAddInternalSystemWindow) {
2078347163dbb64fb61012c0393163283106a0a351eWinson Chung        final WindowToken token = createWindowToken(dc, INVALID_STACK_ID, type);
20817f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale        return createWindow(parent, type, token, name, ownerCanAddInternalSystemWindow);
20917f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    }
21017f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale
2119bafc7150ea41758cf40ba60eb90deb62217fc34Jorim Jaggi    static WindowState createWindow(WindowState parent, int type, WindowToken token, String name) {
21217f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale        return createWindow(parent, type, token, name, false /* ownerCanAddInternalSystemWindow */);
21317f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    }
21417f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale
21517f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale    static WindowState createWindow(WindowState parent, int type, WindowToken token, String name,
21617f175ca1a75d5a4864b88126f5d2a59935d52fdWale Ogunwale            boolean ownerCanAddInternalSystemWindow) {
21744fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(type);
21844fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        attrs.setTitle(name);
21944fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale
2208e44f6c46822028a853c41610d2289e299987af0Wale Ogunwale        final WindowState w = new WindowState(sWm, sMockSession, sIWindow, token, parent, OP_NONE,
221469395638813abdb7423d0b91d6c42c2b1dcb78aDavid Stevens                0, attrs, VISIBLE, 0, ownerCanAddInternalSystemWindow);
22244fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        // TODO: Probably better to make this call in the WindowState ctor to avoid errors with
22344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        // adding it to the token...
22444fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        token.addWindow(w);
22544fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale        return w;
22644fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale    }
2273d0bfd9530bc51c52aec027eaf6d0dba918efc99Wale Ogunwale
228d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian    /** Creates a {@link TaskStack} and adds it to the specified {@link DisplayContent}. */
22911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    TaskStack createTaskStackOnDisplay(DisplayContent dc) {
2301666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        return createStackControllerOnDisplay(dc).mContainer;
2311666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale    }
2321666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale
23311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    StackWindowController createStackControllerOnDisplay(DisplayContent dc) {
2341666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        final int stackId = ++sNextStackId;
2358347163dbb64fb61012c0393163283106a0a351eWinson Chung        return createStackControllerOnStackOnDisplay(stackId, dc);
2368347163dbb64fb61012c0393163283106a0a351eWinson Chung    }
2378347163dbb64fb61012c0393163283106a0a351eWinson Chung
23811cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    StackWindowController createStackControllerOnStackOnDisplay(int stackId,
2398347163dbb64fb61012c0393163283106a0a351eWinson Chung            DisplayContent dc) {
2401666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale        return new StackWindowController(stackId, null, dc.getDisplayId(),
2411666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale                true /* onTop */, new Rect(), sWm);
242d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian    }
243d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
244367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian    /** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
24511cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale    Task createTaskInStack(TaskStack stack, int userId) {
246af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        return WindowTestUtils.createTaskInStack(sWm, stack, userId);
247d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian    }
248d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian
249367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian    /** Creates a {@link DisplayContent} and adds it to the system. */
250367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian    DisplayContent createNewDisplay() {
251367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian        final int displayId = sNextDisplayId++;
252367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian        final Display display = new Display(DisplayManagerGlobal.getInstance(), displayId,
25311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                mDisplayInfo, DEFAULT_DISPLAY_ADJUSTMENTS);
25411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        return new DisplayContent(display, sWm, mLayersController, new WallpaperController(sWm));
255367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian    }
256367ff7fd5251790ad8dc086bd386be8cba1dda5cAndrii Kulian
257af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /** Creates a {@link com.android.server.wm.WindowTestUtils.TestWindowState} */
258af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    WindowTestUtils.TestWindowState createWindowState(WindowManager.LayoutParams attrs,
259af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            WindowToken token) {
260af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        return new WindowTestUtils.TestWindowState(sWm, sMockSession, sIWindow, attrs, token);
261c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale    }
262c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale
26344fbdf5b1e13398e35d4bafb7236d194a51ee7afWale Ogunwale}
264