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 19d53f09254ed48365d3a5149d640437d76aed2e5dJorim Jaggiimport static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION; 20ba53d8ae410976709e1413b74173a791e8dead15Jason Monkimport static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; 2130d64f3a93f5fc5aaf75eeb38d658ef04a884b41Jorim Jaggiimport static android.app.ActivityManager.StackId.PINNED_STACK_ID; 22322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.comimport static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY; 23ba53d8ae410976709e1413b74173a791e8dead15Jason Monkimport static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY; 2430d64f3a93f5fc5aaf75eeb38d658ef04a884b41Jorim Jaggiimport static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION; 2561fbcbcc94d1ca949afae47ec0ec7a8da80aadefBryce Leeimport static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; 26e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwaleimport static com.android.server.EventLogTags.WM_TASK_REMOVED; 270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; 28d53f09254ed48365d3a5149d640437d76aed2e5dJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 29d53f09254ed48365d3a5149d640437d76aed2e5dJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 3099db1863a84364339fc5dc9142f15910cdd96ed8Wale Ogunwale 313797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwaleimport android.app.ActivityManager.StackId; 32829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggiimport android.app.ActivityManager.TaskDescription; 33b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwaleimport android.content.pm.ActivityInfo; 34e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.content.res.Configuration; 35e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.graphics.Rect; 362c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautnerimport android.util.EventLog; 3742bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautnerimport android.util.Slog; 38e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.DisplayInfo; 39e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport android.view.Surface; 40e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 41c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwaleimport com.android.internal.annotations.VisibleForTesting; 422c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner 43e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwaleimport java.io.PrintWriter; 4451304d7380b6122ac55645fd9085ba071b04afa9Jorim Jaggiimport java.util.function.Consumer; 45e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 46f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwaleclass Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerUser { 47b9b16a74e5543b7b707e55a7382bbe82d300e2e5Wale Ogunwale static final String TAG = TAG_WITH_CLASS_NAME ? "Task" : TAG_WM; 482cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale // Return value from {@link setBounds} indicating no change was made to the Task bounds. 493eadad75664e71519deebcf7a978b492952616ffWale Ogunwale private static final int BOUNDS_CHANGE_NONE = 0; 502cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale // Return value from {@link setBounds} indicating the position of the Task bounds changed. 513eadad75664e71519deebcf7a978b492952616ffWale Ogunwale private static final int BOUNDS_CHANGE_POSITION = 1; 522cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale // Return value from {@link setBounds} indicating the size of the Task bounds changed. 533eadad75664e71519deebcf7a978b492952616ffWale Ogunwale private static final int BOUNDS_CHANGE_SIZE = 1 << 1; 542cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale 55f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale // TODO: Track parent marks like this in WindowContainer. 56c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner TaskStack mStack; 5783162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner final int mTaskId; 58ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final int mUserId; 593eadad75664e71519deebcf7a978b492952616ffWale Ogunwale private boolean mDeferRemoval = false; 60e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner final WindowManagerService mService; 61b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner 62e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // Content limits relative to the DisplayContent this sits in. 63e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale private Rect mBounds = new Rect(); 640429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi final Rect mPreparedFrozenBounds = new Rect(); 6526c8c42bbb2b998e609983886fad5968f033268dJorim Jaggi final Configuration mPreparedFrozenMergedConfig = new Configuration(); 66e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 67dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi // Bounds used to calculate the insets. 68dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi private final Rect mTempInsetBounds = new Rect(); 69dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi 70e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // Device rotation as of the last time {@link #mBounds} was set. 713eadad75664e71519deebcf7a978b492952616ffWale Ogunwale private int mRotation; 72e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 73e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // Whether mBounds is fullscreen 745a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale private boolean mFillsParent = true; 75e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 76e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // For comparison with DisplayContent bounds. 77e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale private Rect mTmpRect = new Rect(); 78e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // For handling display rotations. 79e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale private Rect mTmpRect2 = new Rect(); 80e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 81b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale // Resize mode of the task. See {@link ActivityInfo#resizeMode} 82b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale private int mResizeMode; 83b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang 84d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung // Whether the task supports picture-in-picture. 85d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung // See {@link ActivityInfo#FLAG_SUPPORTS_PICTURE_IN_PICTURE} 86d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung private boolean mSupportsPictureInPicture; 87d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung 883005e75585dcda30b64603e320e0711b583624ddChong Zhang // Whether the task is currently being drag-resized 893005e75585dcda30b64603e320e0711b583624ddChong Zhang private boolean mDragResizing; 900b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi private int mDragResizeMode; 913005e75585dcda30b64603e320e0711b583624ddChong Zhang 92b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale private boolean mHomeTask; 93b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale 94829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi private TaskDescription mTaskDescription; 95829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi 9618f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // If set to true, the task will report that it is not in the floating 9718f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // state regardless of it's stack affilation. As the floating state drives 9818f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // production of content insets this can be used to preserve them across 9918f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // stack moves and we in fact do so when moving from full screen to pinned. 10018f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr private boolean mPreserveNonFloatingState = false; 10118f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr 102ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski Task(int taskId, TaskStack stack, int userId, WindowManagerService service, Rect bounds, 103069bbd382898d3330d284912b3a472495045c363Wale Ogunwale Configuration overrideConfig, int resizeMode, boolean supportsPictureInPicture, 104069bbd382898d3330d284912b3a472495045c363Wale Ogunwale boolean homeTask, TaskDescription taskDescription, 105d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung TaskWindowContainerController controller) { 10683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner mTaskId = taskId; 107c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mStack = stack; 108ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mUserId = userId; 109e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mService = service; 11072919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale mResizeMode = resizeMode; 111d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung mSupportsPictureInPicture = supportsPictureInPicture; 11272919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale mHomeTask = homeTask; 113e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale setController(controller); 1148072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian setBounds(bounds, overrideConfig); 115829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi mTaskDescription = taskDescription; 11661fbcbcc94d1ca949afae47ec0ec7a8da80aadefBryce Lee 11761fbcbcc94d1ca949afae47ec0ec7a8da80aadefBryce Lee // Tasks have no set orientation value (including SCREEN_ORIENTATION_UNSPECIFIED). 11861fbcbcc94d1ca949afae47ec0ec7a8da80aadefBryce Lee setOrientation(SCREEN_ORIENTATION_UNSET); 119c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 120c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 121c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner DisplayContent getDisplayContent() { 122c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale return mStack != null ? mStack.getDisplayContent() : null; 123c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 124c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 125069bbd382898d3330d284912b3a472495045c363Wale Ogunwale private int getAdjustedAddPosition(int suggestedPosition) { 126c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale final int size = mChildren.size(); 127c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale if (suggestedPosition >= size) { 128c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale return Math.min(size, suggestedPosition); 12942bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner } 130f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale 131c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale for (int pos = 0; pos < size && pos < suggestedPosition; ++pos) { 132c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale // TODO: Confirm that this is the behavior we want long term. 133c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale if (mChildren.get(pos).removed) { 134c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale // suggestedPosition assumes removed tokens are actually gone. 135c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale ++suggestedPosition; 136c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale } 137f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale } 138c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale return Math.min(size, suggestedPosition); 139c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale } 140c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale 141c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale @Override 142c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale void addChild(AppWindowToken wtoken, int position) { 143c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale position = getAdjustedAddPosition(position); 144c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale super.addChild(wtoken, position); 14542bf39edbdad19f51497938d0a3469dd772f19e8Craig Mautner mDeferRemoval = false; 146c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 147c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 148c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale @Override 149c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale void positionChildAt(int position, AppWindowToken child, boolean includingParents) { 150c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale position = getAdjustedAddPosition(position); 151c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale super.positionChildAt(position, child, includingParents); 152c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale mDeferRemoval = false; 153c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale } 154c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale 155e42d0e102dbdf5287703389183a69019b64fc35eWale Ogunwale private boolean hasWindowsAlive() { 156f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; i--) { 157f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale if (mChildren.get(i).hasWindowsAlive()) { 1587e8eeb79abe1a4b39b2f086aacefa48928307cb2Chong Zhang return true; 1597e8eeb79abe1a4b39b2f086aacefa48928307cb2Chong Zhang } 1607e8eeb79abe1a4b39b2f086aacefa48928307cb2Chong Zhang } 1617e8eeb79abe1a4b39b2f086aacefa48928307cb2Chong Zhang return false; 1627e8eeb79abe1a4b39b2f086aacefa48928307cb2Chong Zhang } 1637e8eeb79abe1a4b39b2f086aacefa48928307cb2Chong Zhang 164c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale @VisibleForTesting 165c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale boolean shouldDeferRemoval() { 1662c9f203aad9df59171be155c45b7ed2654499d6aWale Ogunwale // TODO: This should probably return false if mChildren.isEmpty() regardless if the stack 1672c9f203aad9df59171be155c45b7ed2654499d6aWale Ogunwale // is animating... 168c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale return hasWindowsAlive() && mStack.isAnimating(); 169c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale } 170c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale 171f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale @Override 172f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale void removeIfPossible() { 173c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale if (shouldDeferRemoval()) { 174b9b16a74e5543b7b707e55a7382bbe82d300e2e5Wale Ogunwale if (DEBUG_STACK) Slog.i(TAG, "removeTask: deferring removing taskId=" + mTaskId); 175e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = true; 176e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner return; 177e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 17845a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian removeImmediately(); 17945a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian } 18045a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian 18145a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian @Override 18245a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian void removeImmediately() { 183b9b16a74e5543b7b707e55a7382bbe82d300e2e5Wale Ogunwale if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing taskId=" + mTaskId); 184e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale EventLog.writeEvent(WM_TASK_REMOVED, mTaskId, "removeTask"); 185e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner mDeferRemoval = false; 18645a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian 18745a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian // Make sure to remove dim layer user first before removing task its from parent. 1880689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski DisplayContent content = getDisplayContent(); 1890689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski if (content != null) { 190112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang content.mDimLayerController.removeDimLayerUser(this); 1910689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski } 19245a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian 19345a61fe5296d6fd3b9e2872c5dfc8d01f6a5b455Andrii Kulian super.removeImmediately(); 194e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 195e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner 1962719cc134e68e4c8f0def68fdc1d68dc3de9c1d8Wale Ogunwale void reparent(TaskStack stack, int position, boolean moveParents) { 19753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale if (stack == mStack) { 198c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale throw new IllegalArgumentException( 199c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale "task=" + this + " already child of stack=" + mStack); 20053a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 201e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale if (DEBUG_STACK) Slog.i(TAG, "reParentTask: removing taskId=" + mTaskId 20253a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale + " from stack=" + mStack); 203e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale EventLog.writeEvent(WM_TASK_REMOVED, mTaskId, "reParentTask"); 2047cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian final DisplayContent prevDisplayContent = getDisplayContent(); 2057cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian 20618f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // If we are moving from the fullscreen stack to the pinned stack 20718f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // then we want to preserve our insets so that there will not 20818f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // be a jump in the area covered by system decorations. We rely 20918f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr // on the pinned animation to later unset this value. 21018f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr if (stack.mStackId == PINNED_STACK_ID) { 21118f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr mPreserveNonFloatingState = true; 21218f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr } else { 21318f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr mPreserveNonFloatingState = false; 21418f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr } 21518f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr 216441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian getParent().removeChild(this); 2172719cc134e68e4c8f0def68fdc1d68dc3de9c1d8Wale Ogunwale stack.addTask(this, position, showForAllUsers(), moveParents); 2187cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian 2197cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian // Relayout display(s). 2207cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian final DisplayContent displayContent = stack.getDisplayContent(); 2217cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian displayContent.setLayoutNeeded(); 2227cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian if (prevDisplayContent != displayContent) { 2237cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian onDisplayChanged(displayContent); 2247cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian prevDisplayContent.setLayoutNeeded(); 2257cd7c2d333c1b4f77a5b1a9f08cbaaebb242700cAndrii Kulian } 22653a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale } 22753a29a90f35f72462c0d6ad650921d5566c1f8f0Wale Ogunwale 228d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian /** @see com.android.server.am.ActivityManagerService#positionTaskInStack(int, int, int). */ 229c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale void positionAt(int position, Rect bounds, Configuration overrideConfig) { 230c5cc301689649695e03f502e7d1c1492ef5e5d1eWale Ogunwale mStack.positionChildAt(position, this, false /* includingParents */); 2311779e6108ab264689b7d5e5c42ba3cbca6c8189fAndrii Kulian resizeLocked(bounds, overrideConfig, false /* force */); 232ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 233ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 23414a3fb98e5ec5f366e810ad4d1f2a73ef8407ac6Wale Ogunwale @Override 235d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian void onParentSet() { 236d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian // Update task bounds if needed. 237d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian updateDisplayInfo(getDisplayContent()); 238d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian 239d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian if (StackId.windowsAreScaleable(mStack.mStackId)) { 240d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian // We force windows out of SCALING_MODE_FREEZE so that we can continue to animate them 241d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian // while a resize is pending. 242d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian forceWindowsScaleable(true /* force */); 243d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian } else { 244d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian forceWindowsScaleable(false /* force */); 245d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian } 246d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian } 247d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian 248d276563b38907647ce70940e1e90603826df6ab4Andrii Kulian @Override 249f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale void removeChild(AppWindowToken token) { 250f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale if (!mChildren.contains(token)) { 251f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale Slog.e(TAG, "removeChild: token=" + this + " not found."); 252f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale return; 2533f4433dadb7627153939ebb7d88d080c132b7f7fWale Ogunwale } 2543f4433dadb7627153939ebb7d88d080c132b7f7fWale Ogunwale 255f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale super.removeChild(token); 256571771c3fc912e63f83b75693c0f3c85ec9622daWale Ogunwale 257f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale if (mChildren.isEmpty()) { 258e1fe7fa288a34ecaaab390f49ef540edc4a6c52dWale Ogunwale EventLog.writeEvent(WM_TASK_REMOVED, mTaskId, "removeAppToken: last token"); 259e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (mDeferRemoval) { 260f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale removeIfPossible(); 261e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 262c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 263b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner } 2645d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner 265cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner void setSendingToBottom(boolean toBottom) { 266f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int appTokenNdx = 0; appTokenNdx < mChildren.size(); appTokenNdx++) { 267f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale mChildren.get(appTokenNdx).sendingToBottom = toBottom; 268cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 269cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner } 270cbd84af39a329890013b0c3b6763280ba2ad78c9Craig Mautner 271ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski /** Set the task bounds. Passing in null sets the bounds to fullscreen. */ 2728072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian private int setBounds(Rect bounds, Configuration overrideConfig) { 2738072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian if (overrideConfig == null) { 2748072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian overrideConfig = Configuration.EMPTY; 275b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 2768072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian if (bounds == null && !Configuration.EMPTY.equals(overrideConfig)) { 277ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski throw new IllegalArgumentException("null bounds but non empty configuration: " 2788072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian + overrideConfig); 279b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 2808072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian if (bounds != null && Configuration.EMPTY.equals(overrideConfig)) { 281ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski throw new IllegalArgumentException("non null bounds, but empty configuration"); 282b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 2835a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale boolean oldFullscreen = mFillsParent; 284e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale int rotation = Surface.ROTATION_0; 285e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final DisplayContent displayContent = mStack.getDisplayContent(); 286e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (displayContent != null) { 287e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale displayContent.getLogicalDisplayRect(mTmpRect); 288e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale rotation = displayContent.getDisplayInfo().rotation; 2895a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale mFillsParent = bounds == null; 2905a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale if (mFillsParent) { 291e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale bounds = mTmpRect; 292e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 293e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 294e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 295e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (bounds == null) { 296e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // Can't set to fullscreen if we don't have a display to get bounds from... 2972cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return BOUNDS_CHANGE_NONE; 298e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 2995a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale if (mBounds.equals(bounds) && oldFullscreen == mFillsParent && mRotation == rotation) { 3002cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return BOUNDS_CHANGE_NONE; 3012cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale } 3022cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale 3032cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale int boundsChange = BOUNDS_CHANGE_NONE; 3042e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang if (mBounds.left != bounds.left || mBounds.top != bounds.top) { 3052cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale boundsChange |= BOUNDS_CHANGE_POSITION; 3062cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale } 3072e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang if (mBounds.width() != bounds.width() || mBounds.height() != bounds.height()) { 3082cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale boundsChange |= BOUNDS_CHANGE_SIZE; 309e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 310e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 3112e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang mBounds.set(bounds); 312f66db43063e4409206f1572fa1bac4f87c431f9aChong Zhang 313e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale mRotation = rotation; 3140689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski if (displayContent != null) { 315112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang displayContent.mDimLayerController.updateDimLayer(this); 3160689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski } 317441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian onOverrideConfigurationChanged(mFillsParent ? Configuration.EMPTY : overrideConfig); 3182cc92f55c0257cdc837585b36987c610fb0a8251Wale Ogunwale return boundsChange; 319e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 320e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 321dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi /** 322dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi * Sets the bounds used to calculate the insets. See 323dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi * {@link android.app.IActivityManager#resizeDockedStack} why this is needed. 324dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi */ 325dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi void setTempInsetBounds(Rect tempInsetBounds) { 326dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi if (tempInsetBounds != null) { 327dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi mTempInsetBounds.set(tempInsetBounds); 328dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi } else { 329dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi mTempInsetBounds.setEmpty(); 330dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi } 331dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi } 332dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi 333dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi /** 334dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi * Gets the bounds used to calculate the insets. See 335dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi * {@link android.app.IActivityManager#resizeDockedStack} why this is needed. 336dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi */ 337dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi void getTempInsetBounds(Rect out) { 338dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi out.set(mTempInsetBounds); 339dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi } 340dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi 341b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale void setResizeable(int resizeMode) { 342b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale mResizeMode = resizeMode; 343b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang } 344b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang 345b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang boolean isResizeable() { 346d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung return ActivityInfo.isResizeableMode(mResizeMode) || mSupportsPictureInPicture 347d339538a67b7d6bb3d7ad73f31ad20ffc932f891Winson Chung || mService.mForceResizableTasks; 348b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale } 349b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale 350322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com /** 351322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com * Tests if the orientation should be preserved upon user interactive resizig operations. 352322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com 353322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com * @return true if orientation should not get changed upon resizing operation. 354322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com */ 355322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com boolean preserveOrientationOnResize() { 356322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com return mResizeMode == RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY 357322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com || mResizeMode == RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY 358322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com || mResizeMode == RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION; 359322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com } 360322347ba58f02b960dc87eca3cb0ebe0455c9253skuhne@google.com 361b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale boolean cropWindowsToStackBounds() { 362df241e97715abf10fc043233d18ac4cdd5c0f889Wale Ogunwale return isResizeable(); 363b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale } 364b1faf60b896afe235175354ffd90290ff93a54b4Wale Ogunwale 36542625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi boolean isHomeTask() { 36642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi return mHomeTask; 36742625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 36842625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi 3698072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian boolean resizeLocked(Rect bounds, Configuration overrideConfig, boolean forced) { 3708072d11f6a41a68600a15623ca5316ca0def1856Andrii Kulian int boundsChanged = setBounds(bounds, overrideConfig); 37187b21722c2336490ecf8b66f6acfc46ce8cc6f46Chong Zhang if (forced) { 3723005e75585dcda30b64603e320e0711b583624ddChong Zhang boundsChanged |= BOUNDS_CHANGE_SIZE; 3733005e75585dcda30b64603e320e0711b583624ddChong Zhang } 3743005e75585dcda30b64603e320e0711b583624ddChong Zhang if (boundsChanged == BOUNDS_CHANGE_NONE) { 3753005e75585dcda30b64603e320e0711b583624ddChong Zhang return false; 3763005e75585dcda30b64603e320e0711b583624ddChong Zhang } 3773005e75585dcda30b64603e320e0711b583624ddChong Zhang if ((boundsChanged & BOUNDS_CHANGE_SIZE) == BOUNDS_CHANGE_SIZE) { 378d1c3791659572529dbc749b70d1c33bda1bdbc32Wale Ogunwale onResize(); 379bd0d937303ae54d8a5bb5f08080c4164302daefcChong Zhang } else { 380d1c3791659572529dbc749b70d1c33bda1bdbc32Wale Ogunwale onMovedByResize(); 3813005e75585dcda30b64603e320e0711b583624ddChong Zhang } 3823005e75585dcda30b64603e320e0711b583624ddChong Zhang return true; 3833005e75585dcda30b64603e320e0711b583624ddChong Zhang } 3843005e75585dcda30b64603e320e0711b583624ddChong Zhang 3850429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi /** 3860429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi * Prepares the task bounds to be frozen with the current size. See 3870429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi * {@link AppWindowToken#freezeBounds}. 3880429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi */ 3890429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi void prepareFreezingBounds() { 3900429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi mPreparedFrozenBounds.set(mBounds); 391441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian mPreparedFrozenMergedConfig.setTo(getConfiguration()); 3920429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi } 3930429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi 3945117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang /** 3955117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * Align the task to the adjusted bounds. 3965117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * 3975117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * @param adjustedBounds Adjusted bounds to which the task should be aligned. 3985117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * @param tempInsetBounds Insets bounds for the task. 3995117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * @param alignBottom True if the task's bottom should be aligned to the adjusted 4005117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * bounds's bottom; false if the task's top should be aligned 4015117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang * the adjusted bounds's top. 4025117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang */ 403441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian void alignToAdjustedBounds(Rect adjustedBounds, Rect tempInsetBounds, boolean alignBottom) { 4049425116bd70f09e9e6dc5406866868046ba1ca97Andrii Kulian if (!isResizeable() || Configuration.EMPTY.equals(getOverrideConfiguration())) { 4055117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang return; 4065117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang } 4075117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang 4085117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang getBounds(mTmpRect2); 4095117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang if (alignBottom) { 4105117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang int offsetY = adjustedBounds.bottom - mTmpRect2.bottom; 4115117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang mTmpRect2.offset(0, offsetY); 4125117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang } else { 4135117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang mTmpRect2.offsetTo(adjustedBounds.left, adjustedBounds.top); 4145117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang } 4155117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang setTempInsetBounds(tempInsetBounds); 4165406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian resizeLocked(mTmpRect2, getOverrideConfiguration(), false /* forced */); 4175117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang } 4185117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang 419f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale /** Return true if the current bound can get outputted to the rest of the system as-is. */ 420f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale private boolean useCurrentBounds() { 421f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale final DisplayContent displayContent = mStack.getDisplayContent(); 4225a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale return mFillsParent 4233797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale || !StackId.isTaskResizeableByDockedStack(mStack.mStackId) 424f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale || displayContent == null 425fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi || displayContent.getDockedStackIgnoringVisibility() != null; 426f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 427f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 4284c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang /** Original bounds of the task if applicable, otherwise fullscreen rect. */ 429ccb6ce2dcd8b833692f6c8a4a568fb938acfe058Wale Ogunwale void getBounds(Rect out) { 430f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale if (useCurrentBounds()) { 431f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // No need to adjust the output bounds if fullscreen or the docked stack is visible 432f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // since it is already what we want to represent to the rest of the system. 433f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale out.set(mBounds); 434f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return; 435f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 436f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 437ccb6ce2dcd8b833692f6c8a4a568fb938acfe058Wale Ogunwale // The bounds has been adjusted to accommodate for a docked stack, but the docked stack is 438ccb6ce2dcd8b833692f6c8a4a568fb938acfe058Wale Ogunwale // not currently visible. Go ahead a represent it as fullscreen to the rest of the system. 439f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale mStack.getDisplayContent().getLogicalDisplayRect(out); 440e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 441e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 4424c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang /** 4434c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * Calculate the maximum visible area of this task. If the task has only one app, 4444c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * the result will be visible frame of that app. If the task has more than one apps, 4454c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * we search from top down if the next app got different visible area. 4464c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * 4474c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * This effort is to handle the case where some task (eg. GMail composer) might pop up 4484c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * a dialog that's different in size from the activity below, in which case we should 4494c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * be dimming the entire task area behind the dialog. 4504c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * 4514c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * @param out Rect containing the max visible bounds. 4524c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang * @return true if the task has some visible app windows; false otherwise. 4534c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang */ 4544c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang boolean getMaxVisibleBounds(Rect out) { 4554c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang boolean foundTop = false; 456f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; i--) { 457f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale final AppWindowToken token = mChildren.get(i); 458d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang // skip hidden (or about to hide) apps 4598997322ed3c8014e1833323b71e5a8d34e6a9e14Wale Ogunwale if (token.mIsExiting || token.isClientHidden() || token.hiddenRequested) { 460d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang continue; 461d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang } 462d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang final WindowState win = token.findMainWindow(); 4634c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (win == null) { 4644c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang continue; 4654c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4664c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (!foundTop) { 4674c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang out.set(win.mVisibleFrame); 4684c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang foundTop = true; 4694c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang continue; 4704c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4714c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (win.mVisibleFrame.left < out.left) { 4724c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang out.left = win.mVisibleFrame.left; 4734c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4744c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (win.mVisibleFrame.top < out.top) { 4754c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang out.top = win.mVisibleFrame.top; 4764c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4774c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (win.mVisibleFrame.right > out.right) { 4784c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang out.right = win.mVisibleFrame.right; 4794c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4804c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (win.mVisibleFrame.bottom > out.bottom) { 4814c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang out.bottom = win.mVisibleFrame.bottom; 4824c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4834c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4844c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang return foundTop; 4854c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4864c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 4874c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang /** Bounds of the task to be used for dimming, as well as touch related tests. */ 4884c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang @Override 4894c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang public void getDimBounds(Rect out) { 490a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr final DisplayContent displayContent = mStack.getDisplayContent(); 491a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr // It doesn't matter if we in particular are part of the resize, since we couldn't have 492a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr // a DimLayer anyway if we weren't visible. 493f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale final boolean dockedResizing = displayContent != null 494f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale && displayContent.mDividerControllerLocked.isResizing(); 4954c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (useCurrentBounds()) { 4964c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (inFreeformWorkspace() && getMaxVisibleBounds(out)) { 4974c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang return; 4984c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 4994c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 5005a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale if (!mFillsParent) { 50122a869f51b93242d001ffb4c5d4ab3c8ed0b5a16Jorim Jaggi // When minimizing the docked stack when going home, we don't adjust the task bounds 50222a869f51b93242d001ffb4c5d4ab3c8ed0b5a16Jorim Jaggi // so we need to intersect the task bounds with the stack bounds here. 503a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr // 504a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr // If we are Docked Resizing with snap points, the task bounds could be smaller than the stack 505a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr // bounds and so we don't even want to use them. Even if the app should not be resized the Dim 506a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr // should keep up with the divider. 507a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr if (dockedResizing) { 508a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr mStack.getBounds(out); 509a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr } else { 510a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr mStack.getBounds(mTmpRect); 511a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr mTmpRect.intersect(mBounds); 512a86a6bf73e8f6e58590c1b53972cd2d1cc7c137fRobert Carr } 51322a869f51b93242d001ffb4c5d4ab3c8ed0b5a16Jorim Jaggi out.set(mTmpRect); 51422a869f51b93242d001ffb4c5d4ab3c8ed0b5a16Jorim Jaggi } else { 51522a869f51b93242d001ffb4c5d4ab3c8ed0b5a16Jorim Jaggi out.set(mBounds); 51622a869f51b93242d001ffb4c5d4ab3c8ed0b5a16Jorim Jaggi } 5174c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang return; 5184c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 5194c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 520f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale // The bounds has been adjusted to accommodate for a docked stack, but the docked stack is 521f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale // not currently visible. Go ahead a represent it as fullscreen to the rest of the system. 522f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale if (displayContent != null) { 523f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale displayContent.getLogicalDisplayRect(out); 524f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale } 5254c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 5264c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 5270b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi void setDragResizing(boolean dragResizing, int dragResizeMode) { 528c662d8e94620c84b2fa57bfd6e45690f0c349d89Jorim Jaggi if (mDragResizing != dragResizing) { 5290b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi if (!DragResizeMode.isModeAllowedForStack(mStack.mStackId, dragResizeMode)) { 5300b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi throw new IllegalArgumentException("Drag resize mode not allow for stack stackId=" 5310b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi + mStack.mStackId + " dragResizeMode=" + dragResizeMode); 5320b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi } 533c662d8e94620c84b2fa57bfd6e45690f0c349d89Jorim Jaggi mDragResizing = dragResizing; 5340b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi mDragResizeMode = dragResizeMode; 535c662d8e94620c84b2fa57bfd6e45690f0c349d89Jorim Jaggi resetDragResizingChangeReported(); 536c662d8e94620c84b2fa57bfd6e45690f0c349d89Jorim Jaggi } 537c662d8e94620c84b2fa57bfd6e45690f0c349d89Jorim Jaggi } 538c662d8e94620c84b2fa57bfd6e45690f0c349d89Jorim Jaggi 5393005e75585dcda30b64603e320e0711b583624ddChong Zhang boolean isDragResizing() { 540d1c3791659572529dbc749b70d1c33bda1bdbc32Wale Ogunwale return mDragResizing; 5413005e75585dcda30b64603e320e0711b583624ddChong Zhang } 5423005e75585dcda30b64603e320e0711b583624ddChong Zhang 5430b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi int getDragResizeMode() { 5440b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi return mDragResizeMode; 5450b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi } 5460b46f3c72c324bc9b8890ed9b81951bbeec70fddJorim Jaggi 547e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale void updateDisplayInfo(final DisplayContent displayContent) { 548e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (displayContent == null) { 549e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return; 550e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 5515a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale if (mFillsParent) { 552ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski setBounds(null, Configuration.EMPTY); 553e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return; 554e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 555e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale final int newRotation = displayContent.getDisplayInfo().rotation; 556e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (mRotation == newRotation) { 557e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return; 558e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 559e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 560e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale // Device rotation changed. 5612e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang // - We don't want the task to move around on the screen when this happens, so update the 5622e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang // task bounds so it stays in the same place. 563e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale // - Rotate the bounds and notify activity manager if the task can be resized independently 5642e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang // from its stack. The stack will take care of task rotation for the other case. 5652e2c81a8d67f6ceccf178c5c7264d27e8c72e9ffChong Zhang mTmpRect2.set(mBounds); 566e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale 567e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale if (!StackId.isTaskResizeAllowed(mStack.mStackId)) { 568441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian setBounds(mTmpRect2, getOverrideConfiguration()); 569e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale return; 570e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale } 571e1fe4d1e12b2524807ed29990b11268a03de54d7Wale Ogunwale 5729474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale displayContent.rotateBounds(mRotation, newRotation, mTmpRect2); 573441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian if (setBounds(mTmpRect2, getOverrideConfiguration()) != BOUNDS_CHANGE_NONE) { 5741666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale final TaskWindowContainerController controller = getController(); 5751666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale if (controller != null) { 5761666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale controller.requestResize(mBounds, RESIZE_MODE_SYSTEM_SCREEN_ROTATION); 5771666e317dc1a17e9435246ec6c8209dbb6ee3696Wale Ogunwale } 5781ed0d89e7e9a28a5dd52fdc40425466efd8d08efWale Ogunwale } 579e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 580e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 581f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale /** Cancels any running app transitions associated with the task. */ 582c28098f69b8ba5d3039ecd0fa154e880f4613843Winson void cancelTaskWindowTransition() { 583f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; --i) { 584f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale mChildren.get(i).mAppAnimator.clearAnimation(); 585c28098f69b8ba5d3039ecd0fa154e880f4613843Winson } 586c28098f69b8ba5d3039ecd0fa154e880f4613843Winson } 587c28098f69b8ba5d3039ecd0fa154e880f4613843Winson 588f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale /** Cancels any running thumbnail transitions associated with the task. */ 58913d30660ef6da2d924e4fc943ccd187767ee0cd2Winson void cancelTaskThumbnailTransition() { 590f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; --i) { 591f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale mChildren.get(i).mAppAnimator.clearThumbnail(); 59213d30660ef6da2d924e4fc943ccd187767ee0cd2Winson } 59313d30660ef6da2d924e4fc943ccd187767ee0cd2Winson } 59413d30660ef6da2d924e4fc943ccd187767ee0cd2Winson 5956dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale boolean showForAllUsers() { 596f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale final int tokensCount = mChildren.size(); 59772919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale return (tokensCount != 0) && mChildren.get(tokensCount - 1).mShowForAllUsers; 598ff71d20ff357a33c30e1e3b474e51ad47d5c5d3aJorim Jaggi } 599ff71d20ff357a33c30e1e3b474e51ad47d5c5d3aJorim Jaggi 60009b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang boolean inFreeformWorkspace() { 60109b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang return mStack != null && mStack.mStackId == FREEFORM_WORKSPACE_STACK_ID; 60209b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang } 60309b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang 604031384556ede1678e9c7f5bff21a6b9eefb3502fRobert Carr boolean inPinnedWorkspace() { 605031384556ede1678e9c7f5bff21a6b9eefb3502fRobert Carr return mStack != null && mStack.mStackId == PINNED_STACK_ID; 606031384556ede1678e9c7f5bff21a6b9eefb3502fRobert Carr } 607031384556ede1678e9c7f5bff21a6b9eefb3502fRobert Carr 6087e4c90e5441e344a1e2b58f46f5785db8409d609Robert Carr /** 6097e4c90e5441e344a1e2b58f46f5785db8409d609Robert Carr * When we are in a floating stack (Freeform, Pinned, ...) we calculate 6107e4c90e5441e344a1e2b58f46f5785db8409d609Robert Carr * insets differently. However if we are animating to the fullscreen stack 6117e4c90e5441e344a1e2b58f46f5785db8409d609Robert Carr * we need to begin calculating insets as if we were fullscreen, otherwise 6127e4c90e5441e344a1e2b58f46f5785db8409d609Robert Carr * we will have a jump at the end. 6137e4c90e5441e344a1e2b58f46f5785db8409d609Robert Carr */ 614e627558feffa4ffe6435d7d13eda3d89f7c08095Robert Carr boolean isFloating() { 61518f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr return StackId.tasksAreFloating(mStack.mStackId) 61618f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr && !mStack.isAnimatingBoundsToFullscreen() && !mPreserveNonFloatingState; 617e627558feffa4ffe6435d7d13eda3d89f7c08095Robert Carr } 618e627558feffa4ffe6435d7d13eda3d89f7c08095Robert Carr 619d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang WindowState getTopVisibleAppMainWindow() { 620d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang final AppWindowToken token = getTopVisibleAppToken(); 621d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang return token != null ? token.findMainWindow() : null; 6229184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang } 623bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang 624d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang AppWindowToken getTopVisibleAppToken() { 625f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; i--) { 626f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale final AppWindowToken token = mChildren.get(i); 627d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang // skip hidden (or about to hide) apps 6288997322ed3c8014e1833323b71e5a8d34e6a9e14Wale Ogunwale if (!token.mIsExiting && !token.isClientHidden() && !token.hiddenRequested) { 629d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang return token; 630d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang } 631d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang } 632d8ceb85512f8dc2dac6ef07fc72f89a75095e3d7Chong Zhang return null; 633bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang } 6349184ec686072e9343c9dd73cf45324e5e89e042fChong Zhang 6355d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner @Override 63629bfbb878d54db14204e9b02dc17bfc6e127b6b2Wale Ogunwale public boolean dimFullscreen() { 637df241e97715abf10fc043233d18ac4cdd5c0f889Wale Ogunwale return isFullscreen(); 63829bfbb878d54db14204e9b02dc17bfc6e127b6b2Wale Ogunwale } 63929bfbb878d54db14204e9b02dc17bfc6e127b6b2Wale Ogunwale 64029bfbb878d54db14204e9b02dc17bfc6e127b6b2Wale Ogunwale boolean isFullscreen() { 641f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale if (useCurrentBounds()) { 6425a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale return mFillsParent; 643f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 644f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // The bounds has been adjusted to accommodate for a docked stack, but the docked stack 645f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // is not currently visible. Go ahead a represent it as fullscreen to the rest of the 646f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // system. 647f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return true; 648e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 649e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 650e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale @Override 651e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale public DisplayInfo getDisplayInfo() { 652f0a60a9c60d9973e10a859dd8c31b8f18adb5a0eWale Ogunwale return getDisplayContent().getDisplayInfo(); 653f0a60a9c60d9973e10a859dd8c31b8f18adb5a0eWale Ogunwale } 654f0a60a9c60d9973e10a859dd8c31b8f18adb5a0eWale Ogunwale 655f0a60a9c60d9973e10a859dd8c31b8f18adb5a0eWale Ogunwale @Override 656f0a60a9c60d9973e10a859dd8c31b8f18adb5a0eWale Ogunwale public boolean isAttachedToDisplay() { 657f0a60a9c60d9973e10a859dd8c31b8f18adb5a0eWale Ogunwale return getDisplayContent() != null; 658e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 659e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 6609f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale void forceWindowsScaleable(boolean force) { 66168e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService.openSurfaceTransaction(); 6629f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale try { 663f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; i--) { 664f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale mChildren.get(i).forceWindowsScaleableInTransaction(force); 6659f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale } 6669f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale } finally { 66768e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr mService.closeSurfaceTransaction(); 6689f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale } 6699f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale } 6709f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale 671829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi void setTaskDescription(TaskDescription taskDescription) { 672829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi mTaskDescription = taskDescription; 673829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi } 674829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi 675829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi TaskDescription getTaskDescription() { 676829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi return mTaskDescription; 677829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi } 678829b9cd100ddea44fadb9931c0ff11b11aaba059Jorim Jaggi 679f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale @Override 6805136249a7147fb205e1b861c1d42a7d1f13b73ccWale Ogunwale boolean fillsParent() { 6815a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale return mFillsParent || !StackId.isTaskResizeAllowed(mStack.mStackId); 6825136249a7147fb205e1b861c1d42a7d1f13b73ccWale Ogunwale } 6835136249a7147fb205e1b861c1d42a7d1f13b73ccWale Ogunwale 684329a583aae2c878ddaed3a816f11cd804bb83fe8Jorim Jaggi @Override 685fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi TaskWindowContainerController getController() { 686fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi return (TaskWindowContainerController) super.getController(); 687fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi } 688fb9d78afb77b1d304b24f470a637244d52a7e1dfJorim Jaggi 689e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale @Override 69051304d7380b6122ac55645fd9085ba071b04afa9Jorim Jaggi void forAllTasks(Consumer<Task> callback) { 69151304d7380b6122ac55645fd9085ba071b04afa9Jorim Jaggi callback.accept(this); 69251304d7380b6122ac55645fd9085ba071b04afa9Jorim Jaggi } 69351304d7380b6122ac55645fd9085ba071b04afa9Jorim Jaggi 69451304d7380b6122ac55645fd9085ba071b04afa9Jorim Jaggi @Override 6955d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner public String toString() { 696f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale return "{taskId=" + mTaskId + " appTokens=" + mChildren + " mdr=" + mDeferRemoval + "}"; 6975d9c7be84d9628c1cf199fcf9015942835c4671bCraig Mautner } 698e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 6999adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale String getName() { 7009adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale return toShortString(); 7019adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale } 7029adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale 70318f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr void clearPreserveNonFloatingState() { 70418f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr mPreserveNonFloatingState = false; 70518f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr } 70618f622f08ce84bfb1a6cf19bca33d3ef0ad4aca9Robert Carr 7070689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski @Override 7080689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski public String toShortString() { 7090689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski return "Task=" + mTaskId; 7100689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski } 7110689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski 712b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale public void dump(String prefix, PrintWriter pw) { 713b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale final String doublePrefix = prefix + " "; 714b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale 715b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale pw.println(prefix + "taskId=" + mTaskId); 7165a2183d9855fccd6ee2a548872b8fe3f58e8164cWale Ogunwale pw.println(doublePrefix + "mFillsParent=" + mFillsParent); 717b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale pw.println(doublePrefix + "mBounds=" + mBounds.toShortString()); 718b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale pw.println(doublePrefix + "mdr=" + mDeferRemoval); 719f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale pw.println(doublePrefix + "appTokens=" + mChildren); 720b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale pw.println(doublePrefix + "mTempInsetBounds=" + mTempInsetBounds.toShortString()); 721b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale 722b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale final String triplePrefix = doublePrefix + " "; 723b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale 724f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale for (int i = mChildren.size() - 1; i >= 0; i--) { 725f6192868fa4fcf85130ef40a90d0c96fbbca761dWale Ogunwale final AppWindowToken wtoken = mChildren.get(i); 726b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale pw.println(triplePrefix + "Activity #" + i + " " + wtoken); 727b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale wtoken.dump(pw, triplePrefix); 728b429e6826d394a63f81d1702efd714d640ddfb49Wale Ogunwale } 729e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 730b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner} 731