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