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