Task.java revision 0689ae903628f12ff073376b655b9d972533796b
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;
201ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwaleimport static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION;
2142bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport static com.android.server.wm.WindowManagerService.TAG;
22e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport static com.android.server.wm.WindowManagerService.DEBUG_RESIZE;
23e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STACK;
241ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwaleimport static com.android.server.wm.WindowManagerService.H.RESIZE_TASK;
25234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhneimport static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
2642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner
27e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.content.res.Configuration;
28e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.graphics.Rect;
292c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog;
3042bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport android.util.Slog;
31e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.util.SparseArray;
32e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.DisplayInfo;
33e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.Surface;
34e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
35e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport com.android.server.EventLogTags;
362c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner
37e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.io.PrintWriter;
38e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.util.ArrayList;
39e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
40e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleclass Task implements DimLayer.DimLayerUser {
412cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    // Return value from {@link setBounds} indicating no change was made to the Task bounds.
422cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    static final int BOUNDS_CHANGE_NONE = 0;
432cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    // Return value from {@link setBounds} indicating the position of the Task bounds changed.
442cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    static final int BOUNDS_CHANGE_POSITION = 1;
452cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    // Return value from {@link setBounds} indicating the size of the Task bounds changed.
462cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    static final int BOUNDS_CHANGE_SIZE = 1 << 1;
472cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale
48c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    TaskStack mStack;
4905d6272bad2d707b488a6f8784ce8aea5e25b110Craig Mautner    final AppTokenList mAppTokens = new AppTokenList();
5083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner    final int mTaskId;
51ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    final int mUserId;
529ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner    boolean mDeferRemoval = false;
53e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    final WindowManagerService mService;
54b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner
55e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Content limits relative to the DisplayContent this sits in.
56e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private Rect mBounds = new Rect();
57e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
58e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Device rotation as of the last time {@link #mBounds} was set.
59e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    int mRotation;
60e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
61e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Whether mBounds is fullscreen
62e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private boolean mFullscreen = true;
63e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
64e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // Contains configurations settings that are different from the global configuration due to
65e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // stack specific operations. E.g. {@link #setBounds}.
66e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    Configuration mOverrideConfig;
67e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
68e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // For comparison with DisplayContent bounds.
69e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private Rect mTmpRect = new Rect();
70e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    // For handling display rotations.
71e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    private Rect mTmpRect2 = new Rect();
72e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
733005e75585dcda30b64603e320e0711b583624ddChong Zhang    // Whether the task is currently being drag-resized
743005e75585dcda30b64603e320e0711b583624ddChong Zhang    private boolean mDragResizing;
753005e75585dcda30b64603e320e0711b583624ddChong Zhang
76ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski    Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds,
77ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            Configuration config) {
7883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        mTaskId = taskId;
79c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mStack = stack;
80ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        mUserId = userId;
81e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mService = service;
82ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        setBounds(bounds, config);
83c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
84c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
85c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    DisplayContent getDisplayContent() {
86c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        return mStack.getDisplayContent();
87c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
88c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
89c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    void addAppToken(int addPos, AppWindowToken wtoken) {
9042bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        final int lastPos = mAppTokens.size();
9183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        if (addPos >= lastPos) {
9283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            addPos = lastPos;
9383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        } else {
9483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            for (int pos = 0; pos < lastPos && pos < addPos; ++pos) {
9583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                if (mAppTokens.get(pos).removed) {
9683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                    // addPos assumes removed tokens are actually gone.
9783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                    ++addPos;
9883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner                }
9901f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner            }
10042bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        }
101c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        mAppTokens.add(addPos, wtoken);
10283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTask = this;
10342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        mDeferRemoval = false;
104c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    }
105c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner
106e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    void removeLocked() {
107e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        if (!mAppTokens.isEmpty() && mStack.isAnimating()) {
10883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId);
109e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            mDeferRemoval = true;
110e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            return;
111e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        }
11283162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId);
11383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask");
114e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mDeferRemoval = false;
1150689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        DisplayContent content = getDisplayContent();
1160689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        if (content != null) {
1170689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski            content.mDimBehindController.removeDimLayerUser(this);
1180689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        }
119e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner        mStack.removeTask(this);
12083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        mService.mTaskIdToTask.delete(mTaskId);
121e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner    }
122e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner
12353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale    void moveTaskToStack(TaskStack stack, boolean toTop) {
12453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (stack == mStack) {
12553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale            return;
12653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        }
12753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: removing taskId=" + mTaskId
12853a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale                + " from stack=" + mStack);
129000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale        EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask");
13053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        if (mStack != null) {
13153a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale            mStack.removeTask(this);
13253a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        }
13353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale        stack.addTask(this, toTop);
13453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale    }
13553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale
136ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale    void positionTaskInStack(TaskStack stack, int position) {
137ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        if (mStack != null && stack != mStack) {
138ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            if (DEBUG_STACK) Slog.i(TAG, "positionTaskInStack: removing taskId=" + mTaskId
139ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale                    + " from stack=" + mStack);
140ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask");
141ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale            mStack.removeTask(this);
142ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        }
143ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale        stack.positionTask(this, position, showForAllUsers());
144ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale    }
145ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale
146c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner    boolean removeAppToken(AppWindowToken wtoken) {
14742bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        boolean removed = mAppTokens.remove(wtoken);
148c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        if (mAppTokens.size() == 0) {
149000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId,
1502c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner                    "removeAppToken: last token");
151e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            if (mDeferRemoval) {
152e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner                removeLocked();
153e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner            }
154c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner        }
15583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTask = null;
15683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        /* Leave mTaskId for now, it might be useful for debug
15783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        wtoken.mTaskId = -1;
15883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner         */
15942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner        return removed;
160b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner    }
1615d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner
162cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner    void setSendingToBottom(boolean toBottom) {
163cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner        for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) {
164cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner            mAppTokens.get(appTokenNdx).sendingToBottom = toBottom;
165cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner        }
166cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner    }
167cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner
168ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski    /** Set the task bounds. Passing in null sets the bounds to fullscreen. */
1692cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale    int setBounds(Rect bounds, Configuration config) {
170ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (config == null) {
171ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            config = Configuration.EMPTY;
172b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
173ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (bounds == null && !Configuration.EMPTY.equals(config)) {
174ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            throw new IllegalArgumentException("null bounds but non empty configuration: "
175ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski                    + config);
176b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
177ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        if (bounds != null && Configuration.EMPTY.equals(config)) {
178ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            throw new IllegalArgumentException("non null bounds, but empty configuration");
179b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale        }
180e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        boolean oldFullscreen = mFullscreen;
181e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        int rotation = Surface.ROTATION_0;
182e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final DisplayContent displayContent = mStack.getDisplayContent();
183e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (displayContent != null) {
184e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            displayContent.getLogicalDisplayRect(mTmpRect);
185e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            rotation = displayContent.getDisplayInfo().rotation;
186e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            if (bounds == null) {
187e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                bounds = mTmpRect;
188e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                mFullscreen = true;
189e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            } else {
190234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                if (mStack.mStackId != FREEFORM_WORKSPACE_STACK_ID || bounds.isEmpty()) {
191234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                    // ensure bounds are entirely within the display rect
192234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                    if (!bounds.intersect(mTmpRect)) {
193234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                        // Can't set bounds outside the containing display...Sorry!
1942cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale                        return BOUNDS_CHANGE_NONE;
195234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne                    }
196e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
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) {
2200689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski            displayContent.mDimBehindController.updateDimLayer(this);
2210689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        }
222ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski        mOverrideConfig = mFullscreen ? Configuration.EMPTY : config;
2232cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale        return boundsChange;
224e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
225e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
22687b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang    boolean resizeLocked(Rect bounds, Configuration configuration, boolean forced) {
2273005e75585dcda30b64603e320e0711b583624ddChong Zhang        int boundsChanged = setBounds(bounds, configuration);
22887b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang        if (forced) {
2293005e75585dcda30b64603e320e0711b583624ddChong Zhang            boundsChanged |= BOUNDS_CHANGE_SIZE;
2303005e75585dcda30b64603e320e0711b583624ddChong Zhang        }
2313005e75585dcda30b64603e320e0711b583624ddChong Zhang        if (boundsChanged == BOUNDS_CHANGE_NONE) {
2323005e75585dcda30b64603e320e0711b583624ddChong Zhang            return false;
2333005e75585dcda30b64603e320e0711b583624ddChong Zhang        }
2343005e75585dcda30b64603e320e0711b583624ddChong Zhang        if ((boundsChanged & BOUNDS_CHANGE_SIZE) == BOUNDS_CHANGE_SIZE) {
2353005e75585dcda30b64603e320e0711b583624ddChong Zhang            resizeWindows();
2363005e75585dcda30b64603e320e0711b583624ddChong Zhang        }
2373005e75585dcda30b64603e320e0711b583624ddChong Zhang        return true;
2383005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
2393005e75585dcda30b64603e320e0711b583624ddChong Zhang
240f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    /** Return true if the current bound can get outputted to the rest of the system as-is. */
241f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    private boolean useCurrentBounds() {
242f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        final DisplayContent displayContent = mStack.getDisplayContent();
243f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        if (mFullscreen
244f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale                || mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID
245f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale                || mStack.mStackId == DOCKED_STACK_ID
246f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale                || displayContent == null
247f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale                || displayContent.getDockedStackLocked() != null) {
248f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            return true;
249f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        }
250f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        return false;
251f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    }
252f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale
253f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale    /** Bounds of the task with other system factors taken into consideration. */
2540689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    @Override
2550689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    public void getBounds(Rect out) {
256f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        if (useCurrentBounds()) {
257f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            // No need to adjust the output bounds if fullscreen or the docked stack is visible
258f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            // since it is already what we want to represent to the rest of the system.
259f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            out.set(mBounds);
260f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            return;
261f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        }
262f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale
263f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // The bounds has been adjusted to accommodate for a docked stack, but the docked stack
264f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // is not currently visible. Go ahead a represent it as fullscreen to the rest of the
265f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // system.
266f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        mStack.getDisplayContent().getLogicalDisplayRect(out);
267e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
268e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
2693005e75585dcda30b64603e320e0711b583624ddChong Zhang    void setDragResizing(boolean dragResizing) {
2703005e75585dcda30b64603e320e0711b583624ddChong Zhang        mDragResizing = dragResizing;
2713005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
2723005e75585dcda30b64603e320e0711b583624ddChong Zhang
2733005e75585dcda30b64603e320e0711b583624ddChong Zhang    boolean isDragResizing() {
2743005e75585dcda30b64603e320e0711b583624ddChong Zhang        return mDragResizing;
2753005e75585dcda30b64603e320e0711b583624ddChong Zhang    }
2763005e75585dcda30b64603e320e0711b583624ddChong Zhang
277e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void updateDisplayInfo(final DisplayContent displayContent) {
278e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (displayContent == null) {
279e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
280e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
281e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mFullscreen) {
282ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski            setBounds(null, Configuration.EMPTY);
283e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
284e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
285e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final int newRotation = displayContent.getDisplayInfo().rotation;
286e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        if (mRotation == newRotation) {
287e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            return;
288e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
289e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
290e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // Device rotation changed. We don't want the task to move around on the screen when
291e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        // this happens, so update the task bounds so it stays in the same place.
2929474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale        mTmpRect2.set(mBounds);
2939474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale        displayContent.rotateBounds(mRotation, newRotation, mTmpRect2);
2941ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale        if (setBounds(mTmpRect2, mOverrideConfig) != BOUNDS_CHANGE_NONE) {
2951ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale            // Post message to inform activity manager of the bounds change simulating
2961ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale            // a one-way call. We do this to prevent a deadlock between window manager
2971ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale            // lock and activity manager lock been held.
2981ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale            mService.mH.sendMessage(mService.mH.obtainMessage(
2991ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale                            RESIZE_TASK, mTaskId, RESIZE_MODE_SYSTEM_SCREEN_ROTATION, mBounds));
3001ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale        }
301e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
302e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
303e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    void resizeWindows() {
304e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        final ArrayList<WindowState> resizingWindows = mService.mResizingWindows;
305e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) {
306e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            final ArrayList<WindowState> windows = mAppTokens.get(activityNdx).allAppWindows;
307e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
308e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                final WindowState win = windows.get(winNdx);
309e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                if (!resizingWindows.contains(win)) {
310e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    if (DEBUG_RESIZE) Slog.d(TAG, "setBounds: Resizing " + win);
311e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                    resizingWindows.add(win);
312e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                }
313e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale            }
314e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        }
315e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
316e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
3176dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale    boolean showForAllUsers() {
3183fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale        final int tokensCount = mAppTokens.size();
3196dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale        return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers;
3203fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale    }
3213fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale
32209b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang    boolean inFreeformWorkspace() {
32309b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang        return mStack != null && mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID;
32409b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang    }
32509b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang
3269184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang    WindowState getTopAppMainWindow() {
3279184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang        final int tokensCount = mAppTokens.size();
3289184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang        return tokensCount > 0 ? mAppTokens.get(tokensCount - 1).findMainWindow() : null;
3299184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang    }
3309184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang
3315d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    @Override
332e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public boolean isFullscreen() {
333f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        if (useCurrentBounds()) {
334f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale            return mFullscreen;
335f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        }
336f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // The bounds has been adjusted to accommodate for a docked stack, but the docked stack
337f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // is not currently visible. Go ahead a represent it as fullscreen to the rest of the
338f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        // system.
339f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale        return true;
340e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
341e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
342e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    @Override
343e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public DisplayInfo getDisplayInfo() {
344e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        return mStack.getDisplayContent().getDisplayInfo();
345e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
346e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
347e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    @Override
3485d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    public String toString() {
34983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner        return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}";
3505d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner    }
351e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale
3520689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    @Override
3530689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    public String toShortString() {
3540689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski        return "Task=" + mTaskId;
3550689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski    }
3560689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski
357e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    public void printTo(String prefix, PrintWriter pw) {
358e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale        pw.print(prefix); pw.print("taskId="); pw.print(mTaskId);
359e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                pw.print(prefix); pw.print("appTokens="); pw.print(mAppTokens);
360e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale                pw.print(prefix); pw.print("mdr="); pw.println(mDeferRemoval);
361e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale    }
362b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner}
363