WindowSurfacePlacer.java revision 42625d1bc7ef99c4d4435e8cdebfe3eee57b8d97
14501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskipackage com.android.server.wm; 24501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 34501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; 44501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; 54501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; 64501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; 74501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION; 84501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_DREAM; 94501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; 104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION; 114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG; 124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; 134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; 144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; 154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG; 164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT; 174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; 180bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG; 190bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; 200bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; 210bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT; 220bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; 230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; 240bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER; 250bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; 260bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT; 270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; 280bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; 290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE; 30ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; 314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.H.*; 324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD; 334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION; 340bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS; 350bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS; 360bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; 374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; 384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; 394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; 404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 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.PowerManager; 474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.RemoteException; 484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.SystemClock; 494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace; 504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.provider.Settings; 5149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet; 524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog; 534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display; 544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo; 554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface; 564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl; 574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.View; 584cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams; 594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation; 604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 6124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter; 624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport java.util.ArrayList; 634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/** 654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces. 664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * 674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning 684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService. 694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer { 71ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM; 724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WindowManagerService mService; 734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WallpaperController mWallpaperControllerLocked; 744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mInLayout = false; 764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** Only do a maximum of 6 repeated layouts. After that quit */ 784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mLayoutRepeatCount; 794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_UPDATE_ROTATION = 1 << 0; 814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; 824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_FORCE_HIDING_CHANGED = 1 << 2; 834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3; 844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_TURN_ON_SCREEN = 1 << 4; 854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_ACTION_PENDING = 1 << 5; 864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mWallpaperMayChange = false; 884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mOrientationChangeComplete = true; 894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mWallpaperActionPending = false; 904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mWallpaperForceHidingChanged = false; 924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private Object mLastWindowFreezeSource = null; 934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private Session mHoldScreen = null; 944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mObscured = false; 954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mSyswin = false; 964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mScreenBrightness = -1; 974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mButtonBrightness = -1; 984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private long mUserActivityTimeout = -1; 994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mUpdateRotation = false; 1004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final Rect mTmpStartRect = new Rect(); 101b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale private final Rect mTmpContentRect = new Rect(); 1024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Set to true when the display contains content to show the user. 1044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // When false, the display manager may choose to mirror or blank the display. 1054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mDisplayHasContent = false; 1064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Only set while traversing the default display based on its content. 1084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Affects the behavior of mirroring on secondary displays. 1094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mObscureApplicationContentOnSecondaryDisplays = false; 1104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mPreferredRefreshRate = 0; 1124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mPreferredModeId = 0; 1144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private boolean mTraversalScheduled; 116c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi private int mDeferDepth = 0; 11724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 1184cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private static final class LayerAndToken { 1194cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski public int layer; 1204cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski public AppWindowToken token; 1214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 1224cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private final LayerAndToken mTmpLayerAndToken = new LayerAndToken(); 1234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 1244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski public WindowSurfacePlacer(WindowManagerService service) { 1254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService = service; 1264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked = mService.mWallpaperControllerLocked; 1274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 129c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 130c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#deferSurfaceLayout()} 131c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 132c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void deferLayout() { 133c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth++; 134c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 135c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 136c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 137c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#continueSurfaceLayout()} 138c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 139c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void continueLayout() { 140c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth--; 141c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth <= 0) { 142c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi performSurfacePlacement(); 143c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 144c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 145c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 1464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performSurfacePlacement() { 147c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth > 0) { 148c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi return; 149c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 1504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int loopCount = 6; 1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 15224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = false; 1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementLoop(); 1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(DO_TRAVERSAL); 1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski loopCount--; 15624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (mTraversalScheduled && loopCount > 0); 1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = false; 1584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementLoop() { 1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mInLayout) { 1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG) { 1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski throw new RuntimeException("Recursive call!"); 1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 165ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" 1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 1674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForConfig) { 1714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Our configuration has changed (most likely rotation), but we 1724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // don't yet have the complete configuration to report to 1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // applications. Don't do any window layout until we have it. 1744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayReady) { 1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not yet initialized, nothing to do. 1794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout"); 1834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = true; 1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean recoveringMemory = false; 1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mForceRemoves.isEmpty()) { 1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski recoveringMemory = true; 1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Wait a little bit for things to settle down, and off we go. 1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski while (!mService.mForceRemoves.isEmpty()) { 1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = mService.mForceRemoves.remove(0); 191ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.i(TAG, "Force removing: " + ws); 1924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(ws); 1934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 194ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Due to memory failure, waiting a bit for next layout"); 1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Object tmp = new Object(); 1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski synchronized (tmp) { 1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski tmp.wait(250); 1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (InterruptedException e) { 2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementInner(recoveringMemory); 2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (++mLayoutRepeatCount < 6) { 21124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski requestTraversal(); 2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 213ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.e(TAG, "Performed 6 layouts in a row. Skipping"); 2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) { 2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(REPORT_WINDOWS_CHANGE); 2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE); 2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 226ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception while laying out windows", e); 2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); 2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski void debugLayoutRepeats(final String msg, int pendingLayoutChanges) { 2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) { 234ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Layouts looping: " + msg + 2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges)); 2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // "Something has changed! Let's make it correct now." 2404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementInner(boolean recoveringMemory) { 241ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_WINDOW_TRACE) Slog.v(TAG, "performSurfacePlacementInner: entry. Called by " 242ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski + Debug.getCallers(3)); 2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean updateInputWindowsNeeded = false; 2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = mService.updateFocusedWindowLocked( 2504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); 2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting tokens. 2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int numDisplays = mService.mDisplayContents.size(); 2554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 2574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i=displayContent.mExitingTokens.size()-1; i>=0; i--) { 2584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.mExitingTokens.get(i).hasVisible = false; 2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 2634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 2654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = exitingAppTokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 2674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingAppTokens.get(tokenNdx).hasVisible = false; 2684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = null; 2724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = -1; 2734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = -1; 2744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = -1; 2754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = false; 2764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTransactionSequence++; 2784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked(); 2804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo(); 2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDw = defaultInfo.logicalWidth; 2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDh = defaultInfo.logicalHeight; 2834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 284ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 2854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 2864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.openTransaction(); 2874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 28824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski applySurfaceChangesTransaction(recoveringMemory, numDisplays, defaultDw, defaultDh); 2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 290ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception in Window Manager", e); 2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } finally { 2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.closeTransaction(); 293ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowList defaultWindows = defaultDisplay.getWindowList(); 2984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If we are ready to perform an app transition, check through 3004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // all of the app tokens to be shown and see if they are ready 3014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to go. 3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isReady()) { 3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked(defaultWindows); 3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAppTransitionReadyLocked", 3064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) { 3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We have finished the animation of an app transition. To do 3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // this, we have delayed a lot of operations like showing and 3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hiding apps, moving apps in Z-order, etc. The app token list 3134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // reflects the correct Z-order, but the window list may now 3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be out of sync with it. So here we will just rebuild the 3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // entire app window list. Fun! 3164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= 3174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.handleAnimatingStoppedAndTransitionLocked(); 3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAnimStopAndXitionLock", 3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0 3244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.mAppTransition.isReady()) { 3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // At this point, there was a window with a wallpaper that 3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // was force hiding other windows behind it, but now it 3274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // is going away. This may be simple -- just animate 3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // away the wallpaper and its window -- or it may be 3294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hard -- the wallpaper now needs to be shown behind 3304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // something that was hidden. 3314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after animateAwayWallpaperLocked", 3344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = false; 3374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperMayChange) { 3394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 340ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Wallpaper may change! Adjusting"); 3414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 3424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange", 3434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 3474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 3484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 3494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski false /*updateInputWindows*/)) { 3504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = true; 3514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM; 3524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 3564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("mLayoutNeeded", 3584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) { 3624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = mService.mResizingWindows.get(i); 3634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAppFreezing) { 3644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't remove this window until rotation has completed. 3654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 3664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 367db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang // Discard the saved surface if window size is changed, it can't be reused. 368bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang if (win.mAppToken != null) { 369bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang win.mAppToken.destroySavedSurfaces(); 370db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang } 3714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.reportResized(); 3724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mResizingWindows.remove(i); 3734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 375ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_ORIENTATION && mService.mDisplayFrozen) Slog.v(TAG, 376ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete); 3774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mOrientationChangeComplete) { 3784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 3794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE; 3804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLastFinishedFreezeSource = mLastWindowFreezeSource; 3814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT); 3824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.stopFreezingDisplayLocked(); 3844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Destroy the surface of any windows that are no longer visible. 38719723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski boolean wallpaperDestroyed = false; 38819723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski i = mService.mDestroySurface.size(); 38919723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (i > 0) { 39019723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski do { 39119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski i--; 39219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski WindowState win = mService.mDestroySurface.get(i); 39319723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski win.mDestroying = false; 39419723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (mService.mInputMethodWindow == win) { 39519723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski mService.mInputMethodWindow = null; 39619723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } 39719723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski if (mWallpaperControllerLocked.isWallpaperTarget(win)) { 39819723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski wallpaperDestroyed = true; 39919723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } 40013f7be9e0424266be4bf3b5c8c7fdc161e4fe091Robert Carr win.destroyOrSaveSurface(); 40119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } while (i > 0); 40219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski mService.mDestroySurface.clear(); 40319723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski } 4044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting tokens? 4064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 4074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 4084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<WindowToken> exitingTokens = displayContent.mExitingTokens; 4094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingTokens.size() - 1; i >= 0; i--) { 4104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowToken token = exitingTokens.get(i); 4114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible) { 4124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingTokens.remove(i); 4134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (token.windowType == TYPE_WALLPAPER) { 4144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.removeWallpaperToken(token); 4154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting applications? 4214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 4224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 4234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 4244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 4254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingAppTokens.size() - 1; i >= 0; i--) { 4264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken token = exitingAppTokens.get(i); 4274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible && !mService.mClosingApps.contains(token) && 4284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!token.mIsExiting || token.allAppWindows.isEmpty())) { 4294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Make sure there is no animation running on this token, 4304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so any windows associated with it will be removed as 4314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon as their animations are complete 4324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.clearAnimation(); 4334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.animating = false; 434ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, 435ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski "performLayout: App token exiting now removed" + token); 4364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.removeAppFromTaskLocked(); 4374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wallpaperDestroyed) { 4424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 4434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.layoutNeeded = true; 4444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 4474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 4484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent.pendingLayoutChanges != 0) { 4494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 4504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Finally update all input windows now that the window changes have stabilized. 4544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(true /*force*/); 4554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setHoldScreenLocked(mHoldScreen); 4574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayFrozen) { 4584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mScreenBrightness < 0 || mScreenBrightness > 1.0f) { 4594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(-1); 4604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager( 4624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski toBrightnessOverride(mScreenBrightness)); 4634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mButtonBrightness < 0 4654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || mButtonBrightness > 1.0f) { 4664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(-1); 4674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager( 4694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski toBrightnessOverride(mButtonBrightness)); 4704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager( 4724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout); 4734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mTurnOnScreen) { 4764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAllowTheaterModeWakeFromLayout 4774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || Settings.Global.getInt(mService.mContext.getContentResolver(), 4784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Settings.Global.THEATER_MODE_ON, 0) == 0) { 4794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_POWER) { 480ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Turning screen on after layout!"); 4814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(), 4834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "android.server.wm:TURN_ON"); 4844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = false; 4864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mUpdateRotation) { 489ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation"); 4904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateRotationUncheckedLocked(false)) { 4914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 4924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = false; 4944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForDrawnCallback != null || 4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (mOrientationChangeComplete && !defaultDisplay.layoutNeeded && 4994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mUpdateRotation)) { 5004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.checkDrawnWindowsLocked(); 5014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = mService.mPendingRemove.size(); 5044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (N > 0) { 5054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mPendingRemoveTmp.length < N) { 5064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemoveTmp = new WindowState[N+10]; 5074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.toArray(mService.mPendingRemoveTmp); 5094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.clear(); 5104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayContentList displayList = new DisplayContentList(); 5114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < N; i++) { 5124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState w = mService.mPendingRemoveTmp[i]; 5134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(w); 5144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 5154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && !displayList.contains(displayContent)) { 5164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayList.add(displayContent); 5174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (DisplayContent displayContent : displayList) { 52192e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mLayersController.assignLayersLocked(displayContent.getWindowList()); 5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 5234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Remove all deferred displays stacks, tasks, and activities. 5274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = mService.mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) { 5284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mDisplayContents.valueAt(displayNdx).checkForDeferredActions(); 5294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindowsNeeded) { 5324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 534b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mService.setFocusTaskRegionLocked(); 5354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Check to see if we are now in a state where the screen should 5374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be enabled, because the window obscured flags have changed. 5384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.enableScreenIfNeededLocked(); 5394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.scheduleAnimationLocked(); 5414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 542ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_WINDOW_TRACE) Slog.e(TAG, 54369cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating()); 5444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 54624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private void applySurfaceChangesTransaction(boolean recoveringMemory, int numDisplays, 54724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int defaultDw, int defaultDh) { 54824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mWatermark != null) { 54924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mWatermark.positionSurface(defaultDw, defaultDh); 55024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 55124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mStrictModeFlash != null) { 55224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh); 55324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 55424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mCircularDisplayMask != null) { 55524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh, 55624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 55724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 55824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mEmulatorDisplayOverlay != null) { 55924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh, 56024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 56124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 56224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 56324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean focusDisplayed = false; 56424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 56524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 56624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 56724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean updateAllDrawn = false; 56824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 56924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 57024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int displayId = displayContent.getDisplayId(); 57124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dw = displayInfo.logicalWidth; 57224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dh = displayInfo.logicalHeight; 57324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDw = displayInfo.appWidth; 57424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDh = displayInfo.appHeight; 57524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); 57624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 57724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Reset for each display. 57824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent = false; 57924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate = 0; 58024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId = 0; 58124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 58224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int repeats = 0; 58324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski do { 58424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski repeats++; 58524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats > 6) { 586ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Animation repeat aborted after too many iterations"); 58724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = false; 58824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski break; 58924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 59124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats( 59224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski "On entry to LockedInner", displayContent.pendingLayoutChanges); 59324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 59424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 && 59524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.adjustWallpaperWindows()) { 59692e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mLayersController.assignLayersLocked(windows); 59724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 59824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 60024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay 60124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && (displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) { 602ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 60324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.updateOrientationFromAppTokensLocked(true)) { 60424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 60524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 60624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 60724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 60824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 60924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_LAYOUT) != 0) { 61024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 61124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 61224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 61324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST LOOP: Perform a layout, if needed. 61424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats < LAYOUT_REPEAT_THRESHOLD) { 61524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski performLayoutLockedInner(displayContent, repeats == 1, 61624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski false /* updateInputWindows */); 61724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else { 618ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.w(TAG, "Layout repeat skipped after too many iterations"); 61924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 62024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST AND ONE HALF LOOP: Make WindowManagerPolicy think 62224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // it is animating. 62324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges = 0; 62424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay) { 62624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.beginPostLayoutPolicyLw(dw, dh); 62724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 62824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 62924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 63024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs, 63124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mAttachedWindow); 63224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 63524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.finishPostLayoutPolicyLw(); 63624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("after finishPostLayoutPolicyLw", 63724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 63824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (displayContent.pendingLayoutChanges != 0); 64024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mObscured = false; 64224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mSyswin = false; 64324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.resetDimming(); 64424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Only used if default window 64624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean someoneLosingFocus = !mService.mLosingFocus.isEmpty(); 64724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 64924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 65024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean obscuredChanged = w.mObscured != mObscured; 65124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 65224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Update effect. 65324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mObscured = mObscured; 65424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mObscured) { 6550abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang handleNotObscuredLocked(w, displayInfo); 65624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 65724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 658112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang w.applyDimLayerIfNeeded(); 65924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 66024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && obscuredChanged 66124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && mWallpaperControllerLocked.isWallpaperTarget(w) && w.isVisibleLw()) { 66224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // This is the wallpaper target and its obscured state 66324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // changed... make sure the current wallaper's visibility 66424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // has been updated accordingly. 66524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.updateWallpaperVisibility(); 66624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 66724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 66824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final WindowStateAnimator winAnimator = w.mWinAnimator; 66924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 67024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // If the window has moved due to its containing content frame changing, then 671f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // notify the listeners and optionally animate it. Simply checking a change of 672f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // position is not enough, because being move due to dock divider is not a trigger 673f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // for animation. 67424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.hasMoved()) { 67524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Frame has moved, containing content frame has also moved, and we're not 67624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // currently animating... let's do something. 67724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int left = w.mFrame.left; 67824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int top = w.mFrame.top; 67942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi final boolean adjustedForMinimizedDockedStack = w.getTask() != null && 68042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi w.getTask().mStack.isAdjustedForMinimizedDockedStack(); 681f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0 68242625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi && !w.isDragResizing() && !adjustedForMinimizedDockedStack) { 683f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski winAnimator.setMoveAnimation(left, top); 68424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 68524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 68624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski //TODO (multidisplay): Accessibility supported only for the default display. 68724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mAccessibilityController != null 68824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && displayId == Display.DEFAULT_DISPLAY) { 68924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); 69024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 69124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 69224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski try { 69324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mClient.moved(left, top); 69424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } catch (RemoteException e) { 69524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 69624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 69724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 698ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 69924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mContentChanged = false; 700bd0d937303ae54d8a5bb5f08080c4164302daefcChong Zhang w.mMovedByResize = false; 70124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 70224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Moved from updateWindowsAndWallpaperLocked(). 70324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 70424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Take care of the window being ready to display. 70524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean committed = winAnimator.commitFinishDrawingLocked(); 70624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && committed) { 70724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mAttrs.type == TYPE_DREAM) { 70824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // HACK: When a dream is shown, it may at that 70924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // point hide the lock screen. So we need to 71024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // redo the layout to let the phone window manager 71124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // make this happen. 71224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 71324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski FINISH_LAYOUT_REDO_LAYOUT; 71424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 71524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("dream and commitFinishDrawingLocked true", 71624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 71724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 71824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 71924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { 72024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 721ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "First draw done in potential wallpaper target " + w); 72224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperMayChange = true; 72324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 72424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 72524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("wallpaper and commitFinishDrawingLocked true", 72624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 72724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 72824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 72924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 730c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski if (!winAnimator.isAnimating()) { 731c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // Updates the shown frame before we set up the surface. This is needed 732c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // because the resizing could change the top-left position (in addition to 733c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // size) of the window. setSurfaceBoundariesLocked uses mShownPosition to 734c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // position the surface. We only apply it to windows that aren't animating, 735c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // because we depend on the animation to calculate the correct shown frame 736c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski // on the next animation step. 737c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski winAnimator.computeShownFrameLocked(); 738c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski } 73924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.setSurfaceBoundariesLocked(recoveringMemory); 74024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 74124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 74224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final AppWindowToken atoken = w.mAppToken; 74324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) { 744ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.d(TAG, "updateWindows: starting " + w 74524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn 74624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" + atoken.mAppAnimator.freezingScreen); 74724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 74824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) { 74924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken.lastTransactionSequence != mService.mTransactionSequence) { 75024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.lastTransactionSequence = mService.mTransactionSequence; 75124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 75224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = false; 75324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 75424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.isOnScreenIgnoringKeyguard() 75524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski || winAnimator.mAttrType == TYPE_BASE_APPLICATION) 75624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && !w.mExiting && !w.mDestroying) { 75724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 758ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Eval win " + w + ": isDrawn=" 75924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + w.isDrawnLw() 76024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + ", isAnimating=" + winAnimator.isAnimating()); 76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!w.isDrawnLw()) { 762ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Not displayed: s=" 763e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr + winAnimator.mSurfaceController 76424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " pv=" + w.mPolicyVisibility 76524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mDrawState=" + winAnimator.drawStateToString() 76624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " ah=" + w.mAttachedHidden 76724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " th=" + atoken.hiddenRequested 76824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " a=" + winAnimator.mAnimating); 76924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 771bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang if (w != atoken.startingWindow) { 772bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang if (!w.mAppDied && 773bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang (!atoken.mAppAnimator.freezingScreen || !w.mAppFreezing)) { 77424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows++; 77524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.isDrawnLw()) { 77624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numDrawnWindows++; 77724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) 778ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "tokenMayBeDrawn: " + atoken 77924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" 78024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + atoken.mAppAnimator.freezingScreen 78124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mAppFreezing=" + w.mAppFreezing); 78224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawn = true; 78324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else if (w.isDrawnLw()) { 78624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = true; 78724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && someoneLosingFocus && w == mService.mCurrentFocus 79224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && w.isDisplayedLw()) { 79324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski focusDisplayed = true; 79424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.updateResizingWindows(w); 79724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.setDisplayProperties(displayId, 80024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent, 80124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate, 80224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId, 80324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski true /* inTraversal, must call performTraversalInTrans... below */); 80424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 80524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.getDisplayContentLocked(displayId).stopDimmingIfNeeded(); 80624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 80724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (updateAllDrawn) { 80824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawnLocked(displayContent); 80924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 81224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (focusDisplayed) { 81324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS); 81424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 81624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Give the display manager a chance to adjust properties 81724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // like display rotation if it needs to. 81824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager(); 81924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 82024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 8214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isInLayout() { 8224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return mInLayout; 8234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performLayoutLockedInner(final DisplayContent displayContent, 8264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean initial, boolean updateInputWindows) { 8274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!displayContent.layoutNeeded) { 8284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 8294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = false; 8314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 8324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isDefaultDisplay = displayContent.isDefaultDisplay; 8334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 8354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dw = displayInfo.logicalWidth; 8364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dh = displayInfo.logicalHeight; 8374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mInputConsumer != null) { 8394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputConsumer.layout(dw, dh); 8404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = windows.size(); 8434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 8444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) { 846ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "-------------------------------------"); 847ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "performLayout: needed=" 8484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + displayContent.layoutNeeded + " dw=" + dw + " dh=" + dh); 8494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8519ebbe6afe7a433f78ca3d30c9f215c53212c34acSriram Viswanathan mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mService.mRotation, 8529ebbe6afe7a433f78ca3d30c9f215c53212c34acSriram Viswanathan mService.mCurConfiguration.uiMode); 8534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (isDefaultDisplay) { 8544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not needed on non-default displays. 8554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSystemDecorLayer = mService.mPolicy.getSystemDecorLayerLw(); 8564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mScreenRect.set(0, 0, dw, dh); 8574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 859b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale mService.mPolicy.getContentRectLw(mTmpContentRect); 860b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale displayContent.resize(mTmpContentRect); 8614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int seq = mService.mLayoutSeq+1; 8634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (seq < 0) seq = 0; 8644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLayoutSeq = seq; 8654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean behindDream = false; 8674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // First perform layout of any root windows (not attached 8694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to another window). 8704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topAttached = -1; 8714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = N-1; i >= 0; i--) { 8724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 8734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't do layout of a window if it is not visible, or 8754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon won't be visible, to avoid wasting time and funky 8764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // changes while a window is animating away. 8774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean gone = (behindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) 8784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || win.isGoneForLayoutLw(); 8794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT && !win.mLayoutAttached) { 881ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "1ST PASS " + win 8824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 8834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mLayoutAttached=" + win.mLayoutAttached 8844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " screen changed=" + win.isConfigChanged()); 8854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken atoken = win.mAppToken; 886ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (gone) Slog.v(TAG, " GONE: mViewVisibility=" 8874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 8884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 8894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 8904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 8914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 892ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski else Slog.v(TAG, " VIS: mViewVisibility=" 8934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 8944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 8954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 8964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 8974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 8984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 9014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 9024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 9034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 9044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 9054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!gone || !win.mHaveFrame || win.mLayoutNeeded 9064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || ((win.isConfigChanged() || win.setInsetsChanged()) && 9074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ((win.mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 || 9084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (win.mHasSurface && win.mAppToken != null && 9094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mAppToken.layoutConfigChanges)))) { 9104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!win.mLayoutAttached) { 9114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 912ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 9134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 9144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAttrs.type == TYPE_DREAM) { 9164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 9174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 9184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 9194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski behindDream = true; 9204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, null); 9244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 9254c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 9264c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Window frames may have changed. Update dim layer with the new bounds. 9274c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang final Task task = win.getTask(); 9284c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (task != null) { 9294c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang displayContent.mDimLayerController.updateDimLayer(task); 9304c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 9314c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 932ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" 9344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mFrame + " mContainingFrame=" 9354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" 9364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mDisplayFrame); 9374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 9384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topAttached < 0) topAttached = i; 9394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean attachedBehindDream = false; 9444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Now perform layout of attached windows, which usually 9464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // depend on the position of the window they are attached to. 9474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // XXX does not deal with windows that are attached to windows 9484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // that are themselves attached. 9494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = topAttached; i >= 0; i--) { 9504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 9514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mLayoutAttached) { 953ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" 9554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); 9564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 9574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 9584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 9594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 9604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 9614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (attachedBehindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) { 9624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 9634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 9654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || !win.mHaveFrame || win.mLayoutNeeded) { 9664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 967ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 9684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 9694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, win.mAttachedWindow); 9734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 974ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" 9764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); 9774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (win.mAttrs.type == TYPE_DREAM) { 9794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 9804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 9814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 9824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski attachedBehindDream = behindDream; 9834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9864c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Window frames may have changed. Tell the input dispatcher about it. 9874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.setUpdateInputWindowsNeededLw(); 9884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindows) { 9894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 9904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.finishLayoutLw(); 99361f39a7b988f6a22681a3f9e0bf8121f72ff88c4Jorim Jaggi mService.mH.sendEmptyMessage(UPDATE_DOCKED_STACK_DIVIDER); 9944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 9974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param windows List of windows on default display. 9984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @return bitmap indicating if another pass through layout must be made. 9994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 10004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int handleAppTransitionReadyLocked(WindowList windows) { 10014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int appsCount = mService.mOpeningApps.size(); 10024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!transitionGoodToGo(appsCount)) { 10034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return 0; 10044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1005ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 10064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int transit = mService.mAppTransition.getAppTransition(); 10074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mSkipAppTransitionAnimation) { 10084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_UNSET; 10094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSkipAppTransitionAnimation = false; 10114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.clear(); 10124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(APP_TRANSITION_TIMEOUT); 10144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.rebuildAppWindowListLocked(); 10164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = false; 10184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // The top-most window will supply the layout params, 10204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // and we will determine it below. 10214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski LayoutParams animLp = null; 10224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int bestAnimLayer = -1; 10234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean fullscreenAnim = false; 10244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean voiceInteraction = false; 10254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState lowerWallpaperTarget = 10274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getLowerWallpaperTarget(); 10284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState upperWallpaperTarget = 10294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getUpperWallpaperTarget(); 10304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean openingAppHasWallpaper = false; 10324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper = false; 10334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken lowerWallpaperAppToken; 10344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken upperWallpaperAppToken; 10354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (lowerWallpaperTarget == null) { 10364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = upperWallpaperAppToken = null; 10374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = lowerWallpaperTarget.mAppToken; 10394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski upperWallpaperAppToken = upperWallpaperTarget.mAppToken; 10404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 10434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Do a first pass through the tokens for two 10444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // things: 10454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (1) Determine if both the closing and opening 10464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // app token sets are wallpaper targets, in which 10474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // case special animations are needed 10484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (since the wallpaper needs to stay static 10494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // behind them). 10504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (2) Find the layout params of the top-most 10514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // application window in the tokens, which is 10524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // what will control the animation theme. 10534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int closingAppsCount = mService.mClosingApps.size(); 10544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = closingAppsCount + mService.mOpeningApps.size(); 10554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 10564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken; 10574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (i < closingAppsCount) { 10584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mClosingApps.valueAt(i); 10594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 10604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper = true; 10614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount); 10644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 10654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppHasWallpaper = true; 10664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski voiceInteraction |= wtoken.voiceInteraction; 10704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken.appFullscreen) { 10724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 10734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 10744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 10754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 10764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski fullscreenAnim = true; 10774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (!fullscreenAnim) { 10794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 10804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 10814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws.mLayer > bestAnimLayer) { 10824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 10834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 10844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, 10904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget); 10914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If all closing windows are obscured, then there is 10934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // no need to do an animation. This is the case, for 10944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // example, when this transition is being done behind 10954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // the lock screen. 10964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mPolicy.allowAppAnimationsLw()) { 1097ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 10984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Animations disallowed by keyguard or dream."); 10994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = null; 11004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski processApplicationsAnimatingInPlace(transit); 11034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 110442625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mTmpLayerAndToken.token = null; 11054cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken); 11064cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowToken topClosingApp = mTmpLayerAndToken.token; 11074cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int topClosingLayer = mTmpLayerAndToken.layer; 11084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11094cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowToken topOpeningApp = handleOpeningApps(transit, 11104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski animLp, voiceInteraction, topClosingLayer); 11114cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11124cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : 11134cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski topOpeningApp.mAppAnimator; 11144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : 11154cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski topClosingApp.mAppAnimator; 11164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 111742625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator, 111842625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mService.mOpeningApps, mService.mClosingApps); 11194cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mAppTransition.postAnimationCallback(); 11204cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mAppTransition.clear(); 11214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11224cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mOpeningApps.clear(); 11234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mClosingApps.clear(); 11244cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11254cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // This has changed the visibility of windows, so perform 11264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // a new layout to get them all up-to-date. 11274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.getDefaultDisplayContentLocked().layoutNeeded = true; 11284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski 11294cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // TODO(multidisplay): IMEs are only supported on the default display. 11304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (windows == mService.getDefaultWindowListLocked() 11314cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski && !mService.moveInputMethodWindowsIfNeededLocked(true)) { 113292e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski mService.mLayersController.assignLayersLocked(windows); 11334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11344cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 11354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski true /*updateInputWindows*/); 11364cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mFocusMayChange = false; 11374cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.notifyActivityDrawnForKeyguard(); 11384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; 11394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 11404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp, 11424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski boolean voiceInteraction, int topClosingLayer) { 11434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topOpeningApp = null; 11444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int appsCount = mService.mOpeningApps.size(); 11454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int i = 0; i < appsCount; i++) { 11464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 11474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 1148ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken); 11494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!appAnimator.usingTransferredAnimation) { 11514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 11524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 11534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.inPendingTransaction = false; 1155eb22e8ed42bb146060e8ffc94444f70ea47fda04Chong Zhang 11564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.setTokenVisibilityLocked( 11574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken, animLp, true, transit, false, voiceInteraction)){ 11584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This token isn't going to be animating. Add it to the list of tokens to 11594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be notified of app transition complete since the notification will not be 11604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // sent be the app window animator. 11614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token); 11624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 11644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.waitingToShow = false; 11654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 11674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int windowsCount = wtoken.allAppWindows.size(); 11684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < windowsCount; j++) { 11694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 11704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1171ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1172974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()"); 1173974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski SurfaceControl.openTransaction(); 1174974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski try { 117569cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); 1176974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } finally { 1177974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski SurfaceControl.closeTransaction(); 1178ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1179974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()"); 1180974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } 11814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 11824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topOpeningLayer = 0; 11844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 11854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int layer = -1; 11864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 1187bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang final WindowState win = wtoken.windows.get(j); 118878a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // Clearing the mExiting flag before entering animation. It will be set to true 118978a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // if app window is removed, or window relayout to invisible. We don't want to 119078a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // clear it out for windows that get replaced, because the animation depends on 119178a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // the flag to remove the replaced window. 11927fed68d116f037847f298b7d52f537998c315298Robert Carr // 11937fed68d116f037847f298b7d52f537998c315298Robert Carr // We also don't clear the mExiting flag for windows which have the 11947fed68d116f037847f298b7d52f537998c315298Robert Carr // mRemoveOnExit flag. This indicates an explicit remove request has been issued 11957fed68d116f037847f298b7d52f537998c315298Robert Carr // by the client. We should let animation proceed and not clear this flag or 11967fed68d116f037847f298b7d52f537998c315298Robert Carr // they won't eventually be removed by WindowStateAnimator#finishExit. 11977fed68d116f037847f298b7d52f537998c315298Robert Carr if (!win.mWillReplaceWindow && !win.mRemoveOnExit) { 119878a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski win.mExiting = false; 119978a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski } 12004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 12014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 12024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topOpeningApp == null || layer > topOpeningLayer) { 12054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp = wtoken; 12064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningLayer = layer; 12074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12094cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) { 12104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); 12114cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12134cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski return topOpeningApp; 12144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction, 12174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski LayerAndToken layerAndToken) { 12184cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final int appsCount; 12194cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski appsCount = mService.mClosingApps.size(); 12204cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int i = 0; i < appsCount; i++) { 12214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski AppWindowToken wtoken = mService.mClosingApps.valueAt(i); 12224cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 1223ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken); 12244cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski appAnimator.clearThumbnail(); 12254cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski appAnimator.animation = null; 12264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.inPendingTransaction = false; 12274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false, 12284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski voiceInteraction); 12294cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.updateReportedVisibilityLocked(); 12304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // Force the allDrawn flag, because we want to start 12314cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // this guy's animations regardless of whether it's 12324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // gotten drawn. 12334cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.allDrawn = true; 12344cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski wtoken.deferClearAllDrawn = false; 12354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // Ensure that apps that are mid-starting are also scheduled to have their 12364cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski // starting windows removed after the animation is complete 12374cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (wtoken.startingWindow != null && !wtoken.startingWindow.mExiting) { 12384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.scheduleRemoveStartingWindowLocked(wtoken); 12394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12404cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 12414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (animLp != null) { 12434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski int layer = -1; 12444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 12454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski WindowState win = wtoken.windows.get(j); 12464cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 12474cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 12484cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12494cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12504cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (layerAndToken.token == null || layer > layerAndToken.layer) { 12514cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layerAndToken.token = wtoken; 12524cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski layerAndToken.layer = layer; 12534cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12544cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12554cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) { 12564cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer); 12574cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski } 12584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean transitionGoodToGo(int appsCount) { 1262ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Checking " + appsCount + " opening apps (frozen=" 12644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mDisplayFrozen + " timeout=" 12654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mAppTransition.isTimeout() + ")..."); 12664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAppTransition.isTimeout()) { 12674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int i = 0; i < appsCount; i++) { 12684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 1269ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Check opening app=" + wtoken + ": allDrawn=" 12714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.allDrawn + " startingDisplayed=" 12724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingDisplayed + " startingMoved=" 12734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingMoved); 1274db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang 1275bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang wtoken.restoreSavedSurfaces(); 1276bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang 12774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { 12784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return false; 12794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12822f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi // We also need to wait for the specs to be fetched, if needed. 12832f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) { 1284ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true"); 12852f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi return false; 12862f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi } 12872f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi 12884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If the wallpaper is visible, we need to check it's ready too. 12894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return !mWallpaperControllerLocked.isWallpaperVisible() || 12904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.wallpaperTransitionReady(); 12914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return true; 12934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, 12964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget, 12974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState upperWallpaperTarget) { 12984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper 12994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); 13004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState oldWallpaper = 13014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.isWallpaperTargetAnimating() 13024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ? null : wallpaperTarget; 130349b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps; 130449b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> closingApps = mService.mClosingApps; 1305ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New wallpaper target=" + wallpaperTarget 13074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", oldWallpaper=" + oldWallpaper 13084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", lower target=" + lowerWallpaperTarget 130949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", upper target=" + upperWallpaperTarget 131049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", openingApps=" + openingApps 131149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", closingApps=" + closingApps); 13124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = false; 13134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (closingAppHasWallpaper && openingAppHasWallpaper) { 13144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 1315ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Wallpaper animation!"); 13164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski switch (transit) { 13174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_OPEN: 13184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_OPEN: 13194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_FRONT: 13204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; 13214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 13224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_CLOSE: 13234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_CLOSE: 13244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_BACK: 13254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; 13264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 13274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1328ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit: " + AppTransition.appTransitionToString(transit)); 133049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() 133149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski && !openingApps.contains(oldWallpaper.mAppToken) 133249b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski && closingApps.contains(oldWallpaper.mAppToken)) { 133349b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski // We are transitioning from an activity with a wallpaper to one without. 13344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; 1335ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit away from wallpaper: " 13374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 133849b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() && 133949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski openingApps.contains(wallpaperTarget.mAppToken)) { 13404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We are transitioning from an activity without 13414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a wallpaper to now showing the wallpaper 13424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_OPEN; 1343ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit into wallpaper: " 13454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 13464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 13474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = true; 13484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return transit; 13504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 13534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param w WindowState this method is applied to. 13540abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang * @param dispInfo info of the display that the window's obscuring state is checked against. 13554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 13560abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang private void handleNotObscuredLocked(final WindowState w, final DisplayInfo dispInfo) { 13574cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski final LayoutParams attrs = w.mAttrs; 13584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int attrFlags = attrs.flags; 13594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean canBeSeen = w.isDisplayedLw(); 13604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13610abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang if (canBeSeen && w.isObscuringFullscreen(dispInfo)) { 13624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This window completely covers everything behind it, 13634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so we want to leave all of them as undimmed (for 13644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // performance reasons). 13654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscured = true; 13664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (w.mHasSurface) { 13694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 13704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = w.mSession; 13714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.screenBrightness >= 0 13734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mScreenBrightness < 0) { 13744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = w.mAttrs.screenBrightness; 13754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.buttonBrightness >= 0 13774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mButtonBrightness < 0) { 13784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = w.mAttrs.buttonBrightness; 13794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.userActivityTimeout >= 0 13814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mUserActivityTimeout < 0) { 13824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = w.mAttrs.userActivityTimeout; 13834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int type = attrs.type; 13864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen 13874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && (type == TYPE_SYSTEM_DIALOG 13884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || type == TYPE_SYSTEM_ERROR 13894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) { 13904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mSyswin = true; 13914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen) { 13944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This function assumes that the contents of the default display are 13954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // processed first before secondary displays. 13964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 13974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && displayContent.isDefaultDisplay) { 13984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // While a dream or keyguard is showing, obscure ordinary application 13994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // content on secondary displays (by forcibly enabling mirroring unless 14004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // there is other content we want to show) but still allow opaque 14014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // keyguard dialogs to be shown. 14024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { 14034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = true; 14044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 14064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (displayContent != null && 14074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!mObscureApplicationContentOnSecondaryDisplays 14084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (mObscured && type == TYPE_KEYGUARD_DIALOG))) { 14094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Allow full screen keyguard presentation dialogs to be seen. 14104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 14114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredRefreshRate == 0 14134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredRefreshRate != 0) { 14144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredRefreshRate = w.mAttrs.preferredRefreshRate; 14154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredModeId == 0 14174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredDisplayModeId != 0) { 14184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredModeId = w.mAttrs.preferredDisplayModeId; 14194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void updateAllDrawnLocked(DisplayContent displayContent) { 14254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // See if any windows have been drawn, so they (and others 14264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // associated with them) can now be shown. 14274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<TaskStack> stacks = displayContent.getStacks(); 14284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 14294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final ArrayList<Task> tasks = stacks.get(stackNdx).getTasks(); 14304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 14314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList tokens = tasks.get(taskNdx).mAppTokens; 14324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 14334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = tokens.get(tokenNdx); 14344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn) { 14354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int numInteresting = wtoken.numInterestingWindows; 14364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 14374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY) 1438ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "allDrawn: " + wtoken 14394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " interesting=" + numInteresting 14404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " drawn=" + wtoken.numDrawnWindows); 14414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.allDrawn = true; 14424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Force an additional layout pass where WindowStateAnimator# 14434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // commitFinishDrawingLocked() will call performShowLocked(). 14444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 14454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, 14464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.token).sendToTarget(); 14474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private static int toBrightnessOverride(float value) { 14554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return (int)(value * PowerManager.BRIGHTNESS_ON); 14564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void processApplicationsAnimatingInPlace(int transit) { 14594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { 14604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Find the focused window 14614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = mService.findFocusedWindowLocked( 14624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.getDefaultDisplayContentLocked()); 14634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win != null) { 14644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = win.mAppToken; 14654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 14664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 1467ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.v(TAG, "Now animating app in place " + wtoken); 14684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 14694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 14704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.updateTokenInPlaceLocked(wtoken, transit); 14714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 14724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 14744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = wtoken.allAppWindows.size(); 14754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < N; j++) { 14764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 14774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 147969cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); 14804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, 14854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int openingLayer, int closingLayer) { 14864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator; 14874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (openingAppAnimator == null || openingAppAnimator.animation == null) { 14884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 14894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int taskId = appToken.mTask.mTaskId; 14914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId); 14924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) { 1493ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId); 14944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 14954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This thumbnail animation is very special, we need to have 14974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // an extra surface with the thumbnail included with the animation. 14984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight()); 14994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 15004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // TODO(multi-display): support other displays 15014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); 15024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final Display display = displayContent.getDisplay(); 15034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo displayInfo = displayContent.getDisplayInfo(); 15044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Create a new surface for the thumbnail 15064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession, 15074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "thumbnail anim", dirty.width(), dirty.height(), 15084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); 15094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski surfaceControl.setLayerStack(display.getLayerStack()); 15104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_TRANSACTIONS) { 1511ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE"); 15124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Draw the thumbnail onto the surface 15154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Surface drawSurface = new Surface(); 15164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.copyFrom(surfaceControl); 15174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Canvas c = drawSurface.lockCanvas(dirty); 15184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski c.drawBitmap(thumbnailHeader, 0, 0, null); 15194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.unlockCanvasAndPost(c); 15204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.release(); 15214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Get the thumbnail animation 15234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Animation anim; 15244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) { 15254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this is a multi-window scenario, we use the windows frame as 15264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // destination of the thumbnail header animation. If this is a full screen 15274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // window scenario, we use the whole display as the target. 15284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = appToken.findMainWindow(); 15294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect appRect = win != null ? win.getContentFrameLw() : 15304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight); 15314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // For the new aspect-scaled transition, we want it to always show 15324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // above the animating opening/closing window, and we want to 15334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // synchronize its thumbnail surface with the surface for the 15344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // open/close animation (only on the way down) 15354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect, 15364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski thumbnailHeader, taskId); 15374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer); 15384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.deferThumbnailDestruction = 15394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mService.mAppTransition.isNextThumbnailTransitionScaleUp(); 15404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 15414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailScaleAnimationLocked( 15424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader); 15434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.restrictDuration(MAX_ANIMATION_DURATION); 15454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked()); 15464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnail = surfaceControl; 15484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailLayer = openingLayer; 15494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailAnimation = anim; 15504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect); 15514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailX = mTmpStartRect.left; 15524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailY = mTmpStartRect.top; 15534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (Surface.OutOfResourcesException e) { 1554ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w=" 15554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + dirty.width() + " h=" + dirty.height(), e); 15564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.clearThumbnail(); 15574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean copyAnimToLayoutParamsLocked() { 15614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean doRequest = false; 15624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams; 15644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) { 15654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = true; 15664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) { 15694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = true; 15704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) { 15734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = true; 15744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) { 15774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = false; 15784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 15794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = true; 15804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource; 15814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 15824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) { 15864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = true; 15874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) { 15894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = true; 15904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return doRequest; 15934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 159424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 159524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski void requestTraversal() { 159624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mTraversalScheduled) { 159724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = true; 159824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(DO_TRAVERSAL); 159924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 160024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 160124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 160224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski public void dump(PrintWriter pw, String prefix) { 160324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled); 160424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 16054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski} 1606