WindowSurfacePlacer.java revision f52dd205b9d31e0edcfdfff4ed98259c07ca38b7
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; 184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG; 194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_ADD_REMOVE; 204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_APP_TRANSITIONS; 214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT; 224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT_REPEATS; 234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_ORIENTATION; 244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_POWER; 254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_STARTING_WINDOW; 264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_TOKEN_MOVEMENT; 274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; 284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_WALLPAPER_LIGHT; 294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.DEBUG_WINDOW_TRACE; 304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.H.*; 314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD; 324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION; 334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.SHOW_LIGHT_TRANSACTIONS; 344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.SHOW_TRANSACTIONS; 354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.TAG; 364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES; 374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES; 384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE; 394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Bitmap; 414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Canvas; 424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.PixelFormat; 434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Rect; 444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug; 454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.PowerManager; 464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.RemoteException; 474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.SystemClock; 484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace; 494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.provider.Settings; 5049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet; 514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog; 524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display; 534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo; 544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface; 554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl; 564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.View; 574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.WindowManager; 584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation; 594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 6024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter; 614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport java.util.ArrayList; 624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/** 644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces. 654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * 664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning 674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService. 684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer { 704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WindowManagerService mService; 714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final WallpaperController mWallpaperControllerLocked; 724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mInLayout = false; 744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** Only do a maximum of 6 repeated layouts. After that quit */ 764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mLayoutRepeatCount; 774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_UPDATE_ROTATION = 1 << 0; 794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_MAY_CHANGE = 1 << 1; 804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_FORCE_HIDING_CHANGED = 1 << 2; 814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_ORIENTATION_CHANGE_COMPLETE = 1 << 3; 824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_TURN_ON_SCREEN = 1 << 4; 834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski static final int SET_WALLPAPER_ACTION_PENDING = 1 << 5; 844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mWallpaperMayChange = false; 864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mOrientationChangeComplete = true; 874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean mWallpaperActionPending = false; 884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mWallpaperForceHidingChanged = false; 904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private Object mLastWindowFreezeSource = null; 914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private Session mHoldScreen = null; 924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mObscured = false; 934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mSyswin = false; 944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mScreenBrightness = -1; 954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mButtonBrightness = -1; 964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private long mUserActivityTimeout = -1; 974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mUpdateRotation = false; 984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private final Rect mTmpStartRect = new Rect(); 994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Set to true when the display contains content to show the user. 1014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // When false, the display manager may choose to mirror or blank the display. 1024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mDisplayHasContent = false; 1034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Only set while traversing the default display based on its content. 1054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Affects the behavior of mirroring on secondary displays. 1064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean mObscureApplicationContentOnSecondaryDisplays = false; 1074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private float mPreferredRefreshRate = 0; 1094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int mPreferredModeId = 0; 1114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private boolean mTraversalScheduled; 113c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi private int mDeferDepth = 0; 11424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 1154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski public WindowSurfacePlacer(WindowManagerService service) { 1164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService = service; 1174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked = mService.mWallpaperControllerLocked; 1184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 120c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 121c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#deferSurfaceLayout()} 122c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 123c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void deferLayout() { 124c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth++; 125c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 126c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 127c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi /** 128c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi * See {@link WindowManagerService#continueSurfaceLayout()} 129c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi */ 130c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi void continueLayout() { 131c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi mDeferDepth--; 132c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth <= 0) { 133c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi performSurfacePlacement(); 134c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 135c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 136c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi 1374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performSurfacePlacement() { 138c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi if (mDeferDepth > 0) { 139c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi return; 140c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi } 1414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int loopCount = 6; 1424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 14324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = false; 1444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementLoop(); 1454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(DO_TRAVERSAL); 1464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski loopCount--; 14724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (mTraversalScheduled && loopCount > 0); 1484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = false; 1494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementLoop() { 1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mInLayout) { 1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG) { 1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski throw new RuntimeException("Recursive call!"); 1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15614b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" 1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 1584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForConfig) { 1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Our configuration has changed (most likely rotation), but we 1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // don't yet have the complete configuration to report to 1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // applications. Don't do any window layout until we have it. 1654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayReady) { 1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not yet initialized, nothing to do. 1704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout"); 1744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = true; 1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean recoveringMemory = false; 1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mForceRemoves.isEmpty()) { 1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski recoveringMemory = true; 1794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Wait a little bit for things to settle down, and off we go. 1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski while (!mService.mForceRemoves.isEmpty()) { 1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = mService.mForceRemoves.remove(0); 1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.i(TAG, "Force removing: " + ws); 1834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(ws); 1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.w(TAG, 1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Due to memory failure, waiting a bit for next layout"); 1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Object tmp = new Object(); 1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski synchronized (tmp) { 1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski tmp.wait(250); 1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (InterruptedException e) { 1924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementInner(recoveringMemory); 1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (++mLayoutRepeatCount < 6) { 20324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski requestTraversal(); 2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.e(TAG, "Performed 6 layouts in a row. Skipping"); 2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) { 2134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(REPORT_WINDOWS_CHANGE); 2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE); 2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception while laying out windows", e); 2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); 2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski void debugLayoutRepeats(final String msg, int pendingLayoutChanges) { 2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) { 2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Layouts looping: " + msg + 2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges)); 2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // "Something has changed! Let's make it correct now." 2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementInner(boolean recoveringMemory) { 2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WINDOW_TRACE) { 2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, 2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "performSurfacePlacementInner: entry. Called by " 2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 2404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean updateInputWindowsNeeded = false; 2414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = mService.updateFocusedWindowLocked( 2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); 2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting tokens. 2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int numDisplays = mService.mDisplayContents.size(); 2504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i=displayContent.mExitingTokens.size()-1; i>=0; i--) { 2534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.mExitingTokens.get(i).hasVisible = false; 2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 2584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 2614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = exitingAppTokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingAppTokens.get(tokenNdx).hasVisible = false; 2634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = null; 2674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = -1; 2684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = -1; 2694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = -1; 2704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = false; 2714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTransactionSequence++; 2734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked(); 2754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo(); 2764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDw = defaultInfo.logicalWidth; 2774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDh = defaultInfo.logicalHeight; 2784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 2804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.openTransaction(); 2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 28324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski applySurfaceChangesTransaction(recoveringMemory, numDisplays, defaultDw, defaultDh); 2844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 2854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception in Window Manager", e); 2864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } finally { 2874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.closeTransaction(); 2884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 2904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowList defaultWindows = defaultDisplay.getWindowList(); 2934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If we are ready to perform an app transition, check through 2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // all of the app tokens to be shown and see if they are ready 2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to go. 2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isReady()) { 2984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked(defaultWindows); 2994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAppTransitionReadyLocked", 3014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) { 3054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We have finished the animation of an app transition. To do 3064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // this, we have delayed a lot of operations like showing and 3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hiding apps, moving apps in Z-order, etc. The app token list 3084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // reflects the correct Z-order, but the window list may now 3094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be out of sync with it. So here we will just rebuild the 3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // entire app window list. Fun! 3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= 3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.handleAnimatingStoppedAndTransitionLocked(); 3134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAnimStopAndXitionLock", 3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0 3194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.mAppTransition.isReady()) { 3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // At this point, there was a window with a wallpaper that 3214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // was force hiding other windows behind it, but now it 3224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // is going away. This may be simple -- just animate 3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // away the wallpaper and its window -- or it may be 3244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hard -- the wallpaper now needs to be shown behind 3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // something that was hidden. 3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after animateAwayWallpaperLocked", 3294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = false; 3324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperMayChange) { 3344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Wallpaper may change! Adjusting"); 3364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 3374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange", 3384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 3424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 3434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 3444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski false /*updateInputWindows*/)) { 3454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = true; 3464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM; 3474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 3514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("mLayoutNeeded", 3534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) { 3574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = mService.mResizingWindows.get(i); 3584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAppFreezing) { 3594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't remove this window until rotation has completed. 3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 3614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 362db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang // Discard the saved surface if window size is changed, it can't be reused. 363bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang if (win.mAppToken != null) { 364bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang win.mAppToken.destroySavedSurfaces(); 365db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang } 3664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.reportResized(); 3674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mResizingWindows.remove(i); 3684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_ORIENTATION && mService.mDisplayFrozen) 3714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, 3724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "With display frozen, orientationChangeComplete=" 3734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mOrientationChangeComplete); 3744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mOrientationChangeComplete) { 3754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 3764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE; 3774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLastFinishedFreezeSource = mLastWindowFreezeSource; 3784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT); 3794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.stopFreezingDisplayLocked(); 3814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Destroy the surface of any windows that are no longer visible. 3844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean wallpaperDestroyed = false; 3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski i = mService.mDestroySurface.size(); 3864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (i > 0) { 3874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 3884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski i--; 3894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = mService.mDestroySurface.get(i); 3904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mDestroying = false; 3914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mInputMethodWindow == win) { 3924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMethodWindow = null; 3934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperControllerLocked.isWallpaperTarget(win)) { 3954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wallpaperDestroyed = true; 3964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 397bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang if (!win.shouldSaveSurface()) { 398db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang win.mWinAnimator.destroySurfaceLocked(); 399db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang } 4004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } while (i > 0); 4014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mDestroySurface.clear(); 4024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting tokens? 4054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 4064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 4074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<WindowToken> exitingTokens = displayContent.mExitingTokens; 4084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingTokens.size() - 1; i >= 0; i--) { 4094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowToken token = exitingTokens.get(i); 4104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible) { 4114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingTokens.remove(i); 4124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (token.windowType == TYPE_WALLPAPER) { 4134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.removeWallpaperToken(token); 4144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting applications? 4204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 4214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 4224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 4234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 4244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingAppTokens.size() - 1; i >= 0; i--) { 4254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken token = exitingAppTokens.get(i); 4264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible && !mService.mClosingApps.contains(token) && 4274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!token.mIsExiting || token.allAppWindows.isEmpty())) { 4284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Make sure there is no animation running on this token, 4294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so any windows associated with it will be removed as 4304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon as their animations are complete 4314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.clearAnimation(); 4324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.animating = false; 4334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) 4344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, 4354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip 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) { 4804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip 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) { 4894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_ORIENTATION) Slog.d(TAG, 4904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Performing post-rotate rotation"); 4914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateRotationUncheckedLocked(false)) { 4924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 4934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = false; 4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForDrawnCallback != null || 4994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (mOrientationChangeComplete && !defaultDisplay.layoutNeeded && 5004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mUpdateRotation)) { 5014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.checkDrawnWindowsLocked(); 5024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = mService.mPendingRemove.size(); 5054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (N > 0) { 5064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mPendingRemoveTmp.length < N) { 5074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemoveTmp = new WindowState[N+10]; 5084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.toArray(mService.mPendingRemoveTmp); 5104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.clear(); 5114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayContentList displayList = new DisplayContentList(); 5124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < N; i++) { 5134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState w = mService.mPendingRemoveTmp[i]; 5144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(w); 5154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 5164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && !displayList.contains(displayContent)) { 5174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayList.add(displayContent); 5184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (DisplayContent displayContent : displayList) { 5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.assignLayersLocked(displayContent.getWindowList()); 5234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 5244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Remove all deferred displays stacks, tasks, and activities. 5284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = mService.mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) { 5294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mDisplayContents.valueAt(displayNdx).checkForDeferredActions(); 5304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindowsNeeded) { 5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 5344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setFocusTaskRegion(); 5364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Check to see if we are now in a state where the screen should 5384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be enabled, because the window obscured flags have changed. 5394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.enableScreenIfNeededLocked(); 5404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.scheduleAnimationLocked(); 5424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 54369cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale if (DEBUG_WINDOW_TRACE) Slog.e(TAG, 54469cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating()); 5454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 54724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private void applySurfaceChangesTransaction(boolean recoveringMemory, int numDisplays, 54824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int defaultDw, int defaultDh) { 54924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mWatermark != null) { 55024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mWatermark.positionSurface(defaultDw, defaultDh); 55124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 55224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mStrictModeFlash != null) { 55324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh); 55424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 55524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mCircularDisplayMask != null) { 55624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh, 55724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 55824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 55924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mEmulatorDisplayOverlay != null) { 56024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh, 56124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 56224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 56324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 56424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean focusDisplayed = false; 56524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 56624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 56724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 56824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean updateAllDrawn = false; 56924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 57024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 57124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int displayId = displayContent.getDisplayId(); 57224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dw = displayInfo.logicalWidth; 57324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dh = displayInfo.logicalHeight; 57424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDw = displayInfo.appWidth; 57524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDh = displayInfo.appHeight; 57624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); 57724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 57824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Reset for each display. 57924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent = false; 58024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate = 0; 58124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId = 0; 58224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 58324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int repeats = 0; 58424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski do { 58524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski repeats++; 58624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats > 6) { 58724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.w(TAG, "Animation repeat aborted after too many iterations"); 58824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = false; 58924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski break; 59024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 59224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats( 59324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski "On entry to LockedInner", displayContent.pendingLayoutChanges); 59424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 59524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 && 59624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.adjustWallpaperWindows()) { 59724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.assignLayersLocked(windows); 59824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 59924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 60024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 60124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay 60224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && (displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) { 60324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 60424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.updateOrientationFromAppTokensLocked(true)) { 60524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 60624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 60724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 60824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 60924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 61024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_LAYOUT) != 0) { 61124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 61224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 61324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 61424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST LOOP: Perform a layout, if needed. 61524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats < LAYOUT_REPEAT_THRESHOLD) { 61624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski performLayoutLockedInner(displayContent, repeats == 1, 61724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski false /* updateInputWindows */); 61824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else { 61924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.w(TAG, "Layout repeat skipped after too many iterations"); 62024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 62124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST AND ONE HALF LOOP: Make WindowManagerPolicy think 62324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // it is animating. 62424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges = 0; 62524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay) { 62724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.beginPostLayoutPolicyLw(dw, dh); 62824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 62924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 63024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 63124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs, 63224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mAttachedWindow); 63324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 63624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.finishPostLayoutPolicyLw(); 63724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("after finishPostLayoutPolicyLw", 63824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 63924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 64024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (displayContent.pendingLayoutChanges != 0); 64124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mObscured = false; 64324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mSyswin = false; 64424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.resetDimming(); 64524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Only used if default window 64724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean someoneLosingFocus = !mService.mLosingFocus.isEmpty(); 64824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 65024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 6515a2f2cb3de21beaa0b760bb0be1928909012f81eWale Ogunwale Task task = w.getTask(); 6525a2f2cb3de21beaa0b760bb0be1928909012f81eWale Ogunwale if (task == null && w.getDisplayContent().getHomeStack() == null 6535a2f2cb3de21beaa0b760bb0be1928909012f81eWale Ogunwale && w.getAttrs().type != TYPE_PRIVATE_PRESENTATION) { 6545a2f2cb3de21beaa0b760bb0be1928909012f81eWale Ogunwale // TODO: Understand what the use case is here and see if the conditions can be 6555a2f2cb3de21beaa0b760bb0be1928909012f81eWale Ogunwale // simplified. 65624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski continue; 65724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 65824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 65924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean obscuredChanged = w.mObscured != mObscured; 66024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 66124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Update effect. 66224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mObscured = mObscured; 66324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mObscured) { 66424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski handleNotObscuredLocked(w, innerDw, innerDh); 66524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 66624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 667112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang w.applyDimLayerIfNeeded(); 66824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 66924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && obscuredChanged 67024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && mWallpaperControllerLocked.isWallpaperTarget(w) && w.isVisibleLw()) { 67124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // This is the wallpaper target and its obscured state 67224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // changed... make sure the current wallaper's visibility 67324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // has been updated accordingly. 67424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.updateWallpaperVisibility(); 67524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 67624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 67724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final WindowStateAnimator winAnimator = w.mWinAnimator; 67824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 67924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // If the window has moved due to its containing content frame changing, then 680f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // notify the listeners and optionally animate it. Simply checking a change of 681f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // position is not enough, because being move due to dock divider is not a trigger 682f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski // for animation. 68324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.hasMoved()) { 68424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Frame has moved, containing content frame has also moved, and we're not 68524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // currently animating... let's do something. 68624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int left = w.mFrame.left; 68724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int top = w.mFrame.top; 688f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0 689f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski && !w.isDragResizing()) { 690f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski winAnimator.setMoveAnimation(left, top); 69124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 69224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 69324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski //TODO (multidisplay): Accessibility supported only for the default display. 69424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mAccessibilityController != null 69524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && displayId == Display.DEFAULT_DISPLAY) { 69624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); 69724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 69824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 69924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski try { 70024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mClient.moved(left, top); 70124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } catch (RemoteException e) { 70224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 70324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 70424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 70524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 70624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mContentChanged = false; 70724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 70824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Moved from updateWindowsAndWallpaperLocked(). 70924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 71024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Take care of the window being ready to display. 71124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean committed = winAnimator.commitFinishDrawingLocked(); 71224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && committed) { 71324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mAttrs.type == TYPE_DREAM) { 71424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // HACK: When a dream is shown, it may at that 71524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // point hide the lock screen. So we need to 71624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // redo the layout to let the phone window manager 71724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // make this happen. 71824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 71924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski FINISH_LAYOUT_REDO_LAYOUT; 72024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 72124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("dream and commitFinishDrawingLocked true", 72224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 72324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 72424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 72524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { 72624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 72724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "First draw done in potential wallpaper target " + w); 72824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperMayChange = true; 72924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 73024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 73124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("wallpaper and commitFinishDrawingLocked true", 73224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 73324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73609b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang /* 73709b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang * Updates the shown frame before we set up the surface. This is needed because 73809b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang * the resizing could change the top-left position (in addition to size) of the 7392a6a2c2de8ce2743679f488f056f22cd1adfd726Filip Gruszczynski * window. setSurfaceBoundariesLocked uses mShownPosition to position the 7402a6a2c2de8ce2743679f488f056f22cd1adfd726Filip Gruszczynski * surface. 74109b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang */ 74209b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang winAnimator.computeShownFrameLocked(); 74324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.setSurfaceBoundariesLocked(recoveringMemory); 74424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 74524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 74624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final AppWindowToken atoken = w.mAppToken; 74724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) { 74824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.d(TAG, "updateWindows: starting " + w 74924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn 75024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" + atoken.mAppAnimator.freezingScreen); 75124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 75224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) { 75324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken.lastTransactionSequence != mService.mTransactionSequence) { 75424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.lastTransactionSequence = mService.mTransactionSequence; 75524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 75624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = false; 75724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 75824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.isOnScreenIgnoringKeyguard() 75924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski || winAnimator.mAttrType == TYPE_BASE_APPLICATION) 76024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && !w.mExiting && !w.mDestroying) { 76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 76224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "Eval win " + w + ": isDrawn=" 76324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + w.isDrawnLw() 76424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + ", isAnimating=" + winAnimator.isAnimating()); 76524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!w.isDrawnLw()) { 76624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "Not displayed: s=" 767e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr + winAnimator.mSurfaceController 76824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " pv=" + w.mPolicyVisibility 76924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mDrawState=" + winAnimator.drawStateToString() 77024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " ah=" + w.mAttachedHidden 77124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " th=" + atoken.hiddenRequested 77224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " a=" + winAnimator.mAnimating); 77324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 775112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang if (w != atoken.startingWindow && !w.mAppDied) { 77624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!atoken.mAppAnimator.freezingScreen || !w.mAppFreezing) { 77724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows++; 77824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.isDrawnLw()) { 77924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numDrawnWindows++; 78024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) 78124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "tokenMayBeDrawn: " + atoken 78224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" 78324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + atoken.mAppAnimator.freezingScreen 78424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mAppFreezing=" + w.mAppFreezing); 78524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawn = true; 78624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 78824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else if (w.isDrawnLw()) { 78924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = true; 79024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && someoneLosingFocus && w == mService.mCurrentFocus 79524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && w.isDisplayedLw()) { 79624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski focusDisplayed = true; 79724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.updateResizingWindows(w); 80024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 80124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 80224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.setDisplayProperties(displayId, 80324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent, 80424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate, 80524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId, 80624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski true /* inTraversal, must call performTraversalInTrans... below */); 80724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 80824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.getDisplayContentLocked(displayId).stopDimmingIfNeeded(); 80924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 81024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (updateAllDrawn) { 81124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawnLocked(displayContent); 81224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 81524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (focusDisplayed) { 81624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS); 81724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 81824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 81924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Give the display manager a chance to adjust properties 82024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // like display rotation if it needs to. 82124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager(); 82224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 82324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 8244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isInLayout() { 8254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return mInLayout; 8264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performLayoutLockedInner(final DisplayContent displayContent, 8294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean initial, boolean updateInputWindows) { 8304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!displayContent.layoutNeeded) { 8314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 8324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = false; 8344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 8354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isDefaultDisplay = displayContent.isDefaultDisplay; 8364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 8384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dw = displayInfo.logicalWidth; 8394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dh = displayInfo.logicalHeight; 8404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mInputConsumer != null) { 8424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputConsumer.layout(dw, dh); 8434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = windows.size(); 8464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 8474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) { 8494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "-------------------------------------"); 8504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "performLayout: needed=" 8514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + displayContent.layoutNeeded + " dw=" + dw + " dh=" + dh); 8524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mService.mRotation); 8554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (isDefaultDisplay) { 8564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not needed on non-default displays. 8574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSystemDecorLayer = mService.mPolicy.getSystemDecorLayerLw(); 8584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mScreenRect.set(0, 0, dw, dh); 8594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.getContentRectLw(mService.mTmpContentRect); 8624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.resize(mService.mTmpContentRect); 8634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int seq = mService.mLayoutSeq+1; 8654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (seq < 0) seq = 0; 8664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLayoutSeq = seq; 8674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean behindDream = false; 8694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // First perform layout of any root windows (not attached 8714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to another window). 8724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topAttached = -1; 8734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = N-1; i >= 0; i--) { 8744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 8754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't do layout of a window if it is not visible, or 8774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon won't be visible, to avoid wasting time and funky 8784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // changes while a window is animating away. 8794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean gone = (behindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) 8804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || win.isGoneForLayoutLw(); 8814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT && !win.mLayoutAttached) { 8834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "1ST PASS " + win 8844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 8854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mLayoutAttached=" + win.mLayoutAttached 8864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " screen changed=" + win.isConfigChanged()); 8874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken atoken = win.mAppToken; 8884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (gone) Slog.v(TAG, " GONE: mViewVisibility=" 8894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 8904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 8914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 8924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 8934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 8944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski else Slog.v(TAG, " VIS: mViewVisibility=" 8954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 8964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 8974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 8984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 8994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 9004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 9034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 9044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 9054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 9064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 9074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!gone || !win.mHaveFrame || win.mLayoutNeeded 9084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || ((win.isConfigChanged() || win.setInsetsChanged()) && 9094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ((win.mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 || 9104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (win.mHasSurface && win.mAppToken != null && 9114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mAppToken.layoutConfigChanges)))) { 9124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!win.mLayoutAttached) { 9134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 9144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 9154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 9164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAttrs.type == TYPE_DREAM) { 9184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 9194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 9204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 9214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski behindDream = true; 9224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, null); 9264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 9274c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 9284c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Window frames may have changed. Update dim layer with the new bounds. 9294c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang final Task task = win.getTask(); 9304c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (task != null) { 9314c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang displayContent.mDimLayerController.updateDimLayer(task); 9324c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang } 9334c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 9344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" 9364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mFrame + " mContainingFrame=" 9374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" 9384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mDisplayFrame); 9394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 9404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topAttached < 0) topAttached = i; 9414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean attachedBehindDream = false; 9464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Now perform layout of attached windows, which usually 9484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // depend on the position of the window they are attached to. 9494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // XXX does not deal with windows that are attached to windows 9504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // that are themselves attached. 9514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = topAttached; i >= 0; i--) { 9524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 9534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mLayoutAttached) { 9554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" 9574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); 9584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 9594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 9604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 9614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 9624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 9634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (attachedBehindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) { 9644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 9654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 9674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || !win.mHaveFrame || win.mLayoutNeeded) { 9684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 9694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 9704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 9714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, win.mAttachedWindow); 9754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 9764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" 9784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); 9794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (win.mAttrs.type == TYPE_DREAM) { 9814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 9824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 9834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 9844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski attachedBehindDream = behindDream; 9854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9884c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Window frames may have changed. Tell the input dispatcher about it. 9894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.setUpdateInputWindowsNeededLw(); 9904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindows) { 9914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 9924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.finishLayoutLw(); 99561f39a7b988f6a22681a3f9e0bf8121f72ff88c4Jorim Jaggi mService.mH.sendEmptyMessage(UPDATE_DOCKED_STACK_DIVIDER); 9964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 9994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param windows List of windows on default display. 10004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @return bitmap indicating if another pass through layout must be made. 10014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 10024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int handleAppTransitionReadyLocked(WindowList windows) { 10034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int appsCount = mService.mOpeningApps.size(); 10044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!transitionGoodToGo(appsCount)) { 10054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return 0; 10064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 10084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int transit = mService.mAppTransition.getAppTransition(); 10094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mSkipAppTransitionAnimation) { 10104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_UNSET; 10114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSkipAppTransitionAnimation = false; 10134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.clear(); 10144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(APP_TRANSITION_TIMEOUT); 10164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.rebuildAppWindowListLocked(); 10184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = false; 10204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // The top-most window will supply the layout params, 10224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // and we will determine it below. 10234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowManager.LayoutParams animLp = null; 10244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int bestAnimLayer = -1; 10254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean fullscreenAnim = false; 10264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean voiceInteraction = false; 10274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState lowerWallpaperTarget = 10294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getLowerWallpaperTarget(); 10304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState upperWallpaperTarget = 10314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getUpperWallpaperTarget(); 10324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean openingAppHasWallpaper = false; 10344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper = false; 10354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken lowerWallpaperAppToken; 10364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken upperWallpaperAppToken; 10374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (lowerWallpaperTarget == null) { 10384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = upperWallpaperAppToken = null; 10394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = lowerWallpaperTarget.mAppToken; 10414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski upperWallpaperAppToken = upperWallpaperTarget.mAppToken; 10424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 10454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Do a first pass through the tokens for two 10464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // things: 10474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (1) Determine if both the closing and opening 10484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // app token sets are wallpaper targets, in which 10494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // case special animations are needed 10504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (since the wallpaper needs to stay static 10514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // behind them). 10524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (2) Find the layout params of the top-most 10534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // application window in the tokens, which is 10544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // what will control the animation theme. 10554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int closingAppsCount = mService.mClosingApps.size(); 10564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = closingAppsCount + mService.mOpeningApps.size(); 10574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 10584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken; 10594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (i < closingAppsCount) { 10604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mClosingApps.valueAt(i); 10614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 10624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper = true; 10634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount); 10664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 10674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppHasWallpaper = true; 10684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski voiceInteraction |= wtoken.voiceInteraction; 10724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken.appFullscreen) { 10744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 10754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 10764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 10774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 10784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski fullscreenAnim = true; 10794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (!fullscreenAnim) { 10814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 10824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 10834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws.mLayer > bestAnimLayer) { 10844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 10854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 10864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, 10924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget); 10934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If all closing windows are obscured, then there is 10954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // no need to do an animation. This is the case, for 10964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // example, when this transition is being done behind 10974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // the lock screen. 10984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mPolicy.allowAppAnimationsLw()) { 10994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 11004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Animations disallowed by keyguard or dream."); 11014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = null; 11024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski processApplicationsAnimatingInPlace(transit); 11054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topClosingApp = null; 11074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topClosingLayer = 0; 11084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = mService.mClosingApps.size(); 11094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 11104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mClosingApps.valueAt(i); 11114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 11124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 11134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Now closing app " + wtoken); 11144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 11154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 11164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.inPendingTransaction = false; 11174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false, 11184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski voiceInteraction); 11194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 11204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Force the allDrawn flag, because we want to start 11214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // this guy's animations regardless of whether it's 11224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // gotten drawn. 11234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.allDrawn = true; 11244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.deferClearAllDrawn = false; 11254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Ensure that apps that are mid-starting are also scheduled to have their 11264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // starting windows removed after the animation is complete 11274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken.startingWindow != null && !wtoken.startingWindow.mExiting) { 11284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.scheduleRemoveStartingWindowLocked(wtoken); 11294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 11314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 11334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int layer = -1; 11344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 11354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = wtoken.windows.get(j); 11364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 11374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 11384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topClosingApp == null || layer > topClosingLayer) { 11414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topClosingApp = wtoken; 11424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topClosingLayer = layer; 11434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topOpeningApp = null; 11484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = mService.mOpeningApps.size(); 11494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 11504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 11514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 11524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 11534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Now opening app" + wtoken); 11544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!appAnimator.usingTransferredAnimation) { 11564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 11574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 11584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.inPendingTransaction = false; 11604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.setTokenVisibilityLocked( 11614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken, animLp, true, transit, false, voiceInteraction)){ 11624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This token isn't going to be animating. Add it to the list of tokens to 11634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be notified of app transition complete since the notification will not be 11644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // sent be the app window animator. 11654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token); 11664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 11684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.waitingToShow = false; 11694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 11714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int windowsCount = wtoken.allAppWindows.size(); 11724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < windowsCount; j++) { 11734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 11744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1175974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1176974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()"); 1177974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski SurfaceControl.openTransaction(); 1178974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski try { 117969cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); 1180974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } finally { 1181974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski SurfaceControl.closeTransaction(); 1182974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 1183974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()"); 1184974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski } 11854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 11864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topOpeningLayer = 0; 11884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 11894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int layer = -1; 11904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 1191bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang final WindowState win = wtoken.windows.get(j); 119278a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // Clearing the mExiting flag before entering animation. It will be set to true 119378a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // if app window is removed, or window relayout to invisible. We don't want to 119478a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // clear it out for windows that get replaced, because the animation depends on 119578a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski // the flag to remove the replaced window. 119678a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski if (win.mAppToken == null || !win.mAppToken.mWillReplaceWindow) { 119778a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski win.mExiting = false; 119878a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski } 11994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 12004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 12014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topOpeningApp == null || layer > topOpeningLayer) { 12044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp = wtoken; 12054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningLayer = layer; 12064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); 1209db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang 1210bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang wtoken.restoreSavedSurfaces(); 12114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : 12144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp.mAppAnimator; 12154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : 12164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topClosingApp.mAppAnimator; 12174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator); 12194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.postAnimationCallback(); 12204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.clear(); 12214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mOpeningApps.clear(); 12234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mClosingApps.clear(); 12244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This has changed the visibility of windows, so perform 12264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a new layout to get them all up-to-date. 12274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.getDefaultDisplayContentLocked().layoutNeeded = true; 12284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // TODO(multidisplay): IMEs are only supported on the default display. 12304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (windows == mService.getDefaultWindowListLocked() 12314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.moveInputMethodWindowsIfNeededLocked(true)) { 12324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.assignLayersLocked(windows); 12334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 12354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski true /*updateInputWindows*/); 12364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 12374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.notifyActivityDrawnForKeyguard(); 123878a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG; 12394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean transitionGoodToGo(int appsCount) { 12424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Checking " + appsCount + " opening apps (frozen=" 12444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mDisplayFrozen + " timeout=" 12454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mAppTransition.isTimeout() + ")..."); 12464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAppTransition.isTimeout()) { 12474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int i = 0; i < appsCount; i++) { 12484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 12494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Check opening app=" + wtoken + ": allDrawn=" 12514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.allDrawn + " startingDisplayed=" 12524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingDisplayed + " startingMoved=" 12534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingMoved); 1254db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang 1255db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang if (wtoken.mHasSavedSurface || wtoken.mAnimatingWithSavedSurface) { 1256db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang continue; 1257db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang } 12584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { 12594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return false; 12604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12632f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi // We also need to wait for the specs to be fetched, if needed. 12642f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) { 12652f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true"); 12662f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi return false; 12672f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi } 12682f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi 12694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If the wallpaper is visible, we need to check it's ready too. 12704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return !mWallpaperControllerLocked.isWallpaperVisible() || 12714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.wallpaperTransitionReady(); 12724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return true; 12744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, 12774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget, 12784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState upperWallpaperTarget) { 12794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper 12804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); 12814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState oldWallpaper = 12824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.isWallpaperTargetAnimating() 12834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ? null : wallpaperTarget; 128449b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps; 128549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski final ArraySet<AppWindowToken> closingApps = mService.mClosingApps; 12864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New wallpaper target=" + wallpaperTarget 12884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", oldWallpaper=" + oldWallpaper 12894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", lower target=" + lowerWallpaperTarget 129049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", upper target=" + upperWallpaperTarget 129149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", openingApps=" + openingApps 129249b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski + ", closingApps=" + closingApps); 12934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = false; 12944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (closingAppHasWallpaper && openingAppHasWallpaper) { 12954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 12964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Wallpaper animation!"); 12974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski switch (transit) { 12984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_OPEN: 12994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_OPEN: 13004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_FRONT: 13014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; 13024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 13034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_CLOSE: 13044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_CLOSE: 13054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_BACK: 13064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; 13074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 13084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit: " + AppTransition.appTransitionToString(transit)); 131149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty() 131249b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski && !openingApps.contains(oldWallpaper.mAppToken) 131349b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski && closingApps.contains(oldWallpaper.mAppToken)) { 131449b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski // We are transitioning from an activity with a wallpaper to one without. 13154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; 13164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit away from wallpaper: " 13184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 131949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() && 132049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski openingApps.contains(wallpaperTarget.mAppToken)) { 13214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We are transitioning from an activity without 13224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a wallpaper to now showing the wallpaper 13234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_OPEN; 13244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 13254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit into wallpaper: " 13264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 13274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 13284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = true; 13294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return transit; 13314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 13344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param w WindowState this method is applied to. 13354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param innerDw Width of app window. 13364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param innerDh Height of app window. 13374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 13384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void handleNotObscuredLocked(final WindowState w, final int innerDw, final int innerDh) { 13394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowManager.LayoutParams attrs = w.mAttrs; 13404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int attrFlags = attrs.flags; 13414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean canBeSeen = w.isDisplayedLw(); 13424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); 13434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) { 13454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This window completely covers everything behind it, 13464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so we want to leave all of them as undimmed (for 13474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // performance reasons). 13484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscured = true; 13494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (w.mHasSurface) { 13524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 13534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = w.mSession; 13544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.screenBrightness >= 0 13564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mScreenBrightness < 0) { 13574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = w.mAttrs.screenBrightness; 13584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.buttonBrightness >= 0 13604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mButtonBrightness < 0) { 13614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = w.mAttrs.buttonBrightness; 13624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.userActivityTimeout >= 0 13644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mUserActivityTimeout < 0) { 13654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = w.mAttrs.userActivityTimeout; 13664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int type = attrs.type; 13694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen 13704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && (type == TYPE_SYSTEM_DIALOG 13714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || type == TYPE_SYSTEM_ERROR 13724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) { 13734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mSyswin = true; 13744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen) { 13774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This function assumes that the contents of the default display are 13784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // processed first before secondary displays. 13794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 13804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && displayContent.isDefaultDisplay) { 13814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // While a dream or keyguard is showing, obscure ordinary application 13824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // content on secondary displays (by forcibly enabling mirroring unless 13834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // there is other content we want to show) but still allow opaque 13844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // keyguard dialogs to be shown. 13854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { 13864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = true; 13874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 13894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (displayContent != null && 13904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!mObscureApplicationContentOnSecondaryDisplays 13914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (mObscured && type == TYPE_KEYGUARD_DIALOG))) { 13924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Allow full screen keyguard presentation dialogs to be seen. 13934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 13944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredRefreshRate == 0 13964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredRefreshRate != 0) { 13974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredRefreshRate = w.mAttrs.preferredRefreshRate; 13984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredModeId == 0 14004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredDisplayModeId != 0) { 14014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredModeId = w.mAttrs.preferredDisplayModeId; 14024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void updateAllDrawnLocked(DisplayContent displayContent) { 14084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // See if any windows have been drawn, so they (and others 14094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // associated with them) can now be shown. 14104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<TaskStack> stacks = displayContent.getStacks(); 14114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 14124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final ArrayList<Task> tasks = stacks.get(stackNdx).getTasks(); 14134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 14144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList tokens = tasks.get(taskNdx).mAppTokens; 14154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 14164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = tokens.get(tokenNdx); 14174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn) { 14184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int numInteresting = wtoken.numInterestingWindows; 14194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 14204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY) 14214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "allDrawn: " + wtoken 14224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " interesting=" + numInteresting 14234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " drawn=" + wtoken.numDrawnWindows); 14244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.allDrawn = true; 14254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Force an additional layout pass where WindowStateAnimator# 14264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // commitFinishDrawingLocked() will call performShowLocked(). 14274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 14284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, 14294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.token).sendToTarget(); 14304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private static int toBrightnessOverride(float value) { 14384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return (int)(value * PowerManager.BRIGHTNESS_ON); 14394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void processApplicationsAnimatingInPlace(int transit) { 14424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { 14434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Find the focused window 14444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = mService.findFocusedWindowLocked( 14454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.getDefaultDisplayContentLocked()); 14464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win != null) { 14474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = win.mAppToken; 14484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 14494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 14504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Now animating app in place " + wtoken); 14514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 14524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 14534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.updateTokenInPlaceLocked(wtoken, transit); 14544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 14554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 14574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = wtoken.allAppWindows.size(); 14584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < N; j++) { 14594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 14604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 146269cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked()); 14634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, 14684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int openingLayer, int closingLayer) { 14694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator; 14704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (openingAppAnimator == null || openingAppAnimator.animation == null) { 14714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 14724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int taskId = appToken.mTask.mTaskId; 14744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId); 14754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) { 14767248c568a01b4215380b0ca5d0e9583535ff2cf1Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId); 14774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 14784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This thumbnail animation is very special, we need to have 14804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // an extra surface with the thumbnail included with the animation. 14814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight()); 14824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 14834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // TODO(multi-display): support other displays 14844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); 14854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final Display display = displayContent.getDisplay(); 14864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo displayInfo = displayContent.getDisplayInfo(); 14874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Create a new surface for the thumbnail 14894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession, 14904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "thumbnail anim", dirty.width(), dirty.height(), 14914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); 14924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski surfaceControl.setLayerStack(display.getLayerStack()); 14934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_TRANSACTIONS) { 14944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE"); 14954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Draw the thumbnail onto the surface 14984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Surface drawSurface = new Surface(); 14994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.copyFrom(surfaceControl); 15004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Canvas c = drawSurface.lockCanvas(dirty); 15014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski c.drawBitmap(thumbnailHeader, 0, 0, null); 15024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.unlockCanvasAndPost(c); 15034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.release(); 15044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Get the thumbnail animation 15064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Animation anim; 15074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) { 15084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this is a multi-window scenario, we use the windows frame as 15094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // destination of the thumbnail header animation. If this is a full screen 15104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // window scenario, we use the whole display as the target. 15114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = appToken.findMainWindow(); 15124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect appRect = win != null ? win.getContentFrameLw() : 15134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight); 15144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // For the new aspect-scaled transition, we want it to always show 15154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // above the animating opening/closing window, and we want to 15164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // synchronize its thumbnail surface with the surface for the 15174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // open/close animation (only on the way down) 15184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect, 15194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski thumbnailHeader, taskId); 15204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer); 15214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.deferThumbnailDestruction = 15224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mService.mAppTransition.isNextThumbnailTransitionScaleUp(); 15234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 15244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailScaleAnimationLocked( 15254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader); 15264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.restrictDuration(MAX_ANIMATION_DURATION); 15284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked()); 15294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnail = surfaceControl; 15314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailLayer = openingLayer; 15324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailAnimation = anim; 15334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect); 15344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailX = mTmpStartRect.left; 15354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailY = mTmpStartRect.top; 15364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (Surface.OutOfResourcesException e) { 15374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w=" 15384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + dirty.width() + " h=" + dirty.height(), e); 15394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.clearThumbnail(); 15404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean copyAnimToLayoutParamsLocked() { 15444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean doRequest = false; 15454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams; 15474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) { 15484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = true; 15494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) { 15524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = true; 15534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) { 15564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = true; 15574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) { 15604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = false; 15614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 15624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = true; 15634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource; 15644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 15654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) { 15694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = true; 15704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) { 15724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = true; 15734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return doRequest; 15764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 157724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 157824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski void requestTraversal() { 157924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mTraversalScheduled) { 158024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = true; 158124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(DO_TRAVERSAL); 158224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 158324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 158424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 158524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski public void dump(PrintWriter pw, String prefix) { 158624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled); 158724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 15884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski} 1589