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