blob: 8ad2ef138b079bc5e1006ac812f2fa5d4824112e [file] [log] [blame]
Craig Mautner59c00972012-07-30 12:10:24 -07001/*
2 * Copyright (C) 2012 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
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -070019import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID;
Craig Mautnerde4ef022013-04-07 19:01:33 -070020import static com.android.server.wm.WindowManagerService.DEBUG_STACK;
Craig Mautner858d8a62013-04-23 17:08:34 -070021import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY;
Craig Mautnerde4ef022013-04-07 19:01:33 -070022import static com.android.server.wm.WindowManagerService.TAG;
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -070023
Craig Mautner5ff12102013-05-24 12:50:15 -070024import android.app.ActivityManager.StackBoxInfo;
Craig Mautnerc00204b2013-03-05 15:02:14 -080025import android.graphics.Rect;
Craig Mautner6601b7b2013-04-29 10:29:11 -070026import android.graphics.Region;
Craig Mautnerde4ef022013-04-07 19:01:33 -070027import android.util.Slog;
Craig Mautner858d8a62013-04-23 17:08:34 -070028import android.util.SparseArray;
Craig Mautnerb47bbc32012-08-22 17:41:48 -070029import android.view.Display;
Craig Mautner59c00972012-07-30 12:10:24 -070030import android.view.DisplayInfo;
Craig Mautnercf910b02013-04-23 11:23:27 -070031import android.view.InputChannel;
Craig Mautner59c00972012-07-30 12:10:24 -070032
33import java.io.PrintWriter;
34import java.util.ArrayList;
35
36class DisplayContentList extends ArrayList<DisplayContent> {
37}
38
39/**
40 * Utility class for keeping track of the WindowStates and other pertinent contents of a
41 * particular Display.
42 *
43 * IMPORTANT: No method from this class should ever be used without holding
44 * WindowManagerService.mWindowMap.
45 */
46class DisplayContent {
47
48 /** Unique identifier of this stack. */
49 private final int mDisplayId;
50
51 /** Z-ordered (bottom-most first) list of all Window objects. Assigned to an element
52 * from mDisplayWindows; */
53 private WindowList mWindows = new WindowList();
54
Craig Mautner59c00972012-07-30 12:10:24 -070055 // This protects the following display size properties, so that
56 // getDisplaySize() doesn't need to acquire the global lock. This is
57 // needed because the window manager sometimes needs to use ActivityThread
58 // while it has its global state locked (for example to load animation
59 // resources), but the ActivityThread also needs get the current display
60 // size sometimes when it has its package lock held.
61 //
62 // These will only be modified with both mWindowMap and mDisplaySizeLock
63 // held (in that order) so the window manager doesn't need to acquire this
64 // lock when needing these values in its normal operation.
65 final Object mDisplaySizeLock = new Object();
66 int mInitialDisplayWidth = 0;
67 int mInitialDisplayHeight = 0;
Dianne Hackborndde331c2012-08-03 14:01:57 -070068 int mInitialDisplayDensity = 0;
Craig Mautner59c00972012-07-30 12:10:24 -070069 int mBaseDisplayWidth = 0;
70 int mBaseDisplayHeight = 0;
Dianne Hackborndde331c2012-08-03 14:01:57 -070071 int mBaseDisplayDensity = 0;
Craig Mautner2d5618c2012-10-18 13:55:47 -070072 private final DisplayInfo mDisplayInfo = new DisplayInfo();
73 private final Display mDisplay;
Craig Mautner59c00972012-07-30 12:10:24 -070074
Craig Mautner6601b7b2013-04-29 10:29:11 -070075 Rect mBaseDisplayRect = new Rect();
76
Craig Mautner39834192012-09-02 07:47:24 -070077 // Accessed directly by all users.
78 boolean layoutNeeded;
Craig Mautner76a71652012-09-03 23:23:58 -070079 int pendingLayoutChanges;
Craig Mautner69b08182012-09-05 13:07:13 -070080 final boolean isDefaultDisplay;
Craig Mautner39834192012-09-02 07:47:24 -070081
Craig Mautner2d5618c2012-10-18 13:55:47 -070082 /**
Craig Mautnerb1fd65c02013-02-05 13:34:57 -080083 * Window tokens that are in the process of exiting, but still
84 * on screen for animations.
85 */
86 final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>();
87
88 /**
89 * Application tokens that are in the process of exiting, but still
90 * on screen for animations.
91 */
92 final AppTokenList mExitingAppTokens = new AppTokenList();
93
Craig Mautnercf910b02013-04-23 11:23:27 -070094 /** Array containing the home StackBox and possibly one more which would contain apps. Array
95 * is stored in display order with the current bottom stack at 0. */
Craig Mautner00af9fe2013-03-25 09:13:41 -070096 private ArrayList<StackBox> mStackBoxes = new ArrayList<StackBox>();
Craig Mautnerc00204b2013-03-05 15:02:14 -080097
Craig Mautnercf910b02013-04-23 11:23:27 -070098 /** True when the home StackBox is at the top of mStackBoxes, false otherwise. */
Craig Mautnerde4ef022013-04-07 19:01:33 -070099 private TaskStack mHomeStack = null;
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700100
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700101 /** Sorted most recent at top, oldest at [0]. */
102 ArrayList<TaskStack> mStackHistory = new ArrayList<TaskStack>();
103
Craig Mautnercf910b02013-04-23 11:23:27 -0700104 /** Forward motion events to mTapDetector. */
105 InputChannel mTapInputChannel;
106
107 /** Detect user tapping outside of current focused stack bounds .*/
108 StackTapDetector mTapDetector;
109
Craig Mautner6601b7b2013-04-29 10:29:11 -0700110 /** Detect user tapping outside of current focused stack bounds .*/
111 Region mTouchExcludeRegion = new Region();
112
Craig Mautner858d8a62013-04-23 17:08:34 -0700113 SparseArray<UserStacks> mUserStacks = new SparseArray<UserStacks>();
114
Craig Mautner6601b7b2013-04-29 10:29:11 -0700115 /** Save allocating when retrieving tasks */
116 ArrayList<Task> mTmpTasks = new ArrayList<Task>();
117
118 /** Save allocating when calculating rects */
119 Rect mTmpRect = new Rect();
120
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800121 /**
Craig Mautner2d5618c2012-10-18 13:55:47 -0700122 * @param display May not be null.
123 */
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700124 DisplayContent(Display display) {
125 mDisplay = display;
126 mDisplayId = display.getDisplayId();
127 display.getDisplayInfo(mDisplayInfo);
Craig Mautner69b08182012-09-05 13:07:13 -0700128 isDefaultDisplay = mDisplayId == Display.DEFAULT_DISPLAY;
Craig Mautner59c00972012-07-30 12:10:24 -0700129 }
130
131 int getDisplayId() {
132 return mDisplayId;
133 }
134
135 WindowList getWindowList() {
136 return mWindows;
137 }
138
Craig Mautnerb47bbc32012-08-22 17:41:48 -0700139 Display getDisplay() {
140 return mDisplay;
141 }
142
Craig Mautner59c00972012-07-30 12:10:24 -0700143 DisplayInfo getDisplayInfo() {
144 return mDisplayInfo;
145 }
146
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700147 boolean homeOnTop() {
Craig Mautnerde4ef022013-04-07 19:01:33 -0700148 return mStackBoxes.get(0).mStack != mHomeStack;
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700149 }
150
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700151 void moveStack(TaskStack stack, boolean toTop) {
152 mStackHistory.remove(stack);
153 mStackHistory.add(toTop ? mStackHistory.size() : 0, stack);
154 }
155
Craig Mautner00af9fe2013-03-25 09:13:41 -0700156 /**
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700157 * Retrieve the tasks on this display in stack order from the bottommost TaskStack up.
Craig Mautner00af9fe2013-03-25 09:13:41 -0700158 * @return All the Tasks, in order, on this display.
159 */
Craig Mautnerc00204b2013-03-05 15:02:14 -0800160 ArrayList<Task> getTasks() {
Craig Mautnerd9a22882013-03-16 15:00:36 -0700161 mTmpTasks.clear();
Craig Mautner858d8a62013-04-23 17:08:34 -0700162 // First do the tasks belonging to other users.
163 final int numUserStacks = mUserStacks.size();
164 for (int i = 0; i < numUserStacks; ++i) {
165 UserStacks userStacks = mUserStacks.valueAt(i);
166 ArrayList<TaskStack> stacks = userStacks.mSavedStackHistory;
167 final int numStacks = stacks.size();
168 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
169 TaskStack stack = stacks.get(stackNdx);
170 if (stack != mHomeStack) {
171 if (WindowManagerService.DEBUG_LAYERS) Slog.i(TAG, "getTasks: mStackHistory=" +
172 mStackHistory);
173 mTmpTasks.addAll(stack.getTasks());
174 }
175 }
176 }
177 // Now do the current user's tasks.
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700178 final int numStacks = mStackHistory.size();
179 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
180 mTmpTasks.addAll(mStackHistory.get(stackNdx).getTasks());
Craig Mautnerd9a22882013-03-16 15:00:36 -0700181 }
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700182 if (WindowManagerService.DEBUG_LAYERS) Slog.i(TAG, "getTasks: mStackHistory=" +
183 mStackHistory);
Craig Mautnerd9a22882013-03-16 15:00:36 -0700184 return mTmpTasks;
Craig Mautnerc00204b2013-03-05 15:02:14 -0800185 }
186
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700187 TaskStack getHomeStack() {
Craig Mautnerde4ef022013-04-07 19:01:33 -0700188 return mHomeStack;
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700189 }
190
Craig Mautner722285e2012-09-07 13:55:58 -0700191 public void updateDisplayInfo() {
192 mDisplay.getDisplayInfo(mDisplayInfo);
193 }
194
Craig Mautner00af9fe2013-03-25 09:13:41 -0700195 /** @return The number of tokens in all of the Tasks on this display. */
Craig Mautnerf81b90872013-02-26 13:02:43 -0800196 int numTokens() {
Craig Mautnerd9a22882013-03-16 15:00:36 -0700197 getTasks();
Craig Mautnerf81b90872013-02-26 13:02:43 -0800198 int count = 0;
Craig Mautnerd9a22882013-03-16 15:00:36 -0700199 for (int taskNdx = mTmpTasks.size() - 1; taskNdx >= 0; --taskNdx) {
200 count += mTmpTasks.get(taskNdx).mAppTokens.size();
Craig Mautner05d6272ba2013-02-11 09:39:27 -0800201 }
Craig Mautnerf81b90872013-02-26 13:02:43 -0800202 return count;
Craig Mautner05d6272ba2013-02-11 09:39:27 -0800203 }
204
Craig Mautner00af9fe2013-03-25 09:13:41 -0700205 /** Refer to {@link WindowManagerService#createStack(int, int, int, float)} */
Craig Mautner05d29032013-05-03 13:40:13 -0700206 TaskStack createStack(WindowManagerService service, int stackId, int relativeStackId,
207 int position, float weight) {
Craig Mautnerc00204b2013-03-05 15:02:14 -0800208 TaskStack newStack = null;
Craig Mautnerde4ef022013-04-07 19:01:33 -0700209 if (DEBUG_STACK) Slog.d(TAG, "createStack: stackId=" + stackId + " relativeStackId="
210 + relativeStackId + " position=" + position + " weight=" + weight);
Craig Mautnerc00204b2013-03-05 15:02:14 -0800211 if (mStackBoxes.isEmpty()) {
Craig Mautnerde4ef022013-04-07 19:01:33 -0700212 if (stackId != HOME_STACK_ID) {
213 throw new IllegalArgumentException("createStack: First stackId not "
214 + HOME_STACK_ID);
215 }
Craig Mautner05d29032013-05-03 13:40:13 -0700216 StackBox newBox = new StackBox(service, this, null);
Craig Mautnerc00204b2013-03-05 15:02:14 -0800217 mStackBoxes.add(newBox);
Craig Mautner05d29032013-05-03 13:40:13 -0700218 newStack = new TaskStack(service, stackId, this);
Craig Mautner967212c2013-04-13 21:10:58 -0700219 newStack.mStackBox = newBox;
Craig Mautnerc00204b2013-03-05 15:02:14 -0800220 newBox.mStack = newStack;
Craig Mautnerde4ef022013-04-07 19:01:33 -0700221 mHomeStack = newStack;
Craig Mautnerc00204b2013-03-05 15:02:14 -0800222 } else {
223 int stackBoxNdx;
224 for (stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
225 final StackBox box = mStackBoxes.get(stackBoxNdx);
226 if (position == StackBox.TASK_STACK_GOES_OVER
227 || position == StackBox.TASK_STACK_GOES_UNDER) {
228 // Position indicates a new box is added at top level only.
Craig Mautner00af9fe2013-03-25 09:13:41 -0700229 if (box.contains(relativeStackId)) {
Craig Mautner05d29032013-05-03 13:40:13 -0700230 StackBox newBox = new StackBox(service, this, null);
231 newStack = new TaskStack(service, stackId, this);
Craig Mautner967212c2013-04-13 21:10:58 -0700232 newStack.mStackBox = newBox;
Craig Mautnerc00204b2013-03-05 15:02:14 -0800233 newBox.mStack = newStack;
Craig Mautnerde4ef022013-04-07 19:01:33 -0700234 final int offset = position == StackBox.TASK_STACK_GOES_OVER ? 1 : 0;
235 if (DEBUG_STACK) Slog.d(TAG, "createStack: inserting stack at " +
236 (stackBoxNdx + offset));
Craig Mautnerc00204b2013-03-05 15:02:14 -0800237 mStackBoxes.add(stackBoxNdx + offset, newBox);
238 break;
239 }
240 } else {
241 // Remaining position values indicate a box must be split.
242 newStack = box.split(stackId, relativeStackId, position, weight);
243 if (newStack != null) {
244 break;
245 }
246 }
247 }
Craig Mautner00af9fe2013-03-25 09:13:41 -0700248 if (stackBoxNdx < 0) {
249 throw new IllegalArgumentException("createStack: stackId " + relativeStackId
250 + " not found.");
Craig Mautnerc00204b2013-03-05 15:02:14 -0800251 }
252 }
Craig Mautner967212c2013-04-13 21:10:58 -0700253 if (newStack != null) {
254 layoutNeeded = true;
255 }
Craig Mautnerc00204b2013-03-05 15:02:14 -0800256 return newStack;
257 }
258
Craig Mautner00af9fe2013-03-25 09:13:41 -0700259 /** Refer to {@link WindowManagerService#resizeStack(int, float)} */
Craig Mautnerc00204b2013-03-05 15:02:14 -0800260 boolean resizeStack(int stackId, float weight) {
Craig Mautner967212c2013-04-13 21:10:58 -0700261 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
Craig Mautnerc00204b2013-03-05 15:02:14 -0800262 final StackBox box = mStackBoxes.get(stackBoxNdx);
263 if (box.resize(stackId, weight)) {
264 return true;
265 }
266 }
267 return false;
268 }
269
Craig Mautner4cd0c13f2013-04-16 15:55:52 -0700270 void addStackBox(StackBox box, boolean toTop) {
271 if (mStackBoxes.size() >= 2) {
272 throw new RuntimeException("addStackBox: Too many toplevel StackBoxes!");
273 }
274 mStackBoxes.add(toTop ? mStackBoxes.size() : 0, box);
275 }
276
Craig Mautner9e4f28c2013-04-03 10:53:23 -0700277 void removeStackBox(StackBox box) {
Craig Mautnerde4ef022013-04-07 19:01:33 -0700278 if (DEBUG_STACK) Slog.d(TAG, "removeStackBox: box=" + box);
Craig Mautner9e4f28c2013-04-03 10:53:23 -0700279 final TaskStack stack = box.mStack;
280 if (stack != null && stack.mStackId == HOME_STACK_ID) {
281 // Never delete the home stack, even if it is empty.
Craig Mautnerde4ef022013-04-07 19:01:33 -0700282 if (DEBUG_STACK) Slog.d(TAG, "removeStackBox: Not deleting home stack.");
Craig Mautner9e4f28c2013-04-03 10:53:23 -0700283 return;
284 }
285 mStackBoxes.remove(box);
286 }
287
Craig Mautner5ff12102013-05-24 12:50:15 -0700288 StackBoxInfo getStackBoxInfo(StackBox box) {
289 StackBoxInfo info = new StackBoxInfo();
290 info.stackBoxId = box.mStackBoxId;
291 info.weight = box.mWeight;
292 info.vertical = box.mVertical;
293 info.bounds = new Rect(box.mBounds);
294 if (box.mStack != null) {
295 info.stackId = box.mStack.mStackId;
296 // ActivityManagerService will fill in the StackInfo.
297 } else {
298 info.stackId = -1;
299 info.children = new StackBoxInfo[2];
300 info.children[0] = getStackBoxInfo(box.mFirst);
301 info.children[1] = getStackBoxInfo(box.mSecond);
302 }
303 return info;
304 }
305
306 ArrayList<StackBoxInfo> getStackBoxInfos() {
307 ArrayList<StackBoxInfo> list = new ArrayList<StackBoxInfo>();
308 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
309 list.add(getStackBoxInfo(mStackBoxes.get(stackBoxNdx)));
310 }
311 return list;
312 }
313
Craig Mautner00af9fe2013-03-25 09:13:41 -0700314 /**
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700315 * Move the home StackBox to the top or bottom of mStackBoxes. That is the only place
316 * it is allowed to be. This is a nop if the home StackBox is already in the correct position.
317 * @param toTop Move home to the top of mStackBoxes if true, to the bottom if false.
318 * @return true if a change was made, false otherwise.
Craig Mautner00af9fe2013-03-25 09:13:41 -0700319 */
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700320 boolean moveHomeStackBox(boolean toTop) {
Craig Mautnerde4ef022013-04-07 19:01:33 -0700321 if (DEBUG_STACK) Slog.d(TAG, "moveHomeStackBox: toTop=" + toTop);
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700322 switch (mStackBoxes.size()) {
323 case 0: throw new RuntimeException("moveHomeStackBox: No home StackBox!");
324 case 1: return false; // Only the home StackBox exists.
Craig Mautnerde4ef022013-04-07 19:01:33 -0700325 case 2:
326 if (homeOnTop() ^ toTop) {
327 mStackBoxes.add(mStackBoxes.remove(0));
Craig Mautnerd5d5d0f2013-04-03 15:08:21 -0700328 return true;
329 }
330 return false;
331 default: throw new RuntimeException("moveHomeStackBox: Too many toplevel StackBoxes!");
Craig Mautner00af9fe2013-03-25 09:13:41 -0700332 }
333 }
334
Craig Mautner967212c2013-04-13 21:10:58 -0700335 /**
336 * Propagate the new bounds to all child stack boxes, applying weights as we move down.
337 * @param contentRect The bounds to apply at the top level.
338 */
Craig Mautnerb3b36ba2013-05-20 13:21:10 -0700339 boolean setStackBoxSize(Rect contentRect) {
340 boolean change = false;
Craig Mautner967212c2013-04-13 21:10:58 -0700341 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
Craig Mautnerb3b36ba2013-05-20 13:21:10 -0700342 change |= mStackBoxes.get(stackBoxNdx).setStackBoxSizes(contentRect);
Craig Mautner967212c2013-04-13 21:10:58 -0700343 }
Craig Mautnerb3b36ba2013-05-20 13:21:10 -0700344 return change;
Craig Mautner967212c2013-04-13 21:10:58 -0700345 }
346
347 Rect getStackBounds(int stackId) {
348 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
349 Rect bounds = mStackBoxes.get(stackBoxNdx).getStackBounds(stackId);
350 if (bounds != null) {
351 return bounds;
352 }
353 }
Craig Mautner858d8a62013-04-23 17:08:34 -0700354 // Not in the visible stacks, try the saved ones.
355 for (int userNdx = mUserStacks.size() - 1; userNdx >= 0; --userNdx) {
356 UserStacks userStacks = mUserStacks.valueAt(userNdx);
357 Rect bounds = userStacks.mSavedStackBox.getStackBounds(stackId);
358 if (bounds != null) {
359 return bounds;
360 }
361 }
Craig Mautner967212c2013-04-13 21:10:58 -0700362 return null;
363 }
364
Craig Mautnercf910b02013-04-23 11:23:27 -0700365 int stackIdFromPoint(int x, int y) {
366 StackBox topBox = mStackBoxes.get(mStackBoxes.size() - 1);
367 return topBox.stackIdFromPoint(x, y);
368 }
369
Craig Mautner6601b7b2013-04-29 10:29:11 -0700370 void setTouchExcludeRegion(TaskStack focusedStack) {
371 mTouchExcludeRegion.set(mBaseDisplayRect);
372 WindowList windows = getWindowList();
373 for (int i = windows.size() - 1; i >= 0; --i) {
374 final WindowState win = windows.get(i);
375 final TaskStack stack = win.getStack();
376 if (win.isVisibleLw() && stack != null && stack != focusedStack) {
377 mTmpRect.set(win.mVisibleFrame);
378 mTmpRect.intersect(win.mVisibleInsets);
379 mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE);
380 }
381 }
382 }
383
Craig Mautner858d8a62013-04-23 17:08:34 -0700384 void switchUserStacks(int oldUserId, int newUserId) {
385 final WindowList windows = getWindowList();
386 for (int i = 0; i < windows.size(); i++) {
387 final WindowState win = windows.get(i);
388 if (win.isHiddenFromUserLocked()) {
389 if (DEBUG_VISIBILITY) Slog.w(TAG, "user changing " + newUserId + " hiding "
390 + win + ", attrs=" + win.mAttrs.type + ", belonging to "
391 + win.mOwnerUid);
392 win.hideLw(false);
393 }
394 }
395 // Clear the old user's non-home StackBox
396 mUserStacks.put(oldUserId, new UserStacks());
397 UserStacks userStacks = mUserStacks.get(newUserId);
398 if (userStacks != null) {
399 userStacks.restore();
400 mUserStacks.delete(newUserId);
401 }
402 }
403
Craig Mautner05d29032013-05-03 13:40:13 -0700404 void resetAnimationBackgroundAnimator() {
405 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
406 mStackBoxes.get(stackBoxNdx).resetAnimationBackgroundAnimator();
407 }
408 }
409
410 boolean animateDimLayers() {
411 boolean result = false;
412 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
413 result |= mStackBoxes.get(stackBoxNdx).animateDimLayers();
414 }
415 return result;
416 }
417
418 void resetDimming() {
419 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
420 mStackBoxes.get(stackBoxNdx).resetDimming();
421 }
422 }
423
424 boolean isDimming() {
425 boolean result = false;
426 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
427 result |= mStackBoxes.get(stackBoxNdx).isDimming();
428 }
429 return result;
430 }
431
432 void stopDimmingIfNeeded() {
433 for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) {
434 mStackBoxes.get(stackBoxNdx).stopDimmingIfNeeded();
435 }
436 }
437
Craig Mautnera91f9e22012-09-14 16:22:08 -0700438 public void dump(String prefix, PrintWriter pw) {
439 pw.print(prefix); pw.print("Display: mDisplayId="); pw.println(mDisplayId);
440 final String subPrefix = " " + prefix;
441 pw.print(subPrefix); pw.print("init="); pw.print(mInitialDisplayWidth); pw.print("x");
442 pw.print(mInitialDisplayHeight); pw.print(" "); pw.print(mInitialDisplayDensity);
443 pw.print("dpi");
444 if (mInitialDisplayWidth != mBaseDisplayWidth
445 || mInitialDisplayHeight != mBaseDisplayHeight
446 || mInitialDisplayDensity != mBaseDisplayDensity) {
447 pw.print(" base=");
448 pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight);
449 pw.print(" "); pw.print(mBaseDisplayDensity); pw.print("dpi");
450 }
451 pw.print(" cur=");
452 pw.print(mDisplayInfo.logicalWidth);
453 pw.print("x"); pw.print(mDisplayInfo.logicalHeight);
454 pw.print(" app=");
455 pw.print(mDisplayInfo.appWidth);
456 pw.print("x"); pw.print(mDisplayInfo.appHeight);
457 pw.print(" rng="); pw.print(mDisplayInfo.smallestNominalAppWidth);
458 pw.print("x"); pw.print(mDisplayInfo.smallestNominalAppHeight);
459 pw.print("-"); pw.print(mDisplayInfo.largestNominalAppWidth);
460 pw.print("x"); pw.println(mDisplayInfo.largestNominalAppHeight);
Dianne Hackbornc652de82013-02-15 16:32:56 -0800461 pw.print(subPrefix); pw.print("layoutNeeded="); pw.println(layoutNeeded);
Craig Mautnerde4ef022013-04-07 19:01:33 -0700462 for (int boxNdx = 0; boxNdx < mStackBoxes.size(); ++boxNdx) {
463 pw.print(prefix); pw.print("StackBox #"); pw.println(boxNdx);
464 mStackBoxes.get(boxNdx).dump(prefix + " ", pw);
465 }
466 int ndx = numTokens();
467 if (ndx > 0) {
468 pw.println();
469 pw.println(" Application tokens in Z order:");
470 getTasks();
471 for (int taskNdx = mTmpTasks.size() - 1; taskNdx >= 0; --taskNdx) {
472 AppTokenList tokens = mTmpTasks.get(taskNdx).mAppTokens;
473 for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) {
474 final AppWindowToken wtoken = tokens.get(tokenNdx);
475 pw.print(" App #"); pw.print(ndx--);
476 pw.print(' '); pw.print(wtoken); pw.println(":");
477 wtoken.dump(pw, " ");
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800478 }
479 }
Craig Mautnerde4ef022013-04-07 19:01:33 -0700480 }
481 if (mExitingTokens.size() > 0) {
482 pw.println();
483 pw.println(" Exiting tokens:");
484 for (int i=mExitingTokens.size()-1; i>=0; i--) {
485 WindowToken token = mExitingTokens.get(i);
486 pw.print(" Exiting #"); pw.print(i);
487 pw.print(' '); pw.print(token);
488 pw.println(':');
489 token.dump(pw, " ");
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800490 }
Craig Mautnerde4ef022013-04-07 19:01:33 -0700491 }
492 if (mExitingAppTokens.size() > 0) {
493 pw.println();
494 pw.println(" Exiting application tokens:");
495 for (int i=mExitingAppTokens.size()-1; i>=0; i--) {
496 WindowToken token = mExitingAppTokens.get(i);
497 pw.print(" Exiting App #"); pw.print(i);
498 pw.print(' '); pw.print(token);
499 pw.println(':');
500 token.dump(pw, " ");
Craig Mautnerb1fd65c02013-02-05 13:34:57 -0800501 }
Craig Mautnerde4ef022013-04-07 19:01:33 -0700502 }
Craig Mautner858d8a62013-04-23 17:08:34 -0700503 if (mUserStacks.size() > 0) {
504 pw.println();
505 pw.println(" Saved user stacks:");
506 for (int i = 0; i < mUserStacks.size(); ++i) {
507 UserStacks userStacks = mUserStacks.valueAt(i);
508 pw.print(" UserId="); pw.println(Integer.toHexString(mUserStacks.keyAt(i)));
509 pw.print(" StackHistory="); pw.println(userStacks.mSavedStackHistory);
510 pw.print(" StackBox="); userStacks.mSavedStackBox.dump(" ", pw);
511 }
512 }
Craig Mautner59c00972012-07-30 12:10:24 -0700513 pw.println();
514 }
Craig Mautner858d8a62013-04-23 17:08:34 -0700515
516 private final class UserStacks {
517 final ArrayList<TaskStack> mSavedStackHistory;
518 StackBox mSavedStackBox;
519 int mBoxNdx;
520
521 public UserStacks() {
522 mSavedStackHistory = new ArrayList<TaskStack>(mStackHistory);
523 for (int stackNdx = mStackHistory.size() - 1; stackNdx >=0; --stackNdx) {
524 if (mStackHistory.get(stackNdx) != mHomeStack) {
525 mStackHistory.remove(stackNdx);
526 }
527 }
528 mSavedStackBox = null;
529 mBoxNdx = -1;
530 for (int boxNdx = mStackBoxes.size() - 1; boxNdx >= 0; --boxNdx) {
531 StackBox box = mStackBoxes.get(boxNdx);
532 if (box.mStack != mHomeStack) {
533 mSavedStackBox = box;
534 mBoxNdx = boxNdx;
535 mStackBoxes.remove(boxNdx);
536 break;
537 }
538 }
539 }
540
541 void restore() {
542 mStackHistory = mSavedStackHistory;
543 if (mBoxNdx >= 0) {
544 mStackBoxes.add(mBoxNdx, mSavedStackBox);
545 }
546 }
547 }
Craig Mautner59c00972012-07-30 12:10:24 -0700548}