1e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr/*
2e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * Copyright (C) 2017 The Android Open Source Project
3e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr *
4e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * Licensed under the Apache License, Version 2.0 (the "License");
5e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * you may not use this file except in compliance with the License.
6e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * You may obtain a copy of the License at
7e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr *
8e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr *      http://www.apache.org/licenses/LICENSE-2.0
9e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr *
10e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * Unless required by applicable law or agreed to in writing, software
11e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * distributed under the License is distributed on an "AS IS" BASIS,
12e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * See the License for the specific language governing permissions and
14e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr * limitations under the License
15e625fcf32532a362bb9d8d1b9d389986a27855c4Robert Carr */
16e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale
174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskipackage com.android.server.wm;
184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
193878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SNAPSHOT;
203878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
21275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
2264b8d562115e632ff65a17fab8923a931b0a5000Tony Mak
23935772129d244122e23308b812765d4591a3c04fAdrian Roosimport static android.view.WindowManager.TRANSIT_CRASHING_ACTIVITY_CLOSE;
24c1674270b588f07ae000237708aabd6871d839a5Winson Chungimport static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS;
2598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
2698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport static android.view.WindowManager.TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
27e99bc0501a288735d337f2ff64f8fa47f766a59bAdrian Roosimport static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
28e99bc0501a288735d337f2ff64f8fa47f766a59bAdrian Roosimport static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
29f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_ACTIVITY_CLOSE;
30f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_ACTIVITY_OPEN;
31f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
32f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
33f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
34f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
35f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
36f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_NONE;
37f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_CLOSE;
38f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
39f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_OPEN;
40f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
41f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_TASK_TO_FRONT;
42f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_CLOSE;
43f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_CLOSE;
44f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_INTRA_OPEN;
45f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport static android.view.WindowManager.TRANSIT_WALLPAPER_OPEN;
46a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggiimport static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit;
4798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport static com.android.server.wm.AppTransition.isTaskTransit;
480bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
490bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
500bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
51192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
520bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
53192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
54192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE;
55192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggiimport android.app.WindowConfiguration;
594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug;
604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace;
6149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet;
624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog;
633878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.util.SparseIntArray;
644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display;
65f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.RemoteAnimationAdapter;
66f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.RemoteAnimationDefinition;
67f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.WindowManager;
684cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams;
69f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport android.view.WindowManager.TransitionType;
704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation;
714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
7298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggiimport com.android.internal.annotations.VisibleForTesting;
73d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggiimport com.android.server.wm.WindowManagerService.H;
74d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi
7524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter;
76f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggiimport java.util.function.Predicate;
774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/**
794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces.
804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski *
814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning
824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService.
834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */
844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer {
85ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski    private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM;
864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WindowManagerService mService;
874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WallpaperController mWallpaperControllerLocked;
884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mInLayout = false;
904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /** Only do a maximum of 6 repeated layouts. After that quit */
924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int mLayoutRepeatCount;
934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_UPDATE_ROTATION                = 1 << 0;
954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_MAY_CHANGE           = 1 << 1;
964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_FORCE_HIDING_CHANGED           = 1 << 2;
974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_ORIENTATION_CHANGE_COMPLETE    = 1 << 3;
98042059d0ca5cd0138748e70f5b7753ae2c5710bbchaviw    static final int SET_WALLPAPER_ACTION_PENDING       = 1 << 4;
994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    private boolean mTraversalScheduled;
101c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    private int mDeferDepth = 0;
10224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
1034cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private static final class LayerAndToken {
1044cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public int layer;
1054cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public AppWindowToken token;
1064cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
1074cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private final LayerAndToken mTmpLayerAndToken = new LayerAndToken();
1084cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
1093878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi    private final SparseIntArray mTempTransitionReasons = new SparseIntArray();
1103dac63a18d9115405404561d327010604420b07bJorim Jaggi
111ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    private final Runnable mPerformSurfacePlacement;
112ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
1134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    public WindowSurfacePlacer(WindowManagerService service) {
1144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService = service;
1150303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale        mWallpaperControllerLocked = mService.mRoot.mWallpaperController;
116ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        mPerformSurfacePlacement = () -> {
117ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            synchronized (mService.mWindowMap) {
118ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi                performSurfacePlacement();
119ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            }
120ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        };
1214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
123c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
124c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#deferSurfaceLayout()}
125c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
126c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void deferLayout() {
127c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth++;
128c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
129c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
130c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
131c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#continueSurfaceLayout()}
132c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
133c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void continueLayout() {
134c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth--;
135c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        if (mDeferDepth <= 0) {
136c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            performSurfacePlacement();
137c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
138c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
139c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
1401f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi    boolean isLayoutDeferred() {
1411f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi        return mDeferDepth > 0;
1421f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi    }
1431f83308556cb5bb0df3fb64f03b9b68f0aad6c0dJorim Jaggi
1444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    final void performSurfacePlacement() {
14502886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        performSurfacePlacement(false /* force */);
14602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    }
14702886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
14802886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    final void performSurfacePlacement(boolean force) {
14902886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        if (mDeferDepth > 0 && !force) {
150c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            return;
151c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int loopCount = 6;
1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        do {
15424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = false;
1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            performSurfacePlacementLoop();
156ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            mService.mAnimationHandler.removeCallbacks(mPerformSurfacePlacement);
1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            loopCount--;
15824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        } while (mTraversalScheduled && loopCount > 0);
159e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        mService.mRoot.mWallpaperActionPending = false;
1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void performSurfacePlacementLoop() {
1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mInLayout) {
1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG) {
1654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                throw new RuntimeException("Recursive call!");
1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
167ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers="
1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + Debug.getCallers(3));
1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mWaitingForConfig) {
1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Our configuration has changed (most likely rotation), but we
1744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // don't yet have the complete configuration to report to
1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // applications.  Don't do any window layout until we have it.
1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mDisplayReady) {
1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Not yet initialized, nothing to do.
1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout");
1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mInLayout = true;
1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean recoveringMemory = false;
1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mForceRemoves.isEmpty()) {
1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            recoveringMemory = true;
1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Wait a little bit for things to settle down, and off we go.
1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            while (!mService.mForceRemoves.isEmpty()) {
192adde52ee32b656bb436f7e92f39f7d0d97cc9306Wale Ogunwale                final WindowState ws = mService.mForceRemoves.remove(0);
193ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "Force removing: " + ws);
194571771c3fc912e63f83b75693c0f3c85ec9622daWale Ogunwale                ws.removeImmediately();
1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
196ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Object tmp = new Object();
1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            synchronized (tmp) {
1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                try {
2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    tmp.wait(250);
2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } catch (InterruptedException e) {
2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
207e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale            mService.mRoot.performSurfacePlacement(recoveringMemory);
2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2112b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale            if (mService.mRoot.isLayoutNeeded()) {
2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (++mLayoutRepeatCount < 6) {
21324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    requestTraversal();
2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } else {
215ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.e(TAG, "Performed 6 layouts in a row. Skipping");
2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mLayoutRepeatCount = 0;
2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mLayoutRepeatCount = 0;
2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) {
2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.removeMessages(REPORT_WINDOWS_CHANGE);
2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE);
2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (RuntimeException e) {
2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
228ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.wtf(TAG, "Unhandled exception while laying out windows", e);
2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    void debugLayoutRepeats(final String msg, int pendingLayoutChanges) {
2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) {
236ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.v(TAG, "Layouts looping: " + msg +
2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges));
2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean isInLayout() {
2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return mInLayout;
2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /**
2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     * @return bitmap indicating if another pass through layout must be made.
2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     */
2480303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale    int handleAppTransitionReadyLocked() {
2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int appsCount = mService.mOpeningApps.size();
250dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi        if (!transitionGoodToGo(appsCount, mTempTransitionReasons)) {
2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return 0;
2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2538784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
2548784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
255ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int transit = mService.mAppTransition.getAppTransition();
257a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        if (mService.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) {
258f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            transit = WindowManager.TRANSIT_UNSET;
2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mSkipAppTransitionAnimation = false;
2614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mNoAnimationNotifyOnTransitionFinished.clear();
2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
263d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi        mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2659adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale        final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
267e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        mService.mRoot.mWallpaperMayChange = false;
2684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
269ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        int i;
270ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        for (i = 0; i < appsCount; i++) {
271ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang            final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
2720c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
2730c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // window is removed, or window relayout to invisible. This also affects window
2740c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
2750c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // transition selection depends on wallpaper target visibility.
276ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang            wtoken.clearAnimatingFlags();
277ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        }
2780c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale
279ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        // Adjust wallpaper before we pull the lower/upper target, since pending changes
280ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        // (like the clearAnimatingFlags() above) might affect wallpaper target result.
2810c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // Or, the opening app window should be a wallpaper target.
2820c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(displayContent,
2830303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale                mService.mOpeningApps);
284ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang
285f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // Determine if closing and opening app token sets are wallpaper targets, in which case
286f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // special animations are needed.
287f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final boolean hasWallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget() != null;
288f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final boolean openingAppHasWallpaper = canBeWallpaperTarget(mService.mOpeningApps)
289f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                && hasWallpaperTarget;
290f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final boolean closingAppHasWallpaper = canBeWallpaperTarget(mService.mClosingApps)
291f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                && hasWallpaperTarget;
2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
29398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        transit = maybeUpdateTransitToTranslucentAnim(transit);
2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
295f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                closingAppHasWallpaper);
2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
297f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // Find the layout params of the top-most application window in the tokens, which is
298f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // what will control the animation theme. If all closing windows are obscured, then there is
299f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // no need to do an animation. This is the case, for example, when this transition is being
300f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // done behind a dream window.
30177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        final ArraySet<Integer> activityTypes = collectActivityTypes(mService.mOpeningApps,
30277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi                mService.mClosingApps);
303f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final AppWindowToken animLpToken = mService.mPolicy.allowAppAnimationsLw()
30477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi                ? findAnimLayoutParamsToken(transit, activityTypes)
305f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                : null;
306f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
307f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final LayoutParams animLp = getAnimLp(animLpToken);
30877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        overrideWithRemoteAnimationIfSet(animLpToken, transit, activityTypes);
309f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
310f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final boolean voiceInteraction = containsVoiceInteraction(mService.mOpeningApps)
311f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                || containsVoiceInteraction(mService.mOpeningApps);
3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
313d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi        final int layoutRedo;
314d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi        mService.mSurfaceAnimationRunner.deferStartingAnimations();
315d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi        try {
316d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            processApplicationsAnimatingInPlace(transit);
317d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi
318d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            mTmpLayerAndToken.token = null;
319d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken);
320d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            final AppWindowToken topClosingApp = mTmpLayerAndToken.token;
321d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            final AppWindowToken topOpeningApp = handleOpeningApps(transit, animLp,
322d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi                    voiceInteraction);
323d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi
324d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp);
325d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi
326d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            final int flags = mService.mAppTransition.getTransitFlags();
327d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            layoutRedo = mService.mAppTransition.goodToGo(transit, topOpeningApp,
328d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi                    topClosingApp, mService.mOpeningApps, mService.mClosingApps);
329d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            handleNonAppWindowsInTransition(transit, flags);
330d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            mService.mAppTransition.postAnimationCallback();
331d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            mService.mAppTransition.clear();
332d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi        } finally {
333d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi            mService.mSurfaceAnimationRunner.continueStartingAnimations();
334d6d971695647e742e24986be396524e8528d2f29Jorim Jaggi        }
3354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
33602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        mService.mTaskSnapshotController.onTransitionStarting();
33702886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
3384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mOpeningApps.clear();
3394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mClosingApps.clear();
3405a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi        mService.mUnknownAppVisibilityController.clear();
3414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // This has changed the visibility of windows, so perform
3434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // a new layout to get them all up-to-date.
3442b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale        displayContent.setLayoutNeeded();
3454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3464cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // TODO(multidisplay): IMEs are only supported on the default display.
347ae9adbfb758712caaf11b4ba5c5fd15848dcc3c5Wale Ogunwale        final DisplayContent dc = mService.getDefaultDisplayContentLocked();
3486213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        dc.computeImeTarget(true /* updateImeTarget */);
3494cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
3504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                true /*updateInputWindows*/);
3514cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mFocusMayChange = false;
3528784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
353dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi        mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING,
354dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi                mTempTransitionReasons.clone()).sendToTarget();
355dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi
3568784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
3578784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
358fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        return layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
3594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
361f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    private static LayoutParams getAnimLp(AppWindowToken wtoken) {
362f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final WindowState mainWindow = wtoken != null ? wtoken.findMainWindow() : null;
363f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        return mainWindow != null ? mainWindow.mAttrs : null;
364f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    }
365f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
366f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    /**
367f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi     * Overrides the pending transition with the remote animation defined for the transition in the
368f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi     * set of defined remote animations in the app window token.
369f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi     */
37077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi    private void overrideWithRemoteAnimationIfSet(AppWindowToken animLpToken, int transit,
37177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            ArraySet<Integer> activityTypes) {
372935772129d244122e23308b812765d4591a3c04fAdrian Roos        if (transit == TRANSIT_CRASHING_ACTIVITY_CLOSE) {
373935772129d244122e23308b812765d4591a3c04fAdrian Roos            // The crash transition has higher priority than any involved remote animations.
374935772129d244122e23308b812765d4591a3c04fAdrian Roos            return;
375935772129d244122e23308b812765d4591a3c04fAdrian Roos        }
376f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        if (animLpToken == null) {
377f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            return;
378f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        }
379f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final RemoteAnimationDefinition definition = animLpToken.getRemoteAnimationDefinition();
380f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        if (definition != null) {
38177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            final RemoteAnimationAdapter adapter = definition.getAdapter(transit, activityTypes);
382f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            if (adapter != null) {
383f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                mService.mAppTransition.overridePendingAppTransitionRemote(adapter);
384f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            }
385f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        }
386f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    }
387f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
388f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    /**
389f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi     * @return The window token that determines the animation theme.
390f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi     */
39177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi    private AppWindowToken findAnimLayoutParamsToken(@TransitionType int transit,
39277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            ArraySet<Integer> activityTypes) {
393f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        AppWindowToken result;
394f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
395f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        // Remote animations always win, but fullscreen tokens override non-fullscreen tokens.
396f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps,
397f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                w -> w.getRemoteAnimationDefinition() != null
39877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi                        && w.getRemoteAnimationDefinition().hasTransition(transit, activityTypes));
399f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        if (result != null) {
400f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            return result;
401f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        }
402f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        result = lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps,
403f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                w -> w.fillsParent() && w.findMainWindow() != null);
404f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        if (result != null) {
405f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            return result;
406f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        }
407f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        return lookForHighestTokenWithFilter(mService.mClosingApps, mService.mOpeningApps,
408f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                w -> w.findMainWindow() != null);
409f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    }
410f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
41177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi    /**
41277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi     * @return The set of {@link WindowConfiguration.ActivityType}s contained in the set of apps in
41377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi     *         {@code array1} and {@code array2}.
41477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi     */
41577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi    private ArraySet<Integer> collectActivityTypes(ArraySet<AppWindowToken> array1,
41677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            ArraySet<AppWindowToken> array2) {
41777be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        final ArraySet<Integer> result = new ArraySet<>();
41877be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        for (int i = array1.size() - 1; i >= 0; i--) {
41977be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            result.add(array1.valueAt(i).getActivityType());
42077be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        }
42177be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        for (int i = array2.size() - 1; i >= 0; i--) {
42277be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            result.add(array2.valueAt(i).getActivityType());
42377be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        }
42477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi        return result;
42577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi    }
42677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi
427f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    private AppWindowToken lookForHighestTokenWithFilter(ArraySet<AppWindowToken> array1,
428f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            ArraySet<AppWindowToken> array2, Predicate<AppWindowToken> filter) {
429f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final int array1count = array1.size();
430f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        final int count = array1count + array2.size();
431f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        int bestPrefixOrderIndex = Integer.MIN_VALUE;
432f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        AppWindowToken bestToken = null;
433f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        for (int i = 0; i < count; i++) {
43477be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi            final AppWindowToken wtoken = i < array1count
43577be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi                    ? array1.valueAt(i)
43677be157a9ebe7c85687c38921322608950ceef14Jorim Jaggi                    : array2.valueAt(i - array1count);
437f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            final int prefixOrderIndex = wtoken.getPrefixOrderIndex();
438f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            if (filter.test(wtoken) && prefixOrderIndex > bestPrefixOrderIndex) {
439f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                bestPrefixOrderIndex = prefixOrderIndex;
440f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                bestToken = wtoken;
441f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            }
442f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        }
443f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        return bestToken;
444f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    }
445f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
446f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    private boolean containsVoiceInteraction(ArraySet<AppWindowToken> apps) {
447f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        for (int i = apps.size() - 1; i >= 0; i--) {
448f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            if (apps.valueAt(i).mVoiceInteraction) {
449f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi                return true;
450f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi            }
451f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        }
452f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi        return false;
453f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi    }
454f84e2f60fec6f6d2ecfb3b90ddf075101f4b902fJorim Jaggi
4554cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp,
456b7e8a13b5d39ad153132a4a76e732136732afe33Matthew Ng            boolean voiceInteraction) {
4574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowToken topOpeningApp = null;
458b7e8a13b5d39ad153132a4a76e732136732afe33Matthew Ng        int topOpeningLayer = Integer.MIN_VALUE;
4594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount = mService.mOpeningApps.size();
4604cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
4614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
462ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken);
4634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
464ab9fcb2197796ab80cbfb226c443e4eb3ffbc15bJorim Jaggi            if (!wtoken.setVisibility(animLp, true, transit, false, voiceInteraction)) {
4654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // This token isn't going to be animating. Add it to the list of tokens to
4664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // be notified of app transition complete since the notification will not be
4674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // sent be the app window animator.
4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token);
4694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.updateReportedVisibilityLocked();
4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.waitingToShow = false;
472ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
473974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                    ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()");
47468e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            mService.openSurfaceTransaction();
475974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            try {
476f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi                wtoken.showAllWindowsLocked();
477974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            } finally {
478111aff959919c7b838b107e62e1baef77e3f6382Adrian Roos                mService.closeSurfaceTransaction("handleAppTransitionReadyLocked");
479ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
480974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                        "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()");
481974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            }
4824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (animLp != null) {
4849f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale                final int layer = wtoken.getHighestAnimLayer();
4854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (topOpeningApp == null || layer > topOpeningLayer) {
4864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningApp = wtoken;
4874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningLayer = layer;
4884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
4894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4904cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) {
491988f66885cce2149c73e1ea12304fb98163d5efcJorim Jaggi                wtoken.attachThumbnailAnimation();
49264b8d562115e632ff65a17fab8923a931b0a5000Tony Mak            } else if (mService.mAppTransition.isNextAppTransitionOpenCrossProfileApps()) {
49364b8d562115e632ff65a17fab8923a931b0a5000Tony Mak                wtoken.attachCrossProfileAppsThumbnailAnimation();
4944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        return topOpeningApp;
4974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4994cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction,
5004cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            LayerAndToken layerAndToken) {
5014cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount;
5024cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        appsCount = mService.mClosingApps.size();
5034cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
5044cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
505f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
506ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
50787e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung            // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
50887e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung            //       animating?
5099f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
5104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.updateReportedVisibilityLocked();
5114cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Force the allDrawn flag, because we want to start
5124cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // this guy's animations regardless of whether it's
5134cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // gotten drawn.
5144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.allDrawn = true;
5154cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.deferClearAllDrawn = false;
5164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Ensure that apps that are mid-starting are also scheduled to have their
5174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // starting windows removed after the animation is complete
518ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi            if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit
519ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi                    && wtoken.getController() != null) {
520ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi                wtoken.getController().removeStartingWindow();
5214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (animLp != null) {
524e4da0c145e89274f98c683d4e045644400ea1a18Wale Ogunwale                int layer = wtoken.getHighestAnimLayer();
5254cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                if (layerAndToken.token == null || layer > layerAndToken.layer) {
5264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.token = wtoken;
5274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.layer = layer;
5284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                }
5294cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
5304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) {
531988f66885cce2149c73e1ea12304fb98163d5efcJorim Jaggi                wtoken.attachThumbnailAnimation();
5324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
5354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
536fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    private void handleNonAppWindowsInTransition(int transit, int flags) {
537fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
538fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0
539fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) {
540fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                Animation anim = mService.mPolicy.createKeyguardWallpaperExit(
541fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                        (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
542fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                if (anim != null) {
543fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    mService.getDefaultDisplayContentLocked().mWallpaperController
544fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                            .startWallpaperAnimation(anim);
545fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                }
546fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            }
547fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
548fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        if (transit == TRANSIT_KEYGUARD_GOING_AWAY
549fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) {
550fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            mService.getDefaultDisplayContentLocked().startKeyguardExitOnNonAppWindows(
551fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
552fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
553fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
554fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    }
555fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi
556dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi    private boolean transitionGoodToGo(int appsCount, SparseIntArray outReasons) {
557ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "Checking " + appsCount + " opening apps (frozen="
5594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mDisplayFrozen + " timeout="
5604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mAppTransition.isTimeout() + ")...");
56142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr        final ScreenRotationAnimation screenRotationAnimation =
56242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            mService.mAnimator.getScreenRotationAnimationLocked(
56342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    Display.DEFAULT_DISPLAY);
56442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr
565dbaad384bb79579eb3dfff965b344073ee193572Jorim Jaggi        outReasons.clear();
5664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mAppTransition.isTimeout()) {
56742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // Imagine the case where we are changing orientation due to an app transition, but a previous
56842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // orientation change is still in progress. We won't process the orientation change
56942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // for our transition because we need to wait for the rotation animation to finish.
57042769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // If we start the app transition at this point, we will interrupt it halfway with a new rotation
57142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // animation after the old one finally finishes. It's better to defer the
57242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // app transition.
57342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() &&
57442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    mService.rotationNeedsUpdateLocked()) {
57542769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                if (DEBUG_APP_TRANSITIONS) {
57642769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    Slog.v(TAG, "Delaying app transition for screen rotation animation to finish");
57742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                }
57842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                return false;
57942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            }
5804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int i = 0; i < appsCount; i++) {
5814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
582ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        "Check opening app=" + wtoken + ": allDrawn="
5844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.allDrawn + " startingDisplayed="
5854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.startingDisplayed + " startingMoved="
586d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.startingMoved + " isRelaunching()="
58760f9c97a4893644dde4cff4e595091afce5fb099Jorim Jaggi                        + wtoken.isRelaunching() + " startingWindow="
58860f9c97a4893644dde4cff4e595091afce5fb099Jorim Jaggi                        + wtoken.startingWindow);
589d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang
590bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang
59102886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                final boolean allDrawn = wtoken.allDrawn && !wtoken.isRelaunching();
59202886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
5934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    return false;
5944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
5959b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi                final int windowingMode = wtoken.getWindowingMode();
59602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                if (allDrawn) {
5979b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi                    outReasons.put(windowingMode,  APP_TRANSITION_WINDOWS_DRAWN);
598275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                } else {
5999b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi                    outReasons.put(windowingMode,
6009b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi                            wtoken.startingData instanceof SplashScreenStartingData
6019b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi                                    ? APP_TRANSITION_SPLASH_SCREEN
6029b58f2ddf83f919241413a7fb523a281a03f1c30Jorim Jaggi                                    : APP_TRANSITION_SNAPSHOT);
603275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                }
6044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
6054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6062f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            // We also need to wait for the specs to be fetched, if needed.
6072f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) {
608ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true");
6092f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi                return false;
6102f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            }
6112f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi
6125a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi            if (!mService.mUnknownAppVisibilityController.allResolved()) {
6135a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                if (DEBUG_APP_TRANSITIONS) {
6145a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                    Slog.v(TAG, "unknownApps is not empty: "
6155a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                            + mService.mUnknownAppVisibilityController.getDebugMessage());
6165a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                }
6175a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                return false;
6185a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi            }
6195a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi
6204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // If the wallpaper is visible, we need to check it's ready too.
621275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
6224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mWallpaperControllerLocked.wallpaperTransitionReady();
623275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            if (wallpaperReady) {
624275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                return true;
625275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            }
626275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            return false;
6274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return true;
6294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
6304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
632f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale            boolean closingAppHasWallpaper) {
633935772129d244122e23308b812765d4591a3c04fAdrian Roos        // Given no app transition pass it through instead of a wallpaper transition.
634935772129d244122e23308b812765d4591a3c04fAdrian Roos        // Never convert the crashing transition.
635c1674270b588f07ae000237708aabd6871d839a5Winson Chung        // Never update the transition for the wallpaper if we are just docking from recents
636935772129d244122e23308b812765d4591a3c04fAdrian Roos        if (transit == TRANSIT_NONE || transit == TRANSIT_CRASHING_ACTIVITY_CLOSE
637935772129d244122e23308b812765d4591a3c04fAdrian Roos                || transit == TRANSIT_DOCK_TASK_FROM_RECENTS) {
638935772129d244122e23308b812765d4591a3c04fAdrian Roos            return transit;
639c1674270b588f07ae000237708aabd6871d839a5Winson Chung        }
64026a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng
6414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper
6424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
6430c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating()
6440c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                ? null : wallpaperTarget;
64549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps;
64649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> closingApps = mService.mClosingApps;
647a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        final AppWindowToken topOpeningApp = getTopApp(mService.mOpeningApps,
648a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                false /* ignoreHidden */);
649a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        final AppWindowToken topClosingApp = getTopApp(mService.mClosingApps,
650a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                true /* ignoreHidden */);
651a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi
652fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        boolean openingCanBeWallpaperTarget = canBeWallpaperTarget(openingApps);
653ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
6544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "New wallpaper target=" + wallpaperTarget
6554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + ", oldWallpaper=" + oldWallpaper
65649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", openingApps=" + openingApps
65749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", closingApps=" + closingApps);
658a5e105728fb87264b9dc2e66b3703168f8864110Jorim Jaggi
659a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) {
660fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
661fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
662fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    "New transit: " + AppTransition.appTransitionToString(transit));
663a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        }
664a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic
665a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        // relies on the fact that we always execute a Keyguard transition after preparing one.
666a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        else if (!isKeyguardGoingAwayTransit(transit)) {
667a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            if (closingAppHasWallpaper && openingAppHasWallpaper) {
668a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
669a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                switch (transit) {
670a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_ACTIVITY_OPEN:
671a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_OPEN:
672a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_TO_FRONT:
673a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        transit = TRANSIT_WALLPAPER_INTRA_OPEN;
674a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        break;
675a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_ACTIVITY_CLOSE:
676a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_CLOSE:
677a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_TO_BACK:
678a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        transit = TRANSIT_WALLPAPER_INTRA_CLOSE;
679a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        break;
680a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                }
681a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
682a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        "New transit: " + AppTransition.appTransitionToString(transit));
683a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty()
684a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    && !openingApps.contains(oldWallpaper.mAppToken)
685a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                    && closingApps.contains(oldWallpaper.mAppToken)
686a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                    && topClosingApp == oldWallpaper.mAppToken) {
687a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                // We are transitioning from an activity with a wallpaper to one without.
688a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                transit = TRANSIT_WALLPAPER_CLOSE;
689a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: "
690a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        + AppTransition.appTransitionToString(transit));
69198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()
69298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                    && openingApps.contains(wallpaperTarget.mAppToken)
693a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                    && topOpeningApp == wallpaperTarget.mAppToken
69498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                    && transit != TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE) {
695a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                // We are transitioning from an activity without
696a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                // a wallpaper to now showing the wallpaper
697a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                transit = TRANSIT_WALLPAPER_OPEN;
698a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: "
699a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        + AppTransition.appTransitionToString(transit));
700a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            }
7014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
7024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return transit;
7034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
7044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
70598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi    /**
70698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     * There are cases where we open/close a new task/activity, but in reality only a translucent
70798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     * activity on top of existing activities is opening/closing. For that one, we have a different
70898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     * animation because non of the task/activity animations actually work well with translucent
70998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     * apps.
71098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     *
71198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     * @param transit The current transition type.
71298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     * @return The current transition type or
71398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     *         {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE}/
71498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     *         {@link WindowManager#TRANSIT_TRANSLUCENT_ACTIVITY_OPEN} if appropriate for the
71598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     *         situation.
71698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi     */
71798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi    @VisibleForTesting
71898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi    int maybeUpdateTransitToTranslucentAnim(int transit) {
71998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        final boolean taskOrActivity = AppTransition.isTaskTransit(transit)
72098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                || AppTransition.isActivityTransit(transit);
72198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        boolean allOpeningVisible = true;
72298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        boolean allTranslucentOpeningApps = !mService.mOpeningApps.isEmpty();
72398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        for (int i = mService.mOpeningApps.size() - 1; i >= 0; i--) {
72498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            final AppWindowToken token = mService.mOpeningApps.valueAt(i);
72598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            if (!token.isVisible()) {
72698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                allOpeningVisible = false;
72798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                if (token.fillsParent()) {
72898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                    allTranslucentOpeningApps = false;
72998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                }
73098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            }
73198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        }
73298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        boolean allTranslucentClosingApps = !mService.mClosingApps.isEmpty();
73398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        for (int i = mService.mClosingApps.size() - 1; i >= 0; i--) {
73498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            if (mService.mClosingApps.valueAt(i).fillsParent()) {
73598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                allTranslucentClosingApps = false;
73698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi                break;
73798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            }
73898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        }
73998a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi
74098a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        if (taskOrActivity && allTranslucentClosingApps && allOpeningVisible) {
74198a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            return TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE;
74298a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        }
74398a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        if (taskOrActivity && allTranslucentOpeningApps && mService.mClosingApps.isEmpty()) {
74498a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi            return TRANSIT_TRANSLUCENT_ACTIVITY_OPEN;
74598a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        }
74698a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi        return transit;
74798a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi    }
74898a9d206be7e2c87b58d0d59c7a0ccc53eb22dd0Jorim Jaggi
749fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) {
750fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        for (int i = apps.size() - 1; i >= 0; i--) {
751fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
752fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                return true;
753fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            }
754fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
755fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        return false;
756fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    }
757fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi
758a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi    /**
759a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     * Finds the top app in a list of apps, using its {@link AppWindowToken#getPrefixOrderIndex} to
760a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     * compare z-order.
761a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     *
762a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     * @param apps The list of apps to search.
763a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     * @param ignoreHidden If set to true, ignores apps that are {@link AppWindowToken#isHidden}.
764a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     * @return The top {@link AppWindowToken}.
765a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi     */
766a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi    private AppWindowToken getTopApp(ArraySet<AppWindowToken> apps, boolean ignoreHidden) {
767a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        int topPrefixOrderIndex = Integer.MIN_VALUE;
768a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        AppWindowToken topApp = null;
769a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        for (int i = apps.size() - 1; i >= 0; i--) {
770a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi            final AppWindowToken app = apps.valueAt(i);
771a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi            if (ignoreHidden && app.isHidden()) {
772a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                continue;
773a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi            }
774a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi            final int prefixOrderIndex = app.getPrefixOrderIndex();
775a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi            if (prefixOrderIndex > topPrefixOrderIndex) {
776a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                topPrefixOrderIndex = prefixOrderIndex;
777a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi                topApp = app;
778a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi            }
779a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        }
780a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi        return topApp;
781a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi    }
782a96967d4a4738ea2d888f57f79f06d31ece2b307Jorim Jaggi
7834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void processApplicationsAnimatingInPlace(int transit) {
7840c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        if (transit == TRANSIT_TASK_IN_PLACE) {
7854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Find the focused window
78663d4ecc7a5c23f1ebbd3d71e5054041d90df9762Wale Ogunwale            final WindowState win = mService.getDefaultDisplayContentLocked().findFocusedWindow();
7874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (win != null) {
7884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowToken wtoken = win.mAppToken;
7894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS)
790ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.v(TAG, "Now animating app in place " + wtoken);
791f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi                wtoken.cancelAnimation();
792f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi                wtoken.applyAnimationLocked(null, transit, false, false);
7934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken.updateReportedVisibilityLocked();
794f5f9e12146a3857c28b8c0fc96c2fa68a2ae40deJorim Jaggi                wtoken.showAllWindowsLocked();
7954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
7964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
7974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
7984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    void requestTraversal() {
80024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (!mTraversalScheduled) {
80124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = true;
802ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            mService.mAnimationHandler.post(mPerformSurfacePlacement);
80324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
80424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
80524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
80624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    public void dump(PrintWriter pw, String prefix) {
807e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        pw.println(prefix + "mTraversalScheduled=" + mTraversalScheduled);
808e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        pw.println(prefix + "mHoldScreenWindow=" + mService.mRoot.mHoldScreenWindow);
809d4a00a027265e5abfae335e38bd17fd744e3a2c3Wale Ogunwale        pw.println(prefix + "mObscuringWindow=" + mService.mRoot.mObscuringWindow);
81024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
8114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski}
812