Task.java revision 56b88afcbdd190e8448fd17db91f2bf94e00c1fa
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
193797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwaleimport static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
203797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwaleimport static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
213797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwaleimport static android.app.ActivityManager.StackId.HOME_STACK_ID;
223797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwaleimport static android.app.ActivityManager.StackId.PINNED_STACK_ID;
23b15758ab7a6481717d0d29612e870d7241061c31Chong Zhangimport static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
241ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwaleimport static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
2542bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport static com.android.server.wm.WindowManagerService.TAG;
26e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport static com.android.server.wm.WindowManagerService.DEBUG_RESIZE;
27e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STACK;
281ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwaleimport static com.android.server.wm.WindowManagerService.H.RESIZE_TASK;
2999db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale
303797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwaleimport android.app.ActivityManager.StackId;
31e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.content.res.Configuration;
32e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.graphics.Rect;
332c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog;
3442bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport android.util.Slog;
35e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.DisplayInfo;
36e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.Surface;
37e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
38e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport com.android.server.EventLogTags;
392c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner
40e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.io.PrintWriter;
41e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.util.ArrayList;
42e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
43e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleclass Task implements DimLayer.DimLayerUser {
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
76b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    // Whether the task is resizeable
77b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    private boolean mResizeable;
78b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
793005e75585dcda30b64603e320e0711b583624ddChong Zhang    // Whether the task is currently being drag-resized
803005e75585dcda30b64603e320e0711b583624ddChong Zhang    private boolean mDragResizing;
813005e75585dcda30b64603e320e0711b583624ddChong Zhang
82ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski    Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
83ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            Configuration config) {
8483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        mTaskId = taskId;
85c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mStack = stack;
86ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        mUserId = userId;
87e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mService = service;
88ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        setBounds(bounds, config);
89c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
90c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
91c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    DisplayContent getDisplayContent() {
92c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return mStack.getDisplayContent();
93c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
94c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
95c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void addAppToken(int addPos, AppWindowToken wtoken) {
9642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        final int lastPos = mAppTokens.size();
9783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        if (addPos >= lastPos) {
9883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            addPos = lastPos;
9983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        } else {
10083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            for (int pos = 0; pos < lastPos && pos < addPos; ++pos) {
10183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                if (mAppTokens.get(pos).removed) {
10283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                    // addPos assumes removed tokens are actually gone.
10383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                    ++addPos;
10483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                }
10501f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner            }
10642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        }
107c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mAppTokens.add(addPos, wtoken);
10883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTask = this;
10942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        mDeferRemoval = false;
110c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
111c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
112e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    void removeLocked() {
113e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        if (!mAppTokens.isEmpty() && mStack.isAnimating()) {
11483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId);
115e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            mDeferRemoval = true;
116e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            return;
117e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        }
11883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId);
11983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask");
120e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mDeferRemoval = false;
1210689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        DisplayContent content = getDisplayContent();
1220689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        if (content != null) {
123112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang            content.mDimLayerController.removeDimLayerUser(this);
1240689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        }
125e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mStack.removeTask(this);
12683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        mService.mTaskIdToTask.delete(mTaskId);
127e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    }
128e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner
12953a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale    void moveTaskToStack(TaskStack stack, boolean toTop) {
13053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (stack == mStack) {
13153a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale            return;
13253a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        }
13353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: removing taskId=" + mTaskId
13453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale                + " from stack=" + mStack);
135000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask");
13653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (mStack != null) {
13753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale            mStack.removeTask(this);
13853a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        }
13953a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        stack.addTask(this, toTop);
14053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale    }
14153a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale
142935e50292e1404dc5f1705b2a1719cdaee3072b0Wale Ogunwale    void positionTaskInStack(TaskStack stack, int position, Rect bounds, Configuration config) {
143ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        if (mStack != null && stack != mStack) {
144ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            if (DEBUG_STACK) Slog.i(TAG, "positionTaskInStack: removing taskId=" + mTaskId
145ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale                    + " from stack=" + mStack);
146ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask");
147ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            mStack.removeTask(this);
148ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        }
149ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        stack.positionTask(this, position, showForAllUsers());
150935e50292e1404dc5f1705b2a1719cdaee3072b0Wale Ogunwale        setBounds(bounds, config);
151ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale    }
152ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale
153c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean removeAppToken(AppWindowToken wtoken) {
15442bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        boolean removed = mAppTokens.remove(wtoken);
155c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mAppTokens.size() == 0) {
156000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId,
1572c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner                    "removeAppToken: last token");
158e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            if (mDeferRemoval) {
159e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner                removeLocked();
160e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            }
161c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
16283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTask = null;
16383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        /* Leave mTaskId for now, it might be useful for debug
16483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTaskId = -1;
16583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner         */
16642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        return removed;
167b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner    }
1685d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner
169cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner    void setSendingToBottom(boolean toBottom) {
170cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner        for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) {
171cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner            mAppTokens.get(appTokenNdx).sendingToBottom = toBottom;
172cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner        }
173cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner    }
174cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner
175ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski    /** Set the task bounds. Passing in null sets the bounds to fullscreen. */
1762cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    int setBounds(Rect bounds, Configuration config) {
177ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (config == null) {
178ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            config = Configuration.EMPTY;
179b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
180ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (bounds == null && !Configuration.EMPTY.equals(config)) {
181ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            throw new IllegalArgumentException("null bounds but non empty configuration: "
182ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski                    + config);
183b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
184ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (bounds != null && Configuration.EMPTY.equals(config)) {
185ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            throw new IllegalArgumentException("non null bounds, but empty configuration");
186b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
187e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        boolean oldFullscreen = mFullscreen;
188e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        int rotation = Surface.ROTATION_0;
189e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final DisplayContent displayContent = mStack.getDisplayContent();
190e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (displayContent != null) {
191e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            displayContent.getLogicalDisplayRect(mTmpRect);
192e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            rotation = displayContent.getDisplayInfo().rotation;
193e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (bounds == null) {
194e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                bounds = mTmpRect;
195e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mFullscreen = true;
196e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            } else {
197e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mFullscreen = mTmpRect.equals(bounds);
198e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
199e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
200e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
201e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (bounds == null) {
202e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            // Can't set to fullscreen if we don't have a display to get bounds from...
2032cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            return BOUNDS_CHANGE_NONE;
204e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
205e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mBounds.equals(bounds) && oldFullscreen == mFullscreen && mRotation == rotation) {
2062cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            return BOUNDS_CHANGE_NONE;
2072cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        }
2082cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale
2092cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        int boundsChange = BOUNDS_CHANGE_NONE;
2102cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        if (mBounds.left != bounds.left || mBounds.right != bounds.right) {
2112cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            boundsChange |= BOUNDS_CHANGE_POSITION;
2122cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        }
2132cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        if (mBounds.width() != bounds.width() || mBounds.height() != bounds.height()) {
2142cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale            boundsChange |= BOUNDS_CHANGE_SIZE;
215e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
216e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
217e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mBounds.set(bounds);
218e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        mRotation = rotation;
2190689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        if (displayContent != null) {
220112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang            displayContent.mDimLayerController.updateDimLayer(this);
2210689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        }
222ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        mOverrideConfig = mFullscreen ? Configuration.EMPTY : config;
2232cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        return boundsChange;
224e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
225e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
226b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    void setResizeable(boolean resizeable) {
227b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        mResizeable = resizeable;
228b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    }
229b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
230b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    boolean isResizeable() {
231b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        return mResizeable;
232b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    }
233b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
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
248b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    boolean scrollLocked(Rect bounds) {
249b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        // shift the task bound if it doesn't fully cover the stack area
250b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        mStack.getDimBounds(mTmpRect);
251b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        if (mService.mCurConfiguration.orientation == ORIENTATION_LANDSCAPE) {
252b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            if (bounds.left > mTmpRect.left) {
253b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.left = mTmpRect.left;
254b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.right = mTmpRect.left + mBounds.width();
255b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            } else if (bounds.right < mTmpRect.right) {
256b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.left = mTmpRect.right - mBounds.width();
257b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.right = mTmpRect.right;
258b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            }
259b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        } else {
260b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            if (bounds.top > mTmpRect.top) {
261b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.top = mTmpRect.top;
262b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.bottom = mTmpRect.top + mBounds.height();
263b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            } else if (bounds.bottom < mTmpRect.bottom) {
264b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.top = mTmpRect.bottom - mBounds.height();
265b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                bounds.bottom = mTmpRect.bottom;
266b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            }
267b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        }
268b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
269b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        if (bounds.equals(mBounds)) {
270b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            return false;
271b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        }
272b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        // Normal setBounds() does not allow non-null bounds for fullscreen apps.
273b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        // We only change bounds for the scrolling case without change it size,
274b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        // on resizing path we should still want the validation.
275b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        mBounds.set(bounds);
276b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
277b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            final ArrayList<WindowState> windows = mAppTokens.get(activityNdx).allAppWindows;
278b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
279b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                final WindowState win = windows.get(winNdx);
280b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                win.mXOffset = bounds.left;
281b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                win.mYOffset = bounds.top;
282b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang            }
283b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        }
284b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        return true;
285b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    }
286b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
287f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    /** Return true if the current bound can get outputted to the rest of the system as-is. */
288f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    private boolean useCurrentBounds() {
289f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        final DisplayContent displayContent = mStack.getDisplayContent();
290f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        if (mFullscreen
2913797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale                || !StackId.isTaskResizeableByDockedStack(mStack.mStackId)
292f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale                || displayContent == null
293f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale                || displayContent.getDockedStackLocked() != null) {
294f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            return true;
295f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        }
296f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        return false;
297f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    }
298f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale
2994c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    /** Original bounds of the task if applicable, otherwise fullscreen rect. */
3000689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    public void getBounds(Rect out) {
301f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        if (useCurrentBounds()) {
302f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            // No need to adjust the output bounds if fullscreen or the docked stack is visible
303f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            // since it is already what we want to represent to the rest of the system.
304f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            out.set(mBounds);
305f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            return;
306f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        }
307f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale
308f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // The bounds has been adjusted to accommodate for a docked stack, but the docked stack
309f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // is not currently visible. Go ahead a represent it as fullscreen to the rest of the
310f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // system.
311f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        mStack.getDisplayContent().getLogicalDisplayRect(out);
312e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
313e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
3144c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
3154c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    /**
3164c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * Calculate the maximum visible area of this task. If the task has only one app,
3174c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * the result will be visible frame of that app. If the task has more than one apps,
3184c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * we search from top down if the next app got different visible area.
3194c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     *
3204c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * This effort is to handle the case where some task (eg. GMail composer) might pop up
3214c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * a dialog that's different in size from the activity below, in which case we should
3224c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * be dimming the entire task area behind the dialog.
3234c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     *
3244c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * @param out Rect containing the max visible bounds.
3254c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     * @return true if the task has some visible app windows; false otherwise.
3264c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang     */
3274c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    boolean getMaxVisibleBounds(Rect out) {
3284c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        boolean foundTop = false;
3294c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        for (int i = mAppTokens.size() - 1; i >= 0; i--) {
330d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            final AppWindowToken token = mAppTokens.get(i);
331d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            // skip hidden (or about to hide) apps
332d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            if (token.mIsExiting || token.clientHidden || token.hiddenRequested) {
333d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang                continue;
334d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            }
335d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            final WindowState win = token.findMainWindow();
3364c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (win == null) {
3374c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                continue;
3384c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3394c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (!foundTop) {
3404c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                out.set(win.mVisibleFrame);
3414c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                foundTop = true;
3424c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                continue;
3434c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3444c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (win.mVisibleFrame.left < out.left) {
3454c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                out.left = win.mVisibleFrame.left;
3464c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3474c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (win.mVisibleFrame.top < out.top) {
3484c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                out.top = win.mVisibleFrame.top;
3494c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3504c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (win.mVisibleFrame.right > out.right) {
3514c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                out.right = win.mVisibleFrame.right;
3524c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3534c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (win.mVisibleFrame.bottom > out.bottom) {
3544c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                out.bottom = win.mVisibleFrame.bottom;
3554c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3564c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        }
3574c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        return foundTop;
3584c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    }
3594c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
3604c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    /** Bounds of the task to be used for dimming, as well as touch related tests. */
3614c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    @Override
3624c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    public void getDimBounds(Rect out) {
3634c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        if (useCurrentBounds()) {
3644c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            if (inFreeformWorkspace() && getMaxVisibleBounds(out)) {
3654c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                return;
3664c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            }
3674c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
3684c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            out.set(mBounds);
3694c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang            return;
3704c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        }
3714c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
3724c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        // The bounds has been adjusted to accommodate for a docked stack, but the docked stack
3734c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        // is not currently visible. Go ahead a represent it as fullscreen to the rest of the
3744c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        // system.
3754c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        mStack.getDisplayContent().getLogicalDisplayRect(out);
3764c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang    }
3774c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
3783005e75585dcda30b64603e320e0711b583624ddChong Zhang    void setDragResizing(boolean dragResizing) {
3793005e75585dcda30b64603e320e0711b583624ddChong Zhang        mDragResizing = dragResizing;
3803005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
3813005e75585dcda30b64603e320e0711b583624ddChong Zhang
3823005e75585dcda30b64603e320e0711b583624ddChong Zhang    boolean isDragResizing() {
3833005e75585dcda30b64603e320e0711b583624ddChong Zhang        return mDragResizing;
3843005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
3853005e75585dcda30b64603e320e0711b583624ddChong Zhang
386e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void updateDisplayInfo(final DisplayContent displayContent) {
387e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (displayContent == null) {
388e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
389e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
390e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mFullscreen) {
391ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            setBounds(null, Configuration.EMPTY);
392e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
393e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
394e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final int newRotation = displayContent.getDisplayInfo().rotation;
395e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mRotation == newRotation) {
396e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
397e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
398e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
399e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // Device rotation changed. We don't want the task to move around on the screen when
400e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // this happens, so update the task bounds so it stays in the same place.
4019474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale        mTmpRect2.set(mBounds);
4029474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale        displayContent.rotateBounds(mRotation, newRotation, mTmpRect2);
4031ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale        if (setBounds(mTmpRect2, mOverrideConfig) != BOUNDS_CHANGE_NONE) {
4041ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale            // Post message to inform activity manager of the bounds change simulating
4051ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale            // a one-way call. We do this to prevent a deadlock between window manager
40644bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski            // lock and activity manager lock been held. Only tasks within the freeform stack
40744bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski            // are resizeable independently of their stack resizing.
40844bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski            if (mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID) {
40944bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski                mService.mH.sendMessage(mService.mH.obtainMessage(
41044bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski                        RESIZE_TASK, mTaskId, RESIZE_MODE_SYSTEM_SCREEN_ROTATION, mBounds));
41144bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski            }
4121ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale        }
413e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
414e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
415e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void resizeWindows() {
416e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
417e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
418e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            final ArrayList<WindowState> windows = mAppTokens.get(activityNdx).allAppWindows;
419e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
420e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                final WindowState win = windows.get(winNdx);
421e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                if (!resizingWindows.contains(win)) {
422e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    if (DEBUG_RESIZE) Slog.d(TAG, "setBounds: Resizing " + win);
423e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    resizingWindows.add(win);
424e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
425e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
426e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
427e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
428e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
429c28098f69b8ba5d3039ecd0fa154e880f4613843Winson    /**
430c28098f69b8ba5d3039ecd0fa154e880f4613843Winson     * Cancels any running app transitions associated with the task.
431c28098f69b8ba5d3039ecd0fa154e880f4613843Winson     */
432c28098f69b8ba5d3039ecd0fa154e880f4613843Winson    void cancelTaskWindowTransition() {
433c28098f69b8ba5d3039ecd0fa154e880f4613843Winson        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
434c28098f69b8ba5d3039ecd0fa154e880f4613843Winson            mAppTokens.get(activityNdx).mAppAnimator.clearAnimation();
435c28098f69b8ba5d3039ecd0fa154e880f4613843Winson        }
436c28098f69b8ba5d3039ecd0fa154e880f4613843Winson    }
437c28098f69b8ba5d3039ecd0fa154e880f4613843Winson
43813d30660ef6da2d924e4fc943ccd187767ee0cd2Winson    /**
43913d30660ef6da2d924e4fc943ccd187767ee0cd2Winson     * Cancels any running thumbnail transitions associated with the task.
44013d30660ef6da2d924e4fc943ccd187767ee0cd2Winson     */
44113d30660ef6da2d924e4fc943ccd187767ee0cd2Winson    void cancelTaskThumbnailTransition() {
44213d30660ef6da2d924e4fc943ccd187767ee0cd2Winson        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
44313d30660ef6da2d924e4fc943ccd187767ee0cd2Winson            mAppTokens.get(activityNdx).mAppAnimator.clearThumbnail();
44413d30660ef6da2d924e4fc943ccd187767ee0cd2Winson        }
44513d30660ef6da2d924e4fc943ccd187767ee0cd2Winson    }
44613d30660ef6da2d924e4fc943ccd187767ee0cd2Winson
4476dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale    boolean showForAllUsers() {
4483fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale        final int tokensCount = mAppTokens.size();
4496dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale        return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers;
4503fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale    }
4513fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale
452db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang    boolean inHomeStack() {
453db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang        return mStack != null && mStack.mStackId == HOME_STACK_ID;
454db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang    }
455db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang
45609b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang    boolean inFreeformWorkspace() {
45709b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang        return mStack != null && mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID;
45809b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang    }
45909b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang
460955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski    boolean inDockedWorkspace() {
461955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski        return mStack != null && mStack.mStackId == DOCKED_STACK_ID;
462955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski    }
463955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski
464b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    boolean isResizeableByDockedStack() {
465b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        return mStack != null && getDisplayContent().getDockedStackLocked() != null &&
466b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                StackId.isTaskResizeableByDockedStack(mStack.mStackId);
467b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    }
468b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
469b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    /**
470b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang     * Whether the task should be treated as if it's docked. Returns true if the task
471b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang     * is currently in docked workspace, or it's side-by-side to a docked task.
472b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang     */
473b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    boolean isDockedInEffect() {
474b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        return inDockedWorkspace() || isResizeableByDockedStack();
475b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang    }
476b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang
477d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang    WindowState getTopVisibleAppMainWindow() {
478d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang        final AppWindowToken token = getTopVisibleAppToken();
479d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang        return token != null ? token.findMainWindow() : null;
4809184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang    }
481bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang
482d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang    AppWindowToken getTopVisibleAppToken() {
483d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang        for (int i = mAppTokens.size() - 1; i >= 0; i--) {
484d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            final AppWindowToken token = mAppTokens.get(i);
485d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            // skip hidden (or about to hide) apps
486d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            if (!token.mIsExiting && !token.clientHidden && !token.hiddenRequested) {
487d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang                return token;
488d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang            }
489d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang        }
490d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang        return null;
491bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang    }
4929184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang
4935d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    @Override
494e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public boolean isFullscreen() {
495f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        if (useCurrentBounds()) {
496f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            return mFullscreen;
497f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        }
498f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // The bounds has been adjusted to accommodate for a docked stack, but the docked stack
499f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // is not currently visible. Go ahead a represent it as fullscreen to the rest of the
500f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // system.
501f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        return true;
502e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
503e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
504e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    @Override
505e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public DisplayInfo getDisplayInfo() {
506e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mStack.getDisplayContent().getDisplayInfo();
507e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
508e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
509e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    @Override
5105d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    public String toString() {
51183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}";
5125d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    }
513e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
5140689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    @Override
5150689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    public String toShortString() {
5160689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        return "Task=" + mTaskId;
5170689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    }
5180689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski
519e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public void printTo(String prefix, PrintWriter pw) {
52056b88afcbdd190e8448fd17db91f2bf94e00c1faWale Ogunwale        pw.print(prefix); pw.print("taskId="); pw.println(mTaskId);
52156b88afcbdd190e8448fd17db91f2bf94e00c1faWale Ogunwale            pw.print(prefix + prefix); pw.print("mFullscreen="); pw.println(mFullscreen);
52256b88afcbdd190e8448fd17db91f2bf94e00c1faWale Ogunwale            pw.print(prefix + prefix); pw.print("mBounds="); pw.println(mBounds.toShortString());
52356b88afcbdd190e8448fd17db91f2bf94e00c1faWale Ogunwale            pw.print(prefix + prefix); pw.print("mdr="); pw.println(mDeferRemoval);
52456b88afcbdd190e8448fd17db91f2bf94e00c1faWale Ogunwale            pw.print(prefix + prefix); pw.print("appTokens="); pw.println(mAppTokens);
525e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
526b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner}
527