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