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; 20858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; 21de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport static com.android.server.wm.WindowManagerService.TAG; 22d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 23c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautnerimport android.graphics.Rect; 246601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautnerimport android.graphics.Region; 25de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport android.util.Slog; 26b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautnerimport android.view.Display; 2759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.DisplayInfo; 284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.Surface; 2959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 3059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport java.io.PrintWriter; 3159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport java.util.ArrayList; 3259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 3359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass DisplayContentList extends ArrayList<DisplayContent> { 3459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner} 3559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 3659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner/** 3759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * Utility class for keeping track of the WindowStates and other pertinent contents of a 3859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * particular Display. 3959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * 4059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * IMPORTANT: No method from this class should ever be used without holding 4159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * WindowManagerService.mWindowMap. 4259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner */ 4359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerclass DisplayContent { 4459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 4559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner /** Unique identifier of this stack. */ 4659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner private final int mDisplayId; 4759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 4859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner /** Z-ordered (bottom-most first) list of all Window objects. Assigned to an element 4959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner * from mDisplayWindows; */ 50dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner private final WindowList mWindows = new WindowList(); 5159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 5259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // This protects the following display size properties, so that 5359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // getDisplaySize() doesn't need to acquire the global lock. This is 5459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // needed because the window manager sometimes needs to use ActivityThread 5559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // while it has its global state locked (for example to load animation 5659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // resources), but the ActivityThread also needs get the current display 5759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // size sometimes when it has its package lock held. 5859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // 5959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // These will only be modified with both mWindowMap and mDisplaySizeLock 6059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // held (in that order) so the window manager doesn't need to acquire this 6159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner // lock when needing these values in its normal operation. 6259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner final Object mDisplaySizeLock = new Object(); 6359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mInitialDisplayWidth = 0; 6459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mInitialDisplayHeight = 0; 65dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn int mInitialDisplayDensity = 0; 6659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mBaseDisplayWidth = 0; 6759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int mBaseDisplayHeight = 0; 68dde331cebd87982faded6818ad5f9927ff994c96Dianne Hackborn int mBaseDisplayDensity = 0; 692d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner private final DisplayInfo mDisplayInfo = new DisplayInfo(); 702d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner private final Display mDisplay; 7159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 726601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner Rect mBaseDisplayRect = new Rect(); 73bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner Rect mContentRect = new Rect(); 746601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 75398341927f3dca68d71024483aa276d10af4c080Craig Mautner // Accessed directly by all users. 76398341927f3dca68d71024483aa276d10af4c080Craig Mautner boolean layoutNeeded; 7776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner int pendingLayoutChanges; 7869b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner final boolean isDefaultDisplay; 79398341927f3dca68d71024483aa276d10af4c080Craig Mautner 80dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner /** Window tokens that are in the process of exiting, but still on screen for animations. */ 81b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner final ArrayList<WindowToken> mExitingTokens = new ArrayList<WindowToken>(); 82b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 83bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner /** Array containing all TaskStacks on this display. Array 84cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner * is stored in display order with the current bottom stack at 0. */ 85dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner private final ArrayList<TaskStack> mStacks = new ArrayList<TaskStack>(); 86c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 87bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner /** A special TaskStack with id==HOME_STACK_ID that moves to the bottom whenever any TaskStack 88bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner * (except a future lockscreen TaskStack) moves to the top. */ 89de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner private TaskStack mHomeStack = null; 90d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 91cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner /** Detect user tapping outside of current focused stack bounds .*/ 92037aa8d434984840691378f3cc7d99d63dcc4076Craig Mautner StackTapPointerEventListener mTapDetector; 93cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 946601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner /** Detect user tapping outside of current focused stack bounds .*/ 956601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner Region mTouchExcludeRegion = new Region(); 966601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 976601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner /** Save allocating when calculating rects */ 986601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner Rect mTmpRect = new Rect(); 996601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 100dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner /** For gathering Task objects in order. */ 101dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner final ArrayList<Task> mTmpTaskHistory = new ArrayList<Task>(); 102dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner 1039d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner final WindowManagerService mService; 1049d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner 10595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner /** Remove this display when animation on it has completed. */ 10695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner boolean mDeferredRemoval; 1071bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner 108b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner /** 1092d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner * @param display May not be null. 110df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner * @param service You know. 1112d5618c22101cfc4d6478cfe1d846798389540c1Craig Mautner */ 1129d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner DisplayContent(Display display, WindowManagerService service) { 113b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner mDisplay = display; 114b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner mDisplayId = display.getDisplayId(); 115b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner display.getDisplayInfo(mDisplayInfo); 11669b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner isDefaultDisplay = mDisplayId == Display.DEFAULT_DISPLAY; 1179d808b1f4823879ce8b52aefb90c55346017cdc7Craig Mautner mService = service; 11859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 11959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 12059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner int getDisplayId() { 12159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner return mDisplayId; 12259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 12359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 12459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner WindowList getWindowList() { 12559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner return mWindows; 12659c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 12759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 128b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner Display getDisplay() { 129b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner return mDisplay; 130b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner } 131b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner 13259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner DisplayInfo getDisplayInfo() { 13359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner return mDisplayInfo; 13459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 13559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner 136a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown /** 137a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown * Returns true if the specified UID has access to this display. 138a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown */ 139a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown public boolean hasAccess(int uid) { 140a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown return mDisplay.hasAccess(uid); 141a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown } 142a506a6ec94863a35acca9feb165db76ddac3892cJeff Brown 143a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung public boolean isPrivate() { 144a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung return (mDisplay.getFlags() & Display.FLAG_PRIVATE) != 0; 145a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung } 146a446bf0e8c7b5f5441aeb11b359ba6776b9b3061keunyoung 147dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner ArrayList<TaskStack> getStacks() { 148dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner return mStacks; 149dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner } 150dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner 15100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner /** 1524cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner * Retrieve the tasks on this display in stack order from the bottommost TaskStack up. 15300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner * @return All the Tasks, in order, on this display. 15400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner */ 155c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner ArrayList<Task> getTasks() { 156dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner mTmpTaskHistory.clear(); 157dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner final int numStacks = mStacks.size(); 158dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 159dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner mTmpTaskHistory.addAll(mStacks.get(stackNdx).getTasks()); 160d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner } 161dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner return mTmpTaskHistory; 162c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 163c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 164d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner TaskStack getHomeStack() { 165333c2ec88305a71ab1d59bf0482193273fac61afCraig Mautner if (mHomeStack == null && mDisplayId == Display.DEFAULT_DISPLAY) { 166e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner Slog.e(TAG, "getHomeStack: Returning null from this=" + this); 167e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 168de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 169d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner } 170d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner 17146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner void updateDisplayInfo() { 172722285e199a9fc74b9b3343b7505c00666848c88Craig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 173bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int i = mStacks.size() - 1; i >= 0; --i) { 174b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner mStacks.get(i).updateDisplayInfo(); 175bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner } 176722285e199a9fc74b9b3343b7505c00666848c88Craig Mautner } 177722285e199a9fc74b9b3343b7505c00666848c88Craig Mautner 17846ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner void getLogicalDisplayRect(Rect out) { 17946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner // Uses same calculation as in LogicalDisplay#configureDisplayInTransactionLocked. 1804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int orientation = mDisplayInfo.rotation; 1814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean rotated = (orientation == Surface.ROTATION_90 1824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner || orientation == Surface.ROTATION_270); 1834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int physWidth = rotated ? mBaseDisplayHeight : mBaseDisplayWidth; 1844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int physHeight = rotated ? mBaseDisplayWidth : mBaseDisplayHeight; 18546ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner int width = mDisplayInfo.logicalWidth; 1864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int left = (physWidth - width) / 2; 18746ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner int height = mDisplayInfo.logicalHeight; 1884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int top = (physHeight - height) / 2; 18946ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner out.set(left, top, left + width, top + height); 19046ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner } 19146ac6fa614131d567bed93d1d2067d765ecef85dCraig Mautner 192df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner /** Refer to {@link WindowManagerService#attachStack(int, int)} */ 193df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner void attachStack(TaskStack stack) { 194df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (stack.mStackId == HOME_STACK_ID) { 195bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner if (mHomeStack != null) { 196df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner throw new IllegalArgumentException("attachStack: HOME_STACK_ID (0) not first."); 197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 198df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mHomeStack = stack; 199b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 200df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mStacks.add(stack); 201bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner layoutNeeded = true; 202b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 203b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 204bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner void moveStack(TaskStack stack, boolean toTop) { 205bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.remove(stack); 206bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.add(toTop ? mStacks.size() : 0, stack); 20705d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner } 20805d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner 209df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner void detachStack(TaskStack stack) { 210df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mStacks.remove(stack); 21100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner } 21200af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner 213967212cb542e6eeb308678367b53381bff984c31Craig Mautner /** 214bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner * Propagate the new bounds to all child stacks. 215967212cb542e6eeb308678367b53381bff984c31Craig Mautner * @param contentRect The bounds to apply at the top level. 216967212cb542e6eeb308678367b53381bff984c31Craig Mautner */ 217bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner void resize(Rect contentRect) { 218bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mContentRect.set(contentRect); 219967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 220967212cb542e6eeb308678367b53381bff984c31Craig Mautner 221cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner int stackIdFromPoint(int x, int y) { 222bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 223bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner final TaskStack stack = mStacks.get(stackNdx); 224bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner stack.getBounds(mTmpRect); 225bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner if (mTmpRect.contains(x, y)) { 226bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner return stack.mStackId; 227bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner } 228bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner } 229bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner return -1; 230cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 231cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 2326601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner void setTouchExcludeRegion(TaskStack focusedStack) { 2336601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTouchExcludeRegion.set(mBaseDisplayRect); 2346601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner WindowList windows = getWindowList(); 2356601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner for (int i = windows.size() - 1; i >= 0; --i) { 2366601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner final WindowState win = windows.get(i); 2376601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner final TaskStack stack = win.getStack(); 2386601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner if (win.isVisibleLw() && stack != null && stack != focusedStack) { 2396601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTmpRect.set(win.mVisibleFrame); 2406601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTmpRect.intersect(win.mVisibleInsets); 2416601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner mTouchExcludeRegion.op(mTmpRect, Region.Op.DIFFERENCE); 2426601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner } 2436601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner } 2446601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner } 2456601b7bdeb46756fd83ad4c1966ef966c52b46e4Craig Mautner 246dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner void switchUserStacks(int newUserId) { 247858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner final WindowList windows = getWindowList(); 248858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner for (int i = 0; i < windows.size(); i++) { 249858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner final WindowState win = windows.get(i); 250858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (win.isHiddenFromUserLocked()) { 251858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (DEBUG_VISIBILITY) Slog.w(TAG, "user changing " + newUserId + " hiding " 252858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner + win + ", attrs=" + win.mAttrs.type + ", belonging to " 253858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner + win.mOwnerUid); 254858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner win.hideLw(false); 255858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 256858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 257ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 258bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 259bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.get(stackNdx).switchUser(newUserId); 260858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 261858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 262858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 26305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner void resetAnimationBackgroundAnimator() { 264bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 265bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.get(stackNdx).resetAnimationBackgroundAnimator(); 26605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 26705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 26805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 26905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean animateDimLayers() { 27005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 271bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 272bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner result |= mStacks.get(stackNdx).animateDimLayers(); 27305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 27405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 27505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 27605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 27705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner void resetDimming() { 278bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 279bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.get(stackNdx).resetDimmingTag(); 28005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 28105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 28205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 28305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean isDimming() { 284bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 285b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner if (mStacks.get(stackNdx).isDimming()) { 286b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner return true; 287b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner } 28805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 289b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner return false; 29005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 29105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 29205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner void stopDimmingIfNeeded() { 293bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 294bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.get(stackNdx).stopDimmingIfNeeded(); 29505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 29605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 29705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 2982eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner void close() { 299bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 300bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner mStacks.get(stackNdx).close(); 3012eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner } 3022eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner } 3032eb15342be5b075dda3df29b2b014a92ce13a5f8Craig Mautner 30495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner boolean isAnimating() { 30595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 30695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final TaskStack stack = mStacks.get(stackNdx); 30795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (stack.isAnimating()) { 30895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner return true; 30995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 31095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 31195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner return false; 31295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 31395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner 31495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner void checkForDeferredActions() { 31595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner boolean animating = false; 31695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 31795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final TaskStack stack = mStacks.get(stackNdx); 31895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (stack.isAnimating()) { 31995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner animating = true; 32095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } else { 32195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (stack.mDeferDetach) { 32295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mService.detachStackLocked(this, stack); 32395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 32495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final ArrayList<Task> tasks = stack.getTasks(); 32595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 32695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final Task task = tasks.get(taskNdx); 32795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner AppTokenList tokens = task.mAppTokens; 32895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 32995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner AppWindowToken wtoken = tokens.get(tokenNdx); 33095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (wtoken.mDeferRemoval) { 331fabab90d1e3b723db64ccb0cf4564971edd361d8Craig Mautner stack.mExitingAppTokens.remove(wtoken); 33295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner wtoken.mDeferRemoval = false; 33395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mService.removeAppFromTaskLocked(wtoken); 33495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 33595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 33695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (task.mDeferRemoval) { 33795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner task.mDeferRemoval = false; 33895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mService.removeTaskLocked(task); 33995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 34095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 34195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 34295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 34395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (!animating && mDeferredRemoval) { 34495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mService.onDisplayRemoved(mDisplayId); 34595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 34695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 34795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner 348a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner public void dump(String prefix, PrintWriter pw) { 349a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(prefix); pw.print("Display: mDisplayId="); pw.println(mDisplayId); 350a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner final String subPrefix = " " + prefix; 351a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(subPrefix); pw.print("init="); pw.print(mInitialDisplayWidth); pw.print("x"); 352a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mInitialDisplayHeight); pw.print(" "); pw.print(mInitialDisplayDensity); 353a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("dpi"); 354a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner if (mInitialDisplayWidth != mBaseDisplayWidth 355a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner || mInitialDisplayHeight != mBaseDisplayHeight 356a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner || mInitialDisplayDensity != mBaseDisplayDensity) { 357a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" base="); 358a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mBaseDisplayWidth); pw.print("x"); pw.print(mBaseDisplayHeight); 359a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" "); pw.print(mBaseDisplayDensity); pw.print("dpi"); 360a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner } 361a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" cur="); 362a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mDisplayInfo.logicalWidth); 363a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.print(mDisplayInfo.logicalHeight); 364a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" app="); 365a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(mDisplayInfo.appWidth); 366a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.print(mDisplayInfo.appHeight); 367a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print(" rng="); pw.print(mDisplayInfo.smallestNominalAppWidth); 368a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.print(mDisplayInfo.smallestNominalAppHeight); 369a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("-"); pw.print(mDisplayInfo.largestNominalAppWidth); 370a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner pw.print("x"); pw.println(mDisplayInfo.largestNominalAppHeight); 37195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner pw.print(subPrefix); pw.print("deferred="); pw.print(mDeferredRemoval); 37295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner pw.print(" layoutNeeded="); pw.println(layoutNeeded); 373bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 374bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner final TaskStack stack = mStacks.get(stackNdx); 375bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner pw.print(prefix); pw.print("mStacks[" + stackNdx + "]"); pw.println(stack.mStackId); 376bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner stack.dump(prefix + " ", pw); 377de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 378dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner pw.println(); 379e8b85fd41904ceaaa4ac09200b2b39106f9c5c37Craig Mautner pw.println(" Application tokens in top down Z order:"); 380dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner int ndx = 0; 381e8b85fd41904ceaaa4ac09200b2b39106f9c5c37Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 382bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner final TaskStack stack = mStacks.get(stackNdx); 383bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner pw.print(" mStackId="); pw.println(stack.mStackId); 384bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner ArrayList<Task> tasks = stack.getTasks(); 385dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 386bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner final Task task = tasks.get(taskNdx); 387bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner pw.print(" mTaskId="); pw.println(task.taskId); 388bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner AppTokenList tokens = task.mAppTokens; 389bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx, ++ndx) { 390de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final AppWindowToken wtoken = tokens.get(tokenNdx); 391bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner pw.print(" Activity #"); pw.print(tokenNdx); 392de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(' '); pw.print(wtoken); pw.println(":"); 393bcb6eb9e26c923333b25074d39722a5dfa8c0320Craig Mautner wtoken.dump(pw, " "); 394b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 395b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 396de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 397dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner if (ndx == 0) { 398dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner pw.println(" None"); 399dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner } 400dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner pw.println(); 401dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner if (!mExitingTokens.isEmpty()) { 402de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(); 403de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(" Exiting tokens:"); 404de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=mExitingTokens.size()-1; i>=0; i--) { 405de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner WindowToken token = mExitingTokens.get(i); 406de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(" Exiting #"); pw.print(i); 407de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.print(' '); pw.print(token); 408de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner pw.println(':'); 409de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner token.dump(pw, " "); 410b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 411de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 41259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner pw.println(); 41359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner } 414e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 415e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner @Override 416e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner public String toString() { 417e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return "Display " + mDisplayId + " info=" + mDisplayInfo + " stacks=" + mStacks; 418e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 41959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner} 420