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