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