blob: 30f99e58d8874400ceef7858d5737663d7531bb3 [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 Kuliand68501e2017-01-10 22:57:27 -080022import android.content.res.Configuration;
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -080023import android.hardware.display.DisplayManagerGlobal;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070024import android.platform.test.annotations.Presubmit;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070025import android.support.test.filters.SmallTest;
26import android.support.test.runner.AndroidJUnit4;
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -080027import android.view.Display;
28import android.view.DisplayInfo;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070029
30import java.util.ArrayList;
31
Andrii Kulian367ff7f2017-01-25 19:45:34 -080032import static android.view.Display.DEFAULT_DISPLAY;
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -080033import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070034import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -080035import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070036import static org.junit.Assert.assertEquals;
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070037
38/**
39 * Tests for the {@link DisplayContent} class.
40 *
41 * Build/Install/Run:
42 * bit FrameworksServicesTests:com.android.server.wm.DisplayContentTests
43 */
44@SmallTest
45@Presubmit
46@RunWith(AndroidJUnit4.class)
Wale Ogunwale44fbdf52016-11-16 10:18:45 -080047public class DisplayContentTests extends WindowTestsBase {
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070048
49 @Test
50 public void testForAllWindows() throws Exception {
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080051 final WindowState exitingAppWindow = createWindow(null, TYPE_BASE_APPLICATION,
52 sDisplayContent, "exiting app");
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070053 final AppWindowToken exitingAppToken = exitingAppWindow.mAppToken;
54 exitingAppToken.mIsExiting = true;
55 exitingAppToken.mTask.mStack.mExitingAppTokens.add(exitingAppToken);
56
57 final ArrayList<WindowState> windows = new ArrayList();
58
59 // Test forward traversal.
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080060 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070061
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080062 assertEquals(sWallpaperWindow, windows.get(0));
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070063 assertEquals(exitingAppWindow, windows.get(1));
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080064 assertEquals(sChildAppWindowBelow, windows.get(2));
65 assertEquals(sAppWindow, windows.get(3));
66 assertEquals(sChildAppWindowAbove, windows.get(4));
67 assertEquals(sDockedDividerWindow, windows.get(5));
68 assertEquals(sStatusBarWindow, windows.get(6));
69 assertEquals(sNavBarWindow, windows.get(7));
70 assertEquals(sImeWindow, windows.get(8));
71 assertEquals(sImeDialogWindow, windows.get(9));
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070072
73 // Test backward traversal.
74 windows.clear();
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080075 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
Wale Ogunwaleb783fd82016-11-04 09:51:54 -070076
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080077 assertEquals(sWallpaperWindow, windows.get(9));
78 assertEquals(exitingAppWindow, windows.get(8));
79 assertEquals(sChildAppWindowBelow, windows.get(7));
80 assertEquals(sAppWindow, windows.get(6));
81 assertEquals(sChildAppWindowAbove, windows.get(5));
82 assertEquals(sDockedDividerWindow, windows.get(4));
83 assertEquals(sStatusBarWindow, windows.get(3));
84 assertEquals(sNavBarWindow, windows.get(2));
85 assertEquals(sImeWindow, windows.get(1));
86 assertEquals(sImeDialogWindow, windows.get(0));
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -080087
88 exitingAppWindow.removeImmediately();
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080089 }
90
91 @Test
Wale Ogunwale6ce0fb82016-12-13 14:24:00 -080092 public void testForAllWindows_WithAppImeTarget() throws Exception {
Wale Ogunwale3c1170d2016-12-02 14:44:52 -080093 final WindowState imeAppTarget =
94 createWindow(null, TYPE_BASE_APPLICATION, sDisplayContent, "imeAppTarget");
95
96 sWm.mInputMethodTarget = imeAppTarget;
97
98 final ArrayList<WindowState> windows = new ArrayList();
99
100 // Test forward traversal.
101 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
102
103 assertEquals(sWallpaperWindow, windows.get(0));
104 assertEquals(sChildAppWindowBelow, windows.get(1));
105 assertEquals(sAppWindow, windows.get(2));
106 assertEquals(sChildAppWindowAbove, windows.get(3));
107 assertEquals(imeAppTarget, windows.get(4));
108 assertEquals(sImeWindow, windows.get(5));
109 assertEquals(sImeDialogWindow, windows.get(6));
110 assertEquals(sDockedDividerWindow, windows.get(7));
111 assertEquals(sStatusBarWindow, windows.get(8));
112 assertEquals(sNavBarWindow, windows.get(9));
113
114 // Test backward traversal.
115 windows.clear();
116 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
117
118 assertEquals(sWallpaperWindow, windows.get(9));
119 assertEquals(sChildAppWindowBelow, windows.get(8));
120 assertEquals(sAppWindow, windows.get(7));
121 assertEquals(sChildAppWindowAbove, windows.get(6));
122 assertEquals(imeAppTarget, windows.get(5));
123 assertEquals(sImeWindow, windows.get(4));
124 assertEquals(sImeDialogWindow, windows.get(3));
125 assertEquals(sDockedDividerWindow, windows.get(2));
126 assertEquals(sStatusBarWindow, windows.get(1));
127 assertEquals(sNavBarWindow, windows.get(0));
128
129 // Clean-up
130 sWm.mInputMethodTarget = null;
131 imeAppTarget.removeImmediately();
Wale Ogunwaleb783fd82016-11-04 09:51:54 -0700132 }
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -0800133
134 @Test
Wale Ogunwale6ce0fb82016-12-13 14:24:00 -0800135 public void testForAllWindows_WithStatusBarImeTarget() throws Exception {
136
137 sWm.mInputMethodTarget = sStatusBarWindow;
138
139 final ArrayList<WindowState> windows = new ArrayList();
140
141 // Test forward traversal.
142 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
143
144 assertEquals(sWallpaperWindow, windows.get(0));
145 assertEquals(sChildAppWindowBelow, windows.get(1));
146 assertEquals(sAppWindow, windows.get(2));
147 assertEquals(sChildAppWindowAbove, windows.get(3));
148 assertEquals(sDockedDividerWindow, windows.get(4));
149 assertEquals(sStatusBarWindow, windows.get(5));
150 assertEquals(sImeWindow, windows.get(6));
151 assertEquals(sImeDialogWindow, windows.get(7));
152 assertEquals(sNavBarWindow, windows.get(8));
153
154 // Test backward traversal.
155 windows.clear();
156 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
157
158 assertEquals(sWallpaperWindow, windows.get(8));
159 assertEquals(sChildAppWindowBelow, windows.get(7));
160 assertEquals(sAppWindow, windows.get(6));
161 assertEquals(sChildAppWindowAbove, windows.get(5));
162 assertEquals(sDockedDividerWindow, windows.get(4));
163 assertEquals(sStatusBarWindow, windows.get(3));
164 assertEquals(sImeWindow, windows.get(2));
165 assertEquals(sImeDialogWindow, windows.get(1));
166 assertEquals(sNavBarWindow, windows.get(0));
167
168 // Clean-up
169 sWm.mInputMethodTarget = null;
170 }
171
172 @Test
Wale Ogunwale5d7e7f12016-12-12 14:47:05 -0800173 public void testForAllWindows_WithInBetweenWindowToken() throws Exception {
174 // This window is set-up to be z-ordered between some windows that go in the same token like
175 // the nav bar and status bar.
176 final WindowState voiceInteractionWindow = createWindow(null, TYPE_VOICE_INTERACTION,
177 sDisplayContent, "voiceInteractionWindow");
178
179 final ArrayList<WindowState> windows = new ArrayList();
180
181 // Test forward traversal.
182 sDisplayContent.forAllWindows(w -> {windows.add(w);}, false /* traverseTopToBottom */);
183
184 assertEquals(sWallpaperWindow, windows.get(0));
185 assertEquals(sChildAppWindowBelow, windows.get(1));
186 assertEquals(sAppWindow, windows.get(2));
187 assertEquals(sChildAppWindowAbove, windows.get(3));
188 assertEquals(sDockedDividerWindow, windows.get(4));
189 assertEquals(voiceInteractionWindow, windows.get(5));
190 assertEquals(sStatusBarWindow, windows.get(6));
191 assertEquals(sNavBarWindow, windows.get(7));
192 assertEquals(sImeWindow, windows.get(8));
193 assertEquals(sImeDialogWindow, windows.get(9));
194
195 // Test backward traversal.
196 windows.clear();
197 sDisplayContent.forAllWindows(w -> {windows.add(w);}, true /* traverseTopToBottom */);
198
199 assertEquals(sWallpaperWindow, windows.get(9));
200 assertEquals(sChildAppWindowBelow, windows.get(8));
201 assertEquals(sAppWindow, windows.get(7));
202 assertEquals(sChildAppWindowAbove, windows.get(6));
203 assertEquals(sDockedDividerWindow, windows.get(5));
204 assertEquals(voiceInteractionWindow, windows.get(4));
205 assertEquals(sStatusBarWindow, windows.get(3));
206 assertEquals(sNavBarWindow, windows.get(2));
207 assertEquals(sImeWindow, windows.get(1));
208 assertEquals(sImeDialogWindow, windows.get(0));
209
210 voiceInteractionWindow.removeImmediately();
211 }
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -0800212
Andrii Kuliand68501e2017-01-10 22:57:27 -0800213 /**
214 * This tests stack movement between displays and proper stack's, task's and app token's display
215 * container references updates.
216 */
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -0800217 @Test
218 public void testMoveStackBetweenDisplays() throws Exception {
Andrii Kulian367ff7f2017-01-25 19:45:34 -0800219 // Create a second display.
220 final DisplayContent dc = createNewDisplay();
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -0800221
222 // Add stack with activity.
223 final TaskStack stack = createTaskStackOnDisplay(dc);
224 assertEquals(dc.getDisplayId(), stack.getDisplayContent().getDisplayId());
225 assertEquals(dc, stack.getParent().getParent());
226 assertEquals(dc, stack.getDisplayContent());
227
228 final Task task = createTaskInStack(stack, 0 /* userId */);
229 final TestAppWindowToken token = new TestAppWindowToken(dc);
230 task.addChild(token, 0);
231 assertEquals(dc, task.getDisplayContent());
232 assertEquals(dc, token.getDisplayContent());
233
234 // Move stack to first display.
Wale Ogunwale1666e312016-12-16 11:27:18 -0800235 sDisplayContent.moveStackToDisplay(stack);
Andrii Kulian6cc1a1d2016-12-27 23:52:59 -0800236 assertEquals(sDisplayContent.getDisplayId(), stack.getDisplayContent().getDisplayId());
237 assertEquals(sDisplayContent, stack.getParent().getParent());
238 assertEquals(sDisplayContent, stack.getDisplayContent());
239 assertEquals(sDisplayContent, task.getDisplayContent());
240 assertEquals(sDisplayContent, token.getDisplayContent());
241 }
Andrii Kuliand68501e2017-01-10 22:57:27 -0800242
243 /**
244 * This tests override configuration updates for display content.
245 */
246 @Test
247 public void testDisplayOverrideConfigUpdate() throws Exception {
248 final int displayId = sDisplayContent.getDisplayId();
249 final Configuration currentOverrideConfig = sDisplayContent.getOverrideConfiguration();
250
251 // Create new, slightly changed override configuration and apply it to the display.
252 final Configuration newOverrideConfig = new Configuration(currentOverrideConfig);
253 newOverrideConfig.densityDpi += 120;
254 newOverrideConfig.fontScale += 0.3;
255
256 sWm.setNewDisplayOverrideConfiguration(newOverrideConfig, displayId);
257
258 // Check that override config is applied.
259 assertEquals(newOverrideConfig, sDisplayContent.getOverrideConfiguration());
Andrii Kulian367ff7f2017-01-25 19:45:34 -0800260 }
261
262 /**
263 * This tests global configuration updates when default display config is updated.
264 */
265 @Test
266 public void testDefaultDisplayOverrideConfigUpdate() throws Exception {
267 final Configuration currentOverrideConfig = sDisplayContent.getOverrideConfiguration();
268
269 // Create new, slightly changed override configuration and apply it to the display.
270 final Configuration newOverrideConfig = new Configuration(currentOverrideConfig);
271 newOverrideConfig.densityDpi += 120;
272 newOverrideConfig.fontScale += 0.3;
273
274 sWm.setNewDisplayOverrideConfiguration(newOverrideConfig, DEFAULT_DISPLAY);
Andrii Kuliand68501e2017-01-10 22:57:27 -0800275
276 // Check that global configuration is updated, as we've updated default display's config.
Andrii Kulian367ff7f2017-01-25 19:45:34 -0800277 Configuration globalConfig = sWm.mRoot.getConfiguration();
Andrii Kuliand68501e2017-01-10 22:57:27 -0800278 assertEquals(newOverrideConfig.densityDpi, globalConfig.densityDpi);
279 assertEquals(newOverrideConfig.fontScale, globalConfig.fontScale, 0.1 /* delta */);
Andrii Kulian367ff7f2017-01-25 19:45:34 -0800280
281 // Return back to original values.
282 sWm.setNewDisplayOverrideConfiguration(currentOverrideConfig, DEFAULT_DISPLAY);
283 globalConfig = sWm.mRoot.getConfiguration();
284 assertEquals(currentOverrideConfig.densityDpi, globalConfig.densityDpi);
285 assertEquals(currentOverrideConfig.fontScale, globalConfig.fontScale, 0.1 /* delta */);
Andrii Kuliand68501e2017-01-10 22:57:27 -0800286 }
Wale Ogunwaleb783fd82016-11-04 09:51:54 -0700287}