blob: 2fc6efa3313c1c9b840ed0d9eb8cfe5c37f9b25b [file] [log] [blame]
Robert Carrb1579c82017-09-05 14:54:47 -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.
Robert Carrb1579c82017-09-05 14:54:47 -070015 */
16
17package com.android.server.wm;
18
Robert Carrb1579c82017-09-05 14:54:47 -070019import static android.app.WindowConfiguration.ACTIVITY_TYPE_ASSISTANT;
Robert Carrf7a7ca82017-12-06 13:17:07 -080020import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
Robert Carrb1579c82017-09-05 14:54:47 -070021import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
22import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
23import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
24import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
Robert Carrf7a7ca82017-12-06 13:17:07 -080025import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
Tiger Huang9c8ee262019-02-19 20:44:27 +080026import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ABOVE_SUB_PANEL;
Robert Carrb1579c82017-09-05 14:54:47 -070027import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
Robert Carr0eff1872017-12-01 14:27:04 -080028import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA;
Robert Carrb1579c82017-09-05 14:54:47 -070029import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY;
Tiger Huang9c8ee262019-02-19 20:44:27 +080030import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
31import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;
Robert Carrb1579c82017-09-05 14:54:47 -070032import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
Robert Carr8360a782017-11-22 12:47:58 -080033import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
34import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
35import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL;
Jorim Jaggiffe128d2017-11-30 13:54:36 +010036import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
37
Tiger Huang9c8ee262019-02-19 20:44:27 +080038import static com.android.server.wm.WindowStateAnimator.PRESERVED_SURFACE_LAYER;
39
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +090040import static com.google.common.truth.Truth.assertThat;
41
Jorim Jaggiffe128d2017-11-30 13:54:36 +010042import android.platform.test.annotations.Presubmit;
Jorim Jaggiffe128d2017-11-30 13:54:36 +010043import android.view.SurfaceControl;
44import android.view.SurfaceSession;
45
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070046import androidx.test.filters.FlakyTest;
47import androidx.test.filters.SmallTest;
48
Jorim Jaggiffe128d2017-11-30 13:54:36 +010049import org.junit.After;
50import org.junit.Test;
Jorim Jaggiffe128d2017-11-30 13:54:36 +010051
Tiger Huang9c8ee262019-02-19 20:44:27 +080052import java.util.ArrayList;
Jorim Jaggiffe128d2017-11-30 13:54:36 +010053import java.util.HashMap;
54import java.util.LinkedList;
Robert Carrb1579c82017-09-05 14:54:47 -070055
56/**
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070057 * Tests for the {@link DisplayContent#assignChildLayers(SurfaceControl.Transaction)} method.
Robert Carrb1579c82017-09-05 14:54:47 -070058 *
59 * Build/Install/Run:
Yunfan Chend552c162019-02-08 16:51:28 +090060 * atest WmTests:ZOrderingTests
Robert Carrb1579c82017-09-05 14:54:47 -070061 */
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070062@SmallTest
Robert Carrb1579c82017-09-05 14:54:47 -070063@Presubmit
Robert Carrb1579c82017-09-05 14:54:47 -070064public class ZOrderingTests extends WindowTestsBase {
65
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070066 private static class LayerRecordingTransaction extends SurfaceControl.Transaction {
67 // We have WM use our Hierarchy recording subclass of SurfaceControl.Builder
68 // such that we can keep track of the parents of Surfaces as they are constructed.
69 private final HashMap<SurfaceControl, SurfaceControl> mParentFor = new HashMap<>();
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +090070 HashMap<SurfaceControl, Integer> mLayersForControl = new HashMap<>();
71 HashMap<SurfaceControl, SurfaceControl> mRelativeLayersForControl = new HashMap<>();
Robert Carrb1579c82017-09-05 14:54:47 -070072
73 @Override
74 public SurfaceControl.Transaction setLayer(SurfaceControl sc, int layer) {
75 mRelativeLayersForControl.remove(sc);
76 mLayersForControl.put(sc, layer);
Vishnu Nairaab3d3d2019-03-08 10:34:44 -080077 return this;
Robert Carrb1579c82017-09-05 14:54:47 -070078 }
79
80 @Override
81 public SurfaceControl.Transaction setRelativeLayer(SurfaceControl sc,
82 SurfaceControl relativeTo,
83 int layer) {
84 mRelativeLayersForControl.put(sc, relativeTo);
85 mLayersForControl.put(sc, layer);
Vishnu Nairaab3d3d2019-03-08 10:34:44 -080086 return this;
Robert Carrb1579c82017-09-05 14:54:47 -070087 }
88
Robert Carrf7a7ca82017-12-06 13:17:07 -080089 private int getLayer(SurfaceControl sc) {
Jorim Jaggiffe128d2017-11-30 13:54:36 +010090 return mLayersForControl.getOrDefault(sc, 0);
Robert Carrb1579c82017-09-05 14:54:47 -070091 }
92
Robert Carrf7a7ca82017-12-06 13:17:07 -080093 private SurfaceControl getRelativeLayer(SurfaceControl sc) {
Robert Carrb1579c82017-09-05 14:54:47 -070094 return mRelativeLayersForControl.get(sc);
95 }
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -070096
97 void addParentFor(SurfaceControl child, SurfaceControl parent) {
98 mParentFor.put(child, parent);
99 }
100
101 SurfaceControl getParentFor(SurfaceControl child) {
102 return mParentFor.get(child);
103 }
104
105 @Override
106 public void close() {
107
108 }
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900109 }
Robert Carrb1579c82017-09-05 14:54:47 -0700110
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700111 private static class HierarchyRecorder extends SurfaceControl.Builder {
112 private LayerRecordingTransaction mTransaction;
113 private SurfaceControl mPendingParent;
Robert Carrb1579c82017-09-05 14:54:47 -0700114
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700115 HierarchyRecorder(SurfaceSession s, LayerRecordingTransaction transaction) {
Robert Carrb1579c82017-09-05 14:54:47 -0700116 super(s);
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700117 mTransaction = transaction;
Robert Carrb1579c82017-09-05 14:54:47 -0700118 }
119
Tadashi G. Takaoka041a05a2018-10-15 12:59:51 +0900120 @Override
Robert Carrb1579c82017-09-05 14:54:47 -0700121 public SurfaceControl.Builder setParent(SurfaceControl sc) {
122 mPendingParent = sc;
123 return super.setParent(sc);
124 }
Tadashi G. Takaoka041a05a2018-10-15 12:59:51 +0900125
126 @Override
Robert Carrb1579c82017-09-05 14:54:47 -0700127 public SurfaceControl build() {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700128 final SurfaceControl sc = super.build();
129 mTransaction.addParentFor(sc, mPendingParent);
Robert Carrb1579c82017-09-05 14:54:47 -0700130 mPendingParent = null;
131 return sc;
132 }
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900133 }
Robert Carrb1579c82017-09-05 14:54:47 -0700134
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700135 private static class HierarchyRecordingBuilderFactory implements SurfaceBuilderFactory {
136 private LayerRecordingTransaction mTransaction;
137
138 HierarchyRecordingBuilderFactory(LayerRecordingTransaction transaction) {
139 mTransaction = transaction;
140 }
141
142 @Override
Robert Carrb1579c82017-09-05 14:54:47 -0700143 public SurfaceControl.Builder make(SurfaceSession s) {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700144 final LayerRecordingTransaction transaction = mTransaction;
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700145 return new HierarchyRecorder(s, transaction);
Robert Carrb1579c82017-09-05 14:54:47 -0700146 }
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900147 }
Robert Carrb1579c82017-09-05 14:54:47 -0700148
149 private LayerRecordingTransaction mTransaction;
150
151 @Override
152 void beforeCreateDisplay() {
153 // We can't use @Before here because it may happen after WindowTestsBase @Before
154 // which is after construction of the DisplayContent, meaning the HierarchyRecorder
155 // would miss construction of the top-level layers.
156 mTransaction = new LayerRecordingTransaction();
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700157 mWm.mSurfaceBuilderFactory = new HierarchyRecordingBuilderFactory(mTransaction);
158 mWm.mTransactionFactory = () -> mTransaction;
Robert Carrb1579c82017-09-05 14:54:47 -0700159 }
160
161 @After
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700162 public void tearDown() {
Robert Carrb1579c82017-09-05 14:54:47 -0700163 mTransaction.close();
Robert Carrb1579c82017-09-05 14:54:47 -0700164 }
165
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700166 private static LinkedList<SurfaceControl> getAncestors(LayerRecordingTransaction t,
167 SurfaceControl sc) {
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900168 LinkedList<SurfaceControl> p = new LinkedList<>();
Robert Carrb1579c82017-09-05 14:54:47 -0700169 SurfaceControl current = sc;
170 do {
171 p.addLast(current);
172
173 SurfaceControl rs = t.getRelativeLayer(current);
174 if (rs != null) {
175 current = rs;
176 } else {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700177 current = t.getParentFor(current);
Robert Carrb1579c82017-09-05 14:54:47 -0700178 }
179 } while (current != null);
180 return p;
181 }
182
Robert Carrf7a7ca82017-12-06 13:17:07 -0800183
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700184 private static void assertZOrderGreaterThan(LayerRecordingTransaction t, SurfaceControl left,
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900185 SurfaceControl right) {
Robert Carrb1579c82017-09-05 14:54:47 -0700186 final LinkedList<SurfaceControl> leftParentChain = getAncestors(t, left);
187 final LinkedList<SurfaceControl> rightParentChain = getAncestors(t, right);
188
Robert Carrb1579c82017-09-05 14:54:47 -0700189 SurfaceControl leftTop = leftParentChain.peekLast();
190 SurfaceControl rightTop = rightParentChain.peekLast();
191 while (leftTop != null && rightTop != null && leftTop == rightTop) {
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700192 leftParentChain.removeLast();
Robert Carrb1579c82017-09-05 14:54:47 -0700193 rightParentChain.removeLast();
194 leftTop = leftParentChain.peekLast();
195 rightTop = rightParentChain.peekLast();
196 }
197
198 if (rightTop == null) { // right is the parent of left.
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900199 assertThat(t.getLayer(leftTop)).isGreaterThan(0);
Robert Carrb1579c82017-09-05 14:54:47 -0700200 } else if (leftTop == null) { // left is the parent of right.
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900201 assertThat(t.getLayer(rightTop)).isLessThan(0);
Robert Carrb1579c82017-09-05 14:54:47 -0700202 } else {
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900203 assertThat(t.getLayer(leftTop)).isGreaterThan(t.getLayer(rightTop));
Robert Carrb1579c82017-09-05 14:54:47 -0700204 }
205 }
206
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900207 void assertWindowHigher(WindowState left, WindowState right) {
Robert Carrf7a7ca82017-12-06 13:17:07 -0800208 assertZOrderGreaterThan(mTransaction, left.getSurfaceControl(), right.getSurfaceControl());
209 }
210
211 WindowState createWindow(String name) {
212 return createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, name);
Robert Carrb1579c82017-09-05 14:54:47 -0700213 }
214
Yunfan Chend552c162019-02-08 16:51:28 +0900215 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700216 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900217 public void testAssignWindowLayers_ForImeWithNoTarget() {
lumarkff0ab692018-11-05 20:32:30 +0800218 mDisplayContent.mInputMethodTarget = null;
Robert Carrb1579c82017-09-05 14:54:47 -0700219 mDisplayContent.assignChildLayers(mTransaction);
220
221 // The Ime has an higher base layer than app windows and lower base layer than system
222 // windows, so it should be above app windows and below system windows if there isn't an IME
223 // target.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800224 assertWindowHigher(mImeWindow, mChildAppWindowAbove);
225 assertWindowHigher(mImeWindow, mAppWindow);
226 assertWindowHigher(mNavBarWindow, mImeWindow);
227 assertWindowHigher(mStatusBarWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700228
229 // And, IME dialogs should always have an higher layer than the IME.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800230 assertWindowHigher(mImeDialogWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700231 }
232
Yunfan Chend552c162019-02-08 16:51:28 +0900233 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700234 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900235 public void testAssignWindowLayers_ForImeWithAppTarget() {
Robert Carrf7a7ca82017-12-06 13:17:07 -0800236 final WindowState imeAppTarget = createWindow("imeAppTarget");
lumarkff0ab692018-11-05 20:32:30 +0800237 mDisplayContent.mInputMethodTarget = imeAppTarget;
Robert Carrf7a7ca82017-12-06 13:17:07 -0800238
Robert Carrb1579c82017-09-05 14:54:47 -0700239 mDisplayContent.assignChildLayers(mTransaction);
240
241 // Ime should be above all app windows and below system windows if it is targeting an app
242 // window.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800243 assertWindowHigher(mImeWindow, imeAppTarget);
244 assertWindowHigher(mImeWindow, mChildAppWindowAbove);
245 assertWindowHigher(mImeWindow, mAppWindow);
246 assertWindowHigher(mNavBarWindow, mImeWindow);
247 assertWindowHigher(mStatusBarWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700248
249 // And, IME dialogs should always have an higher layer than the IME.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800250 assertWindowHigher(mImeDialogWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700251 }
252
Yunfan Chend552c162019-02-08 16:51:28 +0900253 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700254 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900255 public void testAssignWindowLayers_ForImeWithAppTargetWithChildWindows() {
Robert Carrf7a7ca82017-12-06 13:17:07 -0800256 final WindowState imeAppTarget = createWindow("imeAppTarget");
Robert Carrb1579c82017-09-05 14:54:47 -0700257 final WindowState imeAppTargetChildAboveWindow = createWindow(imeAppTarget,
258 TYPE_APPLICATION_ATTACHED_DIALOG, imeAppTarget.mToken,
259 "imeAppTargetChildAboveWindow");
260 final WindowState imeAppTargetChildBelowWindow = createWindow(imeAppTarget,
261 TYPE_APPLICATION_MEDIA_OVERLAY, imeAppTarget.mToken,
262 "imeAppTargetChildBelowWindow");
263
lumarkff0ab692018-11-05 20:32:30 +0800264 mDisplayContent.mInputMethodTarget = imeAppTarget;
Robert Carrb1579c82017-09-05 14:54:47 -0700265 mDisplayContent.assignChildLayers(mTransaction);
266
267 // Ime should be above all app windows except for child windows that are z-ordered above it
268 // and below system windows if it is targeting an app window.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800269 assertWindowHigher(mImeWindow, imeAppTarget);
270 assertWindowHigher(imeAppTargetChildAboveWindow, mImeWindow);
271 assertWindowHigher(mImeWindow, mChildAppWindowAbove);
272 assertWindowHigher(mImeWindow, mAppWindow);
273 assertWindowHigher(mNavBarWindow, mImeWindow);
274 assertWindowHigher(mStatusBarWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700275
276 // And, IME dialogs should always have an higher layer than the IME.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800277 assertWindowHigher(mImeDialogWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700278 }
279
Yunfan Chend552c162019-02-08 16:51:28 +0900280 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700281 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900282 public void testAssignWindowLayers_ForImeWithAppTargetAndAppAbove() {
Robert Carrf7a7ca82017-12-06 13:17:07 -0800283 final WindowState appBelowImeTarget = createWindow("appBelowImeTarget");
284 final WindowState imeAppTarget = createWindow("imeAppTarget");
285 final WindowState appAboveImeTarget = createWindow("appAboveImeTarget");
Robert Carrb1579c82017-09-05 14:54:47 -0700286
lumarkff0ab692018-11-05 20:32:30 +0800287 mDisplayContent.mInputMethodTarget = imeAppTarget;
Robert Carrb1579c82017-09-05 14:54:47 -0700288 mDisplayContent.assignChildLayers(mTransaction);
289
290 // Ime should be above all app windows except for non-fullscreen app window above it and
291 // below system windows if it is targeting an app window.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800292 assertWindowHigher(mImeWindow, imeAppTarget);
293 assertWindowHigher(mImeWindow, appBelowImeTarget);
294 assertWindowHigher(appAboveImeTarget, mImeWindow);
295 assertWindowHigher(mImeWindow, mChildAppWindowAbove);
296 assertWindowHigher(mImeWindow, mAppWindow);
297 assertWindowHigher(mNavBarWindow, mImeWindow);
298 assertWindowHigher(mStatusBarWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700299
300 // And, IME dialogs should always have an higher layer than the IME.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800301 assertWindowHigher(mImeDialogWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700302 }
303
Yunfan Chend552c162019-02-08 16:51:28 +0900304 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700305 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900306 public void testAssignWindowLayers_ForImeNonAppImeTarget() {
Robert Carrb1579c82017-09-05 14:54:47 -0700307 final WindowState imeSystemOverlayTarget = createWindow(null, TYPE_SYSTEM_OVERLAY,
308 mDisplayContent, "imeSystemOverlayTarget",
309 true /* ownerCanAddInternalSystemWindow */);
310
lumarkff0ab692018-11-05 20:32:30 +0800311 mDisplayContent.mInputMethodTarget = imeSystemOverlayTarget;
Robert Carrb1579c82017-09-05 14:54:47 -0700312 mDisplayContent.assignChildLayers(mTransaction);
313
314 // The IME target base layer is higher than all window except for the nav bar window, so the
315 // IME should be above all windows except for the nav bar.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800316 assertWindowHigher(mImeWindow, imeSystemOverlayTarget);
317 assertWindowHigher(mImeWindow, mChildAppWindowAbove);
318 assertWindowHigher(mImeWindow, mAppWindow);
319 assertWindowHigher(mImeWindow, mDockedDividerWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700320
321 // The IME has a higher base layer than the status bar so we may expect it to go
322 // above the status bar once they are both in the Non-App layer, as past versions of this
323 // test enforced. However this seems like the wrong behavior unless the status bar is the
324 // IME target.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800325 assertWindowHigher(mNavBarWindow, mImeWindow);
326 assertWindowHigher(mStatusBarWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700327
328 // And, IME dialogs should always have an higher layer than the IME.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800329 assertWindowHigher(mImeDialogWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700330 }
331
Yunfan Chend552c162019-02-08 16:51:28 +0900332 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700333 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900334 public void testAssignWindowLayers_ForStatusBarImeTarget() {
lumarkff0ab692018-11-05 20:32:30 +0800335 mDisplayContent.mInputMethodTarget = mStatusBarWindow;
Robert Carrb1579c82017-09-05 14:54:47 -0700336 mDisplayContent.assignChildLayers(mTransaction);
337
Robert Carrf7a7ca82017-12-06 13:17:07 -0800338 assertWindowHigher(mImeWindow, mChildAppWindowAbove);
339 assertWindowHigher(mImeWindow, mAppWindow);
340 assertWindowHigher(mImeWindow, mDockedDividerWindow);
341 assertWindowHigher(mImeWindow, mStatusBarWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700342
343 // And, IME dialogs should always have an higher layer than the IME.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800344 assertWindowHigher(mImeDialogWindow, mImeWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700345 }
346
Yunfan Chend552c162019-02-08 16:51:28 +0900347 @FlakyTest(bugId = 124088319)
Robert Carrb1579c82017-09-05 14:54:47 -0700348 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900349 public void testStackLayers() {
Robert Carrf7a7ca82017-12-06 13:17:07 -0800350 final WindowState anyWindow1 = createWindow("anyWindow");
Robert Carrb1579c82017-09-05 14:54:47 -0700351 final WindowState pinnedStackWindow = createWindowOnStack(null, WINDOWING_MODE_PINNED,
352 ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, mDisplayContent,
353 "pinnedStackWindow");
354 final WindowState dockedStackWindow = createWindowOnStack(null,
355 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION,
356 mDisplayContent, "dockedStackWindow");
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700357 final WindowState assistantStackWindow = createWindowOnStack(null,
358 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, TYPE_BASE_APPLICATION,
Robert Carrb1579c82017-09-05 14:54:47 -0700359 mDisplayContent, "assistantStackWindow");
Robert Carrf7a7ca82017-12-06 13:17:07 -0800360 final WindowState homeActivityWindow = createWindowOnStack(null, WINDOWING_MODE_FULLSCREEN,
361 ACTIVITY_TYPE_HOME, TYPE_BASE_APPLICATION,
362 mDisplayContent, "homeActivityWindow");
363 final WindowState anyWindow2 = createWindow("anyWindow2");
Robert Carrb1579c82017-09-05 14:54:47 -0700364
365 mDisplayContent.assignChildLayers(mTransaction);
366
Robert Carrf7a7ca82017-12-06 13:17:07 -0800367 assertWindowHigher(dockedStackWindow, homeActivityWindow);
368 assertWindowHigher(assistantStackWindow, homeActivityWindow);
369 assertWindowHigher(pinnedStackWindow, homeActivityWindow);
370 assertWindowHigher(anyWindow1, homeActivityWindow);
371 assertWindowHigher(anyWindow2, homeActivityWindow);
372 assertWindowHigher(pinnedStackWindow, anyWindow1);
373 assertWindowHigher(pinnedStackWindow, anyWindow2);
374 assertWindowHigher(pinnedStackWindow, dockedStackWindow);
375 assertWindowHigher(pinnedStackWindow, assistantStackWindow);
Robert Carrb1579c82017-09-05 14:54:47 -0700376 }
Robert Carr8360a782017-11-22 12:47:58 -0800377
378 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900379 public void testAssignWindowLayers_ForSysUiPanels() {
Robert Carr8360a782017-11-22 12:47:58 -0800380 final WindowState navBarPanel =
381 createWindow(null, TYPE_NAVIGATION_BAR_PANEL, mDisplayContent, "NavBarPanel");
382 final WindowState statusBarPanel =
383 createWindow(null, TYPE_STATUS_BAR_PANEL, mDisplayContent, "StatusBarPanel");
384 final WindowState statusBarSubPanel =
385 createWindow(null, TYPE_STATUS_BAR_SUB_PANEL, mDisplayContent, "StatusBarSubPanel");
386 mDisplayContent.assignChildLayers(mTransaction);
387
388 // Ime should be above all app windows and below system windows if it is targeting an app
389 // window.
Robert Carrf7a7ca82017-12-06 13:17:07 -0800390 assertWindowHigher(navBarPanel, mNavBarWindow);
391 assertWindowHigher(statusBarPanel, mStatusBarWindow);
392 assertWindowHigher(statusBarSubPanel, statusBarPanel);
Robert Carr8360a782017-11-22 12:47:58 -0800393 }
Robert Carr0eff1872017-12-01 14:27:04 -0800394
395 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900396 public void testAssignWindowLayers_ForNegativelyZOrderedSubtype() {
Robert Carr0eff1872017-12-01 14:27:04 -0800397 // TODO(b/70040778): We should aim to eliminate the last user of TYPE_APPLICATION_MEDIA
398 // then we can drop all negative layering on the windowing side.
399
Robert Carrf7a7ca82017-12-06 13:17:07 -0800400 final WindowState anyWindow = createWindow("anyWindow");
Robert Carr0eff1872017-12-01 14:27:04 -0800401 final WindowState child = createWindow(anyWindow, TYPE_APPLICATION_MEDIA, mDisplayContent,
402 "TypeApplicationMediaChild");
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700403 final WindowState mediaOverlayChild = createWindow(anyWindow,
404 TYPE_APPLICATION_MEDIA_OVERLAY,
Robert Carr0eff1872017-12-01 14:27:04 -0800405 mDisplayContent, "TypeApplicationMediaOverlayChild");
406
407 mDisplayContent.assignChildLayers(mTransaction);
408
Robert Carrf7a7ca82017-12-06 13:17:07 -0800409 assertWindowHigher(anyWindow, mediaOverlayChild);
410 assertWindowHigher(mediaOverlayChild, child);
411 }
412
Tiger Huang9c8ee262019-02-19 20:44:27 +0800413 @Test
414 public void testAssignWindowLayers_ForPostivelyZOrderedSubtype() {
415 final WindowState anyWindow = createWindow("anyWindow");
416 final ArrayList<WindowState> childList = new ArrayList<>();
417 childList.add(createWindow(anyWindow, TYPE_APPLICATION_PANEL, mDisplayContent,
418 "TypeApplicationPanelChild"));
419 childList.add(createWindow(anyWindow, TYPE_APPLICATION_SUB_PANEL, mDisplayContent,
420 "TypeApplicationSubPanelChild"));
421 childList.add(createWindow(anyWindow, TYPE_APPLICATION_ATTACHED_DIALOG, mDisplayContent,
422 "TypeApplicationAttachedDialogChild"));
423 childList.add(createWindow(anyWindow, TYPE_APPLICATION_ABOVE_SUB_PANEL, mDisplayContent,
424 "TypeApplicationAboveSubPanelPanelChild"));
425
426 final LayerRecordingTransaction t = mTransaction;
427 mDisplayContent.assignChildLayers(t);
428
429 for (int i = childList.size() - 1; i >= 0; i--) {
430 assertThat(t.getLayer(childList.get(i).getSurfaceControl()))
431 .isGreaterThan(PRESERVED_SURFACE_LAYER);
432 }
433 }
434
Yunfan Chend552c162019-02-08 16:51:28 +0900435 @FlakyTest(bugId = 124088319)
Robert Carrf7a7ca82017-12-06 13:17:07 -0800436 @Test
Tadashi G. Takaokac98f6822018-10-11 17:11:49 +0900437 public void testDockedDividerPosition() {
Robert Carrf7a7ca82017-12-06 13:17:07 -0800438 final WindowState pinnedStackWindow = createWindowOnStack(null, WINDOWING_MODE_PINNED,
439 ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, mDisplayContent,
440 "pinnedStackWindow");
441 final WindowState splitScreenWindow = createWindowOnStack(null,
442 WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION,
443 mDisplayContent, "splitScreenWindow");
444 final WindowState splitScreenSecondaryWindow = createWindowOnStack(null,
445 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
446 TYPE_BASE_APPLICATION, mDisplayContent, "splitScreenSecondaryWindow");
Tadashi G. Takaokab6e148c2018-11-03 02:59:06 -0700447 final WindowState assistantStackWindow = createWindowOnStack(null,
448 WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_ASSISTANT, TYPE_BASE_APPLICATION,
Robert Carrf7a7ca82017-12-06 13:17:07 -0800449 mDisplayContent, "assistantStackWindow");
450
451 mDisplayContent.assignChildLayers(mTransaction);
452
453 assertWindowHigher(mDockedDividerWindow, splitScreenWindow);
454 assertWindowHigher(mDockedDividerWindow, splitScreenSecondaryWindow);
455 assertWindowHigher(pinnedStackWindow, mDockedDividerWindow);
Robert Carr0eff1872017-12-01 14:27:04 -0800456 }
Robert Carrb1579c82017-09-05 14:54:47 -0700457}