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