159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner/* 259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * Copyright (C) 2012 The Android Open Source Project 359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * 459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * you may not use this file except in compliance with the License. 659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * You may obtain a copy of the License at 759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * 859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * http://www.apache.org/licenses/LICENSE-2.0 959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * 1059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * Unless required by applicable law or agreed to in writing, software 1159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 1259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * See the License for the specific language governing permissions and 1459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * limitations under the License. 1559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner */ 1659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 1759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerpackage com.android.server.wm; 1859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 19d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautnerimport static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; 20de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STACK; 21858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; 22de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport static com.android.server.wm.WindowManagerService.TAG; 23d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 245ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautnerimport android.app.ActivityManager.StackBoxInfo; 25c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerimport android.graphics.Rect; 266601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautnerimport android.graphics.Region; 27e2dd83a5b428df5a6ef21c11e71d021c640d843fCraig Mautnerimport android.os.Debug; 282c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog; 29de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport android.util.Slog; 30b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautnerimport android.view.Display; 3159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.DisplayInfo; 322c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport com.android.server.EventLogTags; 3359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 3459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport java.io.PrintWriter; 3559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport java.util.ArrayList; 3659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 3759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass DisplayContentList extends ArrayList<DisplayContent> { 3859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner} 3959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 4059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner/** 4159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * Utility class for keeping track of the WindowStates and other pertinent contents of a 4259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * particular Display. 4359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * 4459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * IMPORTANT: No method from this class should ever be used without holding 4559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * WindowManagerService.mWindowMap. 4659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner */ 4759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass DisplayContent { 4859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 4959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner /** Unique identifier of this stack. */ 5059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner private final int mDisplayId; 5159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 5259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner /** Z-ordered (bottom-most first) list of all Window objects. Assigned to an element 5359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * from mDisplayWindows; */ 5459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner private WindowList mWindows = new WindowList(); 5559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 5659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // This protects the following display size properties, so that 5759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // getDisplaySize() doesn't need to acquire the global lock. This is 5859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // needed because the window manager sometimes needs to use ActivityThread 5959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // while it has its global state locked (for example to load animation 6059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // resources), but the ActivityThread also needs get the current display 6159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // size sometimes when it has its package lock held. 6259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // 6359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // These will only be modified with both mWindowMap and mDisplaySizeLock 6459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // held (in that order) so the window manager doesn't need to acquire this 6559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // lock when needing these values in its normal operation. 6659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final Object mDisplaySizeLock = new Object(); 6759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mInitialDisplayWidth = 0; 6859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mInitialDisplayHeight = 0; 69dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn int mInitialDisplayDensity = 0; 7059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mBaseDisplayWidth = 0; 7159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mBaseDisplayHeight = 0; 72dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn int mBaseDisplayDensity = 0; 732d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner private final DisplayInfo mDisplayInfo = new DisplayInfo(); 742d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner private final Display mDisplay; 7559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 766601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner Rect mBaseDisplayRect = new Rect(); 776601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 78398341927f3dca68d71024483aa276d10af4c080Craig Mautner // Accessed directly by all users. 79398341927f3dca68d71024483aa276d10af4c080Craig Mautner boolean layoutNeeded; 8076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner int pendingLayoutChanges; 8169b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner final boolean isDefaultDisplay; 82398341927f3dca68d71024483aa276d10af4c080Craig Mautner 832d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner /** 84b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Window tokens that are in the process of exiting, but still 85b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * on screen for animations. 86b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner */ 87b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>(); 88b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 89b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner /** 90b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Application tokens that are in the process of exiting, but still 91b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * on screen for animations. 92b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner */ 93b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner final AppTokenList mExitingAppTokens = new AppTokenList(); 94b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 95cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner /** Array containing the home StackBox and possibly one more which would contain apps. Array 96cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner * is stored in display order with the current bottom stack at 0. */ 9700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner private ArrayList<StackBox> mStackBoxes = new ArrayList<StackBox>(); 98c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 99cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner /** True when the home StackBox is at the top of mStackBoxes, false otherwise. */ 100de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner private TaskStack mHomeStack = null; 101d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 102cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner /** Detect user tapping outside of current focused stack bounds .*/ 103037aa8d434984840691378f3cc7d99d63dcc4076Craig Mautner StackTapPointerEventListener mTapDetector; 104cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 1056601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner /** Detect user tapping outside of current focused stack bounds .*/ 1066601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner Region mTouchExcludeRegion = new Region(); 1076601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 1086601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner /** Save allocating when retrieving tasks */ 1092c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner private ArrayList<Task> mTaskHistory = new ArrayList<Task>(); 1106601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 1116601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner /** Save allocating when calculating rects */ 1126601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner Rect mTmpRect = new Rect(); 1136601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 1149d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner final WindowManagerService mService; 1159d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner 116b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner /** 1172d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner * @param display May not be null. 1189d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner * @param service TODO(cmautner): 1192d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner */ 1209d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner DisplayContent(Display display, WindowManagerService service) { 121b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner mDisplay = display; 122b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner mDisplayId = display.getDisplayId(); 123b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner display.getDisplayInfo(mDisplayInfo); 12469b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner isDefaultDisplay = mDisplayId == Display.DEFAULT_DISPLAY; 1259d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner mService = service; 1269d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner 1279d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner StackBox newBox = new StackBox(service, this, null); 1289d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner mStackBoxes.add(newBox); 1299d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner TaskStack newStack = new TaskStack(service, HOME_STACK_ID, this); 1309d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner newStack.mStackBox = newBox; 1319d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner newBox.mStack = newStack; 1329d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner mHomeStack = newStack; 13359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 13459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 13559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int getDisplayId() { 13659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner return mDisplayId; 13759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 13859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 13959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner WindowList getWindowList() { 14059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner return mWindows; 14159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 14259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 143b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner Display getDisplay() { 144b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner return mDisplay; 145b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner } 146b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner 14759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner DisplayInfo getDisplayInfo() { 14859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner return mDisplayInfo; 14959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 15059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 151a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 152a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Returns true if the specified UID has access to this display. 153a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 154a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public boolean hasAccess(int uid) { 155a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return mDisplay.hasAccess(uid); 156a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 157a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 158d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner boolean homeOnTop() { 159de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mStackBoxes.get(0).mStack != mHomeStack; 160d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner } 161d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 162a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung public boolean isPrivate() { 163a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung return (mDisplay.getFlags() & Display.FLAG_PRIVATE) != 0; 164a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung } 165a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung 16600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner /** 1674cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner * Retrieve the tasks on this display in stack order from the bottommost TaskStack up. 16800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner * @return All the Tasks, in order, on this display. 16900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner */ 170c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner ArrayList<Task> getTasks() { 17177df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner return mTaskHistory; 17277df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } 17377df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner 17477df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner void addTask(Task task, boolean toTop) { 17577df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner mTaskHistory.remove(task); 17677df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner 17777df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner final int userId = task.mUserId; 17877df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner int taskNdx; 17977df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner final int numTasks = mTaskHistory.size(); 18077df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner if (toTop) { 18177df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner for (taskNdx = numTasks - 1; taskNdx >= 0; --taskNdx) { 18277df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner if (mTaskHistory.get(taskNdx).mUserId == userId) { 18377df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner break; 18477df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } 18577df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } 18677df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner ++taskNdx; 18777df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } else { 18877df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner for (taskNdx = 0; taskNdx < numTasks; ++taskNdx) { 18977df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner if (mTaskHistory.get(taskNdx).mUserId == userId) { 19077df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner break; 19177df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } 19277df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } 193d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner } 19477df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner 19577df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner mTaskHistory.add(taskNdx, task); 1962c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner EventLog.writeEvent(EventLogTags.WM_TASK_MOVED, task.taskId, toTop ? 1 : 0, taskNdx); 19777df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner } 19877df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner 19977df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner void removeTask(Task task) { 20077df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner mTaskHistory.remove(task); 201c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 202c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 203d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner TaskStack getHomeStack() { 204de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 205d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner } 206d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 20746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner void updateDisplayInfo() { 208722285e199a9fc74b9b3343b7505c00666848c88Craig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 209722285e199a9fc74b9b3343b7505c00666848c88Craig Mautner } 210722285e199a9fc74b9b3343b7505c00666848c88Craig Mautner 21146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner void getLogicalDisplayRect(Rect out) { 21246ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner updateDisplayInfo(); 21346ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner // Uses same calculation as in LogicalDisplay#configureDisplayInTransactionLocked. 21446ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner int width = mDisplayInfo.logicalWidth; 21546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner int left = (mBaseDisplayWidth - width) / 2; 21646ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner int height = mDisplayInfo.logicalHeight; 21746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner int top = (mBaseDisplayHeight - height) / 2; 21846ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner out.set(left, top, left + width, top + height); 21946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner } 22046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner 22100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner /** @return The number of tokens in all of the Tasks on this display. */ 222c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner int numTokens() { 223c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner int count = 0; 22477df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { 22577df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner count += mTaskHistory.get(taskNdx).mAppTokens.size(); 226b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 227c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return count; 228b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 229b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 23000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner /** Refer to {@link WindowManagerService#createStack(int, int, int, float)} */ 2319d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner TaskStack createStack(int stackId, int relativeStackBoxId, int position, float weight) { 232c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner TaskStack newStack = null; 2335a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner if (DEBUG_STACK) Slog.d(TAG, "createStack: stackId=" + stackId + " relativeStackBoxId=" 2345a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner + relativeStackBoxId + " position=" + position + " weight=" + weight); 2359d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner if (stackId == HOME_STACK_ID) { 2369d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner if (mStackBoxes.size() != 1) { 2379d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner throw new IllegalArgumentException("createStack: HOME_STACK_ID (0) not first."); 238de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2399d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner newStack = mHomeStack; 240c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } else { 241c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner int stackBoxNdx; 242c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner for (stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 243c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner final StackBox box = mStackBoxes.get(stackBoxNdx); 244c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner if (position == StackBox.TASK_STACK_GOES_OVER 245c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner || position == StackBox.TASK_STACK_GOES_UNDER) { 246c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner // Position indicates a new box is added at top level only. 2475a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner if (box.contains(relativeStackBoxId)) { 2489d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner StackBox newBox = new StackBox(mService, this, null); 2499d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner newStack = new TaskStack(mService, stackId, this); 250967212cb542e6eeb308678367b53381bff984c31Craig Mautner newStack.mStackBox = newBox; 251c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner newBox.mStack = newStack; 252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final int offset = position == StackBox.TASK_STACK_GOES_OVER ? 1 : 0; 253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "createStack: inserting stack at " + 254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner (stackBoxNdx + offset)); 255c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mStackBoxes.add(stackBoxNdx + offset, newBox); 256c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner break; 257c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 258c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } else { 259c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner // Remaining position values indicate a box must be split. 2605a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner newStack = box.split(stackId, relativeStackBoxId, position, weight); 261c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner if (newStack != null) { 262c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner break; 263c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 264c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 265c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 26600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner if (stackBoxNdx < 0) { 2675a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner throw new IllegalArgumentException("createStack: stackBoxId " + relativeStackBoxId 26800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner + " not found."); 269b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 270b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 271967212cb542e6eeb308678367b53381bff984c31Craig Mautner if (newStack != null) { 272967212cb542e6eeb308678367b53381bff984c31Craig Mautner layoutNeeded = true; 273967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 2742c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner EventLog.writeEvent(EventLogTags.WM_STACK_CREATED, stackId, relativeStackBoxId, position, 2752c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner (int)(weight * 100 + 0.5)); 276c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return newStack; 277b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 278b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 2795a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner /** Refer to {@link WindowManagerService#resizeStackBox(int, float)} */ 2805a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner boolean resizeStack(int stackBoxId, float weight) { 281967212cb542e6eeb308678367b53381bff984c31Craig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 282c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner final StackBox box = mStackBoxes.get(stackBoxNdx); 2835a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner if (box.resize(stackBoxId, weight)) { 2845a449154d1795abe8e44b7bfe821d640b145e2c6Craig Mautner layoutNeeded = true; 285c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return true; 286c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 2875d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner } 288c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return false; 28905d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner } 29005d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner 2914cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner void addStackBox(StackBox box, boolean toTop) { 2924cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner if (mStackBoxes.size() >= 2) { 2934cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner throw new RuntimeException("addStackBox: Too many toplevel StackBoxes!"); 2944cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner } 2954cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner mStackBoxes.add(toTop ? mStackBoxes.size() : 0, box); 2964cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner } 2974cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner 2989e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner void removeStackBox(StackBox box) { 299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "removeStackBox: box=" + box); 3009e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner final TaskStack stack = box.mStack; 3019e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner if (stack != null && stack.mStackId == HOME_STACK_ID) { 3029e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner // Never delete the home stack, even if it is empty. 303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "removeStackBox: Not deleting home stack."); 3049e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner return; 3059e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner } 3069e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner mStackBoxes.remove(box); 3079e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner } 3089e4f28cfa157fff89e42859edc9cce546508491fCraig Mautner 3095ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner StackBoxInfo getStackBoxInfo(StackBox box) { 3105ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner StackBoxInfo info = new StackBoxInfo(); 3115ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.stackBoxId = box.mStackBoxId; 3125ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.weight = box.mWeight; 3135ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.vertical = box.mVertical; 3145ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.bounds = new Rect(box.mBounds); 3155ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner if (box.mStack != null) { 3165ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.stackId = box.mStack.mStackId; 3175ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner // ActivityManagerService will fill in the StackInfo. 3185ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner } else { 3195ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.stackId = -1; 3205ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.children = new StackBoxInfo[2]; 3215ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.children[0] = getStackBoxInfo(box.mFirst); 3225ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner info.children[1] = getStackBoxInfo(box.mSecond); 3235ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner } 3245ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner return info; 3255ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner } 3265ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner 3275ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner ArrayList<StackBoxInfo> getStackBoxInfos() { 3285ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner ArrayList<StackBoxInfo> list = new ArrayList<StackBoxInfo>(); 3295ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 3305ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner list.add(getStackBoxInfo(mStackBoxes.get(stackBoxNdx))); 3315ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner } 3325ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner return list; 3335ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner } 3345ff12101722874f5e7b0cadf06f4c53f4ec4b917Craig Mautner 33500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner /** 336d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner * Move the home StackBox to the top or bottom of mStackBoxes. That is the only place 337d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner * it is allowed to be. This is a nop if the home StackBox is already in the correct position. 338d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner * @param toTop Move home to the top of mStackBoxes if true, to the bottom if false. 339d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner * @return true if a change was made, false otherwise. 34000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner */ 341d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner boolean moveHomeStackBox(boolean toTop) { 342e2dd83a5b428df5a6ef21c11e71d021c640d843fCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "moveHomeStackBox: toTop=" + toTop + " Callers=" + 343e2dd83a5b428df5a6ef21c11e71d021c640d843fCraig Mautner Debug.getCallers(4)); 3442c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner EventLog.writeEvent(EventLogTags.WM_HOME_STACK_MOVED, toTop ? 1 : 0); 345d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner switch (mStackBoxes.size()) { 346d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner case 0: throw new RuntimeException("moveHomeStackBox: No home StackBox!"); 347d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner case 1: return false; // Only the home StackBox exists. 348de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case 2: 349de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (homeOnTop() ^ toTop) { 350de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStackBoxes.add(mStackBoxes.remove(0)); 351d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner return true; 352d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner } 353d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner return false; 354d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner default: throw new RuntimeException("moveHomeStackBox: Too many toplevel StackBoxes!"); 35500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner } 35600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner } 35700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner 358967212cb542e6eeb308678367b53381bff984c31Craig Mautner /** 359967212cb542e6eeb308678367b53381bff984c31Craig Mautner * Propagate the new bounds to all child stack boxes, applying weights as we move down. 360967212cb542e6eeb308678367b53381bff984c31Craig Mautner * @param contentRect The bounds to apply at the top level. 361967212cb542e6eeb308678367b53381bff984c31Craig Mautner */ 362b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner boolean setStackBoxSize(Rect contentRect) { 363b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner boolean change = false; 364967212cb542e6eeb308678367b53381bff984c31Craig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 365d76dcdcd98f1010b9439746314629cf7cba4df89Craig Mautner change |= mStackBoxes.get(stackBoxNdx).setStackBoxSizes(contentRect, true); 366967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 367b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner return change; 368967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 369967212cb542e6eeb308678367b53381bff984c31Craig Mautner 370967212cb542e6eeb308678367b53381bff984c31Craig Mautner Rect getStackBounds(int stackId) { 371967212cb542e6eeb308678367b53381bff984c31Craig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 372967212cb542e6eeb308678367b53381bff984c31Craig Mautner Rect bounds = mStackBoxes.get(stackBoxNdx).getStackBounds(stackId); 373967212cb542e6eeb308678367b53381bff984c31Craig Mautner if (bounds != null) { 374967212cb542e6eeb308678367b53381bff984c31Craig Mautner return bounds; 375967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 376967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 377967212cb542e6eeb308678367b53381bff984c31Craig Mautner return null; 378967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 379967212cb542e6eeb308678367b53381bff984c31Craig Mautner 380cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner int stackIdFromPoint(int x, int y) { 381cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner StackBox topBox = mStackBoxes.get(mStackBoxes.size() - 1); 382cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner return topBox.stackIdFromPoint(x, y); 383cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 384cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 3856601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner void setTouchExcludeRegion(TaskStack focusedStack) { 3866601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTouchExcludeRegion.set(mBaseDisplayRect); 3876601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner WindowList windows = getWindowList(); 3886601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner for (int i = windows.size() - 1; i >= 0; --i) { 3896601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner final WindowState win = windows.get(i); 3906601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner final TaskStack stack = win.getStack(); 3916601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner if (win.isVisibleLw() && stack != null && stack != focusedStack) { 3926601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTmpRect.set(win.mVisibleFrame); 3936601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTmpRect.intersect(win.mVisibleInsets); 3946601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE); 3956601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner } 3966601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner } 3976601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner } 3986601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 399858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner void switchUserStacks(int oldUserId, int newUserId) { 400858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner final WindowList windows = getWindowList(); 401858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner for (int i = 0; i < windows.size(); i++) { 402858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner final WindowState win = windows.get(i); 403858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (win.isHiddenFromUserLocked()) { 404858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (DEBUG_VISIBILITY) Slog.w(TAG, "user changing " + newUserId + " hiding " 405858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner + win + ", attrs=" + win.mAttrs.type + ", belonging to " 406858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner + win.mOwnerUid); 407858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner win.hideLw(false); 408858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 409858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 410ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 411ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 412ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mStackBoxes.get(stackBoxNdx).switchUserStacks(newUserId); 413858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 414858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 415858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 41605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner void resetAnimationBackgroundAnimator() { 41705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 41805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mStackBoxes.get(stackBoxNdx).resetAnimationBackgroundAnimator(); 41905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 42005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 42105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 42205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean animateDimLayers() { 42305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 42405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 42505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner result |= mStackBoxes.get(stackBoxNdx).animateDimLayers(); 42605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 42705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 42805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 42905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 43005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner void resetDimming() { 43105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 43205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mStackBoxes.get(stackBoxNdx).resetDimming(); 43305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 43405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 43505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 43605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean isDimming() { 43705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 43805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 43905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner result |= mStackBoxes.get(stackBoxNdx).isDimming(); 44005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 44105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 44205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 44305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 44405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner void stopDimmingIfNeeded() { 44505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 44605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mStackBoxes.get(stackBoxNdx).stopDimmingIfNeeded(); 44705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 44805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 44905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 4502eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner void close() { 4512eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner for (int stackBoxNdx = mStackBoxes.size() - 1; stackBoxNdx >= 0; --stackBoxNdx) { 4522eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner mStackBoxes.get(stackBoxNdx).close(); 4532eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner } 4542eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner } 4552eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner 456a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner public void dump(String prefix, PrintWriter pw) { 457a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(prefix); pw.print("Display: mDisplayId="); pw.println(mDisplayId); 458a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final String subPrefix = " " + prefix; 459a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(subPrefix); pw.print("init="); pw.print(mInitialDisplayWidth); pw.print("x"); 460a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mInitialDisplayHeight); pw.print(" "); pw.print(mInitialDisplayDensity); 461a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("dpi"); 462a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (mInitialDisplayWidth != mBaseDisplayWidth 463a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner || mInitialDisplayHeight != mBaseDisplayHeight 464a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner || mInitialDisplayDensity != mBaseDisplayDensity) { 465a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" base="); 466a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight); 467a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" "); pw.print(mBaseDisplayDensity); pw.print("dpi"); 468a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 469a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" cur="); 470a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mDisplayInfo.logicalWidth); 471a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.print(mDisplayInfo.logicalHeight); 472a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" app="); 473a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mDisplayInfo.appWidth); 474a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.print(mDisplayInfo.appHeight); 475a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" rng="); pw.print(mDisplayInfo.smallestNominalAppWidth); 476a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.print(mDisplayInfo.smallestNominalAppHeight); 477a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("-"); pw.print(mDisplayInfo.largestNominalAppWidth); 478a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.println(mDisplayInfo.largestNominalAppHeight); 479c652de8141f5b8e3c6bcf8916842b6e106413b1aDianne Hackborn pw.print(subPrefix); pw.print("layoutNeeded="); pw.println(layoutNeeded); 480de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int boxNdx = 0; boxNdx < mStackBoxes.size(); ++boxNdx) { 481de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(prefix); pw.print("StackBox #"); pw.println(boxNdx); 482de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStackBoxes.get(boxNdx).dump(prefix + " ", pw); 483de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 484de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner int ndx = numTokens(); 485de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (ndx > 0) { 486de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(); 487de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(" Application tokens in Z order:"); 488de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner getTasks(); 48977df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { 49077df2ee9deb5635fabb2280ada5b3f3d01dd8e1bCraig Mautner AppTokenList tokens = mTaskHistory.get(taskNdx).mAppTokens; 491de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 492de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final AppWindowToken wtoken = tokens.get(tokenNdx); 493de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(" App #"); pw.print(ndx--); 494de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(' '); pw.print(wtoken); pw.println(":"); 495de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner wtoken.dump(pw, " "); 496b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 497b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 498de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (mExitingTokens.size() > 0) { 500de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(); 501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(" Exiting tokens:"); 502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=mExitingTokens.size()-1; i>=0; i--) { 503de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner WindowToken token = mExitingTokens.get(i); 504de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(" Exiting #"); pw.print(i); 505de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(' '); pw.print(token); 506de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(':'); 507de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner token.dump(pw, " "); 508b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 509de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 510de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (mExitingAppTokens.size() > 0) { 511de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(); 512de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(" Exiting application tokens:"); 513de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=mExitingAppTokens.size()-1; i>=0; i--) { 514de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner WindowToken token = mExitingAppTokens.get(i); 515de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(" Exiting App #"); pw.print(i); 516de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(' '); pw.print(token); 517de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(':'); 518de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner token.dump(pw, " "); 519b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 520de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 52159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner pw.println(); 52259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 52359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner} 524