WindowSurfacePlacer.java revision 87e5d55e98857bd43984c2395660d88ae20efcfc
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;
180c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE;
190c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE;
200c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN;
210c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_BACK;
220c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_TASK_TO_FRONT;
230c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_CLOSE;
240c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE;
250c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN;
260c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwaleimport static com.android.server.wm.AppTransition.TRANSIT_WALLPAPER_OPEN;
270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
280bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
300bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
31192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
33192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.DO_TRAVERSAL;
34192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
35192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE;
36192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
37192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
40441e4494682144aec2ec7f19060464af3d29c319Andrii Kulianimport android.content.res.Configuration;
414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Bitmap;
424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Canvas;
434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.PixelFormat;
444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Rect;
454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug;
464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace;
4749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet;
484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog;
493878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggiimport android.util.SparseIntArray;
504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display;
514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo;
524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface;
534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl;
544cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams;
554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation;
564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
57d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggiimport com.android.server.wm.WindowManagerService.H;
58d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi
5924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter;
604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport java.util.ArrayList;
614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/**
634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces.
644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski *
654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning
664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService.
674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */
684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer {
69ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski    private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM;
704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WindowManagerService mService;
714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WallpaperController mWallpaperControllerLocked;
724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mInLayout = false;
744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /** Only do a maximum of 6 repeated layouts. After that quit */
764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int mLayoutRepeatCount;
774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_UPDATE_ROTATION                = 1 << 0;
794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_MAY_CHANGE           = 1 << 1;
804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_FORCE_HIDING_CHANGED           = 1 << 2;
814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_ORIENTATION_CHANGE_COMPLETE    = 1 << 3;
824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_TURN_ON_SCREEN                 = 1 << 4;
834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_ACTION_PENDING       = 1 << 5;
844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final Rect mTmpStartRect = new Rect();
86b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale    private final Rect mTmpContentRect = new Rect();
874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
8824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    private boolean mTraversalScheduled;
89c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    private int mDeferDepth = 0;
9024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
914cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private static final class LayerAndToken {
924cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public int layer;
934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public AppWindowToken token;
944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
954cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private final LayerAndToken mTmpLayerAndToken = new LayerAndToken();
964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
973dac63a18d9115405404561d327010604420b07bJorim Jaggi    private final ArrayList<SurfaceControl> mPendingDestroyingSurfaces = new ArrayList<>();
983878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi    private final SparseIntArray mTempTransitionReasons = new SparseIntArray();
993dac63a18d9115405404561d327010604420b07bJorim Jaggi
1004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    public WindowSurfacePlacer(WindowManagerService service) {
1014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService = service;
1020303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale        mWallpaperControllerLocked = mService.mRoot.mWallpaperController;
1034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
105c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
106c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#deferSurfaceLayout()}
107c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
108c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void deferLayout() {
109c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth++;
110c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
111c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
112c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
113c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#continueSurfaceLayout()}
114c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
115c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void continueLayout() {
116c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth--;
117c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        if (mDeferDepth <= 0) {
118c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            performSurfacePlacement();
119c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
120c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
121c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
1224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    final void performSurfacePlacement() {
12302886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        performSurfacePlacement(false /* force */);
12402886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    }
12502886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
12602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi    final void performSurfacePlacement(boolean force) {
12702886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        if (mDeferDepth > 0 && !force) {
128c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            return;
129c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
1304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int loopCount = 6;
1314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        do {
13224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = false;
1334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            performSurfacePlacementLoop();
1344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mH.removeMessages(DO_TRAVERSAL);
1354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            loopCount--;
13624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        } while (mTraversalScheduled && loopCount > 0);
137e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        mService.mRoot.mWallpaperActionPending = false;
1384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void performSurfacePlacementLoop() {
1414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mInLayout) {
1424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG) {
1434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                throw new RuntimeException("Recursive call!");
1444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
145ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers="
1464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + Debug.getCallers(3));
1474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mWaitingForConfig) {
1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Our configuration has changed (most likely rotation), but we
1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // don't yet have the complete configuration to report to
1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // applications.  Don't do any window layout until we have it.
1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mDisplayReady) {
1584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Not yet initialized, nothing to do.
1594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout");
1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mInLayout = true;
1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean recoveringMemory = false;
1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mForceRemoves.isEmpty()) {
1674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            recoveringMemory = true;
1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Wait a little bit for things to settle down, and off we go.
1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            while (!mService.mForceRemoves.isEmpty()) {
170adde52ee32b656bb436f7e92f39f7d0d97cc9306Wale Ogunwale                final WindowState ws = mService.mForceRemoves.remove(0);
171ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "Force removing: " + ws);
172571771c3fc912e63f83b75693c0f3c85ec9622daWale Ogunwale                ws.removeImmediately();
1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
174ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Object tmp = new Object();
1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            synchronized (tmp) {
1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                try {
1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    tmp.wait(250);
1794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } catch (InterruptedException e) {
1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
185e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale            mService.mRoot.performSurfacePlacement(recoveringMemory);
1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1892b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale            if (mService.mRoot.isLayoutNeeded()) {
1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (++mLayoutRepeatCount < 6) {
19124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    requestTraversal();
1924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } else {
193ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.e(TAG, "Performed 6 layouts in a row. Skipping");
1944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mLayoutRepeatCount = 0;
1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mLayoutRepeatCount = 0;
1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) {
2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.removeMessages(REPORT_WINDOWS_CHANGE);
2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE);
2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (RuntimeException e) {
2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
206ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.wtf(TAG, "Unhandled exception while laying out windows", e);
2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    void debugLayoutRepeats(final String msg, int pendingLayoutChanges) {
2134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) {
214ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.v(TAG, "Layouts looping: " + msg +
2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges));
2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean isInLayout() {
2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return mInLayout;
2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /**
2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     * @return bitmap indicating if another pass through layout must be made.
2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     */
2260303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale    int handleAppTransitionReadyLocked() {
2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int appsCount = mService.mOpeningApps.size();
2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!transitionGoodToGo(appsCount)) {
2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return 0;
2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2318784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "AppTransitionReady");
2328784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
233ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int transit = mService.mAppTransition.getAppTransition();
2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mSkipAppTransitionAnimation) {
2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            transit = AppTransition.TRANSIT_UNSET;
2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mSkipAppTransitionAnimation = false;
2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mNoAnimationNotifyOnTransitionFinished.clear();
2404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
241d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi        mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2439adfe5776d42c9ddfd4394958993304c9d355229Wale Ogunwale        final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
2446213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        // TODO: Don't believe this is really needed...
2456213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        //mService.mWindowsChanged = true;
2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
247e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        mService.mRoot.mWallpaperMayChange = false;
2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2490c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // The top-most window will supply the layout params, and we will determine it below.
2504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        LayoutParams animLp = null;
2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int bestAnimLayer = -1;
2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean fullscreenAnim = false;
2534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean voiceInteraction = false;
2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
255ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        int i;
256ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        for (i = 0; i < appsCount; i++) {
257ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang            final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
2580c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // Clearing the mAnimatingExit flag before entering animation. It's set to true if app
2590c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // window is removed, or window relayout to invisible. This also affects window
2600c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // visibility. We need to clear it *before* maybeUpdateTransitToWallpaper() as the
2610c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            // transition selection depends on wallpaper target visibility.
262ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang            wtoken.clearAnimatingFlags();
263ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang
264ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        }
2650c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale
266ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        // Adjust wallpaper before we pull the lower/upper target, since pending changes
267ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang        // (like the clearAnimatingFlags() above) might affect wallpaper target result.
2680c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // Or, the opening app window should be a wallpaper target.
2690c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        mWallpaperControllerLocked.adjustWallpaperWindowsForAppTransitionIfNeeded(displayContent,
2700303c5723edfdb4f2db37543544d7cbe9b14df97Wale Ogunwale                mService.mOpeningApps);
271ec8299ca4575cb5afe96bb60082d50cb8a01c74bChong Zhang
272f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
2734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean openingAppHasWallpaper = false;
2744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean closingAppHasWallpaper = false;
2754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2760c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // Do a first pass through the tokens for two things:
2770c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // (1) Determine if both the closing and opening app token sets are wallpaper targets, in
2780c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // which case special animations are needed (since the wallpaper needs to stay static behind
2790c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // them).
2800c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // (2) Find the layout params of the top-most application window in the tokens, which is
2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // what will control the animation theme.
2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int closingAppsCount = mService.mClosingApps.size();
2834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        appsCount = closingAppsCount + mService.mOpeningApps.size();
2844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (i = 0; i < appsCount; i++) {
2854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppWindowToken wtoken;
2864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (i < closingAppsCount) {
2874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken = mService.mClosingApps.valueAt(i);
288f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                if (wallpaperTarget != null && wtoken.windowsCanBeWallpaperTarget()) {
2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    closingAppHasWallpaper = true;
2904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount);
293f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                if (wallpaperTarget != null && wtoken.windowsCanBeWallpaperTarget()) {
2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    openingAppHasWallpaper = true;
2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
29872919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale            voiceInteraction |= wtoken.mVoiceInteraction;
2994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3005136249a7147fb205e1b861c1d42a7d1f13b73ccWale Ogunwale            if (wtoken.fillsParent()) {
301f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                final WindowState ws = wtoken.findMainWindow();
3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (ws != null) {
3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    animLp = ws.mAttrs;
3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    bestAnimLayer = ws.mLayer;
3054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    fullscreenAnim = true;
3064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else if (!fullscreenAnim) {
308f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                final WindowState ws = wtoken.findMainWindow();
3094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (ws != null) {
3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (ws.mLayer > bestAnimLayer) {
3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        animLp = ws.mAttrs;
3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        bestAnimLayer = ws.mLayer;
3134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
3164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
319f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale                closingAppHasWallpaper);
3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3210c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // If all closing windows are obscured, then there is no need to do an animation. This is
3220c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        // the case, for example, when this transition is being done behind the lock screen.
3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mPolicy.allowAppAnimationsLw()) {
324ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "Animations disallowed by keyguard or dream.");
3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            animLp = null;
3274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        processApplicationsAnimatingInPlace(transit);
3304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
33142625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi        mTmpLayerAndToken.token = null;
3324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken);
3334cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowToken topClosingApp = mTmpLayerAndToken.token;
3344cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int topClosingLayer = mTmpLayerAndToken.layer;
3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3364cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowToken topOpeningApp = handleOpeningApps(transit,
3374cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                animLp, voiceInteraction, topClosingLayer);
3384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3391c93f6de2dd74dfc7ee0f52aca6e8b491ace02f9Chong Zhang        mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp);
3401c93f6de2dd74dfc7ee0f52aca6e8b491ace02f9Chong Zhang
3414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ?  null :
3424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                topOpeningApp.mAppAnimator;
3434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null :
3444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                topClosingApp.mAppAnimator;
3454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
346fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        final int flags = mService.mAppTransition.getTransitFlags();
347fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        int layoutRedo = mService.mAppTransition.goodToGo(transit, openingAppAnimator,
348fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                closingAppAnimator, mService.mOpeningApps, mService.mClosingApps);
349fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        handleNonAppWindowsInTransition(transit, flags);
3504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mAppTransition.postAnimationCallback();
3514cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mAppTransition.clear();
3524cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
35302886a82d876aa5e31a92444fec70208599c509cJorim Jaggi        mService.mTaskSnapshotController.onTransitionStarting();
35402886a82d876aa5e31a92444fec70208599c509cJorim Jaggi
3554cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mOpeningApps.clear();
3564cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mClosingApps.clear();
3575a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi        mService.mUnknownAppVisibilityController.clear();
3584cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // This has changed the visibility of windows, so perform
3604cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // a new layout to get them all up-to-date.
3612b06bfc6e90aa293c7058fc6b1d1cf22fbb2ada2Wale Ogunwale        displayContent.setLayoutNeeded();
3624cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
3634cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // TODO(multidisplay): IMEs are only supported on the default display.
364ae9adbfb758712caaf11b4ba5c5fd15848dcc3c5Wale Ogunwale        final DisplayContent dc = mService.getDefaultDisplayContentLocked();
3656213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale        dc.computeImeTarget(true /* updateImeTarget */);
3664cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
3674cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                true /*updateInputWindows*/);
3684cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mFocusMayChange = false;
3698784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
3708784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
3718784be6fe485939c3ae758edbcbbcb85d2b123aeChong Zhang
372fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        return layoutRedo | FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
3734cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
3744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3754cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp,
3764cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            boolean voiceInteraction, int topClosingLayer) {
3774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowToken topOpeningApp = null;
3784cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount = mService.mOpeningApps.size();
3794cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
3804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
3814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
382ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken);
3834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!appAnimator.usingTransferredAnimation) {
3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.clearThumbnail();
38665d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                appAnimator.setNullAnimation();
3874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
388eb22e8ed42bb146060e8ffc94444f70ea47fda04Chong Zhang
3899f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            if (!wtoken.setVisibility(animLp, true, transit, false, voiceInteraction)){
3904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // This token isn't going to be animating. Add it to the list of tokens to
3914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // be notified of app transition complete since the notification will not be
3924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // sent be the app window animator.
3934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token);
3944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
3954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.updateReportedVisibilityLocked();
3964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.waitingToShow = false;
3979f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            wtoken.setAllAppWinAnimators();
3984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
399ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
400974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                    ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()");
40168e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr            mService.openSurfaceTransaction();
402974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            try {
40369cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
404974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            } finally {
40568e5c9e93a8f1542cd988ac01ba1d98381ff4893Robert Carr                mService.closeSurfaceTransaction();
406ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
407974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                        "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()");
408974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            }
4094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
4104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            int topOpeningLayer = 0;
4124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (animLp != null) {
4139f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale                final int layer = wtoken.getHighestAnimLayer();
4144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (topOpeningApp == null || layer > topOpeningLayer) {
4154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningApp = wtoken;
4164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningLayer = layer;
4174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
4184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4194cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) {
4204cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer);
4214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        return topOpeningApp;
4244cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
4254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction,
4274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            LayerAndToken layerAndToken) {
4284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount;
4294cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        appsCount = mService.mClosingApps.size();
4304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
4314cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
432f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
433f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // If we still have some windows animating with saved surfaces that's
434f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // either invisible or already removed, mark them exiting so that they
435f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // are disposed of after the exit animation. These are not supposed to
436f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // be shown, or are delayed removal until app is actually drawn (in which
437f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // case the window will be removed after the animation).
438f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            wtoken.markSavedSurfaceExiting();
439f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
4404cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
441ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
4424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            appAnimator.clearThumbnail();
44365d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang            appAnimator.setNullAnimation();
44487e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung            // TODO: Do we need to add to mNoAnimationNotifyOnTransitionFinished like above if not
44587e5d55e98857bd43984c2395660d88ae20efcfcWinson Chung            //       animating?
4469f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale            wtoken.setVisibility(animLp, false, transit, false, voiceInteraction);
4474cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.updateReportedVisibilityLocked();
4484cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Force the allDrawn flag, because we want to start
4494cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // this guy's animations regardless of whether it's
4504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // gotten drawn.
4514cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.allDrawn = true;
4524cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.deferClearAllDrawn = false;
4534cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Ensure that apps that are mid-starting are also scheduled to have their
4544cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // starting windows removed after the animation is complete
455ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi            if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit
456ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi                    && wtoken.getController() != null) {
457ba41f4b9e3629c097cdd7b6538c5bcf4602728b8Jorim Jaggi                wtoken.getController().removeStartingWindow();
4584cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4594cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
4604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4614cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (animLp != null) {
462e4da0c145e89274f98c683d4e045644400ea1a18Wale Ogunwale                int layer = wtoken.getHighestAnimLayer();
4634cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                if (layerAndToken.token == null || layer > layerAndToken.layer) {
4644cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.token = wtoken;
4654cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.layer = layer;
4664cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                }
4674cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4684cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) {
4694cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer);
4704cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
4734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
474fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    private void handleNonAppWindowsInTransition(int transit, int flags) {
475fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        if (transit == TRANSIT_KEYGUARD_GOING_AWAY) {
476fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if ((flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER) != 0
477fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    && (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_NO_ANIMATION) == 0) {
478fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                Animation anim = mService.mPolicy.createKeyguardWallpaperExit(
479fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                        (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
480fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                if (anim != null) {
481fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    mService.getDefaultDisplayContentLocked().mWallpaperController
482fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                            .startWallpaperAnimation(anim);
483fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                }
484fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            }
485fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
486fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        if (transit == TRANSIT_KEYGUARD_GOING_AWAY
487fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                || transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER) {
488fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            mService.getDefaultDisplayContentLocked().startKeyguardExitOnNonAppWindows(
489fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    transit == TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER,
490fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    (flags & TRANSIT_FLAG_KEYGUARD_GOING_AWAY_TO_SHADE) != 0);
491fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
492fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    }
493fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi
4944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean transitionGoodToGo(int appsCount) {
495ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
4964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "Checking " + appsCount + " opening apps (frozen="
4974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mDisplayFrozen + " timeout="
4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mAppTransition.isTimeout() + ")...");
49942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr        final ScreenRotationAnimation screenRotationAnimation =
50042769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            mService.mAnimator.getScreenRotationAnimationLocked(
50142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    Display.DEFAULT_DISPLAY);
50242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr
5033878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi        final SparseIntArray reasons = mTempTransitionReasons;
5044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mAppTransition.isTimeout()) {
50542769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // Imagine the case where we are changing orientation due to an app transition, but a previous
50642769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // orientation change is still in progress. We won't process the orientation change
50742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // for our transition because we need to wait for the rotation animation to finish.
50842769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // If we start the app transition at this point, we will interrupt it halfway with a new rotation
50942769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // animation after the old one finally finishes. It's better to defer the
51042769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            // app transition.
51142769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            if (screenRotationAnimation != null && screenRotationAnimation.isAnimating() &&
51242769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    mService.rotationNeedsUpdateLocked()) {
51342769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                if (DEBUG_APP_TRANSITIONS) {
51442769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                    Slog.v(TAG, "Delaying app transition for screen rotation animation to finish");
51542769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                }
51642769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr                return false;
51742769fff6ffe3369333ff8366f7eede5da9f2637Robert Carr            }
5184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int i = 0; i < appsCount; i++) {
5194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
520ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        "Check opening app=" + wtoken + ": allDrawn="
5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.allDrawn + " startingDisplayed="
5234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.startingDisplayed + " startingMoved="
524d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.startingMoved + " isRelaunching()="
525d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.isRelaunching());
526d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang
527275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                final boolean drawnBeforeRestoring = wtoken.allDrawn;
5289bc47736362d03b3f099bf018255571457403c1fWale Ogunwale                wtoken.restoreSavedSurfaceForInterestingWindows();
529bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang
53002886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                final boolean allDrawn = wtoken.allDrawn && !wtoken.isRelaunching();
53102886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
5324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    return false;
5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
5343878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                final TaskStack stack = wtoken.getStack();
5353878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                final int stackId = stack != null ? stack.mStackId : INVALID_STACK_ID;
53602886a82d876aa5e31a92444fec70208599c509cJorim Jaggi                if (allDrawn) {
5373878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                    reasons.put(stackId, drawnBeforeRestoring ? APP_TRANSITION_WINDOWS_DRAWN
5383878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                            : APP_TRANSITION_SAVED_SURFACE);
539275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                } else {
5403878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                    reasons.put(stackId, wtoken.startingData instanceof SplashScreenStartingData
5413878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                            ? APP_TRANSITION_SPLASH_SCREEN
5423878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                            : APP_TRANSITION_SNAPSHOT);
543275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                }
5444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5462f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            // We also need to wait for the specs to be fetched, if needed.
5472f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) {
548ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true");
5492f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi                return false;
5502f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            }
5512f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi
5525a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi            if (!mService.mUnknownAppVisibilityController.allResolved()) {
5535a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                if (DEBUG_APP_TRANSITIONS) {
5545a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                    Slog.v(TAG, "unknownApps is not empty: "
5555a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                            + mService.mUnknownAppVisibilityController.getDebugMessage());
5565a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                }
5575a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi                return false;
5585a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi            }
5595a108c225a81cedacb1cec9b5b1986f2f3eff75cJorim Jaggi
5604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // If the wallpaper is visible, we need to check it's ready too.
561275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
5624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mWallpaperControllerLocked.wallpaperTransitionReady();
563275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            if (wallpaperReady) {
5643878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reasons.clone())
5653878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi                        .sendToTarget();
566275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                return true;
567275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            }
568275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            return false;
5694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5703878ca3333da1bf5cbc83d33e5e8b3ce68c8c5e4Jorim Jaggi        mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reasons.clone()).sendToTarget();
5714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return true;
5724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
5734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
575f4ebe2e2ccfcbce9de7ad0c3b5399971201f66fdWale Ogunwale            boolean closingAppHasWallpaper) {
5764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper
5774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
5780c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating()
5790c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                ? null : wallpaperTarget;
58049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps;
58149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> closingApps = mService.mClosingApps;
582fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        boolean openingCanBeWallpaperTarget = canBeWallpaperTarget(openingApps);
583ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
5844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "New wallpaper target=" + wallpaperTarget
5854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + ", oldWallpaper=" + oldWallpaper
58649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", openingApps=" + openingApps
58749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", closingApps=" + closingApps);
5884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mAnimateWallpaperWithTarget = false;
5894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (closingAppHasWallpaper && openingAppHasWallpaper) {
5900c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Wallpaper animation!");
5914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            switch (transit) {
5920c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                case TRANSIT_ACTIVITY_OPEN:
5930c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                case TRANSIT_TASK_OPEN:
5940c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                case TRANSIT_TASK_TO_FRONT:
5950c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                    transit = TRANSIT_WALLPAPER_INTRA_OPEN;
5964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    break;
5970c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                case TRANSIT_ACTIVITY_CLOSE:
5980c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                case TRANSIT_TASK_CLOSE:
5990c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                case TRANSIT_TASK_TO_BACK:
6000c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale                    transit = TRANSIT_WALLPAPER_INTRA_CLOSE;
6014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    break;
6024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
603ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
6044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "New transit: " + AppTransition.appTransitionToString(transit));
605fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        } else if (openingCanBeWallpaperTarget && transit == TRANSIT_KEYGUARD_GOING_AWAY) {
606fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            transit = TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
607fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
608fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                    "New transit: " + AppTransition.appTransitionToString(transit));
60949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty()
61049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                && !openingApps.contains(oldWallpaper.mAppToken)
61149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                && closingApps.contains(oldWallpaper.mAppToken)) {
61249b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski            // We are transitioning from an activity with a wallpaper to one without.
6130c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            transit = TRANSIT_WALLPAPER_CLOSE;
6140c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit away from wallpaper: "
6154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + AppTransition.appTransitionToString(transit));
61649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() &&
61749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                openingApps.contains(wallpaperTarget.mAppToken)) {
6184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // We are transitioning from an activity without
6194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // a wallpaper to now showing the wallpaper
6200c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            transit = TRANSIT_WALLPAPER_OPEN;
6210c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "New transit into wallpaper: "
6224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + AppTransition.appTransitionToString(transit));
6234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } else {
6244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAnimateWallpaperWithTarget = true;
6254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return transit;
6274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
6284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
629fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    private boolean canBeWallpaperTarget(ArraySet<AppWindowToken> apps) {
630fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        for (int i = apps.size() - 1; i >= 0; i--) {
631fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            if (apps.valueAt(i).windowsCanBeWallpaperTarget()) {
632fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi                return true;
633fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi            }
634fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        }
635fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi        return false;
636fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi    }
637fe762344f4475a3a336bb46aef2d59c1fabf32abJorim Jaggi
6384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void processApplicationsAnimatingInPlace(int transit) {
6390c4a40efc4fe01bb2fde452507241f910f79b833Wale Ogunwale        if (transit == TRANSIT_TASK_IN_PLACE) {
6404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Find the focused window
64163d4ecc7a5c23f1ebbd3d71e5054041d90df9762Wale Ogunwale            final WindowState win = mService.getDefaultDisplayContentLocked().findFocusedWindow();
6424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (win != null) {
6434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowToken wtoken = win.mAppToken;
6444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
6454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS)
646ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.v(TAG, "Now animating app in place " + wtoken);
6474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.clearThumbnail();
64865d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                appAnimator.setNullAnimation();
6494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.updateTokenInPlaceLocked(wtoken, transit);
6504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken.updateReportedVisibilityLocked();
6519f25beee3a8cd6f452534006ea9068178cbb4ce1Wale Ogunwale                wtoken.setAllAppWinAnimators();
6524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
65369cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
6544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
6554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
6574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void createThumbnailAppAnimator(int transit, AppWindowToken appToken,
6594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            int openingLayer, int closingLayer) {
6604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator;
6614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (openingAppAnimator == null || openingAppAnimator.animation == null) {
6624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
6634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6646d41026f1b3dc910c9d34ab89993a280dc9679cfBryce Lee        final int taskId = appToken.getTask().mTaskId;
6654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
6664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) {
667ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId);
6684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
6694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
6704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // This thumbnail animation is very special, we need to have
6714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // an extra surface with the thumbnail included with the animation.
6724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight());
6734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
6744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // TODO(multi-display): support other displays
6754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
6764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final Display display = displayContent.getDisplay();
6774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayInfo displayInfo = displayContent.getDisplayInfo();
6784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Create a new surface for the thumbnail
6804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession,
6814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "thumbnail anim", dirty.width(), dirty.height(),
6824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN);
6834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            surfaceControl.setLayerStack(display.getLayerStack());
6844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (SHOW_TRANSACTIONS) {
685ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "  THUMBNAIL " + surfaceControl + ": CREATE");
6864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
6874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Draw the thumbnail onto the surface
6894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Surface drawSurface = new Surface();
6904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.copyFrom(surfaceControl);
6914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Canvas c = drawSurface.lockCanvas(dirty);
6924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            c.drawBitmap(thumbnailHeader, 0, 0, null);
6934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.unlockCanvasAndPost(c);
6944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.release();
6954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
6964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Get the thumbnail animation
6974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Animation anim;
6984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) {
6994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // If this is a multi-window scenario, we use the windows frame as
7004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // destination of the thumbnail header animation. If this is a full screen
7014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // window scenario, we use the whole display as the target.
7024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState win = appToken.findMainWindow();
7034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                Rect appRect = win != null ? win.getContentFrameLw() :
7044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight);
705de63d441d7daf0503bcc6d5fd3f4f7efe06e23d3Jorim Jaggi                Rect insets = win != null ? win.mContentInsets : null;
706441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian                final Configuration displayConfig = displayContent.getConfiguration();
7074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // For the new aspect-scaled transition, we want it to always show
7084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // above the animating opening/closing window, and we want to
7094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // synchronize its thumbnail surface with the surface for the
7104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // open/close animation (only on the way down)
7114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect,
712441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian                        insets, thumbnailHeader, taskId, displayConfig.uiMode,
713441e4494682144aec2ec7f19060464af3d29c319Andrii Kulian                        displayConfig.orientation);
7144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer);
7154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                openingAppAnimator.deferThumbnailDestruction =
7164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        !mService.mAppTransition.isNextThumbnailTransitionScaleUp();
7174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
7184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                anim = mService.mAppTransition.createThumbnailScaleAnimationLocked(
7194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader);
7204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
7214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            anim.restrictDuration(MAX_ANIMATION_DURATION);
7224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());
7234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
7244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnail = surfaceControl;
7254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnailLayer = openingLayer;
7264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnailAnimation = anim;
7274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect);
7284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (Surface.OutOfResourcesException e) {
729ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w="
7304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + dirty.width() + " h=" + dirty.height(), e);
7314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.clearThumbnail();
7324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
7334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
7344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
73524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    void requestTraversal() {
73624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (!mTraversalScheduled) {
73724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = true;
73824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mH.sendEmptyMessage(DO_TRAVERSAL);
73924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
74024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
74124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
7423dac63a18d9115405404561d327010604420b07bJorim Jaggi    /**
7433dac63a18d9115405404561d327010604420b07bJorim Jaggi     * Puts the {@param surface} into a pending list to be destroyed after the current transaction
7443dac63a18d9115405404561d327010604420b07bJorim Jaggi     * has been committed.
7453dac63a18d9115405404561d327010604420b07bJorim Jaggi     */
7463dac63a18d9115405404561d327010604420b07bJorim Jaggi    void destroyAfterTransaction(SurfaceControl surface) {
7473dac63a18d9115405404561d327010604420b07bJorim Jaggi        mPendingDestroyingSurfaces.add(surface);
7483dac63a18d9115405404561d327010604420b07bJorim Jaggi    }
7493dac63a18d9115405404561d327010604420b07bJorim Jaggi
7503dac63a18d9115405404561d327010604420b07bJorim Jaggi    /**
7513dac63a18d9115405404561d327010604420b07bJorim Jaggi     * Destroys any surfaces that have been put into the pending list with
7523dac63a18d9115405404561d327010604420b07bJorim Jaggi     * {@link #destroyAfterTransaction}.
7533dac63a18d9115405404561d327010604420b07bJorim Jaggi     */
7543dac63a18d9115405404561d327010604420b07bJorim Jaggi    void destroyPendingSurfaces() {
7553dac63a18d9115405404561d327010604420b07bJorim Jaggi        for (int i = mPendingDestroyingSurfaces.size() - 1; i >= 0; i--) {
7563dac63a18d9115405404561d327010604420b07bJorim Jaggi            mPendingDestroyingSurfaces.get(i).destroy();
7573dac63a18d9115405404561d327010604420b07bJorim Jaggi        }
7583dac63a18d9115405404561d327010604420b07bJorim Jaggi        mPendingDestroyingSurfaces.clear();
7593dac63a18d9115405404561d327010604420b07bJorim Jaggi    }
7603dac63a18d9115405404561d327010604420b07bJorim Jaggi
76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    public void dump(PrintWriter pw, String prefix) {
762e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        pw.println(prefix + "mTraversalScheduled=" + mTraversalScheduled);
763e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        pw.println(prefix + "mHoldScreenWindow=" + mService.mRoot.mHoldScreenWindow);
764d4a00a027265e5abfae335e38bd17fd744e3a2c3Wale Ogunwale        pw.println(prefix + "mObscuringWindow=" + mService.mRoot.mObscuringWindow);
76524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
7664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski}
767