blob: 786c2bb06d96d3f7f14e41843bb3d4b98729bed1 [file] [log] [blame]
Wale Ogunwaleb783fd82016-11-04 09:51:54 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.wm;
18
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070019import org.junit.Test;
20import org.junit.runner.RunWith;
21
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -080022import android.hardware.display.DisplayManagerGlobal;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070023import android.platform.test.annotations.Presubmit;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070024import android.support.test.filters.SmallTest;
25import android.support.test.runner.AndroidJUnit4;
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -080026import android.view.Display;
27import android.view.DisplayInfo;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070028
29import java.util.ArrayList;
30
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -080031import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070032import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -080033import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070034import static org.junit.Assert.assertEquals;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070035
36/**
37 * Tests for the {@link DisplayContent} class.
38 *
39 * Build/Install/Run:
40 * bit FrameworksServicesTests:com.android.server.wm.DisplayContentTests
41 */
42@SmallTest
43@Presubmit
44@RunWith(AndroidJUnit4.class)
Wale Ogunwale44fbdf52016-11-16 10:18:45 -080045public class DisplayContentTests extends WindowTestsBase {
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070046
47 @Test
48 public void testForAllWindows() throws Exception {
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080049 final WindowState exitingAppWindow = createWindow(null, TYPE_BASE_APPLICATION,
50 sDisplayContent, "exiting app");
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070051 final AppWindowToken exitingAppToken = exitingAppWindow.mAppToken;
52 exitingAppToken.mIsExiting = true;
53 exitingAppToken.mTask.mStack.mExitingAppTokens.add(exitingAppToken);
54
55 final ArrayList<WindowState> windows = new ArrayList();
56
57 // Test forward traversal.
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080058 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070059
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080060 assertEquals(sWallpaperWindow, windows.get(0));
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070061 assertEquals(exitingAppWindow, windows.get(1));
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080062 assertEquals(sChildAppWindowBelow, windows.get(2));
63 assertEquals(sAppWindow, windows.get(3));
64 assertEquals(sChildAppWindowAbove, windows.get(4));
65 assertEquals(sDockedDividerWindow, windows.get(5));
66 assertEquals(sStatusBarWindow, windows.get(6));
67 assertEquals(sNavBarWindow, windows.get(7));
68 assertEquals(sImeWindow, windows.get(8));
69 assertEquals(sImeDialogWindow, windows.get(9));
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070070
71 // Test backward traversal.
72 windows.clear();
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080073 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070074
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080075 assertEquals(sWallpaperWindow, windows.get(9));
76 assertEquals(exitingAppWindow, windows.get(8));
77 assertEquals(sChildAppWindowBelow, windows.get(7));
78 assertEquals(sAppWindow, windows.get(6));
79 assertEquals(sChildAppWindowAbove, windows.get(5));
80 assertEquals(sDockedDividerWindow, windows.get(4));
81 assertEquals(sStatusBarWindow, windows.get(3));
82 assertEquals(sNavBarWindow, windows.get(2));
83 assertEquals(sImeWindow, windows.get(1));
84 assertEquals(sImeDialogWindow, windows.get(0));
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -080085
86 exitingAppWindow.removeImmediately();
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080087 }
88
89 @Test
Wale Ogunwale6ce0fb82016-12-13 14:24:00 -080090 public void testForAllWindows_WithAppImeTarget() throws Exception {
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080091 final WindowState imeAppTarget =
92 createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget");
93
94 sWm.mInputMethodTarget = imeAppTarget;
95
96 final ArrayList<WindowState> windows = new ArrayList();
97
98 // Test forward traversal.
99 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
100
101 assertEquals(sWallpaperWindow, windows.get(0));
102 assertEquals(sChildAppWindowBelow, windows.get(1));
103 assertEquals(sAppWindow, windows.get(2));
104 assertEquals(sChildAppWindowAbove, windows.get(3));
105 assertEquals(imeAppTarget, windows.get(4));
106 assertEquals(sImeWindow, windows.get(5));
107 assertEquals(sImeDialogWindow, windows.get(6));
108 assertEquals(sDockedDividerWindow, windows.get(7));
109 assertEquals(sStatusBarWindow, windows.get(8));
110 assertEquals(sNavBarWindow, windows.get(9));
111
112 // Test backward traversal.
113 windows.clear();
114 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
115
116 assertEquals(sWallpaperWindow, windows.get(9));
117 assertEquals(sChildAppWindowBelow, windows.get(8));
118 assertEquals(sAppWindow, windows.get(7));
119 assertEquals(sChildAppWindowAbove, windows.get(6));
120 assertEquals(imeAppTarget, windows.get(5));
121 assertEquals(sImeWindow, windows.get(4));
122 assertEquals(sImeDialogWindow, windows.get(3));
123 assertEquals(sDockedDividerWindow, windows.get(2));
124 assertEquals(sStatusBarWindow, windows.get(1));
125 assertEquals(sNavBarWindow, windows.get(0));
126
127 // Clean-up
128 sWm.mInputMethodTarget = null;
129 imeAppTarget.removeImmediately();
Wale Ogunwaleb783fd82016-11-04 09:51:54 -0700130 }
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -0800131
132 @Test
Wale Ogunwale6ce0fb82016-12-13 14:24:00 -0800133 public void testForAllWindows_WithStatusBarImeTarget() throws Exception {
134
135 sWm.mInputMethodTarget = sStatusBarWindow;
136
137 final ArrayList<WindowState> windows = new ArrayList();
138
139 // Test forward traversal.
140 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
141
142 assertEquals(sWallpaperWindow, windows.get(0));
143 assertEquals(sChildAppWindowBelow, windows.get(1));
144 assertEquals(sAppWindow, windows.get(2));
145 assertEquals(sChildAppWindowAbove, windows.get(3));
146 assertEquals(sDockedDividerWindow, windows.get(4));
147 assertEquals(sStatusBarWindow, windows.get(5));
148 assertEquals(sImeWindow, windows.get(6));
149 assertEquals(sImeDialogWindow, windows.get(7));
150 assertEquals(sNavBarWindow, windows.get(8));
151
152 // Test backward traversal.
153 windows.clear();
154 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
155
156 assertEquals(sWallpaperWindow, windows.get(8));
157 assertEquals(sChildAppWindowBelow, windows.get(7));
158 assertEquals(sAppWindow, windows.get(6));
159 assertEquals(sChildAppWindowAbove, windows.get(5));
160 assertEquals(sDockedDividerWindow, windows.get(4));
161 assertEquals(sStatusBarWindow, windows.get(3));
162 assertEquals(sImeWindow, windows.get(2));
163 assertEquals(sImeDialogWindow, windows.get(1));
164 assertEquals(sNavBarWindow, windows.get(0));
165
166 // Clean-up
167 sWm.mInputMethodTarget = null;
168 }
169
170 @Test
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -0800171 public void testForAllWindows_WithInBetweenWindowToken() throws Exception {
172 // This window is set-up to be z-ordered between some windows that go in the same token like
173 // the nav bar and status bar.
174 final WindowState voiceInteractionWindow = createWindow(null, TYPE_VOICE_INTERACTION,
175 sDisplayContent, "voiceInteractionWindow");
176
177 final ArrayList<WindowState> windows = new ArrayList();
178
179 // Test forward traversal.
180 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
181
182 assertEquals(sWallpaperWindow, windows.get(0));
183 assertEquals(sChildAppWindowBelow, windows.get(1));
184 assertEquals(sAppWindow, windows.get(2));
185 assertEquals(sChildAppWindowAbove, windows.get(3));
186 assertEquals(sDockedDividerWindow, windows.get(4));
187 assertEquals(voiceInteractionWindow, windows.get(5));
188 assertEquals(sStatusBarWindow, windows.get(6));
189 assertEquals(sNavBarWindow, windows.get(7));
190 assertEquals(sImeWindow, windows.get(8));
191 assertEquals(sImeDialogWindow, windows.get(9));
192
193 // Test backward traversal.
194 windows.clear();
195 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
196
197 assertEquals(sWallpaperWindow, windows.get(9));
198 assertEquals(sChildAppWindowBelow, windows.get(8));
199 assertEquals(sAppWindow, windows.get(7));
200 assertEquals(sChildAppWindowAbove, windows.get(6));
201 assertEquals(sDockedDividerWindow, windows.get(5));
202 assertEquals(voiceInteractionWindow, windows.get(4));
203 assertEquals(sStatusBarWindow, windows.get(3));
204 assertEquals(sNavBarWindow, windows.get(2));
205 assertEquals(sImeWindow, windows.get(1));
206 assertEquals(sImeDialogWindow, windows.get(0));
207
208 voiceInteractionWindow.removeImmediately();
209 }
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -0800210
211 @Test
212 public void testMoveStackBetweenDisplays() throws Exception {
213 // Create second display.
214 final Display display = new Display(DisplayManagerGlobal.getInstance(),
215 sDisplayContent.getDisplayId() + 1, new DisplayInfo(),
216 DEFAULT_DISPLAY_ADJUSTMENTS);
217 final DisplayContent dc = new DisplayContent(display, sWm, sLayersController,
218 new WallpaperController(sWm));
219 sWm.mRoot.addChild(dc, 1);
220
221 // Add stack with activity.
222 final TaskStack stack = createTaskStackOnDisplay(dc);
223 assertEquals(dc.getDisplayId(), stack.getDisplayContent().getDisplayId());
224 assertEquals(dc, stack.getParent().getParent());
225 assertEquals(dc, stack.getDisplayContent());
226
227 final Task task = createTaskInStack(stack, 0 /* userId */);
228 final TestAppWindowToken token = new TestAppWindowToken(dc);
229 task.addChild(token, 0);
230 assertEquals(dc, task.getDisplayContent());
231 assertEquals(dc, token.getDisplayContent());
232
233 // Move stack to first display.
234 sWm.moveStackToDisplay(stack.mStackId, sDisplayContent.getDisplayId());
235 assertEquals(sDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId());
236 assertEquals(sDisplayContent, stack.getParent().getParent());
237 assertEquals(sDisplayContent, stack.getDisplayContent());
238 assertEquals(sDisplayContent, task.getDisplayContent());
239 assertEquals(sDisplayContent, token.getDisplayContent());
240 }
Wale Ogunwaleb783fd82016-11-04 09:51:54 -0700241}