blob: b93c994f4d8fbd03908b9be7590da1cbb2ec1fcd [file] [log] [blame]
Wale Ogunwaled63594a2016-07-18 07:48:30 -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
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070014 * limitations under the License.
Wale Ogunwaled63594a2016-07-18 07:48:30 -070015 */
16
17package com.android.server.wm;
18
Wale Ogunwale51362492016-09-08 17:49:17 -070019import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
20import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
21import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
22import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
23import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
Andrii Kuliand2765632016-12-12 22:26:34 -080024
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090025import static com.android.dx.mockito.inline.extended.ExtendedMockito.any;
26import static com.android.dx.mockito.inline.extended.ExtendedMockito.anyFloat;
27import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
28import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
29import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
Garfield Tan90b04282018-12-11 14:04:42 -080030import static com.android.dx.mockito.inline.extended.ExtendedMockito.spy;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +090031import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
32import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
Andrii Kuliand2765632016-12-12 22:26:34 -080033import static com.android.server.wm.WindowContainer.POSITION_BOTTOM;
34import static com.android.server.wm.WindowContainer.POSITION_TOP;
35
Wale Ogunwalea7e3b642016-08-29 10:15:34 -070036import static org.junit.Assert.assertEquals;
37import static org.junit.Assert.assertFalse;
38import static org.junit.Assert.assertNotNull;
39import static org.junit.Assert.assertNull;
40import static org.junit.Assert.assertTrue;
Bryce Leed92ae482018-01-22 13:56:23 -080041
Garfield Tan90b04282018-12-11 14:04:42 -080042import android.content.pm.ActivityInfo;
Brett Chabota26eda92018-07-23 13:08:30 -070043import android.content.res.Configuration;
44import android.graphics.Rect;
Garfield Tan90b04282018-12-11 14:04:42 -080045import android.os.IBinder;
Brett Chabota26eda92018-07-23 13:08:30 -070046import android.platform.test.annotations.Presubmit;
47import android.view.SurfaceControl;
48import android.view.SurfaceSession;
49
Brett Chabota26eda92018-07-23 13:08:30 -070050import androidx.test.filters.SmallTest;
Brett Chabota26eda92018-07-23 13:08:30 -070051
52import org.junit.Test;
Garfield Tan49dae102019-02-04 09:51:59 -080053import org.mockito.Mockito;
Brett Chabota26eda92018-07-23 13:08:30 -070054
55import java.util.Comparator;
56
Wale Ogunwaled63594a2016-07-18 07:48:30 -070057/**
58 * Test class for {@link WindowContainer}.
59 *
Wale Ogunwalef7cab102016-10-25 15:25:14 -070060 * Build/Install/Run:
Yunfan Chend552c162019-02-08 16:51:28 +090061 * atest WmTests:WindowContainerTests
Wale Ogunwaled63594a2016-07-18 07:48:30 -070062 */
63@SmallTest
Wale Ogunwale5fc70962016-09-09 22:36:19 -070064@Presubmit
Wale Ogunwale26c0dfe2016-12-14 14:42:30 -080065public class WindowContainerTests extends WindowTestsBase {
Wale Ogunwaled63594a2016-07-18 07:48:30 -070066
Wale Ogunwalea7e3b642016-08-29 10:15:34 -070067 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070068 public void testCreation() {
69 final TestWindowContainer w = new TestWindowContainerBuilder(mWm).setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -070070 assertNull("window must have no parent", w.getParentWindow());
71 assertEquals("window must have no children", 0, w.getChildrenCount());
72 }
73
Wale Ogunwalea7e3b642016-08-29 10:15:34 -070074 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070075 public void testAdd() {
76 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwaled1c37912016-08-16 03:19:39 -070077 final TestWindowContainer root = builder.setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -070078
Wale Ogunwaled1c37912016-08-16 03:19:39 -070079 final TestWindowContainer layer1 = root.addChildWindow(builder.setLayer(1));
80 final TestWindowContainer secondLayer1 = root.addChildWindow(builder.setLayer(1));
81 final TestWindowContainer layer2 = root.addChildWindow(builder.setLayer(2));
82 final TestWindowContainer layerNeg1 = root.addChildWindow(builder.setLayer(-1));
83 final TestWindowContainer layerNeg2 = root.addChildWindow(builder.setLayer(-2));
84 final TestWindowContainer secondLayerNeg1 = root.addChildWindow(builder.setLayer(-1));
85 final TestWindowContainer layer0 = root.addChildWindow(builder.setLayer(0));
Wale Ogunwaled63594a2016-07-18 07:48:30 -070086
87 assertEquals(7, root.getChildrenCount());
88
89 assertEquals(root, layer1.getParentWindow());
90 assertEquals(root, secondLayer1.getParentWindow());
91 assertEquals(root, layer2.getParentWindow());
92 assertEquals(root, layerNeg1.getParentWindow());
93 assertEquals(root, layerNeg2.getParentWindow());
94 assertEquals(root, secondLayerNeg1.getParentWindow());
95 assertEquals(root, layer0.getParentWindow());
96
97 assertEquals(layerNeg2, root.getChildAt(0));
98 assertEquals(secondLayerNeg1, root.getChildAt(1));
99 assertEquals(layerNeg1, root.getChildAt(2));
100 assertEquals(layer0, root.getChildAt(3));
101 assertEquals(layer1, root.getChildAt(4));
102 assertEquals(secondLayer1, root.getChildAt(5));
103 assertEquals(layer2, root.getChildAt(6));
Andrii Kuliand2765632016-12-12 22:26:34 -0800104
Riddle Hsu3a4bb612019-01-31 00:02:22 +0800105 assertTrue(layer1.mOnParentChangedCalled);
106 assertTrue(secondLayer1.mOnParentChangedCalled);
107 assertTrue(layer2.mOnParentChangedCalled);
108 assertTrue(layerNeg1.mOnParentChangedCalled);
109 assertTrue(layerNeg2.mOnParentChangedCalled);
110 assertTrue(secondLayerNeg1.mOnParentChangedCalled);
111 assertTrue(layer0.mOnParentChangedCalled);
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700112 }
113
Wale Ogunwalea7e3b642016-08-29 10:15:34 -0700114 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700115 public void testAddChildSetsSurfacePosition() {
116 try (MockSurfaceBuildingContainer top = new MockSurfaceBuildingContainer(mWm)) {
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700117
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700118 final SurfaceControl.Transaction transaction = mock(SurfaceControl.Transaction.class);
119 mWm.mTransactionFactory = () -> transaction;
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700120
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700121 WindowContainer child = new WindowContainer(mWm);
122 child.setBounds(1, 1, 10, 10);
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700123
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700124 verify(transaction, never()).setPosition(any(), anyFloat(), anyFloat());
125 top.addChild(child, 0);
126 verify(transaction, times(1)).setPosition(any(), eq(1.f), eq(1.f));
127 }
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700128 }
129
130 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700131 public void testAdd_AlreadyHasParent() {
132 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwalef6192862016-09-10 13:42:30 -0700133 final TestWindowContainer root = builder.setLayer(0).build();
134
135 final TestWindowContainer child1 = root.addChildWindow();
136 final TestWindowContainer child2 = root.addChildWindow();
137
138 boolean gotException = false;
139 try {
140 child1.addChildWindow(child2);
141 } catch (IllegalArgumentException e) {
142 gotException = true;
143 }
144 assertTrue(gotException);
145
146 gotException = false;
147 try {
148 root.addChildWindow(child2);
149 } catch (IllegalArgumentException e) {
150 gotException = true;
151 }
152 assertTrue(gotException);
153 }
154
155 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700156 public void testHasChild() {
157 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700158 final TestWindowContainer root = builder.setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700159
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700160 final TestWindowContainer child1 = root.addChildWindow();
161 final TestWindowContainer child2 = root.addChildWindow();
162 final TestWindowContainer child11 = child1.addChildWindow();
163 final TestWindowContainer child12 = child1.addChildWindow();
164 final TestWindowContainer child21 = child2.addChildWindow();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700165
166 assertEquals(2, root.getChildrenCount());
167 assertEquals(2, child1.getChildrenCount());
168 assertEquals(1, child2.getChildrenCount());
169
170 assertTrue(root.hasChild(child1));
171 assertTrue(root.hasChild(child2));
172 assertTrue(root.hasChild(child11));
173 assertTrue(root.hasChild(child12));
174 assertTrue(root.hasChild(child21));
175
176 assertTrue(child1.hasChild(child11));
177 assertTrue(child1.hasChild(child12));
178 assertFalse(child1.hasChild(child21));
179
180 assertTrue(child2.hasChild(child21));
181 assertFalse(child2.hasChild(child11));
182 assertFalse(child2.hasChild(child12));
Wale Ogunwalea7e3b642016-08-29 10:15:34 -0700183 }
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700184
Wale Ogunwalea7e3b642016-08-29 10:15:34 -0700185 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700186 public void testRemoveImmediately() {
187 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700188 final TestWindowContainer root = builder.setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700189
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700190 final TestWindowContainer child1 = root.addChildWindow();
191 final TestWindowContainer child2 = root.addChildWindow();
192 final TestWindowContainer child11 = child1.addChildWindow();
193 final TestWindowContainer child12 = child1.addChildWindow();
194 final TestWindowContainer child21 = child2.addChildWindow();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700195
Wale Ogunwale571771c2016-08-26 13:18:50 -0700196 assertNotNull(child12.getParentWindow());
197 child12.removeImmediately();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700198 assertNull(child12.getParentWindow());
199 assertEquals(1, child1.getChildrenCount());
200 assertFalse(child1.hasChild(child12));
201 assertFalse(root.hasChild(child12));
202
Wale Ogunwale571771c2016-08-26 13:18:50 -0700203 assertTrue(root.hasChild(child2));
204 assertNotNull(child2.getParentWindow());
205 child2.removeImmediately();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700206 assertNull(child2.getParentWindow());
207 assertNull(child21.getParentWindow());
208 assertEquals(0, child2.getChildrenCount());
209 assertEquals(1, root.getChildrenCount());
210 assertFalse(root.hasChild(child2));
211 assertFalse(root.hasChild(child21));
212
213 assertTrue(root.hasChild(child1));
214 assertTrue(root.hasChild(child11));
215
Wale Ogunwale571771c2016-08-26 13:18:50 -0700216 root.removeImmediately();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700217 assertEquals(0, root.getChildrenCount());
218 }
219
Wale Ogunwalea7e3b642016-08-29 10:15:34 -0700220 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700221 public void testRemoveImmediately_WithController() {
222 final WindowContainer container = new WindowContainer(mWm);
223 final WindowContainerController controller = new WindowContainerController<>(null, mWm);
Wale Ogunwale26c0dfe2016-12-14 14:42:30 -0800224
225 container.setController(controller);
226 assertEquals(controller, container.getController());
227 assertEquals(container, controller.mContainer);
228
229 container.removeImmediately();
230 assertNull(container.getController());
231 assertNull(controller.mContainer);
232 }
233
234 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700235 public void testSetController() {
236 final WindowContainerController controller = new WindowContainerController<>(null, mWm);
237 final WindowContainer container = new WindowContainer(mWm);
Wale Ogunwale26c0dfe2016-12-14 14:42:30 -0800238
239 container.setController(controller);
240 assertEquals(controller, container.getController());
241 assertEquals(container, controller.mContainer);
242
243 // Assert we can't change the controller to another one once set
244 boolean gotException = false;
245 try {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700246 container.setController(new WindowContainerController<>(null, mWm));
Wale Ogunwale26c0dfe2016-12-14 14:42:30 -0800247 } catch (IllegalArgumentException e) {
248 gotException = true;
249 }
250 assertTrue(gotException);
251
252 // Assert that we can set the controller to null.
253 container.setController(null);
254 assertNull(container.getController());
255 assertNull(controller.mContainer);
256 }
257
258 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700259 public void testAddChildByIndex() {
260 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Kazuki Takisef85197b2018-06-18 18:18:36 +0900261 final TestWindowContainer root = builder.setLayer(0).build();
262
263 final TestWindowContainer child = root.addChildWindow();
264
265 final TestWindowContainer child2 = builder.setLayer(1).build();
266 final TestWindowContainer child3 = builder.setLayer(2).build();
267 final TestWindowContainer child4 = builder.setLayer(3).build();
268
269 // Test adding at top.
270 root.addChild(child2, POSITION_TOP);
271 assertEquals(child2, root.getChildAt(root.getChildrenCount() - 1));
272
273 // Test adding at bottom.
274 root.addChild(child3, POSITION_BOTTOM);
275 assertEquals(child3, root.getChildAt(0));
276
277 // Test adding in the middle.
278 root.addChild(child4, 1);
279 assertEquals(child3, root.getChildAt(0));
280 assertEquals(child4, root.getChildAt(1));
281 assertEquals(child, root.getChildAt(2));
282 assertEquals(child2, root.getChildAt(3));
283 }
284
285 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700286 public void testPositionChildAt() {
287 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Andrii Kuliand2765632016-12-12 22:26:34 -0800288 final TestWindowContainer root = builder.setLayer(0).build();
289
290 final TestWindowContainer child1 = root.addChildWindow();
291 final TestWindowContainer child2 = root.addChildWindow();
292 final TestWindowContainer child3 = root.addChildWindow();
293
294 // Test position at top.
295 root.positionChildAt(POSITION_TOP, child1, false /* includingParents */);
296 assertEquals(child1, root.getChildAt(root.getChildrenCount() - 1));
297
298 // Test position at bottom.
299 root.positionChildAt(POSITION_BOTTOM, child1, false /* includingParents */);
300 assertEquals(child1, root.getChildAt(0));
301
302 // Test position in the middle.
303 root.positionChildAt(1, child3, false /* includingParents */);
304 assertEquals(child1, root.getChildAt(0));
305 assertEquals(child3, root.getChildAt(1));
306 assertEquals(child2, root.getChildAt(2));
307 }
308
309 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700310 public void testPositionChildAtIncludeParents() {
311 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Andrii Kuliand2765632016-12-12 22:26:34 -0800312 final TestWindowContainer root = builder.setLayer(0).build();
313
314 final TestWindowContainer child1 = root.addChildWindow();
315 final TestWindowContainer child2 = root.addChildWindow();
316 final TestWindowContainer child11 = child1.addChildWindow();
317 final TestWindowContainer child12 = child1.addChildWindow();
318 final TestWindowContainer child13 = child1.addChildWindow();
319 final TestWindowContainer child21 = child2.addChildWindow();
320 final TestWindowContainer child22 = child2.addChildWindow();
321 final TestWindowContainer child23 = child2.addChildWindow();
322
323 // Test moving to top.
324 child1.positionChildAt(POSITION_TOP, child11, true /* includingParents */);
325 assertEquals(child12, child1.getChildAt(0));
326 assertEquals(child13, child1.getChildAt(1));
327 assertEquals(child11, child1.getChildAt(2));
328 assertEquals(child2, root.getChildAt(0));
329 assertEquals(child1, root.getChildAt(1));
330
331 // Test moving to bottom.
332 child1.positionChildAt(POSITION_BOTTOM, child11, true /* includingParents */);
333 assertEquals(child11, child1.getChildAt(0));
334 assertEquals(child12, child1.getChildAt(1));
335 assertEquals(child13, child1.getChildAt(2));
336 assertEquals(child1, root.getChildAt(0));
337 assertEquals(child2, root.getChildAt(1));
338
339 // Test moving to middle, includeParents shouldn't do anything.
340 child2.positionChildAt(1, child21, true /* includingParents */);
341 assertEquals(child11, child1.getChildAt(0));
342 assertEquals(child12, child1.getChildAt(1));
343 assertEquals(child13, child1.getChildAt(2));
344 assertEquals(child22, child2.getChildAt(0));
345 assertEquals(child21, child2.getChildAt(1));
346 assertEquals(child23, child2.getChildAt(2));
347 assertEquals(child1, root.getChildAt(0));
348 assertEquals(child2, root.getChildAt(1));
349 }
350
351 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700352 public void testPositionChildAtInvalid() {
353 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Andrii Kuliand2765632016-12-12 22:26:34 -0800354 final TestWindowContainer root = builder.setLayer(0).build();
355
356 final TestWindowContainer child1 = root.addChildWindow();
Andrii Kuliand2765632016-12-12 22:26:34 -0800357
358 boolean gotException = false;
359 try {
360 // Check response to negative position.
361 root.positionChildAt(-1, child1, false /* includingParents */);
362 } catch (IllegalArgumentException e) {
363 gotException = true;
364 }
365 assertTrue(gotException);
366
367 gotException = false;
368 try {
369 // Check response to position that's bigger than child number.
Wale Ogunwalec5cc3012017-01-13 13:26:16 -0800370 root.positionChildAt(3, child1, false /* includingParents */);
Andrii Kuliand2765632016-12-12 22:26:34 -0800371 } catch (IllegalArgumentException e) {
372 gotException = true;
373 }
374 assertTrue(gotException);
375 }
376
377 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700378 public void testIsAnimating() {
379 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700380 final TestWindowContainer root = builder.setLayer(0).build();
381
382 final TestWindowContainer child1 = root.addChildWindow(builder.setIsAnimating(true));
383 final TestWindowContainer child2 = root.addChildWindow();
384 final TestWindowContainer child11 = child1.addChildWindow();
385 final TestWindowContainer child12 = child1.addChildWindow(builder.setIsAnimating(true));
386 final TestWindowContainer child21 = child2.addChildWindow();
387
Jorim Jaggia5e10572017-11-15 14:36:26 +0100388 assertFalse(root.isAnimating());
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700389 assertTrue(child1.isAnimating());
Jorim Jaggia5e10572017-11-15 14:36:26 +0100390 assertTrue(child11.isAnimating());
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700391 assertTrue(child12.isAnimating());
392 assertFalse(child2.isAnimating());
393 assertFalse(child21.isAnimating());
Jorim Jaggia5e10572017-11-15 14:36:26 +0100394
395 assertTrue(root.isSelfOrChildAnimating());
396 assertTrue(child1.isSelfOrChildAnimating());
397 assertFalse(child11.isSelfOrChildAnimating());
398 assertTrue(child12.isSelfOrChildAnimating());
399 assertFalse(child2.isSelfOrChildAnimating());
400 assertFalse(child21.isSelfOrChildAnimating());
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700401 }
402
Wale Ogunwalea7e3b642016-08-29 10:15:34 -0700403 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700404 public void testIsVisible() {
405 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700406 final TestWindowContainer root = builder.setLayer(0).build();
407
408 final TestWindowContainer child1 = root.addChildWindow(builder.setIsVisible(true));
409 final TestWindowContainer child2 = root.addChildWindow();
410 final TestWindowContainer child11 = child1.addChildWindow();
411 final TestWindowContainer child12 = child1.addChildWindow(builder.setIsVisible(true));
412 final TestWindowContainer child21 = child2.addChildWindow();
413
Wale Ogunwale51362492016-09-08 17:49:17 -0700414 assertFalse(root.isVisible());
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700415 assertTrue(child1.isVisible());
416 assertFalse(child11.isVisible());
417 assertTrue(child12.isVisible());
418 assertFalse(child2.isVisible());
419 assertFalse(child21.isVisible());
420 }
421
Wale Ogunwalea7e3b642016-08-29 10:15:34 -0700422 @Test
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700423 public void testOverrideConfigurationAncestorNotification() {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700424 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700425 final TestWindowContainer grandparent = builder.setLayer(0).build();
426
427 final TestWindowContainer parent = grandparent.addChildWindow();
428 final TestWindowContainer child = parent.addChildWindow();
Evan Roskydfe3da72018-10-26 17:21:06 -0700429 child.onRequestedOverrideConfigurationChanged(new Configuration());
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700430
431 assertTrue(grandparent.mOnDescendantOverrideCalled);
432 }
433
434 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700435 public void testRemoveChild() {
436 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale571771c2016-08-26 13:18:50 -0700437 final TestWindowContainer root = builder.setLayer(0).build();
438 final TestWindowContainer child1 = root.addChildWindow();
439 final TestWindowContainer child2 = root.addChildWindow();
440 final TestWindowContainer child11 = child1.addChildWindow();
441 final TestWindowContainer child21 = child2.addChildWindow();
442
443 assertTrue(root.hasChild(child2));
444 assertTrue(root.hasChild(child21));
Wale Ogunwalef6192862016-09-10 13:42:30 -0700445 root.removeChild(child2);
Wale Ogunwale571771c2016-08-26 13:18:50 -0700446 assertFalse(root.hasChild(child2));
447 assertFalse(root.hasChild(child21));
448 assertNull(child2.getParentWindow());
449
450 boolean gotException = false;
451 assertTrue(root.hasChild(child11));
452 try {
453 // Can only detach our direct children.
Wale Ogunwalef6192862016-09-10 13:42:30 -0700454 root.removeChild(child11);
Wale Ogunwale571771c2016-08-26 13:18:50 -0700455 } catch (IllegalArgumentException e) {
456 gotException = true;
457 }
458 assertTrue(gotException);
459 }
460
Wale Ogunwale51362492016-09-08 17:49:17 -0700461 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700462 public void testGetOrientation_childSpecified() {
Bryce Leea163b762017-01-24 11:05:01 -0800463 testGetOrientation_childSpecifiedConfig(false, SCREEN_ORIENTATION_LANDSCAPE,
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900464 SCREEN_ORIENTATION_LANDSCAPE);
Bryce Leea163b762017-01-24 11:05:01 -0800465 testGetOrientation_childSpecifiedConfig(false, SCREEN_ORIENTATION_UNSET,
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900466 SCREEN_ORIENTATION_UNSPECIFIED);
Bryce Leea163b762017-01-24 11:05:01 -0800467 }
468
469 private void testGetOrientation_childSpecifiedConfig(boolean childVisible, int childOrientation,
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900470 int expectedOrientation) {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700471 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Bryce Leea163b762017-01-24 11:05:01 -0800472 final TestWindowContainer root = builder.setLayer(0).build();
473 root.setFillsParent(true);
474
475 builder.setIsVisible(childVisible);
476
477 if (childOrientation != SCREEN_ORIENTATION_UNSET) {
478 builder.setOrientation(childOrientation);
479 }
480
481 final TestWindowContainer child1 = root.addChildWindow(builder);
482 child1.setFillsParent(true);
483
Wale Ogunwale5e5a68d2017-03-24 17:36:38 -0700484 assertEquals(expectedOrientation, root.getOrientation());
Bryce Leea163b762017-01-24 11:05:01 -0800485 }
486
487 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700488 public void testGetOrientation_Unset() {
489 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale51362492016-09-08 17:49:17 -0700490 final TestWindowContainer root = builder.setLayer(0).setIsVisible(true).build();
491 // Unspecified well because we didn't specify anything...
492 assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, root.getOrientation());
493 }
494
495 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700496 public void testGetOrientation_InvisibleParentUnsetVisibleChildren() {
497 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale51362492016-09-08 17:49:17 -0700498 final TestWindowContainer root = builder.setLayer(0).setIsVisible(true).build();
499
500 builder.setIsVisible(false).setLayer(-1);
501 final TestWindowContainer invisible = root.addChildWindow(builder);
502 builder.setIsVisible(true).setLayer(-2);
503 final TestWindowContainer invisibleChild1VisibleAndSet = invisible.addChildWindow(builder);
504 invisibleChild1VisibleAndSet.setOrientation(SCREEN_ORIENTATION_LANDSCAPE);
505 // Landscape well because the container is visible and that is what we set on it above.
506 assertEquals(SCREEN_ORIENTATION_LANDSCAPE, invisibleChild1VisibleAndSet.getOrientation());
Bryce Leea163b762017-01-24 11:05:01 -0800507 // Landscape because even though the container isn't visible it has a child that is
508 // specifying it can influence the orientation by being visible.
509 assertEquals(SCREEN_ORIENTATION_LANDSCAPE, invisible.getOrientation());
510 // Landscape because the grandchild is visible and therefore can participate.
511 assertEquals(SCREEN_ORIENTATION_LANDSCAPE, root.getOrientation());
Wale Ogunwale51362492016-09-08 17:49:17 -0700512
513 builder.setIsVisible(true).setLayer(-3);
514 final TestWindowContainer visibleUnset = root.addChildWindow(builder);
515 visibleUnset.setOrientation(SCREEN_ORIENTATION_UNSET);
516 assertEquals(SCREEN_ORIENTATION_UNSET, visibleUnset.getOrientation());
Bryce Leea163b762017-01-24 11:05:01 -0800517 assertEquals(SCREEN_ORIENTATION_LANDSCAPE, root.getOrientation());
Wale Ogunwale51362492016-09-08 17:49:17 -0700518 }
519
520 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700521 public void testGetOrientation_setBehind() {
522 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale51362492016-09-08 17:49:17 -0700523 final TestWindowContainer root = builder.setLayer(0).setIsVisible(true).build();
524
525 builder.setIsVisible(true).setLayer(-1);
526 final TestWindowContainer visibleUnset = root.addChildWindow(builder);
527 visibleUnset.setOrientation(SCREEN_ORIENTATION_UNSET);
528
529 builder.setIsVisible(true).setLayer(-2);
530 final TestWindowContainer visibleUnsetChild1VisibleSetBehind =
531 visibleUnset.addChildWindow(builder);
532 visibleUnsetChild1VisibleSetBehind.setOrientation(SCREEN_ORIENTATION_BEHIND);
533 // Setting to visible behind will be used by the parents if there isn't another other
534 // container behind this one that has an orientation set.
535 assertEquals(SCREEN_ORIENTATION_BEHIND,
536 visibleUnsetChild1VisibleSetBehind.getOrientation());
537 assertEquals(SCREEN_ORIENTATION_BEHIND, visibleUnset.getOrientation());
538 assertEquals(SCREEN_ORIENTATION_BEHIND, root.getOrientation());
539 }
540
541 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700542 public void testGetOrientation_fillsParent() {
543 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale51362492016-09-08 17:49:17 -0700544 final TestWindowContainer root = builder.setLayer(0).setIsVisible(true).build();
545
546 builder.setIsVisible(true).setLayer(-1);
547 final TestWindowContainer visibleUnset = root.addChildWindow(builder);
548 visibleUnset.setOrientation(SCREEN_ORIENTATION_BEHIND);
549
550 builder.setLayer(1).setIsVisible(true);
551 final TestWindowContainer visibleUnspecifiedRootChild = root.addChildWindow(builder);
552 visibleUnspecifiedRootChild.setFillsParent(false);
553 visibleUnspecifiedRootChild.setOrientation(SCREEN_ORIENTATION_UNSPECIFIED);
554 // Unset because the child doesn't fill the parent. May as well be invisible...
555 assertEquals(SCREEN_ORIENTATION_UNSET, visibleUnspecifiedRootChild.getOrientation());
556 // The parent uses whatever orientation is set behind this container since it doesn't fill
557 // the parent.
558 assertEquals(SCREEN_ORIENTATION_BEHIND, root.getOrientation());
559
560 // Test case of child filling its parent, but its parent isn't filling its own parent.
561 builder.setLayer(2).setIsVisible(true);
562 final TestWindowContainer visibleUnspecifiedRootChildChildFillsParent =
563 visibleUnspecifiedRootChild.addChildWindow(builder);
Garfield Tan90b04282018-12-11 14:04:42 -0800564 visibleUnspecifiedRootChildChildFillsParent.setOrientation(SCREEN_ORIENTATION_PORTRAIT);
Wale Ogunwale51362492016-09-08 17:49:17 -0700565 assertEquals(SCREEN_ORIENTATION_PORTRAIT,
566 visibleUnspecifiedRootChildChildFillsParent.getOrientation());
567 assertEquals(SCREEN_ORIENTATION_UNSET, visibleUnspecifiedRootChild.getOrientation());
568 assertEquals(SCREEN_ORIENTATION_BEHIND, root.getOrientation());
569
570
571 visibleUnspecifiedRootChild.setFillsParent(true);
572 assertEquals(SCREEN_ORIENTATION_PORTRAIT, visibleUnspecifiedRootChild.getOrientation());
573 assertEquals(SCREEN_ORIENTATION_PORTRAIT, root.getOrientation());
574 }
575
Wale Ogunwale63d4ecc2016-09-08 18:48:26 -0700576 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700577 public void testCompareTo() {
578 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Wale Ogunwale63d4ecc2016-09-08 18:48:26 -0700579 final TestWindowContainer root = builder.setLayer(0).build();
580
581 final TestWindowContainer child1 = root.addChildWindow();
582 final TestWindowContainer child11 = child1.addChildWindow();
583 final TestWindowContainer child12 = child1.addChildWindow();
584
585 final TestWindowContainer child2 = root.addChildWindow();
586 final TestWindowContainer child21 = child2.addChildWindow();
587 final TestWindowContainer child22 = child2.addChildWindow();
Wale Ogunwale63d4ecc2016-09-08 18:48:26 -0700588 final TestWindowContainer child222 = child22.addChildWindow();
589 final TestWindowContainer child223 = child22.addChildWindow();
590 final TestWindowContainer child2221 = child222.addChildWindow();
591 final TestWindowContainer child2222 = child222.addChildWindow();
592 final TestWindowContainer child2223 = child222.addChildWindow();
593
594 final TestWindowContainer root2 = builder.setLayer(0).build();
595
596 assertEquals(0, root.compareTo(root));
597 assertEquals(-1, child1.compareTo(child2));
598 assertEquals(1, child2.compareTo(child1));
599
600 boolean inTheSameTree = true;
601 try {
602 root.compareTo(root2);
603 } catch (IllegalArgumentException e) {
604 inTheSameTree = false;
605 }
606 assertFalse(inTheSameTree);
607
608 assertEquals(-1, child1.compareTo(child11));
609 assertEquals(1, child21.compareTo(root));
610 assertEquals(1, child21.compareTo(child12));
611 assertEquals(-1, child11.compareTo(child2));
612 assertEquals(1, child2221.compareTo(child11));
613 assertEquals(-1, child2222.compareTo(child223));
614 assertEquals(1, child2223.compareTo(child21));
615 }
616
Jorim Jaggi619c9f72017-12-19 18:04:29 +0100617 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700618 public void testPrefixOrderIndex() {
619 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Jorim Jaggi619c9f72017-12-19 18:04:29 +0100620 final TestWindowContainer root = builder.build();
621
622 final TestWindowContainer child1 = root.addChildWindow();
623
624 final TestWindowContainer child11 = child1.addChildWindow();
625 final TestWindowContainer child12 = child1.addChildWindow();
626
627 final TestWindowContainer child2 = root.addChildWindow();
628
629 final TestWindowContainer child21 = child2.addChildWindow();
630 final TestWindowContainer child22 = child2.addChildWindow();
631
632 final TestWindowContainer child221 = child22.addChildWindow();
633 final TestWindowContainer child222 = child22.addChildWindow();
634 final TestWindowContainer child223 = child22.addChildWindow();
635
636 final TestWindowContainer child23 = child2.addChildWindow();
637
638 assertEquals(0, root.getPrefixOrderIndex());
639 assertEquals(1, child1.getPrefixOrderIndex());
640 assertEquals(2, child11.getPrefixOrderIndex());
641 assertEquals(3, child12.getPrefixOrderIndex());
642 assertEquals(4, child2.getPrefixOrderIndex());
643 assertEquals(5, child21.getPrefixOrderIndex());
644 assertEquals(6, child22.getPrefixOrderIndex());
645 assertEquals(7, child221.getPrefixOrderIndex());
646 assertEquals(8, child222.getPrefixOrderIndex());
647 assertEquals(9, child223.getPrefixOrderIndex());
648 assertEquals(10, child23.getPrefixOrderIndex());
649 }
650
651 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700652 public void testPrefixOrder_addEntireSubtree() {
653 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Jorim Jaggi619c9f72017-12-19 18:04:29 +0100654 final TestWindowContainer root = builder.build();
655 final TestWindowContainer subtree = builder.build();
656 final TestWindowContainer subtree2 = builder.build();
657
658 final TestWindowContainer child1 = subtree.addChildWindow();
659 final TestWindowContainer child11 = child1.addChildWindow();
660 final TestWindowContainer child2 = subtree2.addChildWindow();
661 final TestWindowContainer child3 = subtree2.addChildWindow();
662 subtree.addChild(subtree2, 1);
663 root.addChild(subtree, 0);
664
665 assertEquals(0, root.getPrefixOrderIndex());
666 assertEquals(1, subtree.getPrefixOrderIndex());
667 assertEquals(2, child1.getPrefixOrderIndex());
668 assertEquals(3, child11.getPrefixOrderIndex());
669 assertEquals(4, subtree2.getPrefixOrderIndex());
670 assertEquals(5, child2.getPrefixOrderIndex());
671 assertEquals(6, child3.getPrefixOrderIndex());
672 }
673
674 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700675 public void testPrefixOrder_remove() {
676 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Jorim Jaggi619c9f72017-12-19 18:04:29 +0100677 final TestWindowContainer root = builder.build();
678
679 final TestWindowContainer child1 = root.addChildWindow();
680
681 final TestWindowContainer child11 = child1.addChildWindow();
682 final TestWindowContainer child12 = child1.addChildWindow();
683
684 final TestWindowContainer child2 = root.addChildWindow();
685
686 assertEquals(0, root.getPrefixOrderIndex());
687 assertEquals(1, child1.getPrefixOrderIndex());
688 assertEquals(2, child11.getPrefixOrderIndex());
689 assertEquals(3, child12.getPrefixOrderIndex());
690 assertEquals(4, child2.getPrefixOrderIndex());
691
692 root.removeChild(child1);
693
694 assertEquals(1, child2.getPrefixOrderIndex());
695 }
696
Bryce Leed92ae482018-01-22 13:56:23 -0800697 /**
698 * Ensure children of a {@link WindowContainer} do not have
699 * {@link WindowContainer#onParentResize()} called when {@link WindowContainer#onParentResize()}
700 * is invoked with overridden bounds.
701 */
702 @Test
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700703 public void testOnParentResizePropagation() {
704 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
Bryce Leed92ae482018-01-22 13:56:23 -0800705 final TestWindowContainer root = builder.build();
706
707 final TestWindowContainer child = root.addChildWindow();
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900708 child.setBounds(new Rect(1, 1, 2, 2));
Bryce Leed92ae482018-01-22 13:56:23 -0800709
710 final TestWindowContainer grandChild = mock(TestWindowContainer.class);
711
712 child.addChildWindow(grandChild);
713 root.onResize();
714
715 // Make sure the child does not propagate resize through onParentResize when bounds are set.
716 verify(grandChild, never()).onParentResize();
717
718 child.removeChild(grandChild);
719
720 child.setBounds(null);
721 child.addChildWindow(grandChild);
722 root.onResize();
723
724 // Make sure the child propagates resize through onParentResize when no bounds set.
725 verify(grandChild, times(1)).onParentResize();
726 }
727
Garfield Tan90b04282018-12-11 14:04:42 -0800728 @Test
729 public void testOnDescendantOrientationRequestChangedPropagation() {
730 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
731 final TestWindowContainer root = spy(builder.build());
732
733 final IBinder binder = mock(IBinder.class);
734 final ActivityRecord activityRecord = mock(ActivityRecord.class);
735 final TestWindowContainer child = root.addChildWindow();
736
737 child.setOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED, binder, activityRecord);
738 verify(root).onDescendantOrientationChanged(binder, activityRecord);
739 }
740
Garfield Tan49dae102019-02-04 09:51:59 -0800741 @Test
742 public void testHandlesOrientationChangeFromDescendantProgation() {
743 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder(mWm);
744 final TestWindowContainer root = spy(builder.build());
745
746 final TestWindowContainer child = root.addChildWindow();
747 assertFalse(child.handlesOrientationChangeFromDescendant());
748
749 Mockito.doReturn(true).when(root).handlesOrientationChangeFromDescendant();
750 assertTrue(child.handlesOrientationChangeFromDescendant());
751 }
752
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700753 /* Used so we can gain access to some protected members of the {@link WindowContainer} class */
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700754 private static class TestWindowContainer extends WindowContainer<TestWindowContainer> {
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700755 private final int mLayer;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700756 private boolean mIsAnimating;
757 private boolean mIsVisible;
Wale Ogunwale51362492016-09-08 17:49:17 -0700758 private boolean mFillsParent;
Bryce Leea163b762017-01-24 11:05:01 -0800759 private Integer mOrientation;
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700760
Riddle Hsu3a4bb612019-01-31 00:02:22 +0800761 private boolean mOnParentChangedCalled;
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700762 private boolean mOnDescendantOverrideCalled;
Andrii Kuliand2765632016-12-12 22:26:34 -0800763
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700764 /**
765 * Compares 2 window layers and returns -1 if the first is lesser than the second in terms
766 * of z-order and 1 otherwise.
767 */
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700768 private static final Comparator<TestWindowContainer> SUBLAYER_COMPARATOR = (w1, w2) -> {
Wale Ogunwaled90546a2016-09-09 23:28:03 -0700769 final int layer1 = w1.mLayer;
770 final int layer2 = w2.mLayer;
Tadashi G. Takaokabf0d57b2018-11-19 16:09:58 +0900771 if (layer1 < layer2 || (layer1 == layer2 && layer2 < 0)) {
Wale Ogunwaled90546a2016-09-09 23:28:03 -0700772 // We insert the child window into the list ordered by the mLayer. For same layers,
773 // the negative one should go below others; the positive one should go above others.
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700774 return -1;
775 }
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700776 if (layer1 == layer2) return 0;
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700777 return 1;
778 };
779
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700780 TestWindowContainer(WindowManagerService wm, int layer, boolean isAnimating,
781 boolean isVisible, Integer orientation) {
782 super(wm);
783
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700784 mLayer = layer;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700785 mIsAnimating = isAnimating;
786 mIsVisible = isVisible;
Wale Ogunwale51362492016-09-08 17:49:17 -0700787 mFillsParent = true;
Bryce Leea163b762017-01-24 11:05:01 -0800788 mOrientation = orientation;
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700789 }
790
791 TestWindowContainer getParentWindow() {
792 return (TestWindowContainer) getParent();
793 }
794
795 int getChildrenCount() {
796 return mChildren.size();
797 }
798
Wale Ogunwalef6192862016-09-10 13:42:30 -0700799 TestWindowContainer addChildWindow(TestWindowContainer child) {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700800 addChild(child, SUBLAYER_COMPARATOR);
Wale Ogunwalef6192862016-09-10 13:42:30 -0700801 return child;
802 }
803
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700804 TestWindowContainer addChildWindow(TestWindowContainerBuilder childBuilder) {
805 TestWindowContainer child = childBuilder.build();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700806 addChild(child, SUBLAYER_COMPARATOR);
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700807 return child;
808 }
809
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700810 TestWindowContainer addChildWindow() {
Wale Ogunwale8b19de92018-11-29 19:58:26 -0800811 return addChildWindow(new TestWindowContainerBuilder(mWmService).setLayer(1));
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700812 }
813
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700814 @Override
Riddle Hsu3a4bb612019-01-31 00:02:22 +0800815 void onParentChanged() {
816 mOnParentChangedCalled = true;
Andrii Kuliand2765632016-12-12 22:26:34 -0800817 }
818
819 @Override
Wale Ogunwale55ddf8f2017-03-20 08:56:38 -0700820 void onDescendantOverrideConfigurationChanged() {
821 mOnDescendantOverrideCalled = true;
822 super.onDescendantOverrideConfigurationChanged();
823 }
824
825 @Override
Jorim Jaggia5e10572017-11-15 14:36:26 +0100826 boolean isSelfAnimating() {
827 return mIsAnimating;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700828 }
829
830 @Override
831 boolean isVisible() {
Wale Ogunwale51362492016-09-08 17:49:17 -0700832 return mIsVisible;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700833 }
Wale Ogunwale571771c2016-08-26 13:18:50 -0700834
835 @Override
Wale Ogunwale5e5a68d2017-03-24 17:36:38 -0700836 int getOrientation(int candidate) {
837 return mOrientation != null ? mOrientation : super.getOrientation(candidate);
838 }
839
840 @Override
Bryce Leea163b762017-01-24 11:05:01 -0800841 int getOrientation() {
Wale Ogunwale5e5a68d2017-03-24 17:36:38 -0700842 return getOrientation(super.mOrientation);
Bryce Leea163b762017-01-24 11:05:01 -0800843 }
844
845 @Override
Wale Ogunwale51362492016-09-08 17:49:17 -0700846 boolean fillsParent() {
847 return mFillsParent;
Wale Ogunwale571771c2016-08-26 13:18:50 -0700848 }
849
Wale Ogunwale51362492016-09-08 17:49:17 -0700850 void setFillsParent(boolean fillsParent) {
851 mFillsParent = fillsParent;
Wale Ogunwale571771c2016-08-26 13:18:50 -0700852 }
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700853 }
854
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700855 private static class TestWindowContainerBuilder {
856 private final WindowManagerService mWm;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700857 private int mLayer;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700858 private boolean mIsAnimating;
859 private boolean mIsVisible;
Bryce Leea163b762017-01-24 11:05:01 -0800860 private Integer mOrientation;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700861
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700862 TestWindowContainerBuilder(WindowManagerService wm) {
863 mWm = wm;
864 mLayer = 0;
865 mIsAnimating = false;
866 mIsVisible = false;
867 mOrientation = null;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700868 }
869
Wale Ogunwale51362492016-09-08 17:49:17 -0700870 TestWindowContainerBuilder setLayer(int layer) {
871 mLayer = layer;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700872 return this;
873 }
874
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700875 TestWindowContainerBuilder setIsAnimating(boolean isAnimating) {
876 mIsAnimating = isAnimating;
877 return this;
878 }
879
880 TestWindowContainerBuilder setIsVisible(boolean isVisible) {
881 mIsVisible = isVisible;
882 return this;
883 }
884
Bryce Leea163b762017-01-24 11:05:01 -0800885 TestWindowContainerBuilder setOrientation(int orientation) {
886 mOrientation = orientation;
887 return this;
888 }
889
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700890 TestWindowContainer build() {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700891 return new TestWindowContainer(mWm, mLayer, mIsAnimating, mIsVisible, mOrientation);
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700892 }
893 }
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700894
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700895 private static class MockSurfaceBuildingContainer extends WindowContainer<WindowContainer>
896 implements AutoCloseable {
897 private final SurfaceSession mSession = new SurfaceSession();
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700898
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700899 MockSurfaceBuildingContainer(WindowManagerService wm) {
900 super(wm);
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700901 }
902
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700903 static class MockSurfaceBuilder extends SurfaceControl.Builder {
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700904 MockSurfaceBuilder(SurfaceSession ss) {
905 super(ss);
906 }
907
908 @Override
909 public SurfaceControl build() {
910 return mock(SurfaceControl.class);
911 }
912 }
913
914 @Override
915 SurfaceControl.Builder makeChildSurface(WindowContainer child) {
916 return new MockSurfaceBuilder(mSession);
917 }
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700918
919 @Override
920 public void close() {
921 mSession.kill();
922 }
Evan Roskyb1ea7ca2018-04-05 17:17:35 -0700923 }
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700924}