1af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee/*
2af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * Copyright (C) 2017 The Android Open Source Project
3af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee *
4af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * Licensed under the Apache License, Version 2.0 (the "License");
5af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * you may not use this file except in compliance with the License.
6af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * You may obtain a copy of the License at
7af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee *
8af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee *      http://www.apache.org/licenses/LICENSE-2.0
9af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee *
10af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * Unless required by applicable law or agreed to in writing, software
11af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * distributed under the License is distributed on an "AS IS" BASIS,
12af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * See the License for the specific language governing permissions and
14af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * limitations under the License
15af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee */
16af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
17af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leepackage com.android.server.wm;
18af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
19af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.app.ActivityManager;
20af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.content.Context;
21af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.content.res.Configuration;
22af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.graphics.Rect;
23af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.os.Binder;
24af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.os.IBinder;
25af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.view.IApplicationToken;
26af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.view.IWindow;
27af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport android.view.WindowManager;
28af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
29af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport static android.app.AppOpsManager.OP_NONE;
30af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
31af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
32af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport static android.content.res.Configuration.EMPTY;
33af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport static com.android.server.wm.WindowContainer.POSITION_TOP;
34af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leeimport static org.mockito.Mockito.mock;
35af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
36af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee/**
37af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * A collection of static functions that can be referenced by other test packages to provide access
38af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee * to WindowManager related test functionality.
39af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee */
40af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Leepublic class WindowTestUtils {
41af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static int sNextTaskId = 0;
42af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
43af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /**
44af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     * Retrieves an instance of {@link WindowManagerService}, creating it if necessary.
45af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     */
46af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static WindowManagerService getWindowManagerService(Context context) {
47af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        return TestWindowManagerPolicy.getWindowManagerService(context);
48af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
49af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
50af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /**
5104ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee     * Retrieves an instance of a mock {@link WindowManagerService}.
5204ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee     */
5304ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee    public static WindowManagerService getMockWindowManagerService() {
5404ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee        return mock(WindowManagerService.class);
5504ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee    }
5604ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee
5704ab3466fabb7244660adf54740a4f60874b02a1Bryce Lee    /**
58af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     * Creates a mock instance of {@link StackWindowController}.
59af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     */
60af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static StackWindowController createMockStackWindowContainerController() {
61af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        StackWindowController controller = mock(StackWindowController.class);
62af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        controller.mContainer = mock(TestTaskStack.class);
63af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        return controller;
64af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
65af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
66af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /** Creates a {@link Task} and adds it to the specified {@link TaskStack}. */
67af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static Task createTaskInStack(WindowManagerService service, TaskStack stack,
68af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            int userId) {
692f569ed618f0eb834efb7a27c57d8ca43bcf4f1bWale Ogunwale        final Task newTask = new Task(sNextTaskId++, stack, userId, service, null, EMPTY, 0, false,
70af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                false, new ActivityManager.TaskDescription(), null);
71af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        stack.addTask(newTask, POSITION_TOP);
72af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        return newTask;
73af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
74af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
75af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /**
76af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     * An extension of {@link TestTaskStack}, which overrides package scoped methods that would not
77af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     * normally be mocked out.
78af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     */
79af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestTaskStack extends TaskStack {
80af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestTaskStack(WindowManagerService service, int stackId) {
81af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super(service, stackId);
82af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
83af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
84af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
85af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        void addTask(Task task, int position, boolean showForAllUsers, boolean moveParents) {
86af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            // Do nothing.
87af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
88af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
89af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
90af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /** Used so we can gain access to some protected members of the {@link AppWindowToken} class. */
91af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestAppWindowToken extends AppWindowToken {
92af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
93af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestAppWindowToken(DisplayContent dc) {
942f569ed618f0eb834efb7a27c57d8ca43bcf4f1bWale Ogunwale            super(dc.mService, new IApplicationToken.Stub() {}, false, dc, true /* fillsParent */,
95af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    null /* overrideConfig */, null /* bounds */);
96af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
97af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
98af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestAppWindowToken(WindowManagerService service, IApplicationToken token,
99af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
100af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
101af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                int rotationAnimationHint, int configChanges, boolean launchTaskBehind,
102af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean alwaysFocusable, AppWindowContainerController controller,
103af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                Configuration overrideConfig, Rect bounds) {
104af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super(service, token, voiceInteraction, dc, inputDispatchingTimeoutNanos, fullscreen,
105af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    showForAllUsers, targetSdk, orientation, rotationAnimationHint, configChanges,
106af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    launchTaskBehind, alwaysFocusable, controller, overrideConfig, bounds);
107af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
108af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
109af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        int getWindowsCount() {
110af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mChildren.size();
111af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
112af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
113af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean hasWindow(WindowState w) {
114af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mChildren.contains(w);
115af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
116af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
117af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        WindowState getFirstChild() {
118612bb885bcef87034070e8e3bfc0b0e953c0f606Jorim Jaggi            return mChildren.peekFirst();
119af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
120af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
121af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        WindowState getLastChild() {
122612bb885bcef87034070e8e3bfc0b0e953c0f606Jorim Jaggi            return mChildren.peekLast();
123af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
124af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
125af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        int positionInParent() {
126af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return getParent().mChildren.indexOf(this);
127af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
128af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
129af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
130af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /* Used so we can gain access to some protected members of the {@link WindowToken} class */
131af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestWindowToken extends WindowToken {
132af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        int adj = 0;
133af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
134af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestWindowToken(int type, DisplayContent dc) {
135af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            this(type, dc, false /* persistOnEmpty */);
136af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
137af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
138af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestWindowToken(int type, DisplayContent dc, boolean persistOnEmpty) {
13911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale            super(dc.mService, mock(IBinder.class), type, persistOnEmpty, dc,
140af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    false /* ownerCanManageAppTokens */);
141af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
142af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
143af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        int getWindowsCount() {
144af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mChildren.size();
145af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
146af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
147af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean hasWindow(WindowState w) {
148af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mChildren.contains(w);
149af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
150af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
151af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
152af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        int getAnimLayerAdjustment() {
153af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return adj;
154af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
155af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
156af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
157af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /* Used so we can gain access to some protected members of the {@link Task} class */
158af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestTask extends Task {
159af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean mShouldDeferRemoval = false;
160af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean mOnDisplayChangedCalled = false;
161af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        private boolean mUseLocalIsAnimating = false;
162af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        private boolean mIsAnimating = false;
163af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
164af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestTask(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
165af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
166af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean homeTask, TaskWindowContainerController controller) {
167af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super(taskId, stack, userId, service, bounds, overrideConfig, resizeMode,
168af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    supportsPictureInPicture, homeTask, new ActivityManager.TaskDescription(),
169af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    controller);
170af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
171af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
172af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean shouldDeferRemoval() {
173af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mShouldDeferRemoval;
174af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
175af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
176af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        int positionInParent() {
177af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return getParent().mChildren.indexOf(this);
178af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
179af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
180af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
181af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        void onDisplayChanged(DisplayContent dc) {
182af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super.onDisplayChanged(dc);
183af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            mOnDisplayChangedCalled = true;
184af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
185af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
186af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
187af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean isAnimating() {
188af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mUseLocalIsAnimating ? mIsAnimating : super.isAnimating();
189af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
190af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
191af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        void setLocalIsAnimating(boolean isAnimating) {
192af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            mUseLocalIsAnimating = true;
193af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            mIsAnimating = isAnimating;
194af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
195af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
196af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
197af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /**
198af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     * Used so we can gain access to some protected members of {@link TaskWindowContainerController}
199af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     * class.
200af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee     */
201af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestTaskWindowContainerController extends TaskWindowContainerController {
202af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
20311cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        TestTaskWindowContainerController(WindowTestsBase testsBase) {
20411cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale            this(testsBase.createStackControllerOnDisplay(testsBase.mDisplayContent));
205af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
206af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
207af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestTaskWindowContainerController(StackWindowController stackController) {
208af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super(sNextTaskId++, new TaskWindowContainerListener() {
209af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                        @Override
210af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                        public void onSnapshotChanged(ActivityManager.TaskSnapshot snapshot) {
211af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
212af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                        }
213af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
214af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                        @Override
215af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                        public void requestResize(Rect bounds, int resizeMode) {
216af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
217af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                        }
218af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    }, stackController, 0 /* userId */, null /* bounds */,
219af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    EMPTY /* overrideConfig*/, RESIZE_MODE_UNRESIZEABLE,
220af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    false /* supportsPictureInPicture */, false /* homeTask*/, true /* toTop*/,
22111cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                    true /* showForAllUsers */, new ActivityManager.TaskDescription(),
22211cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                    stackController.mService);
223af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
224af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
225af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
226af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestTask createTask(int taskId, TaskStack stack, int userId, Rect bounds,
227af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture,
228af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean homeTask, ActivityManager.TaskDescription taskDescription) {
229af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return new TestTask(taskId, stack, userId, mService, bounds, overrideConfig, resizeMode,
230af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    supportsPictureInPicture, homeTask, this);
231af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
232af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
233af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
234af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestAppWindowContainerController extends AppWindowContainerController {
235af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
236af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        final IApplicationToken mToken;
237af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
238af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestAppWindowContainerController(TestTaskWindowContainerController taskController) {
239af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            this(taskController, new TestIApplicationToken());
240af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
241af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
242af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestAppWindowContainerController(TestTaskWindowContainerController taskController,
243af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                IApplicationToken token) {
244af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super(taskController, token, null /* listener */, 0 /* index */,
245af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    SCREEN_ORIENTATION_UNSPECIFIED, true /* fullscreen */,
246af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    true /* showForAllUsers */, 0 /* configChanges */, false /* voiceInteraction */,
247af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    false /* launchTaskBehind */, false /* alwaysFocusable */,
248af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    0 /* targetSdkVersion */, 0 /* rotationAnimationHint */,
24911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                    0 /* inputDispatchingTimeoutNanos */, taskController.mService,
25011cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale                    null /* overrideConfig */, null /* bounds */);
251af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            mToken = token;
252af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
253af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
254af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
255af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        AppWindowToken createAppWindow(WindowManagerService service, IApplicationToken token,
256af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean voiceInteraction, DisplayContent dc, long inputDispatchingTimeoutNanos,
257af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean fullscreen, boolean showForAllUsers, int targetSdk, int orientation,
258af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                int rotationAnimationHint, int configChanges, boolean launchTaskBehind,
259af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                boolean alwaysFocusable, AppWindowContainerController controller,
260af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                Configuration overrideConfig, Rect bounds) {
261af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return new TestAppWindowToken(service, token, voiceInteraction, dc,
262af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    inputDispatchingTimeoutNanos, fullscreen, showForAllUsers, targetSdk,
263af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    orientation,
264af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    rotationAnimationHint, configChanges, launchTaskBehind, alwaysFocusable,
265af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    controller, overrideConfig, bounds);
266af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
267af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
26811cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale        AppWindowToken getAppWindowToken(DisplayContent dc) {
26911cc516a925ac7fc814dbb0a79a7f0abfbfe1ce1Wale Ogunwale            return (AppWindowToken) dc.getWindowToken(mToken.asBinder());
270af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
271af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
272af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
273af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestIApplicationToken implements IApplicationToken {
274af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
275af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        private final Binder mBinder = new Binder();
276af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
277af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        public IBinder asBinder() {
278af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return mBinder;
279af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
280af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
281af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
282af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    /** Used to track resize reports. */
283af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    public static class TestWindowState extends WindowState {
284af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        boolean resizeReported;
285af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
286af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        TestWindowState(WindowManagerService service, Session session, IWindow window,
287af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                WindowManager.LayoutParams attrs, WindowToken token) {
288af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super(service, session, window, token, null, OP_NONE, 0, attrs, 0, 0,
289af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee                    false /* ownerCanAddInternalSystemWindow */);
290af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
291af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
292af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
293af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        void reportResized() {
294af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super.reportResized();
295af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            resizeReported = true;
296af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
297af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
298af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
299af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        public boolean isGoneForLayoutLw() {
300af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            return false;
301af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
302af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
303af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        @Override
304af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        void updateResizingWindowIfNeeded() {
305af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            // Used in AppWindowTokenTests#testLandscapeSeascapeRotationRelayout to deceive
306af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            // the system that it can actually update the window.
307af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            boolean hadSurface = mHasSurface;
308af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            mHasSurface = true;
309af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
310af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            super.updateResizingWindowIfNeeded();
311af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee
312af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee            mHasSurface = hadSurface;
313af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee        }
314af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee    }
315af691c0be7bbfea63e880dd717c51a38a0bc874aBryce Lee}
316