WindowLayersControllerTests.java revision 17f175ca1a75d5a4864b88126f5d2a59935d52fd
13b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull/* 23b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * Copyright (C) 2016 The Android Open Source Project 33b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * 43b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * Licensed under the Apache License, Version 2.0 (the "License"); 53b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * you may not use this file except in compliance with the License. 63b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * You may obtain a copy of the License at 73b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * 83b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * http://www.apache.org/licenses/LICENSE-2.0 93b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * 103b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * Unless required by applicable law or agreed to in writing, software 113b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * distributed under the License is distributed on an "AS IS" BASIS, 123b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * See the License for the specific language governing permissions and 143b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * limitations under the License 153b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull */ 163b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 173b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullpackage com.android.server.wm; 183b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 193b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullimport org.junit.Test; 20d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport org.junit.runner.RunWith; 213b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 22d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.platform.test.annotations.Presubmit; 23d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkeyimport android.support.test.filters.SmallTest; 243b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullimport android.support.test.runner.AndroidJUnit4; 253b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 263b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 273b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullimport static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY; 283b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; 293b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; 303b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 313b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull/** 323b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * Tests for the {@link WindowLayersController} class. 333b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * 343b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * Build/Install/Run: 353b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull * bit FrameworksServicesTests:com.android.server.wm.WindowLayersControllerTests 363b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull */ 37d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey@SmallTest 383b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull@Presubmit 393b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull@RunWith(AndroidJUnit4.class) 403b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scullpublic class WindowLayersControllerTests extends WindowTestsBase { 413b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 423b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull @Test 433b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull public void testAssignWindowLayers_ForImeWithNoTarget() throws Exception { 443b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sWm.mInputMethodTarget = null; 453b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sLayersController.assignWindowLayers(sDisplayContent); 463b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 473b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // The Ime has an higher base layer than app windows and lower base layer than system 483b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // windows, so it should be above app windows and below system windows if there isn't an IME 493b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // target. 503b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove); 513b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sAppWindow); 523b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow); 533b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow); 543b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow); 553b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 563b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // And, IME dialogs should always have an higher layer than the IME. 573b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow); 583b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull } 593b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 603b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull @Test 613b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull public void testAssignWindowLayers_ForImeWithAppTarget() throws Exception { 62d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey final WindowState imeAppTarget = 633b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget"); 643b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sWm.mInputMethodTarget = imeAppTarget; 653b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sLayersController.assignWindowLayers(sDisplayContent); 663b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 673b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // Ime should be above all app windows and below system windows if it is targeting an app 683b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // window. 693b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, imeAppTarget); 703b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove); 713b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sAppWindow); 723b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow); 733b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow); 743b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow); 753b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 763b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // And, IME dialogs should always have an higher layer than the IME. 77d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow); 783b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull } 793b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 803b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull @Test 813b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull public void testAssignWindowLayers_ForImeWithAppTargetWithChildWindows() throws Exception { 823b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull final WindowState imeAppTarget = 833b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget"); 843b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull final WindowState imeAppTargetChildAboveWindow = createWindow(imeAppTarget, 853b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull TYPE_APPLICATION_ATTACHED_DIALOG, imeAppTarget.mToken, 863b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull "imeAppTargetChildAboveWindow"); 873b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull final WindowState imeAppTargetChildBelowWindow = createWindow(imeAppTarget, 883b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull TYPE_APPLICATION_MEDIA_OVERLAY, imeAppTarget.mToken, 893b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull "imeAppTargetChildBelowWindow"); 903b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 913b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sWm.mInputMethodTarget = imeAppTarget; 923b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sLayersController.assignWindowLayers(sDisplayContent); 933b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 943b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // Ime should be above all app windows except for child windows that are z-ordered above it 95d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey // and below system windows if it is targeting an app window. 963b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, imeAppTarget); 973b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(imeAppTargetChildAboveWindow, sImeWindow); 983b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, imeAppTargetChildBelowWindow); 993b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove); 1003b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sAppWindow); 1013b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow); 1023b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow); 1033b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow); 1043b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 1053b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull // And, IME dialogs should always have an higher layer than the IME. 1063b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow); 1073b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull } 1083b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 1093b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull @Test 110d86b8fea43ebb6e5c31691b44d8ceb0d8d3c9072Jeff Sharkey public void testAssignWindowLayers_ForImeWithAppTargetAndAppAbove() throws Exception { 1113b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull final WindowState appBelowImeTarget = 1123b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "appBelowImeTarget"); 1133b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull final WindowState imeAppTarget = 1143b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget"); 1153b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull final WindowState appAboveImeTarget = 1163b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "appAboveImeTarget"); 1173b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull 1183b8b46f3a46ccf35a6bb6a828af0f2d011cc9abeAndrew Scull sWm.mInputMethodTarget = imeAppTarget; 119 sLayersController.assignWindowLayers(sDisplayContent); 120 121 // Ime should be above all app windows except for non-fullscreen app window above it and 122 // below system windows if it is targeting an app window. 123 assertWindowLayerGreaterThan(sImeWindow, imeAppTarget); 124 assertWindowLayerGreaterThan(sImeWindow, appBelowImeTarget); 125 assertWindowLayerGreaterThan(appAboveImeTarget, sImeWindow); 126 assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove); 127 assertWindowLayerGreaterThan(sImeWindow, sAppWindow); 128 assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow); 129 assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow); 130 assertWindowLayerGreaterThan(sStatusBarWindow, sImeWindow); 131 132 // And, IME dialogs should always have an higher layer than the IME. 133 assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow); 134 } 135 136 @Test 137 public void testAssignWindowLayers_ForImeNonAppImeTarget() throws Exception { 138 final WindowState imeSystemOverlayTarget = createWindow(null, TYPE_SYSTEM_OVERLAY, 139 sDisplayContent, "imeSystemOverlayTarget", 140 true /* ownerCanAddInternalSystemWindow */); 141 142 sWm.mInputMethodTarget = imeSystemOverlayTarget; 143 sLayersController.assignWindowLayers(sDisplayContent); 144 145 // The IME target base layer is higher than all window except for the nav bar window, so the 146 // IME should be above all windows except for the nav bar. 147 assertWindowLayerGreaterThan(sImeWindow, imeSystemOverlayTarget); 148 assertWindowLayerGreaterThan(sImeWindow, sChildAppWindowAbove); 149 assertWindowLayerGreaterThan(sImeWindow, sAppWindow); 150 assertWindowLayerGreaterThan(sImeWindow, sDockedDividerWindow); 151 assertWindowLayerGreaterThan(sImeWindow, sStatusBarWindow); 152 assertWindowLayerGreaterThan(sNavBarWindow, sImeWindow); 153 154 // And, IME dialogs should always have an higher layer than the IME. 155 assertWindowLayerGreaterThan(sImeDialogWindow, sImeWindow); 156 } 157 158 private void assertWindowLayerGreaterThan(WindowState first, WindowState second) 159 throws Exception { 160 assertGreaterThan(first.mWinAnimator.mAnimLayer, second.mWinAnimator.mAnimLayer); 161 } 162 163} 164