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