blob: ea8b7bbacd62967cb2e1d7bcca0a2242127568ca [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
14 * limitations under the License
15 */
16
17package com.android.server.wm;
18
19import android.test.AndroidTestCase;
20import android.test.suitebuilder.annotation.SmallTest;
21
22import java.util.Comparator;
Wale Ogunwaled1c37912016-08-16 03:19:39 -070023import java.util.LinkedList;
Wale Ogunwaled63594a2016-07-18 07:48:30 -070024
25/**
26 * Test class for {@link WindowContainer}.
27 *
28 * Build: mmma -j32 frameworks/base/services/tests/servicestests
Wale Ogunwaled1c37912016-08-16 03:19:39 -070029 * Install: adb install -r out/target/product/$TARGET_PRODUCT/data/app/FrameworksServicesTests/FrameworksServicesTests.apk
Wale Ogunwaled63594a2016-07-18 07:48:30 -070030 * Run: adb shell am instrument -w -e class com.android.server.wm.WindowContainerTests com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
31 */
32@SmallTest
33public class WindowContainerTests extends AndroidTestCase {
34
35 public void testCreation() throws Exception {
Wale Ogunwaled1c37912016-08-16 03:19:39 -070036 final TestWindowContainer w = new TestWindowContainerBuilder().setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -070037 assertNull("window must have no parent", w.getParentWindow());
38 assertEquals("window must have no children", 0, w.getChildrenCount());
39 }
40
41 public void testAdd() throws Exception {
Wale Ogunwaled1c37912016-08-16 03:19:39 -070042 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
43 final TestWindowContainer root = builder.setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -070044
Wale Ogunwaled1c37912016-08-16 03:19:39 -070045 final TestWindowContainer layer1 = root.addChildWindow(builder.setLayer(1));
46 final TestWindowContainer secondLayer1 = root.addChildWindow(builder.setLayer(1));
47 final TestWindowContainer layer2 = root.addChildWindow(builder.setLayer(2));
48 final TestWindowContainer layerNeg1 = root.addChildWindow(builder.setLayer(-1));
49 final TestWindowContainer layerNeg2 = root.addChildWindow(builder.setLayer(-2));
50 final TestWindowContainer secondLayerNeg1 = root.addChildWindow(builder.setLayer(-1));
51 final TestWindowContainer layer0 = root.addChildWindow(builder.setLayer(0));
Wale Ogunwaled63594a2016-07-18 07:48:30 -070052
53 assertEquals(7, root.getChildrenCount());
54
55 assertEquals(root, layer1.getParentWindow());
56 assertEquals(root, secondLayer1.getParentWindow());
57 assertEquals(root, layer2.getParentWindow());
58 assertEquals(root, layerNeg1.getParentWindow());
59 assertEquals(root, layerNeg2.getParentWindow());
60 assertEquals(root, secondLayerNeg1.getParentWindow());
61 assertEquals(root, layer0.getParentWindow());
62
63 assertEquals(layerNeg2, root.getChildAt(0));
64 assertEquals(secondLayerNeg1, root.getChildAt(1));
65 assertEquals(layerNeg1, root.getChildAt(2));
66 assertEquals(layer0, root.getChildAt(3));
67 assertEquals(layer1, root.getChildAt(4));
68 assertEquals(secondLayer1, root.getChildAt(5));
69 assertEquals(layer2, root.getChildAt(6));
70 }
71
72 public void testHasChild() throws Exception {
Wale Ogunwaled1c37912016-08-16 03:19:39 -070073 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
74 final TestWindowContainer root = builder.setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -070075
Wale Ogunwaled1c37912016-08-16 03:19:39 -070076 final TestWindowContainer child1 = root.addChildWindow();
77 final TestWindowContainer child2 = root.addChildWindow();
78 final TestWindowContainer child11 = child1.addChildWindow();
79 final TestWindowContainer child12 = child1.addChildWindow();
80 final TestWindowContainer child21 = child2.addChildWindow();
Wale Ogunwaled63594a2016-07-18 07:48:30 -070081
82 assertEquals(2, root.getChildrenCount());
83 assertEquals(2, child1.getChildrenCount());
84 assertEquals(1, child2.getChildrenCount());
85
86 assertTrue(root.hasChild(child1));
87 assertTrue(root.hasChild(child2));
88 assertTrue(root.hasChild(child11));
89 assertTrue(root.hasChild(child12));
90 assertTrue(root.hasChild(child21));
91
92 assertTrue(child1.hasChild(child11));
93 assertTrue(child1.hasChild(child12));
94 assertFalse(child1.hasChild(child21));
95
96 assertTrue(child2.hasChild(child21));
97 assertFalse(child2.hasChild(child11));
98 assertFalse(child2.hasChild(child12));
99 }
100
101 public void testRemove() throws Exception {
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700102 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
103 final TestWindowContainer root = builder.setLayer(0).build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700104
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700105 final TestWindowContainer child1 = root.addChildWindow();
106 final TestWindowContainer child2 = root.addChildWindow();
107 final TestWindowContainer child11 = child1.addChildWindow();
108 final TestWindowContainer child12 = child1.addChildWindow();
109 final TestWindowContainer child21 = child2.addChildWindow();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700110
111 child12.remove();
112 assertNull(child12.getParentWindow());
113 assertEquals(1, child1.getChildrenCount());
114 assertFalse(child1.hasChild(child12));
115 assertFalse(root.hasChild(child12));
116
117 child2.remove();
118 assertNull(child2.getParentWindow());
119 assertNull(child21.getParentWindow());
120 assertEquals(0, child2.getChildrenCount());
121 assertEquals(1, root.getChildrenCount());
122 assertFalse(root.hasChild(child2));
123 assertFalse(root.hasChild(child21));
124
125 assertTrue(root.hasChild(child1));
126 assertTrue(root.hasChild(child11));
127
128 root.remove();
129 assertEquals(0, root.getChildrenCount());
130 }
131
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700132 public void testDetachFromDisplay() throws Exception {
133 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
134 final TestWindowContainer root = builder.setLayer(0).build();
135
136 final TestWindowContainer child1 = root.addChildWindow(builder.setCanDetach(true));
137 final TestWindowContainer child2 = root.addChildWindow();
138 final TestWindowContainer child11 = child1.addChildWindow();
139 final TestWindowContainer child12 = child1.addChildWindow(builder.setCanDetach(true));
140 final TestWindowContainer child21 = child2.addChildWindow();
141
142 assertTrue(root.detachFromDisplay());
143 assertTrue(child1.detachFromDisplay());
144 assertFalse(child11.detachFromDisplay());
145 assertTrue(child12.detachFromDisplay());
146 assertFalse(child2.detachFromDisplay());
147 assertFalse(child21.detachFromDisplay());
148 }
149
150 public void testIsAnimating() throws Exception {
151 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
152 final TestWindowContainer root = builder.setLayer(0).build();
153
154 final TestWindowContainer child1 = root.addChildWindow(builder.setIsAnimating(true));
155 final TestWindowContainer child2 = root.addChildWindow();
156 final TestWindowContainer child11 = child1.addChildWindow();
157 final TestWindowContainer child12 = child1.addChildWindow(builder.setIsAnimating(true));
158 final TestWindowContainer child21 = child2.addChildWindow();
159
160 assertTrue(root.isAnimating());
161 assertTrue(child1.isAnimating());
162 assertFalse(child11.isAnimating());
163 assertTrue(child12.isAnimating());
164 assertFalse(child2.isAnimating());
165 assertFalse(child21.isAnimating());
166 }
167
168 public void testIsVisible() throws Exception {
169 final TestWindowContainerBuilder builder = new TestWindowContainerBuilder();
170 final TestWindowContainer root = builder.setLayer(0).build();
171
172 final TestWindowContainer child1 = root.addChildWindow(builder.setIsVisible(true));
173 final TestWindowContainer child2 = root.addChildWindow();
174 final TestWindowContainer child11 = child1.addChildWindow();
175 final TestWindowContainer child12 = child1.addChildWindow(builder.setIsVisible(true));
176 final TestWindowContainer child21 = child2.addChildWindow();
177
178 assertTrue(root.isVisible());
179 assertTrue(child1.isVisible());
180 assertFalse(child11.isVisible());
181 assertTrue(child12.isVisible());
182 assertFalse(child2.isVisible());
183 assertFalse(child21.isVisible());
184 }
185
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700186 /* Used so we can gain access to some protected members of the {@link WindowContainer} class */
187 private class TestWindowContainer extends WindowContainer {
188 private final int mLayer;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700189 private final LinkedList<String> mUsers = new LinkedList();
190 private final boolean mCanDetach;
191 private boolean mIsAnimating;
192 private boolean mIsVisible;
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700193
194 /**
195 * Compares 2 window layers and returns -1 if the first is lesser than the second in terms
196 * of z-order and 1 otherwise.
197 */
198 private final Comparator<WindowContainer> mWindowSubLayerComparator = (w1, w2) -> {
199 final int layer1 = ((TestWindowContainer)w1).mLayer;
200 final int layer2 = ((TestWindowContainer)w2).mLayer;
201 if (layer1 < layer2 || (layer1 == layer2 && layer2 < 0 )) {
202 // We insert the child window into the list ordered by the mLayer.
203 // For same layers, the negative one should go below others; the positive one should
204 // go above others.
205 return -1;
206 }
207 return 1;
208 };
209
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700210 TestWindowContainer(int layer, LinkedList<String> users, boolean canDetach,
211 boolean isAnimating, boolean isVisible) {
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700212 mLayer = layer;
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700213 mUsers.addAll(users);
214 mCanDetach = canDetach;
215 mIsAnimating = isAnimating;
216 mIsVisible = isVisible;
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700217 }
218
219 TestWindowContainer getParentWindow() {
220 return (TestWindowContainer) getParent();
221 }
222
223 int getChildrenCount() {
224 return mChildren.size();
225 }
226
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700227 TestWindowContainer addChildWindow(TestWindowContainerBuilder childBuilder) {
228 TestWindowContainer child = childBuilder.build();
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700229 addChild(child, mWindowSubLayerComparator);
230 return child;
231 }
232
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700233 TestWindowContainer addChildWindow() {
234 return addChildWindow(new TestWindowContainerBuilder().setLayer(1));
235 }
236
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700237 TestWindowContainer getChildAt(int index) {
238 return (TestWindowContainer) mChildren.get(index);
239 }
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700240
241 @Override
242 boolean detachFromDisplay() {
243 return super.detachFromDisplay() || mCanDetach;
244 }
245
246 @Override
247 boolean isAnimating() {
248 return mIsAnimating || super.isAnimating();
249 }
250
251 @Override
252 boolean isVisible() {
253 return mIsVisible || super.isVisible();
254 }
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700255 }
256
Wale Ogunwaled1c37912016-08-16 03:19:39 -0700257 private class TestWindowContainerBuilder {
258 private int mLayer;
259 private LinkedList<String> mUsers = new LinkedList();
260 private boolean mCanDetach;
261 private boolean mIsAnimating;
262 private boolean mIsVisible;
263
264 TestWindowContainerBuilder setLayer(int layer) {
265 mLayer = layer;
266 return this;
267 }
268
269 TestWindowContainerBuilder addUser(String user) {
270 mUsers.add(user);
271 return this;
272 }
273
274 TestWindowContainerBuilder setCanDetach(boolean canDetach) {
275 mCanDetach = canDetach;
276 return this;
277 }
278
279 TestWindowContainerBuilder setIsAnimating(boolean isAnimating) {
280 mIsAnimating = isAnimating;
281 return this;
282 }
283
284 TestWindowContainerBuilder setIsVisible(boolean isVisible) {
285 mIsVisible = isVisible;
286 return this;
287 }
288
289 TestWindowContainerBuilder reset() {
290 mLayer = 0;
291 mUsers.clear();
292 mCanDetach = false;
293 mIsAnimating = false;
294 mIsVisible = false;
295 return this;
296 }
297
298 TestWindowContainer build() {
299 return new TestWindowContainer(mLayer, mUsers, mCanDetach, mIsAnimating, mIsVisible);
300 }
301 }
Wale Ogunwaled63594a2016-07-18 07:48:30 -0700302}