Task.java revision db20b5f7a1fdb847f2266df0fbae6046dc95c757
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; 2099db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwaleimport static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID; 21db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhangimport static android.app.ActivityManager.HOME_STACK_ID; 2299db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwaleimport static android.app.ActivityManager.PINNED_STACK_ID; 231ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwaleimport static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION; 2442bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport static com.android.server.wm.WindowManagerService.TAG; 25e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport static com.android.server.wm.WindowManagerService.DEBUG_RESIZE; 26e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautnerimport static com.android.server.wm.WindowManagerService.DEBUG_STACK; 271ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwaleimport static com.android.server.wm.WindowManagerService.H.RESIZE_TASK; 2899db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale 2942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner 30e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.content.res.Configuration; 31e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.graphics.Rect; 322c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog; 3342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport android.util.Slog; 34e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.util.SparseArray; 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 763005e75585dcda30b64603e320e0711b583624ddChong Zhang // Whether the task is currently being drag-resized 773005e75585dcda30b64603e320e0711b583624ddChong Zhang private boolean mDragResizing; 783005e75585dcda30b64603e320e0711b583624ddChong Zhang 79ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds, 80ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski Configuration config) { 8183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner mTaskId = taskId; 82c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mStack = stack; 83ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mUserId = userId; 84e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mService = service; 85ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski setBounds(bounds, config); 86c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 87c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 88c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner DisplayContent getDisplayContent() { 89c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return mStack.getDisplayContent(); 90c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 91c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 92c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner void addAppToken(int addPos, AppWindowToken wtoken) { 9342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner final int lastPos = mAppTokens.size(); 9483162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (addPos >= lastPos) { 9583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner addPos = lastPos; 9683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner } else { 9783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner for (int pos = 0; pos < lastPos && pos < addPos; ++pos) { 9883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (mAppTokens.get(pos).removed) { 9983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner // addPos assumes removed tokens are actually gone. 10083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner ++addPos; 10183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner } 10201f79cf91610ec9f85345ea6eeae50ea2f28578fCraig Mautner } 10342bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner } 104c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mAppTokens.add(addPos, wtoken); 10583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner wtoken.mTask = this; 10642bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner mDeferRemoval = false; 107c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 108c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 109e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner void removeLocked() { 110e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (!mAppTokens.isEmpty() && mStack.isAnimating()) { 11183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId); 112e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = true; 113e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner return; 114e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 11583162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); 11683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "removeTask"); 117e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = false; 1180689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski DisplayContent content = getDisplayContent(); 1190689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski if (content != null) { 1200689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski content.mDimBehindController.removeDimLayerUser(this); 1210689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski } 122e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mStack.removeTask(this); 12383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner mService.mTaskIdToTask.delete(mTaskId); 124e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 125e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner 12653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale void moveTaskToStack(TaskStack stack, boolean toTop) { 12753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (stack == mStack) { 12853a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale return; 12953a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 13053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (DEBUG_STACK) Slog.i(TAG, "moveTaskToStack: removing taskId=" + mTaskId 13153a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale + " from stack=" + mStack); 132000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask"); 13353a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (mStack != null) { 13453a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale mStack.removeTask(this); 13553a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 13653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale stack.addTask(this, toTop); 13753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 13853a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale 139ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale void positionTaskInStack(TaskStack stack, int position) { 140ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (mStack != null && stack != mStack) { 141ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (DEBUG_STACK) Slog.i(TAG, "positionTaskInStack: removing taskId=" + mTaskId 142ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale + " from stack=" + mStack); 143ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, "moveTask"); 144ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale mStack.removeTask(this); 145ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 146ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale stack.positionTask(this, position, showForAllUsers()); 147ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 148ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 149c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner boolean removeAppToken(AppWindowToken wtoken) { 15042bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner boolean removed = mAppTokens.remove(wtoken); 151c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner if (mAppTokens.size() == 0) { 152000957cef387dc7d08fc6563e2221e9023194984Wale Ogunwale EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, mTaskId, 1532c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner "removeAppToken: last token"); 154e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (mDeferRemoval) { 155e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner removeLocked(); 156e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 157c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 15883162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner wtoken.mTask = null; 15983162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner /* Leave mTaskId for now, it might be useful for debug 16083162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner wtoken.mTaskId = -1; 16183162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner */ 16242bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner return removed; 163b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 1645d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner 165cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner void setSendingToBottom(boolean toBottom) { 166cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner for (int appTokenNdx = 0; appTokenNdx < mAppTokens.size(); appTokenNdx++) { 167cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner mAppTokens.get(appTokenNdx).sendingToBottom = toBottom; 168cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 169cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 170cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner 171ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski /** Set the task bounds. Passing in null sets the bounds to fullscreen. */ 1722cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale int setBounds(Rect bounds, Configuration config) { 173ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski if (config == null) { 174ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski config = Configuration.EMPTY; 175b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 176ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski if (bounds == null && !Configuration.EMPTY.equals(config)) { 177ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski throw new IllegalArgumentException("null bounds but non empty configuration: " 178ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski + config); 179b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 180ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski if (bounds != null && Configuration.EMPTY.equals(config)) { 181ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski throw new IllegalArgumentException("non null bounds, but empty configuration"); 182b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 183e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale boolean oldFullscreen = mFullscreen; 184e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale int rotation = Surface.ROTATION_0; 185e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final DisplayContent displayContent = mStack.getDisplayContent(); 186e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (displayContent != null) { 187e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale displayContent.getLogicalDisplayRect(mTmpRect); 188e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale rotation = displayContent.getDisplayInfo().rotation; 189e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (bounds == null) { 190e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale bounds = mTmpRect; 191e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale mFullscreen = true; 192e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } else { 19399db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale if ((mStack.mStackId != FREEFORM_WORKSPACE_STACK_ID 19499db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale && mStack.mStackId != PINNED_STACK_ID) || bounds.isEmpty()) { 195234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne // ensure bounds are entirely within the display rect 196234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne if (!bounds.intersect(mTmpRect)) { 197234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne // Can't set bounds outside the containing display...Sorry! 1982cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return BOUNDS_CHANGE_NONE; 199234dbf875f795fdb72f82dc6ea805201ee31fb0eStefan Kuhne } 200e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 201e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale mFullscreen = mTmpRect.equals(bounds); 202e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 203e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 204e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 205e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (bounds == null) { 206e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // Can't set to fullscreen if we don't have a display to get bounds from... 2072cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return BOUNDS_CHANGE_NONE; 208e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 209e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (mBounds.equals(bounds) && oldFullscreen == mFullscreen && mRotation == rotation) { 2102cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return BOUNDS_CHANGE_NONE; 2112cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale } 2122cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale 2132cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale int boundsChange = BOUNDS_CHANGE_NONE; 2142cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale if (mBounds.left != bounds.left || mBounds.right != bounds.right) { 2152cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale boundsChange |= BOUNDS_CHANGE_POSITION; 2162cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale } 2172cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale if (mBounds.width() != bounds.width() || mBounds.height() != bounds.height()) { 2182cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale boundsChange |= BOUNDS_CHANGE_SIZE; 219e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 220e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 221e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale mBounds.set(bounds); 222e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale mRotation = rotation; 2230689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski if (displayContent != null) { 2240689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski displayContent.mDimBehindController.updateDimLayer(this); 2250689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski } 226ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski mOverrideConfig = mFullscreen ? Configuration.EMPTY : config; 2272cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return boundsChange; 228e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 229e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 23087b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang boolean resizeLocked(Rect bounds, Configuration configuration, boolean forced) { 2313005e75585dcda30b64603e320e0711b583624ddChong Zhang int boundsChanged = setBounds(bounds, configuration); 23287b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang if (forced) { 2333005e75585dcda30b64603e320e0711b583624ddChong Zhang boundsChanged |= BOUNDS_CHANGE_SIZE; 2343005e75585dcda30b64603e320e0711b583624ddChong Zhang } 2353005e75585dcda30b64603e320e0711b583624ddChong Zhang if (boundsChanged == BOUNDS_CHANGE_NONE) { 2363005e75585dcda30b64603e320e0711b583624ddChong Zhang return false; 2373005e75585dcda30b64603e320e0711b583624ddChong Zhang } 2383005e75585dcda30b64603e320e0711b583624ddChong Zhang if ((boundsChanged & BOUNDS_CHANGE_SIZE) == BOUNDS_CHANGE_SIZE) { 2393005e75585dcda30b64603e320e0711b583624ddChong Zhang resizeWindows(); 2403005e75585dcda30b64603e320e0711b583624ddChong Zhang } 2413005e75585dcda30b64603e320e0711b583624ddChong Zhang return true; 2423005e75585dcda30b64603e320e0711b583624ddChong Zhang } 2433005e75585dcda30b64603e320e0711b583624ddChong Zhang 244f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale /** Return true if the current bound can get outputted to the rest of the system as-is. */ 245f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale private boolean useCurrentBounds() { 246f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale final DisplayContent displayContent = mStack.getDisplayContent(); 247f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale if (mFullscreen 24899db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale || mStack.allowTaskResize() 249f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale || displayContent == null 250f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale || displayContent.getDockedStackLocked() != null) { 251f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return true; 252f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 253f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return false; 254f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 255f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 256f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale /** Bounds of the task with other system factors taken into consideration. */ 2570689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski @Override 2580689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski public void getBounds(Rect out) { 259f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale if (useCurrentBounds()) { 260f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // No need to adjust the output bounds if fullscreen or the docked stack is visible 261f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // since it is already what we want to represent to the rest of the system. 262f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale out.set(mBounds); 263f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return; 264f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 265f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 266f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // The bounds has been adjusted to accommodate for a docked stack, but the docked stack 267f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // is not currently visible. Go ahead a represent it as fullscreen to the rest of the 268f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // system. 269f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale mStack.getDisplayContent().getLogicalDisplayRect(out); 270e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 271e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 2723005e75585dcda30b64603e320e0711b583624ddChong Zhang void setDragResizing(boolean dragResizing) { 2733005e75585dcda30b64603e320e0711b583624ddChong Zhang mDragResizing = dragResizing; 2743005e75585dcda30b64603e320e0711b583624ddChong Zhang } 2753005e75585dcda30b64603e320e0711b583624ddChong Zhang 2763005e75585dcda30b64603e320e0711b583624ddChong Zhang boolean isDragResizing() { 2773005e75585dcda30b64603e320e0711b583624ddChong Zhang return mDragResizing; 2783005e75585dcda30b64603e320e0711b583624ddChong Zhang } 2793005e75585dcda30b64603e320e0711b583624ddChong Zhang 280e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale void updateDisplayInfo(final DisplayContent displayContent) { 281e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (displayContent == null) { 282e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return; 283e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 284e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (mFullscreen) { 285ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski setBounds(null, Configuration.EMPTY); 286e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return; 287e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 288e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final int newRotation = displayContent.getDisplayInfo().rotation; 289e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (mRotation == newRotation) { 290e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return; 291e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 292e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 293e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // Device rotation changed. We don't want the task to move around on the screen when 294e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // this happens, so update the task bounds so it stays in the same place. 2959474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale mTmpRect2.set(mBounds); 2969474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale displayContent.rotateBounds(mRotation, newRotation, mTmpRect2); 2971ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale if (setBounds(mTmpRect2, mOverrideConfig) != BOUNDS_CHANGE_NONE) { 2981ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale // Post message to inform activity manager of the bounds change simulating 2991ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale // a one-way call. We do this to prevent a deadlock between window manager 30044bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski // lock and activity manager lock been held. Only tasks within the freeform stack 30144bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski // are resizeable independently of their stack resizing. 30244bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski if (mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID) { 30344bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski mService.mH.sendMessage(mService.mH.obtainMessage( 30444bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski RESIZE_TASK, mTaskId, RESIZE_MODE_SYSTEM_SCREEN_ROTATION, mBounds)); 30544bc4daff31d2d6f632695008a0e5f5272ff4f56Filip Gruszczynski } 3061ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale } 307e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 308e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 309e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale void resizeWindows() { 310e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final ArrayList<WindowState> resizingWindows = mService.mResizingWindows; 311e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale for (int activityNdx = mAppTokens.size() - 1; activityNdx >= 0; --activityNdx) { 312e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final ArrayList<WindowState> windows = mAppTokens.get(activityNdx).allAppWindows; 313e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) { 314e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final WindowState win = windows.get(winNdx); 315e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (!resizingWindows.contains(win)) { 316e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (DEBUG_RESIZE) Slog.d(TAG, "setBounds: Resizing " + win); 317e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale resizingWindows.add(win); 318e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 319e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 320e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 321e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 322e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 3236dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale boolean showForAllUsers() { 3243fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale final int tokensCount = mAppTokens.size(); 3256dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers; 3263fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale } 3273fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale 328db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang boolean inHomeStack() { 329db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang return mStack != null && mStack.mStackId == HOME_STACK_ID; 330db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang } 331db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang 33209b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang boolean inFreeformWorkspace() { 33309b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang return mStack != null && mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID; 33409b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang } 33509b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang 336955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski boolean inDockedWorkspace() { 337955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski return mStack != null && mStack.mStackId == DOCKED_STACK_ID; 338955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski } 339955b2fc732382022959889e90694801c36b8a71aFilip Gruszczynski 3409184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang WindowState getTopAppMainWindow() { 3419184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang final int tokensCount = mAppTokens.size(); 3429184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang return tokensCount > 0 ? mAppTokens.get(tokensCount - 1).findMainWindow() : null; 3439184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang } 3449184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang 3455d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner @Override 346e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale public boolean isFullscreen() { 347f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale if (useCurrentBounds()) { 348f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return mFullscreen; 349f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 350f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // The bounds has been adjusted to accommodate for a docked stack, but the docked stack 351f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // is not currently visible. Go ahead a represent it as fullscreen to the rest of the 352f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // system. 353f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return true; 354e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 355e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 356e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale @Override 357e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale public DisplayInfo getDisplayInfo() { 358e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return mStack.getDisplayContent().getDisplayInfo(); 359e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 360e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 361e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale @Override 3625d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner public String toString() { 36383162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; 3645d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner } 365e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 3660689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski @Override 3670689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski public String toShortString() { 3680689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski return "Task=" + mTaskId; 3690689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski } 3700689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski 371e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale public void printTo(String prefix, PrintWriter pw) { 372e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale pw.print(prefix); pw.print("taskId="); pw.print(mTaskId); 373e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale pw.print(prefix); pw.print("appTokens="); pw.print(mAppTokens); 374e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale pw.print(prefix); pw.print("mdr="); pw.println(mDeferRemoval); 375e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 376b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner} 377