Task.java revision 466f3216505bd039a285881e06ead631331fe368
1b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner/*
2b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Copyright (C) 2013 The Android Open Source Project
3b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *
4b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
5b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * you may not use this file except in compliance with the License.
6b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * You may obtain a copy of the License at
7b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *
8b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
9b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner *
10b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * Unless required by applicable law or agreed to in writing, software
11b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
12b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * See the License for the specific language governing permissions and
14b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner * limitations under the License.
15b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner */
16b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner
17b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautnerpackage com.android.server.wm;
18b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner
19466f3216505bd039a285881e06ead631331fe368Filip Gruszczynskiimport static android.app.ActivityManager.DOCKED_STACK_ID;
2042bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport static com.android.server.wm.WindowManagerService.TAG;
21e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport static com.android.server.wm.WindowManagerService.DEBUG_RESIZE;
22e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STACK;
23234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhneimport static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
2442bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner
25e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.content.res.Configuration;
26e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.graphics.Rect;
272c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog;
2842bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport android.util.Slog;
29e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.util.SparseArray;
30e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.util.TypedValue;
31e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.DisplayInfo;
32e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.Surface;
33e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
34e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport com.android.server.EventLogTags;
352c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner
36e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.io.PrintWriter;
37e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.util.ArrayList;
38e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
39e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleclass Task implements DimLayer.DimLayerUser {
40e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    /** Amount of time in milliseconds to animate the dim surface from one value to another,
41e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale     * when no window animation is driving it. */
42e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private static final int DEFAULT_DIM_DURATION = 200;
43e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
442cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    // Return value from {@link setBounds} indicating no change was made to the Task bounds.
452cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    static final int BOUNDS_CHANGE_NONE = 0;
462cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    // Return value from {@link setBounds} indicating the position of the Task bounds changed.
472cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    static final int BOUNDS_CHANGE_POSITION = 1;
482cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    // Return value from {@link setBounds} indicating the size of the Task bounds changed.
492cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    static final int BOUNDS_CHANGE_SIZE = 1 << 1;
502cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale
51c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    TaskStack mStack;
5205d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner    final AppTokenList mAppTokens = new AppTokenList();
5383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner    final int mTaskId;
54ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    final int mUserId;
559ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner    boolean mDeferRemoval = false;
56e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    final WindowManagerService mService;
57b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner
58e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Content limits relative to the DisplayContent this sits in.
59e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private Rect mBounds = new Rect();
60e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
61e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Device rotation as of the last time {@link #mBounds} was set.
62e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    int mRotation;
63e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
64e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Whether mBounds is fullscreen
65e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private boolean mFullscreen = true;
66e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
67e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Contains configurations settings that are different from the global configuration due to
68e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // stack specific operations. E.g. {@link #setBounds}.
69e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    Configuration mOverrideConfig;
70e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
71e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // For comparison with DisplayContent bounds.
72e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private Rect mTmpRect = new Rect();
73e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // For handling display rotations.
74e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private Rect mTmpRect2 = new Rect();
75e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
763005e75585dcda30b64603e320e0711b583624ddChong Zhang    // Whether the task is currently being drag-resized
773005e75585dcda30b64603e320e0711b583624ddChong Zhang    private boolean mDragResizing;
783005e75585dcda30b64603e320e0711b583624ddChong Zhang
79e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // The particular window with FLAG_DIM_BEHIND set. If null, hide mDimLayer.
80e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    WindowStateAnimator mDimWinAnimator;
81e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Used to support {@link android.view.WindowManager.LayoutParams#FLAG_DIM_BEHIND}
82e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private DimLayer mDimLayer;
83e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Set to false at the start of performLayoutAndPlaceSurfaces. If it is still false by the end
84e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // then stop any dimming.
85e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private boolean mContinueDimming;
86e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Shared dim layer for fullscreen tasks. {@link #mDimLayer} will point to this instead
87e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // of creating a new object per fullscreen task on a display.
88e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private static final SparseArray<DimLayer> sSharedFullscreenDimLayers = new SparseArray<>();
89e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
90ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski    Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
91ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            Configuration config) {
9283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        mTaskId = taskId;
93c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mStack = stack;
94ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        mUserId = userId;
95e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mService = service;
96ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        setBounds(bounds, config);
97c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
98c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
99c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    DisplayContent getDisplayContent() {
100c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return mStack.getDisplayContent();
101c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
102c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
103c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void addAppToken(int addPos, AppWindowToken wtoken) {
10442bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        final int lastPos = mAppTokens.size();
10583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        if (addPos >= lastPos) {
10683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            addPos = lastPos;
10783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        } else {
10883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            for (int pos = 0; pos < lastPos && pos < addPos; ++pos) {
10983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                if (mAppTokens.get(pos).removed) {
11083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                    // addPos assumes removed tokens are actually gone.
11183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                    ++addPos;
11283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                }
11301f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner            }
11442bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        }
115c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mAppTokens.add(addPos, wtoken);
11683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTask = this;
11742bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        mDeferRemoval = false;
118c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
119c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
120e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    void removeLocked() {
121e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        if (!mAppTokens.isEmpty() && mStack.isAnimating()) {
12283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId);
123e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            mDeferRemoval = true;
124e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            return;
125e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        }
12683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId);
12783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask");
128e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mDeferRemoval = false;
129e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mStack.removeTask(this);
13083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        mService.mTaskIdToTask.delete(mTaskId);
131e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    }
132e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner
13353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale    void moveTaskToStack(TaskStack stack, boolean toTop) {
13453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (stack == mStack) {
13553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale            return;
13653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        }
13753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: removing taskId=" + mTaskId
13853a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale                + " from stack=" + mStack);
139000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask");
14053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (mStack != null) {
14153a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale            mStack.removeTask(this);
14253a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        }
14353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        stack.addTask(this, toTop);
14453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale    }
14553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale
146ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale    void positionTaskInStack(TaskStack stack, int position) {
147ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        if (mStack != null && stack != mStack) {
148ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            if (DEBUG_STACK) Slog.i(TAG, "positionTaskInStack: removing taskId=" + mTaskId
149ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale                    + " from stack=" + mStack);
150ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask");
151ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            mStack.removeTask(this);
152ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        }
153ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        stack.positionTask(this, position, showForAllUsers());
154ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale    }
155ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale
156c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean removeAppToken(AppWindowToken wtoken) {
15742bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        boolean removed = mAppTokens.remove(wtoken);
158c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mAppTokens.size() == 0) {
159000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId,
1602c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner                    "removeAppToken: last token");
161e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            if (mDeferRemoval) {
162e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner                removeLocked();
163e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            }
164c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
16583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTask = null;
16683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        /* Leave mTaskId for now, it might be useful for debug
16783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTaskId = -1;
16883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner         */
16942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        return removed;
170b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner    }
1715d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner
172cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner    void setSendingToBottom(boolean toBottom) {
173cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner        for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) {
174cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner            mAppTokens.get(appTokenNdx).sendingToBottom = toBottom;
175cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner        }
176cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner    }
177cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner
178ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski    /** Set the task bounds. Passing in null sets the bounds to fullscreen. */
1792cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    int setBounds(Rect bounds, Configuration config) {
180ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (config == null) {
181ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            config = Configuration.EMPTY;
182b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
183ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (bounds == null && !Configuration.EMPTY.equals(config)) {
184ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            throw new IllegalArgumentException("null bounds but non empty configuration: "
185ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski                    + config);
186b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
187ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (bounds != null && Configuration.EMPTY.equals(config)) {
188ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            throw new IllegalArgumentException("non null bounds, but empty configuration");
189b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
190e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        boolean oldFullscreen = mFullscreen;
191e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        int rotation = Surface.ROTATION_0;
192e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final DisplayContent displayContent = mStack.getDisplayContent();
193e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (displayContent != null) {
194e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            displayContent.getLogicalDisplayRect(mTmpRect);
195e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            rotation = displayContent.getDisplayInfo().rotation;
196e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (bounds == null) {
197e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                bounds = mTmpRect;
198e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mFullscreen = true;
199e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            } else {
200234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                if (mStack.mStackId != FREEFORM_WORKSPACE_STACK_ID || bounds.isEmpty()) {
201234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                    // ensure bounds are entirely within the display rect
202234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                    if (!bounds.intersect(mTmpRect)) {
203234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                        // Can't set bounds outside the containing display...Sorry!
2042cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale                        return BOUNDS_CHANGE_NONE;
205234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                    }
206e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
207e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mFullscreen = mTmpRect.equals(bounds);
208e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
209e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
210e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
211e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (bounds == null) {
212e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            // Can't set to fullscreen if we don't have a display to get bounds from...
2132cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            return BOUNDS_CHANGE_NONE;
214e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
215e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mBounds.equals(bounds) && oldFullscreen == mFullscreen && mRotation == rotation) {
2162cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            return BOUNDS_CHANGE_NONE;
2172cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        }
2182cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale
2192cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        int boundsChange = BOUNDS_CHANGE_NONE;
2202cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        if (mBounds.left != bounds.left || mBounds.right != bounds.right) {
2212cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            boundsChange |= BOUNDS_CHANGE_POSITION;
2222cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        }
2232cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        if (mBounds.width() != bounds.width() || mBounds.height() != bounds.height()) {
2242cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            boundsChange |= BOUNDS_CHANGE_SIZE;
225e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
226e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
227e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mBounds.set(bounds);
228e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mRotation = rotation;
229e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        updateDimLayer();
230ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        mOverrideConfig = mFullscreen ? Configuration.EMPTY : config;
2312cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        return boundsChange;
232e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
233e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
23487b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang    boolean resizeLocked(Rect bounds, Configuration configuration, boolean forced) {
2353005e75585dcda30b64603e320e0711b583624ddChong Zhang        int boundsChanged = setBounds(bounds, configuration);
23687b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang        if (forced) {
2373005e75585dcda30b64603e320e0711b583624ddChong Zhang            boundsChanged |= BOUNDS_CHANGE_SIZE;
2383005e75585dcda30b64603e320e0711b583624ddChong Zhang        }
2393005e75585dcda30b64603e320e0711b583624ddChong Zhang        if (boundsChanged == BOUNDS_CHANGE_NONE) {
2403005e75585dcda30b64603e320e0711b583624ddChong Zhang            return false;
2413005e75585dcda30b64603e320e0711b583624ddChong Zhang        }
2423005e75585dcda30b64603e320e0711b583624ddChong Zhang        if ((boundsChanged & BOUNDS_CHANGE_SIZE) == BOUNDS_CHANGE_SIZE) {
2433005e75585dcda30b64603e320e0711b583624ddChong Zhang            resizeWindows();
2443005e75585dcda30b64603e320e0711b583624ddChong Zhang        }
2453005e75585dcda30b64603e320e0711b583624ddChong Zhang        return true;
2463005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
2473005e75585dcda30b64603e320e0711b583624ddChong Zhang
248e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void getBounds(Rect out) {
249e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        out.set(mBounds);
250e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
251e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
2523005e75585dcda30b64603e320e0711b583624ddChong Zhang    void setDragResizing(boolean dragResizing) {
2533005e75585dcda30b64603e320e0711b583624ddChong Zhang        mDragResizing = dragResizing;
2543005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
2553005e75585dcda30b64603e320e0711b583624ddChong Zhang
2563005e75585dcda30b64603e320e0711b583624ddChong Zhang    boolean isDragResizing() {
2573005e75585dcda30b64603e320e0711b583624ddChong Zhang        return mDragResizing;
2583005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
2593005e75585dcda30b64603e320e0711b583624ddChong Zhang
260e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void updateDisplayInfo(final DisplayContent displayContent) {
261e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (displayContent == null) {
262e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
263e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
264e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mFullscreen) {
265ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            setBounds(null, Configuration.EMPTY);
266e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
267e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
268e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final int newRotation = displayContent.getDisplayInfo().rotation;
269e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mRotation == newRotation) {
270e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
271e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
272e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
273e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // Device rotation changed. We don't want the task to move around on the screen when
274e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // this happens, so update the task bounds so it stays in the same place.
2759474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale        mTmpRect2.set(mBounds);
2769474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale        displayContent.rotateBounds(mRotation, newRotation, mTmpRect2);
277ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        setBounds(mTmpRect2, mOverrideConfig);
278e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
279e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
280e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    /** Updates the dim layer bounds, recreating it if needed. */
281e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private void updateDimLayer() {
282e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        DimLayer newDimLayer;
283e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final boolean previousFullscreen =
284e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mDimLayer != null && sSharedFullscreenDimLayers.indexOfValue(mDimLayer) > -1;
285e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final int displayId = mStack.getDisplayContent().getDisplayId();
286e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mFullscreen) {
287e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (previousFullscreen) {
288e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                // Nothing to do here...
289e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                return;
290e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
291e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            // Use shared fullscreen dim layer
292e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            newDimLayer = sSharedFullscreenDimLayers.get(displayId);
293e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (newDimLayer == null) {
294e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                if (mDimLayer != null) {
295e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    // Re-purpose the previous dim layer.
296e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    newDimLayer = mDimLayer;
297e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                } else {
298e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    // Create new full screen dim layer.
299e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    newDimLayer = new DimLayer(mService, this, displayId);
300e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
301e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                newDimLayer.setBounds(mBounds);
302e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                sSharedFullscreenDimLayers.put(displayId, newDimLayer);
303e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            } else if (mDimLayer != null) {
304e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mDimLayer.destroySurface();
305e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
306e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        } else {
307e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            newDimLayer = (mDimLayer == null || previousFullscreen)
308e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    ? new DimLayer(mService, this, displayId) : mDimLayer;
309e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            newDimLayer.setBounds(mBounds);
310e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
311e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mDimLayer = newDimLayer;
312e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
313e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
314e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    boolean animateDimLayers() {
315e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final int dimLayer;
316e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final float dimAmount;
317e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mDimWinAnimator == null) {
318e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            dimLayer = mDimLayer.getLayer();
319e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            dimAmount = 0;
320e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        } else {
321e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            dimLayer = mDimWinAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM;
322e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            dimAmount = mDimWinAnimator.mWin.mAttrs.dimAmount;
323e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
324e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final float targetAlpha = mDimLayer.getTargetAlpha();
325e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (targetAlpha != dimAmount) {
326e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (mDimWinAnimator == null) {
327e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mDimLayer.hide(DEFAULT_DIM_DURATION);
328e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            } else {
329e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                long duration = (mDimWinAnimator.mAnimating && mDimWinAnimator.mAnimation != null)
330e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                        ? mDimWinAnimator.mAnimation.computeDurationHint()
331e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                        : DEFAULT_DIM_DURATION;
332e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                if (targetAlpha > dimAmount) {
333e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    duration = getDimBehindFadeDuration(duration);
334e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
335e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mDimLayer.show(dimLayer, dimAmount, duration);
336e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
337e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        } else if (mDimLayer.getLayer() != dimLayer) {
338e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimLayer.setLayer(dimLayer);
339e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
340e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mDimLayer.isAnimating()) {
341e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (!mService.okToDisplay()) {
342e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                // Jump to the end of the animation.
343e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mDimLayer.show();
344e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            } else {
345e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                return mDimLayer.stepAnimation();
346e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
347e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
348e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return false;
349e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
350e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
351e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private long getDimBehindFadeDuration(long duration) {
352e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        TypedValue tv = new TypedValue();
353e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mService.mContext.getResources().getValue(
354e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                com.android.internal.R.fraction.config_dimBehindFadeDuration, tv, true);
355e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (tv.type == TypedValue.TYPE_FRACTION) {
356e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            duration = (long)tv.getFraction(duration, duration);
357e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        } else if (tv.type >= TypedValue.TYPE_FIRST_INT && tv.type <= TypedValue.TYPE_LAST_INT) {
358e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            duration = tv.data;
359e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
360e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return duration;
361e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
362e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
363e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void clearContinueDimming() {
364e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mContinueDimming = false;
365e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
366e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
367e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void setContinueDimming() {
368e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mContinueDimming = true;
369e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
370e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
371e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    boolean getContinueDimming() {
372e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mContinueDimming;
373e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
374e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
375e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    boolean isDimming() {
376e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mDimLayer.isDimming();
377e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
378e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
379e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    boolean isDimming(WindowStateAnimator winAnimator) {
380e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mDimWinAnimator == winAnimator && isDimming();
381e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
382e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
383e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void startDimmingIfNeeded(WindowStateAnimator newWinAnimator) {
384e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // Only set dim params on the highest dimmed layer.
385e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // Don't turn on for an unshown surface, or for any layer but the highest dimmed layer.
386e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (newWinAnimator.mSurfaceShown && (mDimWinAnimator == null
387e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                || !mDimWinAnimator.mSurfaceShown
388e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                || mDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
389e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimWinAnimator = newWinAnimator;
390e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (mDimWinAnimator.mWin.mAppToken == null
391e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    && !mFullscreen && mStack.getDisplayContent() != null) {
392e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                // Dim should cover the entire screen for system windows.
393e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mStack.getDisplayContent().getLogicalDisplayRect(mTmpRect);
394e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mDimLayer.setBounds(mTmpRect);
395e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
396e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
397e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
398e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
399e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void stopDimmingIfNeeded() {
400e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (!mContinueDimming && isDimming()) {
401e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimWinAnimator = null;
402e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimLayer.setBounds(mBounds);
403e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
404e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
405e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
406e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void close() {
407e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mDimLayer != null) {
408e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimLayer.destroySurface();
409e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimLayer = null;
410e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
411e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
412e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
413e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void resizeWindows() {
414e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
415e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
416e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            final ArrayList<WindowState> windows = mAppTokens.get(activityNdx).allAppWindows;
417e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
418e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                final WindowState win = windows.get(winNdx);
419e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                if (!resizingWindows.contains(win)) {
420e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    if (DEBUG_RESIZE) Slog.d(TAG, "setBounds: Resizing " + win);
421e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    resizingWindows.add(win);
422e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
423e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
424e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
425e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
426e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
4276dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale    boolean showForAllUsers() {
4283fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale        final int tokensCount = mAppTokens.size();
4296dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale        return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers;
4303fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale    }
4313fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale
43209b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang    boolean inFreeformWorkspace() {
43309b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang        return mStack != null && mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID;
43409b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang    }
43509b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang
436466f3216505bd039a285881e06ead631331fe368Filip Gruszczynski    boolean inDockedWorkspace() {
437466f3216505bd039a285881e06ead631331fe368Filip Gruszczynski        return mStack != null && mStack.mStackId == DOCKED_STACK_ID;
438466f3216505bd039a285881e06ead631331fe368Filip Gruszczynski    }
439466f3216505bd039a285881e06ead631331fe368Filip Gruszczynski
4405d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    @Override
441e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public boolean isFullscreen() {
442e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mFullscreen;
443e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
444e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
445e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    @Override
446e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public DisplayInfo getDisplayInfo() {
447e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mStack.getDisplayContent().getDisplayInfo();
448e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
449e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
450e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    @Override
4515d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    public String toString() {
45283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}";
4535d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    }
454e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
455e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public void printTo(String prefix, PrintWriter pw) {
456e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        pw.print(prefix); pw.print("taskId="); pw.print(mTaskId);
457e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                pw.print(prefix); pw.print("appTokens="); pw.print(mAppTokens);
458e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                pw.print(prefix); pw.print("mdr="); pw.println(mDeferRemoval);
459e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mDimLayer.isDimming()) {
460e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            pw.print(prefix); pw.println("mDimLayer:");
461e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            mDimLayer.printTo(prefix + " ", pw);
462e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            pw.print(prefix); pw.print("mDimWinAnimator="); pw.println(mDimWinAnimator);
463e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        } else {
464e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            pw.println();
465e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
466e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
467b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner}
468