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