1e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale
24501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskipackage com.android.server.wm;
34501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
43878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManager.StackId.INVALID_STACK_ID;
5275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SAVED_SURFACE;
63878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SNAPSHOT;
73878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SPLASH_SCREEN;
8275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
94501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
110c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_CLOSE;
120c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_ACTIVITY_OPEN;
13fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggiimport static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION;
14fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggiimport static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE;
15fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggiimport static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
16fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggiimport static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY;
17fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggiimport static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
1826a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ngimport static com.android.server.wm.AppTransition.TRANSIT_NONE;
190c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE;
200c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE;
210c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN;
220c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_BACK;
230c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_FRONT;
240c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_CLOSE;
250c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE;
260c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN;
270c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_OPEN;
28a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggiimport static com.android.server.wm.AppTransition.isKeyguardGoingAwayTransit;
290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
300bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
310bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
33192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
340bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
35192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
36192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE;
37192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
38192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
41441e4494682144aec2ec7f19060464af3d29c319Andrii Kulianimport android.content.res.Configuration;
42aa7fa0135366b80d9bfdb7dffb6795b365a40607Winson Chungimport android.graphics.GraphicBuffer;
434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.PixelFormat;
444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Rect;
45e6c25d4a6f35449a8420f0d1e87529426786ad60Bryce Leeimport android.os.Binder;
464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug;
474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace;
4849b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet;
494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog;
503878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.util.SparseIntArray;
514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display;
524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo;
534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface;
544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl;
554cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams;
564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation;
574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
58d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggiimport com.android.server.wm.WindowManagerService.H;
59d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi
6024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter;
614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport java.util.ArrayList;
624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/**
644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces.
654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski *
664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning
674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService.
684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */
694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer {
70ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski    private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM;
714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WindowManagerService mService;
724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WallpaperController mWallpaperControllerLocked;
734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mInLayout = false;
754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /** Only do a maximum of 6 repeated layouts. After that quit */
774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int mLayoutRepeatCount;
784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_UPDATE_ROTATION                = 1 << 0;
804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_MAY_CHANGE           = 1 << 1;
814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_FORCE_HIDING_CHANGED           = 1 << 2;
824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_ORIENTATION_CHANGE_COMPLETE    = 1 << 3;
834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_TURN_ON_SCREEN                 = 1 << 4;
844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_ACTION_PENDING       = 1 << 5;
854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final Rect mTmpStartRect = new Rect();
87b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale    private final Rect mTmpContentRect = new Rect();
884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
8924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    private boolean mTraversalScheduled;
90c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    private int mDeferDepth = 0;
9124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
924cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private static final class LayerAndToken {
934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public int layer;
944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public AppWindowToken token;
954cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private final LayerAndToken mTmpLayerAndToken = new LayerAndToken();
974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
983dac63a18d9115405404561d327010604420b07bJorim Jaggi    private final ArrayList<SurfaceControl> mPendingDestroyingSurfaces = new ArrayList<>();
993878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi    private final SparseIntArray mTempTransitionReasons = new SparseIntArray();
1003dac63a18d9115405404561d327010604420b07bJorim Jaggi
101ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi    private final Runnable mPerformSurfacePlacement;
102ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi
1034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    public WindowSurfacePlacer(WindowManagerService service) {
1044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService = service;
1050303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale        mWallpaperControllerLocked = mService.mRoot.mWallpaperController;
106ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        mPerformSurfacePlacement = () -> {
107ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            synchronized (mService.mWindowMap) {
108ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi                performSurfacePlacement();
109ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            }
110ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi        };
1114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
113c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
114c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#deferSurfaceLayout()}
115c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
116c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void deferLayout() {
117c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth++;
118c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
119c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
120c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
121c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#continueSurfaceLayout()}
122c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
123c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void continueLayout() {
124c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth--;
125c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        if (mDeferDepth <= 0) {
126c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            performSurfacePlacement();
127c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
128c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
129c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
1304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    final void performSurfacePlacement() {
13102886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        performSurfacePlacement(false /* force */);
13202886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    }
13302886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
13402886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    final void performSurfacePlacement(boolean force) {
13502886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        if (mDeferDepth > 0 && !force) {
136c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            return;
137c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
1384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int loopCount = 6;
1394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        do {
14024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = false;
1414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            performSurfacePlacementLoop();
142ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            mService.mAnimationHandler.removeCallbacks(mPerformSurfacePlacement);
1434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            loopCount--;
14424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        } while (mTraversalScheduled && loopCount > 0);
145e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        mService.mRoot.mWallpaperActionPending = false;
1464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void performSurfacePlacementLoop() {
1494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mInLayout) {
1504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG) {
1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                throw new RuntimeException("Recursive call!");
1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
153ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers="
1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + Debug.getCallers(3));
1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mWaitingForConfig) {
1594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Our configuration has changed (most likely rotation), but we
1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // don't yet have the complete configuration to report to
1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // applications.  Don't do any window layout until we have it.
1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mDisplayReady) {
1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Not yet initialized, nothing to do.
1674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout");
1714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mInLayout = true;
1724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean recoveringMemory = false;
1744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mForceRemoves.isEmpty()) {
1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            recoveringMemory = true;
1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Wait a little bit for things to settle down, and off we go.
1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            while (!mService.mForceRemoves.isEmpty()) {
178adde52ee32b656bb436f7e92f39f7d0d97cc9306Wale Ogunwale                final WindowState ws = mService.mForceRemoves.remove(0);
179ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "Force removing: " + ws);
180571771c3fc912e63f83b75693c0f3c85ec9622daWale Ogunwale                ws.removeImmediately();
1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
182ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
1834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Object tmp = new Object();
1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            synchronized (tmp) {
1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                try {
1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    tmp.wait(250);
1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } catch (InterruptedException e) {
1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
193e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale            mService.mRoot.performSurfacePlacement(recoveringMemory);
1944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1972b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale            if (mService.mRoot.isLayoutNeeded()) {
1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (++mLayoutRepeatCount < 6) {
19924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    requestTraversal();
2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } else {
201ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.e(TAG, "Performed 6 layouts in a row. Skipping");
2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mLayoutRepeatCount = 0;
2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mLayoutRepeatCount = 0;
2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) {
2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.removeMessages(REPORT_WINDOWS_CHANGE);
2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE);
2114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (RuntimeException e) {
2134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
214ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.wtf(TAG, "Unhandled exception while laying out windows", e);
2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    void debugLayoutRepeats(final String msg, int pendingLayoutChanges) {
2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) {
222ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.v(TAG, "Layouts looping: " + msg +
2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges));
2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean isInLayout() {
2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return mInLayout;
2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /**
2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     * @return bitmap indicating if another pass through layout must be made.
2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     */
2340303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale    int handleAppTransitionReadyLocked() {
2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int appsCount = mService.mOpeningApps.size();
2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!transitionGoodToGo(appsCount)) {
2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return 0;
2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2398784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
2408784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
241ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int transit = mService.mAppTransition.getAppTransition();
243a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        if (mService.mSkipAppTransitionAnimation && !isKeyguardGoingAwayTransit(transit)) {
2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            transit = AppTransition.TRANSIT_UNSET;
2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mSkipAppTransitionAnimation = false;
2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mNoAnimationNotifyOnTransitionFinished.clear();
2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
249d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi        mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
2504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2519adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale        final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
2526213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        // TODO: Don't believe this is really needed...
2536213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        //mService.mWindowsChanged = true;
2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
255e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        mService.mRoot.mWallpaperMayChange = false;
2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2570c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // The top-most window will supply the layout params, and we will determine it below.
2584cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        LayoutParams animLp = null;
2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int bestAnimLayer = -1;
2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean fullscreenAnim = false;
2614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean voiceInteraction = false;
2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
263ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        int i;
264ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        for (i = 0; i < appsCount; i++) {
265ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang            final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
2660c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
2670c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // window is removed, or window relayout to invisible. This also affects window
2680c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
2690c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // transition selection depends on wallpaper target visibility.
270ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang            wtoken.clearAnimatingFlags();
271ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang
272ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        }
2730c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale
274ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        // Adjust wallpaper before we pull the lower/upper target, since pending changes
275ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        // (like the clearAnimatingFlags() above) might affect wallpaper target result.
2760c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // Or, the opening app window should be a wallpaper target.
2770c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(displayContent,
2780303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale                mService.mOpeningApps);
279ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang
280f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean openingAppHasWallpaper = false;
2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean closingAppHasWallpaper = false;
2834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2840c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // Do a first pass through the tokens for two things:
2850c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // (1) Determine if both the closing and opening app token sets are wallpaper targets, in
2860c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // which case special animations are needed (since the wallpaper needs to stay static behind
2870c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // them).
2880c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // (2) Find the layout params of the top-most application window in the tokens, which is
2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // what will control the animation theme.
2904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int closingAppsCount = mService.mClosingApps.size();
2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        appsCount = closingAppsCount + mService.mOpeningApps.size();
2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (i = 0; i < appsCount; i++) {
2934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppWindowToken wtoken;
2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (i < closingAppsCount) {
2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken = mService.mClosingApps.valueAt(i);
296f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                if (wallpaperTarget != null && wtoken.windowsCanBeWallpaperTarget()) {
2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    closingAppHasWallpaper = true;
2984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
3004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount);
301f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                if (wallpaperTarget != null && wtoken.windowsCanBeWallpaperTarget()) {
3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    openingAppHasWallpaper = true;
3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
3054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
30672919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale            voiceInteraction |= wtoken.mVoiceInteraction;
3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3085136249a7147fb205e1b861c1d42a7d1f13b73ccWale Ogunwale            if (wtoken.fillsParent()) {
309f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                final WindowState ws = wtoken.findMainWindow();
3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (ws != null) {
3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    animLp = ws.mAttrs;
3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    bestAnimLayer = ws.mLayer;
3134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    fullscreenAnim = true;
3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else if (!fullscreenAnim) {
316f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                final WindowState ws = wtoken.findMainWindow();
3174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (ws != null) {
3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (ws.mLayer > bestAnimLayer) {
3194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        animLp = ws.mAttrs;
3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        bestAnimLayer = ws.mLayer;
3214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
3224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
3244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
327f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                closingAppHasWallpaper);
3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3290c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // If all closing windows are obscured, then there is no need to do an animation. This is
3300c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // the case, for example, when this transition is being done behind the lock screen.
3314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mPolicy.allowAppAnimationsLw()) {
332ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
3334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "Animations disallowed by keyguard or dream.");
3344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            animLp = null;
3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        processApplicationsAnimatingInPlace(transit);
3384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
33942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi        mTmpLayerAndToken.token = null;
3404cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken);
3414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowToken topClosingApp = mTmpLayerAndToken.token;
3424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int topClosingLayer = mTmpLayerAndToken.layer;
3434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowToken topOpeningApp = handleOpeningApps(transit,
3454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                animLp, voiceInteraction, topClosingLayer);
3464cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3471c93f6de2dd74dfc7ee0f52aca6e8b491ace02f9Chong Zhang        mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp);
3481c93f6de2dd74dfc7ee0f52aca6e8b491ace02f9Chong Zhang
3494cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ?  null :
3504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                topOpeningApp.mAppAnimator;
3514cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null :
3524cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                topClosingApp.mAppAnimator;
3534cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
354fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        final int flags = mService.mAppTransition.getTransitFlags();
355fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        int layoutRedo = mService.mAppTransition.goodToGo(transit, openingAppAnimator,
356fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                closingAppAnimator, mService.mOpeningApps, mService.mClosingApps);
357fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        handleNonAppWindowsInTransition(transit, flags);
3584cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mAppTransition.postAnimationCallback();
3594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mAppTransition.clear();
3604cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
36102886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        mService.mTaskSnapshotController.onTransitionStarting();
36202886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
3634cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mOpeningApps.clear();
3644cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mClosingApps.clear();
3655a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi        mService.mUnknownAppVisibilityController.clear();
3664cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3674cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // This has changed the visibility of windows, so perform
3684cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // a new layout to get them all up-to-date.
3692b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale        displayContent.setLayoutNeeded();
3704cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3714cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // TODO(multidisplay): IMEs are only supported on the default display.
372ae9adbfb758712caaf11b4ba5c5fd15848dcc3c5Wale Ogunwale        final DisplayContent dc = mService.getDefaultDisplayContentLocked();
3736213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        dc.computeImeTarget(true /* updateImeTarget */);
3744cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
3754cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                true /*updateInputWindows*/);
3764cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mFocusMayChange = false;
3778784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
3788784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
3798784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
380fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        return layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
3814cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
3824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3834cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp,
3844cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            boolean voiceInteraction, int topClosingLayer) {
3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowToken topOpeningApp = null;
3864cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount = mService.mOpeningApps.size();
3874cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
3884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
3894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
390ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken);
3914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!appAnimator.usingTransferredAnimation) {
3934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.clearThumbnail();
39465d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                appAnimator.setNullAnimation();
3954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
396eb22e8ed42bb146060e8ffc94444f70ea47fda04Chong Zhang
3979f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            if (!wtoken.setVisibility(animLp, true, transit, false, voiceInteraction)){
3984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // This token isn't going to be animating. Add it to the list of tokens to
3994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // be notified of app transition complete since the notification will not be
4004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // sent be the app window animator.
4014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token);
4024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.updateReportedVisibilityLocked();
4044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.waitingToShow = false;
4059f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            wtoken.setAllAppWinAnimators();
4064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
407ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
408974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                    ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()");
40968e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            mService.openSurfaceTransaction();
410974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            try {
41169cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
412974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            } finally {
41368e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr                mService.closeSurfaceTransaction();
414ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
415974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                        "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()");
416974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            }
4174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
4184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            int topOpeningLayer = 0;
4204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (animLp != null) {
4219f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale                final int layer = wtoken.getHighestAnimLayer();
4224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (topOpeningApp == null || layer > topOpeningLayer) {
4234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningApp = wtoken;
4244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningLayer = layer;
4254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
4264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) {
4284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer);
4294cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4314cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        return topOpeningApp;
4324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
4334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4344cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction,
4354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            LayerAndToken layerAndToken) {
4364cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount;
4374cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        appsCount = mService.mClosingApps.size();
4384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
4394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
440f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
441f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // If we still have some windows animating with saved surfaces that's
442f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // either invisible or already removed, mark them exiting so that they
443f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // are disposed of after the exit animation. These are not supposed to
444f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // be shown, or are delayed removal until app is actually drawn (in which
445f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // case the window will be removed after the animation).
446f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            wtoken.markSavedSurfaceExiting();
447f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
4484cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
449ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
4504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            appAnimator.clearThumbnail();
45165d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang            appAnimator.setNullAnimation();
45287e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung            // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
45387e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung            //       animating?
4549f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
4554cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.updateReportedVisibilityLocked();
4564cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Force the allDrawn flag, because we want to start
4574cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // this guy's animations regardless of whether it's
4584cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // gotten drawn.
4594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.allDrawn = true;
4604cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.deferClearAllDrawn = false;
4614cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Ensure that apps that are mid-starting are also scheduled to have their
4624cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // starting windows removed after the animation is complete
463ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi            if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit
464ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi                    && wtoken.getController() != null) {
465ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi                wtoken.getController().removeStartingWindow();
4664cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4674cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4694cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (animLp != null) {
470e4da0c145e89274f98c683d4e045644400ea1a18Wale Ogunwale                int layer = wtoken.getHighestAnimLayer();
4714cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                if (layerAndToken.token == null || layer > layerAndToken.layer) {
4724cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.token = wtoken;
4734cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.layer = layer;
4744cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                }
4754cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4764cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) {
4774cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer);
4784cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
4814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
482fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    private void handleNonAppWindowsInTransition(int transit, int flags) {
483fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
484fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0
485fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) {
486fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                Animation anim = mService.mPolicy.createKeyguardWallpaperExit(
487fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                        (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
488fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                if (anim != null) {
489fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    mService.getDefaultDisplayContentLocked().mWallpaperController
490fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                            .startWallpaperAnimation(anim);
491fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                }
492fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            }
493fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
494fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        if (transit == TRANSIT_KEYGUARD_GOING_AWAY
495fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) {
496fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            mService.getDefaultDisplayContentLocked().startKeyguardExitOnNonAppWindows(
497fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
498fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
499fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
500fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    }
501fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi
5024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean transitionGoodToGo(int appsCount) {
503ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "Checking " + appsCount + " opening apps (frozen="
5054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mDisplayFrozen + " timeout="
5064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mAppTransition.isTimeout() + ")...");
50742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr        final ScreenRotationAnimation screenRotationAnimation =
50842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            mService.mAnimator.getScreenRotationAnimationLocked(
50942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    Display.DEFAULT_DISPLAY);
51042769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr
5113878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi        final SparseIntArray reasons = mTempTransitionReasons;
5124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mAppTransition.isTimeout()) {
51342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // Imagine the case where we are changing orientation due to an app transition, but a previous
51442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // orientation change is still in progress. We won't process the orientation change
51542769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // for our transition because we need to wait for the rotation animation to finish.
51642769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // If we start the app transition at this point, we will interrupt it halfway with a new rotation
51742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // animation after the old one finally finishes. It's better to defer the
51842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // app transition.
51942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() &&
52042769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    mService.rotationNeedsUpdateLocked()) {
52142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                if (DEBUG_APP_TRANSITIONS) {
52242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    Slog.v(TAG, "Delaying app transition for screen rotation animation to finish");
52342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                }
52442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                return false;
52542769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            }
5264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int i = 0; i < appsCount; i++) {
5274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
528ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        "Check opening app=" + wtoken + ": allDrawn="
5304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.allDrawn + " startingDisplayed="
5314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.startingDisplayed + " startingMoved="
532d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.startingMoved + " isRelaunching()="
533d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.isRelaunching());
534d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang
535275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                final boolean drawnBeforeRestoring = wtoken.allDrawn;
5369bc47736362d03b3f099bf018255571457403c1fWale Ogunwale                wtoken.restoreSavedSurfaceForInterestingWindows();
537bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang
53802886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                final boolean allDrawn = wtoken.allDrawn && !wtoken.isRelaunching();
53902886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
5404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    return false;
5414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
5423878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                final TaskStack stack = wtoken.getStack();
5433878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                final int stackId = stack != null ? stack.mStackId : INVALID_STACK_ID;
54402886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                if (allDrawn) {
5453878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                    reasons.put(stackId, drawnBeforeRestoring ? APP_TRANSITION_WINDOWS_DRAWN
5463878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                            : APP_TRANSITION_SAVED_SURFACE);
547275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                } else {
5483878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                    reasons.put(stackId, wtoken.startingData instanceof SplashScreenStartingData
5493878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                            ? APP_TRANSITION_SPLASH_SCREEN
5503878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                            : APP_TRANSITION_SNAPSHOT);
551275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                }
5524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5542f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            // We also need to wait for the specs to be fetched, if needed.
5552f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) {
556ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true");
5572f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi                return false;
5582f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            }
5592f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi
5605a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi            if (!mService.mUnknownAppVisibilityController.allResolved()) {
5615a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                if (DEBUG_APP_TRANSITIONS) {
5625a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                    Slog.v(TAG, "unknownApps is not empty: "
5635a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                            + mService.mUnknownAppVisibilityController.getDebugMessage());
5645a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                }
5655a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                return false;
5665a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi            }
5675a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi
5684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // If the wallpaper is visible, we need to check it's ready too.
569275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
5704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mWallpaperControllerLocked.wallpaperTransitionReady();
571275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            if (wallpaperReady) {
5723878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reasons.clone())
5733878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                        .sendToTarget();
574275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                return true;
575275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            }
576275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            return false;
5774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5783878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi        mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reasons.clone()).sendToTarget();
5794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return true;
5804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
5814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
583f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale            boolean closingAppHasWallpaper) {
58426a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng        // Given no app transition pass it through instead of a wallpaper transition
58526a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng        if (transit == TRANSIT_NONE) {
58626a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng            return TRANSIT_NONE;
58726a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng        }
58826a1cecd2f9e99d7024d80748f165762a82df1e1Matthew Ng
5894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper
5904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
5910c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating()
5920c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                ? null : wallpaperTarget;
59349b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps;
59449b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> closingApps = mService.mClosingApps;
595fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        boolean openingCanBeWallpaperTarget = canBeWallpaperTarget(openingApps);
596ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "New wallpaper target=" + wallpaperTarget
5984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + ", oldWallpaper=" + oldWallpaper
59949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", openingApps=" + openingApps
60049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", closingApps=" + closingApps);
6014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mAnimateWallpaperWithTarget = false;
602a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) {
603fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
604fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
605fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    "New transit: " + AppTransition.appTransitionToString(transit));
606a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        }
607a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        // We never want to change from a Keyguard transit to a non-Keyguard transit, as our logic
608a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        // relies on the fact that we always execute a Keyguard transition after preparing one.
609a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi        else if (!isKeyguardGoingAwayTransit(transit)) {
610a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            if (closingAppHasWallpaper && openingAppHasWallpaper) {
611a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
612a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                switch (transit) {
613a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_ACTIVITY_OPEN:
614a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_OPEN:
615a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_TO_FRONT:
616a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        transit = TRANSIT_WALLPAPER_INTRA_OPEN;
617a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        break;
618a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_ACTIVITY_CLOSE:
619a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_CLOSE:
620a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    case TRANSIT_TASK_TO_BACK:
621a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        transit = TRANSIT_WALLPAPER_INTRA_CLOSE;
622a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        break;
623a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                }
624a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
625a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        "New transit: " + AppTransition.appTransitionToString(transit));
626a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty()
627a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    && !openingApps.contains(oldWallpaper.mAppToken)
628a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    && closingApps.contains(oldWallpaper.mAppToken)) {
629a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                // We are transitioning from an activity with a wallpaper to one without.
630a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                transit = TRANSIT_WALLPAPER_CLOSE;
631a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: "
632a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        + AppTransition.appTransitionToString(transit));
633a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() &&
634a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                    openingApps.contains(wallpaperTarget.mAppToken)) {
635a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                // We are transitioning from an activity without
636a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                // a wallpaper to now showing the wallpaper
637a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                transit = TRANSIT_WALLPAPER_OPEN;
638a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: "
639a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                        + AppTransition.appTransitionToString(transit));
640a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            } else {
641a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi                mService.mAnimateWallpaperWithTarget = true;
642a69243a5475c3cecc410c3328f221bab220cab8aJorim Jaggi            }
6434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return transit;
6454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
6464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
647fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) {
648fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        for (int i = apps.size() - 1; i >= 0; i--) {
649fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
650fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                return true;
651fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            }
652fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
653fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        return false;
654fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    }
655fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi
6564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void processApplicationsAnimatingInPlace(int transit) {
6570c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        if (transit == TRANSIT_TASK_IN_PLACE) {
6584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Find the focused window
65963d4ecc7a5c23f1ebbd3d71e5054041d90df9762Wale Ogunwale            final WindowState win = mService.getDefaultDisplayContentLocked().findFocusedWindow();
6604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (win != null) {
6614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowToken wtoken = win.mAppToken;
6624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
6634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS)
664ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.v(TAG, "Now animating app in place " + wtoken);
6654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.clearThumbnail();
66665d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                appAnimator.setNullAnimation();
6674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.updateTokenInPlaceLocked(wtoken, transit);
6684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken.updateReportedVisibilityLocked();
6699f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale                wtoken.setAllAppWinAnimators();
6704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
67169cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
6724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
6734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
6754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void createThumbnailAppAnimator(int transit, AppWindowToken appToken,
6774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            int openingLayer, int closingLayer) {
6784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator;
6794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (openingAppAnimator == null || openingAppAnimator.animation == null) {
6804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
6814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6826d41026f1b3dc910c9d34ab89993a280dc9679cfBryce Lee        final int taskId = appToken.getTask().mTaskId;
683aa7fa0135366b80d9bfdb7dffb6795b365a40607Winson Chung        final GraphicBuffer thumbnailHeader =
684aa7fa0135366b80d9bfdb7dffb6795b365a40607Winson Chung                mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
685aa7fa0135366b80d9bfdb7dffb6795b365a40607Winson Chung        if (thumbnailHeader == null) {
686ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId);
6874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
6884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // This thumbnail animation is very special, we need to have
6904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // an extra surface with the thumbnail included with the animation.
6914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight());
6924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
6934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // TODO(multi-display): support other displays
6944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
6954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final Display display = displayContent.getDisplay();
6964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayInfo displayInfo = displayContent.getDisplayInfo();
6974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Create a new surface for the thumbnail
699e4338f843b234b8651d20aef15c901cbd6847bfcAlbert Chaulk            WindowState window = appToken.findMainWindow();
7004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession,
7014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "thumbnail anim", dirty.width(), dirty.height(),
702e4338f843b234b8651d20aef15c901cbd6847bfcAlbert Chaulk                    PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN,
703e6c25d4a6f35449a8420f0d1e87529426786ad60Bryce Lee                    appToken.windowType,
704e6c25d4a6f35449a8420f0d1e87529426786ad60Bryce Lee                    window != null ? window.mOwnerUid : Binder.getCallingUid());
7054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            surfaceControl.setLayerStack(display.getLayerStack());
7064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (SHOW_TRANSACTIONS) {
707ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "  THUMBNAIL " + surfaceControl + ": CREATE");
7084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
7094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
710aa7fa0135366b80d9bfdb7dffb6795b365a40607Winson Chung            // Transfer the thumbnail to the surface
7114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Surface drawSurface = new Surface();
7124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.copyFrom(surfaceControl);
713aa7fa0135366b80d9bfdb7dffb6795b365a40607Winson Chung            drawSurface.attachAndQueueBuffer(thumbnailHeader);
7144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.release();
7154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
7164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Get the thumbnail animation
7174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Animation anim;
7184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) {
7194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // If this is a multi-window scenario, we use the windows frame as
7204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // destination of the thumbnail header animation. If this is a full screen
7214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // window scenario, we use the whole display as the target.
7224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState win = appToken.findMainWindow();
7234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                Rect appRect = win != null ? win.getContentFrameLw() :
7244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight);
725de63d441d7daf0503bcc6d5fd3f4f7efe06e23d3Jorim Jaggi                Rect insets = win != null ? win.mContentInsets : null;
726441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian                final Configuration displayConfig = displayContent.getConfiguration();
7274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // For the new aspect-scaled transition, we want it to always show
7284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // above the animating opening/closing window, and we want to
7294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // synchronize its thumbnail surface with the surface for the
7304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // open/close animation (only on the way down)
7314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect,
732441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian                        insets, thumbnailHeader, taskId, displayConfig.uiMode,
733441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian                        displayConfig.orientation);
7344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer);
7354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                openingAppAnimator.deferThumbnailDestruction =
7364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        !mService.mAppTransition.isNextThumbnailTransitionScaleUp();
7374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
7384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                anim = mService.mAppTransition.createThumbnailScaleAnimationLocked(
7394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader);
7404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
7414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            anim.restrictDuration(MAX_ANIMATION_DURATION);
7424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());
7434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
7444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnail = surfaceControl;
7454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnailLayer = openingLayer;
7464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnailAnimation = anim;
7474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect);
7484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (Surface.OutOfResourcesException e) {
749ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w="
7504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + dirty.width() + " h=" + dirty.height(), e);
7514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.clearThumbnail();
7524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
7534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
7544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
75524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    void requestTraversal() {
75624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (!mTraversalScheduled) {
75724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = true;
758ed7993b5d147a6741d26fe0b16cc9fa5e34ceaeeJorim Jaggi            mService.mAnimationHandler.post(mPerformSurfacePlacement);
75924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
76024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
7623dac63a18d9115405404561d327010604420b07bJorim Jaggi    /**
7633dac63a18d9115405404561d327010604420b07bJorim Jaggi     * Puts the {@param surface} into a pending list to be destroyed after the current transaction
7643dac63a18d9115405404561d327010604420b07bJorim Jaggi     * has been committed.
7653dac63a18d9115405404561d327010604420b07bJorim Jaggi     */
7663dac63a18d9115405404561d327010604420b07bJorim Jaggi    void destroyAfterTransaction(SurfaceControl surface) {
7673dac63a18d9115405404561d327010604420b07bJorim Jaggi        mPendingDestroyingSurfaces.add(surface);
7683dac63a18d9115405404561d327010604420b07bJorim Jaggi    }
7693dac63a18d9115405404561d327010604420b07bJorim Jaggi
7703dac63a18d9115405404561d327010604420b07bJorim Jaggi    /**
7713dac63a18d9115405404561d327010604420b07bJorim Jaggi     * Destroys any surfaces that have been put into the pending list with
7723dac63a18d9115405404561d327010604420b07bJorim Jaggi     * {@link #destroyAfterTransaction}.
7733dac63a18d9115405404561d327010604420b07bJorim Jaggi     */
7743dac63a18d9115405404561d327010604420b07bJorim Jaggi    void destroyPendingSurfaces() {
7753dac63a18d9115405404561d327010604420b07bJorim Jaggi        for (int i = mPendingDestroyingSurfaces.size() - 1; i >= 0; i--) {
7763dac63a18d9115405404561d327010604420b07bJorim Jaggi            mPendingDestroyingSurfaces.get(i).destroy();
7773dac63a18d9115405404561d327010604420b07bJorim Jaggi        }
7783dac63a18d9115405404561d327010604420b07bJorim Jaggi        mPendingDestroyingSurfaces.clear();
7793dac63a18d9115405404561d327010604420b07bJorim Jaggi    }
7803dac63a18d9115405404561d327010604420b07bJorim Jaggi
78124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    public void dump(PrintWriter pw, String prefix) {
782e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        pw.println(prefix + "mTraversalScheduled=" + mTraversalScheduled);
783e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        pw.println(prefix + "mHoldScreenWindow=" + mService.mRoot.mHoldScreenWindow);
784d4a00a027265e5abfae335e38bd17fd744e3a2c3Wale Ogunwale        pw.println(prefix + "mObscuringWindow=" + mService.mRoot.mObscuringWindow);
78524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
7864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski}
787