WindowSurfacePlacer.java revision 09b21efb97d539543259b33e2da9d4c7a41966c8
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; 504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog; 514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display; 524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo; 534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface; 544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl; 554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.View; 564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.WindowManager; 574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation; 584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.AnimationUtils; 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; 11324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 1144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski public WindowSurfacePlacer(WindowManagerService service) { 1154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService = service; 1164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked = mService.mWallpaperControllerLocked; 1174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performSurfacePlacement() { 1204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int loopCount = 6; 1214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 12224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = false; 1234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementLoop(); 1244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(DO_TRAVERSAL); 1254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski loopCount--; 12624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (mTraversalScheduled && loopCount > 0); 1274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = false; 1284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementLoop() { 1314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mInLayout) { 1324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG) { 1334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski throw new RuntimeException("Recursive call!"); 1344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.w(TAG, 1364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "performLayoutAndPlaceSurfacesLocked called while in layout. Callers=" 1374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 1384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForConfig) { 1424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Our configuration has changed (most likely rotation), but we 1434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // don't yet have the complete configuration to report to 1444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // applications. Don't do any window layout until we have it. 1454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayReady) { 1494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not yet initialized, nothing to do. 1504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout"); 1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = true; 1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean recoveringMemory = false; 1574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mForceRemoves.isEmpty()) { 1584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski recoveringMemory = true; 1594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Wait a little bit for things to settle down, and off we go. 1604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski while (!mService.mForceRemoves.isEmpty()) { 1614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = mService.mForceRemoves.remove(0); 1624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.i(TAG, "Force removing: " + ws); 1634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(ws); 1644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.w(TAG, 1664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Due to memory failure, waiting a bit for next layout"); 1674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Object tmp = new Object(); 1684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski synchronized (tmp) { 1694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 1704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski tmp.wait(250); 1714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (InterruptedException e) { 1724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski performSurfacePlacementInner(recoveringMemory); 1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (++mLayoutRepeatCount < 6) { 18324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski requestTraversal(); 1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.e(TAG, "Performed 6 layouts in a row. Skipping"); 1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLayoutRepeatCount = 0; 1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 1924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) { 1934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(REPORT_WINDOWS_CHANGE); 1944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE); 1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mInLayout = false; 1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception while laying out windows", e); 1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); 2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski void debugLayoutRepeats(final String msg, int pendingLayoutChanges) { 2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) { 2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Layouts looping: " + msg + 2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges)); 2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // "Something has changed! Let's make it correct now." 2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void performSurfacePlacementInner(boolean recoveringMemory) { 2134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WINDOW_TRACE) { 2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, 2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "performSurfacePlacementInner: entry. Called by " 2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + Debug.getCallers(3)); 2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean updateInputWindowsNeeded = false; 2214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = mService.updateFocusedWindowLocked( 2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); 2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting tokens. 2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int numDisplays = mService.mDisplayContents.size(); 2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i=displayContent.mExitingTokens.size()-1; i>=0; i--) { 2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.mExitingTokens.get(i).hasVisible = false; 2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 2384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 2404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 2414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = exitingAppTokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingAppTokens.get(tokenNdx).hasVisible = false; 2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = null; 2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = -1; 2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = -1; 2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = -1; 2504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = false; 2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTransactionSequence++; 2534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked(); 2554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo(); 2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDw = defaultInfo.logicalWidth; 2574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int defaultDh = defaultInfo.logicalHeight; 2584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces"); 2614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.openTransaction(); 2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 26324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski applySurfaceChangesTransaction(recoveringMemory, numDisplays, defaultDw, defaultDh); 2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (RuntimeException e) { 2654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.wtf(TAG, "Unhandled exception in Window Manager", e); 2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } finally { 2674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl.closeTransaction(); 2684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, 2694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); 2704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowList defaultWindows = defaultDisplay.getWindowList(); 2734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If we are ready to perform an app transition, check through 2754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // all of the app tokens to be shown and see if they are ready 2764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to go. 2774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isReady()) { 2784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked(defaultWindows); 2794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 2804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAppTransitionReadyLocked", 2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) { 2854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We have finished the animation of an app transition. To do 2864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // this, we have delayed a lot of operations like showing and 2874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hiding apps, moving apps in Z-order, etc. The app token list 2884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // reflects the correct Z-order, but the window list may now 2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be out of sync with it. So here we will just rebuild the 2904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // entire app window list. Fun! 2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= 2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.handleAnimatingStoppedAndTransitionLocked(); 2934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after handleAnimStopAndXitionLock", 2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 2984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0 2994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.mAppTransition.isReady()) { 3004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // At this point, there was a window with a wallpaper that 3014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // was force hiding other windows behind it, but now it 3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // is going away. This may be simple -- just animate 3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // away the wallpaper and its window -- or it may be 3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // hard -- the wallpaper now needs to be shown behind 3054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // something that was hidden. 3064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) 3084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski debugLayoutRepeats("after animateAwayWallpaperLocked", 3094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = false; 3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperMayChange) { 3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Wallpaper may change! Adjusting"); 3164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 3174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange", 3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mFocusMayChange) { 3224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 3244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski false /*updateInputWindows*/)) { 3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski updateInputWindowsNeeded = true; 3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM; 3274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.needsLayout()) { 3314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT; 3324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("mLayoutNeeded", 3334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges); 3344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) { 3374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = mService.mResizingWindows.get(i); 3384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAppFreezing) { 3394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't remove this window until rotation has completed. 3404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 3414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.reportResized(); 3434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mResizingWindows.remove(i); 3444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_ORIENTATION && mService.mDisplayFrozen) 3474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, 3484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "With display frozen, orientationChangeComplete=" 3494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mOrientationChangeComplete); 3504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mOrientationChangeComplete) { 3514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 3524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE; 3534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLastFinishedFreezeSource = mLastWindowFreezeSource; 3544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT); 3554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.stopFreezingDisplayLocked(); 3574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Destroy the surface of any windows that are no longer visible. 3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean wallpaperDestroyed = false; 3614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski i = mService.mDestroySurface.size(); 3624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (i > 0) { 3634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski do { 3644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski i--; 3654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = mService.mDestroySurface.get(i); 3664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mDestroying = false; 3674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mInputMethodWindow == win) { 3684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMethodWindow = null; 3694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mWallpaperControllerLocked.isWallpaperTarget(win)) { 3714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wallpaperDestroyed = true; 3724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mWinAnimator.destroySurfaceLocked(); 3744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } while (i > 0); 3754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mDestroySurface.clear(); 3764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting tokens? 3794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 3804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 3814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<WindowToken> exitingTokens = displayContent.mExitingTokens; 3824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingTokens.size() - 1; i >= 0; i--) { 3834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowToken token = exitingTokens.get(i); 3844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible) { 3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski exitingTokens.remove(i); 3864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (token.windowType == TYPE_WALLPAPER) { 3874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.removeWallpaperToken(token); 3884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 3924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 3934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Time to remove any exiting applications? 3944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) { 3954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Initialize state of exiting applications. 3964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList exitingAppTokens = 3974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens; 3984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = exitingAppTokens.size() - 1; i >= 0; i--) { 3994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken token = exitingAppTokens.get(i); 4004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!token.hasVisible && !mService.mClosingApps.contains(token) && 4014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!token.mIsExiting || token.allAppWindows.isEmpty())) { 4024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Make sure there is no animation running on this token, 4034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so any windows associated with it will be removed as 4044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon as their animations are complete 4054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.clearAnimation(); 4064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.mAppAnimator.animating = false; 4074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) 4084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, 4094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "performLayout: App token exiting now removed" + token); 4104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski token.removeAppFromTaskLocked(); 4114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wallpaperDestroyed) { 4164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 4174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski defaultDisplay.layoutNeeded = true; 4184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 4214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 4224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent.pendingLayoutChanges != 0) { 4234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 4244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Finally update all input windows now that the window changes have stabilized. 4284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(true /*force*/); 4294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setHoldScreenLocked(mHoldScreen); 4314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mDisplayFrozen) { 4324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mScreenBrightness < 0 || mScreenBrightness > 1.0f) { 4334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(-1); 4344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager( 4364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski toBrightnessOverride(mScreenBrightness)); 4374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mButtonBrightness < 0 4394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || mButtonBrightness > 1.0f) { 4404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(-1); 4414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager( 4434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski toBrightnessOverride(mButtonBrightness)); 4444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager( 4464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout); 4474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mTurnOnScreen) { 4504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAllowTheaterModeWakeFromLayout 4514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || Settings.Global.getInt(mService.mContext.getContentResolver(), 4524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Settings.Global.THEATER_MODE_ON, 0) == 0) { 4534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_POWER) { 4544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Turning screen on after layout!"); 4554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(), 4574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "android.server.wm:TURN_ON"); 4584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = false; 4604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mUpdateRotation) { 4634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_ORIENTATION) Slog.d(TAG, 4644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Performing post-rotate rotation"); 4654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.updateRotationUncheckedLocked(false)) { 4664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 4674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = false; 4694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWaitingForDrawnCallback != null || 4734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (mOrientationChangeComplete && !defaultDisplay.layoutNeeded && 4744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mUpdateRotation)) { 4754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.checkDrawnWindowsLocked(); 4764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = mService.mPendingRemove.size(); 4794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (N > 0) { 4804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mPendingRemoveTmp.length < N) { 4814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemoveTmp = new WindowState[N+10]; 4824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.toArray(mService.mPendingRemoveTmp); 4844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPendingRemove.clear(); 4854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayContentList displayList = new DisplayContentList(); 4864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < N; i++) { 4874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState w = mService.mPendingRemoveTmp[i]; 4884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.removeWindowInnerLocked(w); 4894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 4904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && !displayList.contains(displayContent)) { 4914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayList.add(displayContent); 4924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (DisplayContent displayContent : displayList) { 4964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.assignLayersLocked(displayContent.getWindowList()); 4974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 4994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Remove all deferred displays stacks, tasks, and activities. 5024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int displayNdx = mService.mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) { 5034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mDisplayContents.valueAt(displayNdx).checkForDeferredActions(); 5044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindowsNeeded) { 5074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 5084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setFocusTaskRegion(); 5104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Check to see if we are now in a state where the screen should 5124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be enabled, because the window obscured flags have changed. 5134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.enableScreenIfNeededLocked(); 5144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.scheduleAnimationLocked(); 5164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 5174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_WINDOW_TRACE) { 5184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.e(TAG, 5194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "performSurfacePlacementInner exit: animating=" 5204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mAnimator.mAnimating); 5214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 5234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 52424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski private void applySurfaceChangesTransaction(boolean recoveringMemory, int numDisplays, 52524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int defaultDw, int defaultDh) { 52624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mWatermark != null) { 52724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mWatermark.positionSurface(defaultDw, defaultDh); 52824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 52924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mStrictModeFlash != null) { 53024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh); 53124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 53224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mCircularDisplayMask != null) { 53324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh, 53424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 53524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 53624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mEmulatorDisplayOverlay != null) { 53724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh, 53824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mRotation); 53924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 54024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 54124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean focusDisplayed = false; 54224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 54324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 54424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx); 54524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski boolean updateAllDrawn = false; 54624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 54724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 54824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int displayId = displayContent.getDisplayId(); 54924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dw = displayInfo.logicalWidth; 55024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int dh = displayInfo.logicalHeight; 55124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDw = displayInfo.appWidth; 55224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int innerDh = displayInfo.appHeight; 55324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); 55424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 55524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Reset for each display. 55624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent = false; 55724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate = 0; 55824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId = 0; 55924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 56024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski int repeats = 0; 56124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski do { 56224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski repeats++; 56324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats > 6) { 56424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.w(TAG, "Animation repeat aborted after too many iterations"); 56524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = false; 56624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski break; 56724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 56824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 56924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats( 57024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski "On entry to LockedInner", displayContent.pendingLayoutChanges); 57124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 57224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 && 57324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.adjustWallpaperWindows()) { 57424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.assignLayersLocked(windows); 57524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 57624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 57724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 57824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay 57924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && (displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) { 58024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout"); 58124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.updateOrientationFromAppTokensLocked(true)) { 58224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 58324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION); 58424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 58524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 58624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 58724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_LAYOUT) != 0) { 58824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.layoutNeeded = true; 58924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 59124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST LOOP: Perform a layout, if needed. 59224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (repeats < LAYOUT_REPEAT_THRESHOLD) { 59324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski performLayoutLockedInner(displayContent, repeats == 1, 59424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski false /* updateInputWindows */); 59524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else { 59624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.w(TAG, "Layout repeat skipped after too many iterations"); 59724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 59824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 59924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // FIRST AND ONE HALF LOOP: Make WindowManagerPolicy think 60024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // it is animating. 60124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges = 0; 60224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 60324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay) { 60424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.beginPostLayoutPolicyLw(dw, dh); 60524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 60624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 60724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 60824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs, 60924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mAttachedWindow); 61024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 61124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 61224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 61324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mPolicy.finishPostLayoutPolicyLw(); 61424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("after finishPostLayoutPolicyLw", 61524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 61624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 61724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } while (displayContent.pendingLayoutChanges != 0); 61824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 61924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mObscured = false; 62024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mSyswin = false; 62124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.resetDimming(); 62224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Only used if default window 62424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean someoneLosingFocus = !mService.mLosingFocus.isEmpty(); 62524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 62624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski for (int i = windows.size() - 1; i >= 0; i--) { 62724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski WindowState w = windows.get(i); 62824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final Task task = w.getTask(); 62924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (task == null && w.getAttrs().type != TYPE_PRIVATE_PRESENTATION) { 63024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski continue; 63124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 63224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 63324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean obscuredChanged = w.mObscured != mObscured; 63424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 63524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Update effect. 63624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mObscured = mObscured; 63724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mObscured) { 63824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski handleNotObscuredLocked(w, innerDw, innerDh); 63924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 64024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (task != null && !task.getContinueDimming()) { 64224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.handleFlagDimBehind(); 64324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 64424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 64524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && obscuredChanged 64624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && mWallpaperControllerLocked.isWallpaperTarget(w) && w.isVisibleLw()) { 64724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // This is the wallpaper target and its obscured state 64824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // changed... make sure the current wallaper's visibility 64924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // has been updated accordingly. 65024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperControllerLocked.updateWallpaperVisibility(); 65124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 65224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 65324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final WindowStateAnimator winAnimator = w.mWinAnimator; 65424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 65524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // If the window has moved due to its containing content frame changing, then 65624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // notify the listeners and optionally animate it. 65724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.hasMoved()) { 65824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Frame has moved, containing content frame has also moved, and we're not 65924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // currently animating... let's do something. 66024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int left = w.mFrame.left; 66124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final int top = w.mFrame.top; 66224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0) { 66324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Animation a = AnimationUtils.loadAnimation(mService.mContext, 66424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski com.android.internal.R.anim.window_move_from_decor); 66524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.setAnimation(a); 66624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.mAnimDw = w.mLastFrame.left - left; 66724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.mAnimDh = w.mLastFrame.top - top; 66824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.mAnimateMove = true; 66924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.mAnimatingMove = true; 67024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 67124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 67224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski //TODO (multidisplay): Accessibility supported only for the default display. 67324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (mService.mAccessibilityController != null 67424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && displayId == Display.DEFAULT_DISPLAY) { 67524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked(); 67624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 67724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 67824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski try { 67924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mClient.moved(left, top); 68024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } catch (RemoteException e) { 68124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 68224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 68324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 68424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); 68524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski w.mContentChanged = false; 68624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 68724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Moved from updateWindowsAndWallpaperLocked(). 68824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mHasSurface) { 68924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Take care of the window being ready to display. 69024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final boolean committed = winAnimator.commitFinishDrawingLocked(); 69124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && committed) { 69224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.mAttrs.type == TYPE_DREAM) { 69324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // HACK: When a dream is shown, it may at that 69424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // point hide the lock screen. So we need to 69524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // redo the layout to let the phone window manager 69624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // make this happen. 69724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= 69824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski FINISH_LAYOUT_REDO_LAYOUT; 69924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 70024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("dream and commitFinishDrawingLocked true", 70124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 70224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 70324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 70424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) { 70524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_WALLPAPER_LIGHT) 70624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "First draw done in potential wallpaper target " + w); 70724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mWallpaperMayChange = true; 70824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; 70924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_LAYOUT_REPEATS) { 71024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski debugLayoutRepeats("wallpaper and commitFinishDrawingLocked true", 71124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski displayContent.pendingLayoutChanges); 71224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 71324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 71424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 71509b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang /* 71609b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang * Updates the shown frame before we set up the surface. This is needed because 71709b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang * the resizing could change the top-left position (in addition to size) of the 71809b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang * window. setSurfaceBoundariesLocked uses mShownFrame to position the surface. 71909b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang */ 72009b21efb97d539543259b33e2da9d4c7a41966c8Chong Zhang winAnimator.computeShownFrameLocked(); 72124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski winAnimator.setSurfaceBoundariesLocked(recoveringMemory); 72224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 72324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 72424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski final AppWindowToken atoken = w.mAppToken; 72524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) { 72624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.d(TAG, "updateWindows: starting " + w 72724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn 72824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" + atoken.mAppAnimator.freezingScreen); 72924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken != null && (!atoken.allDrawn || atoken.mAppAnimator.freezingScreen)) { 73124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (atoken.lastTransactionSequence != mService.mTransactionSequence) { 73224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.lastTransactionSequence = mService.mTransactionSequence; 73324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows = atoken.numDrawnWindows = 0; 73424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = false; 73524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 73624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if ((w.isOnScreenIgnoringKeyguard() 73724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski || winAnimator.mAttrType == TYPE_BASE_APPLICATION) 73824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && !w.mExiting && !w.mDestroying) { 73924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) { 74024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "Eval win " + w + ": isDrawn=" 74124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + w.isDrawnLw() 74224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + ", isAnimating=" + winAnimator.isAnimating()); 74324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!w.isDrawnLw()) { 74424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "Not displayed: s=" 74524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + winAnimator.mSurfaceControl 74624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " pv=" + w.mPolicyVisibility 74724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mDrawState=" + winAnimator.drawStateToString() 74824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " ah=" + w.mAttachedHidden 74924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " th=" + atoken.hiddenRequested 75024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " a=" + winAnimator.mAnimating); 75124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 75224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 75324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w != atoken.startingWindow) { 75424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!atoken.mAppAnimator.freezingScreen || !w.mAppFreezing) { 75524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numInterestingWindows++; 75624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (w.isDrawnLw()) { 75724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.numDrawnWindows++; 75824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) 75924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski Slog.v(TAG, "tokenMayBeDrawn: " + atoken 76024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " freezingScreen=" 76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + atoken.mAppAnimator.freezingScreen 76224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski + " mAppFreezing=" + w.mAppFreezing); 76324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawn = true; 76424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 76524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 76624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } else if (w.isDrawnLw()) { 76724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski atoken.startingDisplayed = true; 76824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 76924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 77224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (isDefaultDisplay && someoneLosingFocus && w == mService.mCurrentFocus 77324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski && w.isDisplayedLw()) { 77424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski focusDisplayed = true; 77524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 77724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.updateResizingWindows(w); 77824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 77924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 78024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.setDisplayProperties(displayId, 78124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mDisplayHasContent, 78224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredRefreshRate, 78324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mPreferredModeId, 78424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski true /* inTraversal, must call performTraversalInTrans... below */); 78524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 78624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.getDisplayContentLocked(displayId).stopDimmingIfNeeded(); 78724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 78824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (updateAllDrawn) { 78924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski updateAllDrawnLocked(displayContent); 79024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (focusDisplayed) { 79424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS); 79524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 79624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 79724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // Give the display manager a chance to adjust properties 79824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski // like display rotation if it needs to. 79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager(); 80024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 80124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 8024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isInLayout() { 8034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return mInLayout; 8044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final void performLayoutLockedInner(final DisplayContent displayContent, 8074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean initial, boolean updateInputWindows) { 8084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!displayContent.layoutNeeded) { 8094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 8104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = false; 8124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowList windows = displayContent.getWindowList(); 8134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean isDefaultDisplay = displayContent.isDefaultDisplay; 8144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski DisplayInfo displayInfo = displayContent.getDisplayInfo(); 8164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dw = displayInfo.logicalWidth; 8174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int dh = displayInfo.logicalHeight; 8184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mInputConsumer != null) { 8204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputConsumer.layout(dw, dh); 8214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = windows.size(); 8244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 8254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) { 8274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "-------------------------------------"); 8284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "performLayout: needed=" 8294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + displayContent.layoutNeeded + " dw=" + dw + " dh=" + dh); 8304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mService.mRotation); 8334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (isDefaultDisplay) { 8344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Not needed on non-default displays. 8354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSystemDecorLayer = mService.mPolicy.getSystemDecorLayerLw(); 8364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mScreenRect.set(0, 0, dw, dh); 8374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.getContentRectLw(mService.mTmpContentRect); 8404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.resize(mService.mTmpContentRect); 8414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int seq = mService.mLayoutSeq+1; 8434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (seq < 0) seq = 0; 8444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mLayoutSeq = seq; 8454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean behindDream = false; 8474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // First perform layout of any root windows (not attached 8494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // to another window). 8504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topAttached = -1; 8514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = N-1; i >= 0; i--) { 8524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 8534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't do layout of a window if it is not visible, or 8554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // soon won't be visible, to avoid wasting time and funky 8564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // changes while a window is animating away. 8574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean gone = (behindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) 8584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || win.isGoneForLayoutLw(); 8594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT && !win.mLayoutAttached) { 8614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "1ST PASS " + win 8624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame 8634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mLayoutAttached=" + win.mLayoutAttached 8644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " screen changed=" + win.isConfigChanged()); 8654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken atoken = win.mAppToken; 8664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (gone) Slog.v(TAG, " GONE: mViewVisibility=" 8674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 8684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 8694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 8704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 8714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 8724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski else Slog.v(TAG, " VIS: mViewVisibility=" 8734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" 8744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRelayoutCalled + " hidden=" 8754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mRootToken.hidden + " hiddenRequested=" 8764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + (atoken != null && atoken.hiddenRequested) 8774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " mAttachedHidden=" + win.mAttachedHidden); 8784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 8804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 8814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 8824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 8834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 8844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 8854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!gone || !win.mHaveFrame || win.mLayoutNeeded 8864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || ((win.isConfigChanged() || win.setInsetsChanged()) && 8874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ((win.mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 || 8884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (win.mHasSurface && win.mAppToken != null && 8894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mAppToken.layoutConfigChanges)))) { 8904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!win.mLayoutAttached) { 8914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 8924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 8934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 8944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 8954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mAttrs.type == TYPE_DREAM) { 8964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 8974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 8984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 8994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski behindDream = true; 9004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, null); 9044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 9054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" 9074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mFrame + " mContainingFrame=" 9084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" 9094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mDisplayFrame); 9104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 9114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topAttached < 0) topAttached = i; 9124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean attachedBehindDream = false; 9174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Now perform layout of attached windows, which usually 9194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // depend on the position of the window they are attached to. 9204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // XXX does not deal with windows that are attached to windows 9214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // that are themselves attached. 9224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = topAttached; i >= 0; i--) { 9234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = windows.get(i); 9244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mLayoutAttached) { 9264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" 9284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); 9294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this view is GONE, then skip it -- keep the current 9304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // frame, and let the caller know so they can ignore it 9314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if they want. (We do the normal layout for INVISIBLE 9324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // windows, since that means "perform layout as normal, 9334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // just don't display"). 9344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (attachedBehindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) { 9354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski continue; 9364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled) 9384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || !win.mHaveFrame || win.mLayoutNeeded) { 9394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (initial) { 9404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); 9414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mContentChanged = false; 9424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutNeeded = false; 9444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.prelayout(); 9454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.layoutWindowLw(win, win.mAttachedWindow); 9464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski win.mLayoutSeq = seq; 9474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_LAYOUT) Slog.v(TAG, 9484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" 9494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); 9504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (win.mAttrs.type == TYPE_DREAM) { 9524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Don't layout windows behind a dream, so that if it 9534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // does stuff like hide the status bar we won't get a 9544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // bad transition when it goes away. 9554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski attachedBehindDream = behindDream; 9564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Window frames may have changed. Tell the input dispatcher about it. 9604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.setUpdateInputWindowsNeededLw(); 9614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (updateInputWindows) { 9624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mInputMonitor.updateInputWindowsLw(false /*force*/); 9634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mPolicy.finishLayoutLw(); 9664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 9694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param windows List of windows on default display. 9704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @return bitmap indicating if another pass through layout must be made. 9714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 9724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int handleAppTransitionReadyLocked(WindowList windows) { 9734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int appsCount = mService.mOpeningApps.size(); 9744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!transitionGoodToGo(appsCount)) { 9754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return 0; 9764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO"); 9784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int transit = mService.mAppTransition.getAppTransition(); 9794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mSkipAppTransitionAnimation) { 9804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_UNSET; 9814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 9824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mSkipAppTransitionAnimation = false; 9834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.clear(); 9844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.removeMessages(APP_TRANSITION_TIMEOUT); 9864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.rebuildAppWindowListLocked(); 9884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = false; 9904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // The top-most window will supply the layout params, 9924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // and we will determine it below. 9934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowManager.LayoutParams animLp = null; 9944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int bestAnimLayer = -1; 9954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean fullscreenAnim = false; 9964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean voiceInteraction = false; 9974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 9984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState lowerWallpaperTarget = 9994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getLowerWallpaperTarget(); 10004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState upperWallpaperTarget = 10014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.getUpperWallpaperTarget(); 10024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean openingAppHasWallpaper = false; 10044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper = false; 10054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken lowerWallpaperAppToken; 10064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken upperWallpaperAppToken; 10074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (lowerWallpaperTarget == null) { 10084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = upperWallpaperAppToken = null; 10094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski lowerWallpaperAppToken = lowerWallpaperTarget.mAppToken; 10114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski upperWallpaperAppToken = upperWallpaperTarget.mAppToken; 10124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int i; 10154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Do a first pass through the tokens for two 10164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // things: 10174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (1) Determine if both the closing and opening 10184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // app token sets are wallpaper targets, in which 10194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // case special animations are needed 10204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (since the wallpaper needs to stay static 10214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // behind them). 10224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // (2) Find the layout params of the top-most 10234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // application window in the tokens, which is 10244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // what will control the animation theme. 10254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int closingAppsCount = mService.mClosingApps.size(); 10264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = closingAppsCount + mService.mOpeningApps.size(); 10274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 10284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken; 10294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (i < closingAppsCount) { 10304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mClosingApps.valueAt(i); 10314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 10324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper = true; 10334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 10354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount); 10364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { 10374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppHasWallpaper = true; 10384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski voiceInteraction |= wtoken.voiceInteraction; 10424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken.appFullscreen) { 10444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 10454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 10464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 10474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 10484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski fullscreenAnim = true; 10494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (!fullscreenAnim) { 10514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState ws = wtoken.findMainWindow(); 10524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws != null) { 10534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (ws.mLayer > bestAnimLayer) { 10544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = ws.mAttrs; 10554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski bestAnimLayer = ws.mLayer; 10564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper, 10624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget); 10634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If all closing windows are obscured, then there is 10654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // no need to do an animation. This is the case, for 10664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // example, when this transition is being done behind 10674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // the lock screen. 10684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mPolicy.allowAppAnimationsLw()) { 10694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 10704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Animations disallowed by keyguard or dream."); 10714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski animLp = null; 10724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 10734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski processApplicationsAnimatingInPlace(transit); 10754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 10764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topClosingApp = null; 10774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topClosingLayer = 0; 10784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = mService.mClosingApps.size(); 10794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 10804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mClosingApps.valueAt(i); 10814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 10824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 10834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Now closing app " + wtoken); 10844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 10854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 10864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.inPendingTransaction = false; 10874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false, 10884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski voiceInteraction); 10894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 10904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Force the allDrawn flag, because we want to start 10914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // this guy's animations regardless of whether it's 10924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // gotten drawn. 10934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.allDrawn = true; 10944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.deferClearAllDrawn = false; 10954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Ensure that apps that are mid-starting are also scheduled to have their 10964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // starting windows removed after the animation is complete 10974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (wtoken.startingWindow != null && !wtoken.startingWindow.mExiting) { 10984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.scheduleRemoveStartingWindowLocked(wtoken); 10994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 11014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 11034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int layer = -1; 11044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 11054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = wtoken.windows.get(j); 11064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 11074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 11084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topClosingApp == null || layer > topClosingLayer) { 11114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topClosingApp = wtoken; 11124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topClosingLayer = layer; 11134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken topOpeningApp = null; 11184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appsCount = mService.mOpeningApps.size(); 11194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (i = 0; i < appsCount; i++) { 11204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 11214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 11224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 11234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Now opening app" + wtoken); 11244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!appAnimator.usingTransferredAnimation) { 11264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 11274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 11284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.inPendingTransaction = false; 11304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.setTokenVisibilityLocked( 11314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken, animLp, true, transit, false, voiceInteraction)){ 11324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This token isn't going to be animating. Add it to the list of tokens to 11334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // be notified of app transition complete since the notification will not be 11344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // sent be the app window animator. 11354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token); 11364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 11384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.waitingToShow = false; 11394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 11414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int windowsCount = wtoken.allAppWindows.size(); 11424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < windowsCount; j++) { 11434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 11444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); 11464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 11474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int topOpeningLayer = 0; 11494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (animLp != null) { 11504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int layer = -1; 11514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < wtoken.windows.size(); j++) { 11524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = wtoken.windows.get(j); 11534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win.mWinAnimator.mAnimLayer > layer) { 11544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski layer = win.mWinAnimator.mAnimLayer; 11554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (topOpeningApp == null || layer > topOpeningLayer) { 11584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp = wtoken; 11594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningLayer = layer; 11604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer); 11634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : 11664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topOpeningApp.mAppAnimator; 11674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : 11684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski topClosingApp.mAppAnimator; 11694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator); 11714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.postAnimationCallback(); 11724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.clear(); 11734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mOpeningApps.clear(); 11754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mClosingApps.clear(); 11764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This has changed the visibility of windows, so perform 11784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a new layout to get them all up-to-date. 11794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.getDefaultDisplayContentLocked().layoutNeeded = true; 11804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // TODO(multidisplay): IMEs are only supported on the default display. 11824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (windows == mService.getDefaultWindowListLocked() 11834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.moveInputMethodWindowsIfNeededLocked(true)) { 11844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.assignLayersLocked(windows); 11854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES, 11874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski true /*updateInputWindows*/); 11884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mFocusMayChange = false; 11894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.notifyActivityDrawnForKeyguard(); 11904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return FINISH_LAYOUT_REDO_LAYOUT 11914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski | FINISH_LAYOUT_REDO_CONFIG; 11924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 11944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 11954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private boolean transitionGoodToGo(int appsCount) { 11964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 11974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Checking " + appsCount + " opening apps (frozen=" 11984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mDisplayFrozen + " timeout=" 11994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + mService.mAppTransition.isTimeout() + ")..."); 12004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mService.mAppTransition.isTimeout()) { 12014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int i = 0; i < appsCount; i++) { 12024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); 12034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "Check opening app=" + wtoken + ": allDrawn=" 12054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.allDrawn + " startingDisplayed=" 12064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingDisplayed + " startingMoved=" 12074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + wtoken.startingMoved); 12084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) { 12094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return false; 12104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If the wallpaper is visible, we need to check it's ready too. 12144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return !mWallpaperControllerLocked.isWallpaperVisible() || 12154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.wallpaperTransitionReady(); 12164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return true; 12184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, 12214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget, 12224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState upperWallpaperTarget) { 12234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper 12244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); 12254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState oldWallpaper = 12264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperControllerLocked.isWallpaperTargetAnimating() 12274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ? null : wallpaperTarget; 12284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New wallpaper target=" + wallpaperTarget 12304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", oldWallpaper=" + oldWallpaper 12314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", lower target=" + lowerWallpaperTarget 12324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + ", upper target=" + upperWallpaperTarget); 12334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = false; 12344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (closingAppHasWallpaper && openingAppHasWallpaper) { 12354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 12364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Wallpaper animation!"); 12374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski switch (transit) { 12384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_OPEN: 12394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_OPEN: 12404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_FRONT: 12414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN; 12424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 12434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_ACTIVITY_CLOSE: 12444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_CLOSE: 12454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski case AppTransition.TRANSIT_TASK_TO_BACK: 12464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE; 12474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski break; 12484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit: " + AppTransition.appTransitionToString(transit)); 12514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if ((oldWallpaper != null) && !mService.mOpeningApps.isEmpty() 12524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && !mService.mOpeningApps.contains(oldWallpaper.mAppToken)) { 12534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We are transitioning from an activity with 12544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a wallpaper to one without. 12554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_CLOSE; 12564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit away from wallpaper: " 12584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 12594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw()) { 12604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // We are transitioning from an activity without 12614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // a wallpaper to now showing the wallpaper 12624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski transit = AppTransition.TRANSIT_WALLPAPER_OPEN; 12634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, 12644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "New transit into wallpaper: " 12654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + AppTransition.appTransitionToString(transit)); 12664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 12674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimateWallpaperWithTarget = true; 12684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return transit; 12704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski /** 12734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param w WindowState this method is applied to. 12744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param innerDw Width of app window. 12754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * @param innerDh Height of app window. 12764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */ 12774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void handleNotObscuredLocked(final WindowState w, final int innerDw, final int innerDh) { 12784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowManager.LayoutParams attrs = w.mAttrs; 12794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int attrFlags = attrs.flags; 12804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean canBeSeen = w.isDisplayedLw(); 12814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); 12824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) { 12844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This window completely covers everything behind it, 12854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // so we want to leave all of them as undimmed (for 12864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // performance reasons). 12874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscured = true; 12884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 12904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (w.mHasSurface) { 12914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { 12924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mHoldScreen = w.mSession; 12934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.screenBrightness >= 0 12954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mScreenBrightness < 0) { 12964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mScreenBrightness = w.mAttrs.screenBrightness; 12974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 12984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.buttonBrightness >= 0 12994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mButtonBrightness < 0) { 13004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mButtonBrightness = w.mAttrs.buttonBrightness; 13014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!mSyswin && w.mAttrs.userActivityTimeout >= 0 13034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && mUserActivityTimeout < 0) { 13044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUserActivityTimeout = w.mAttrs.userActivityTimeout; 13054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int type = attrs.type; 13084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen 13094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && (type == TYPE_SYSTEM_DIALOG 13104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || type == TYPE_SYSTEM_ERROR 13114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) { 13124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mSyswin = true; 13134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (canBeSeen) { 13164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This function assumes that the contents of the default display are 13174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // processed first before secondary displays. 13184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = w.getDisplayContent(); 13194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (displayContent != null && displayContent.isDefaultDisplay) { 13204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // While a dream or keyguard is showing, obscure ordinary application 13214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // content on secondary displays (by forcibly enabling mirroring unless 13224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // there is other content we want to show) but still allow opaque 13234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // keyguard dialogs to be shown. 13244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { 13254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mObscureApplicationContentOnSecondaryDisplays = true; 13264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 13284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else if (displayContent != null && 13294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski (!mObscureApplicationContentOnSecondaryDisplays 13304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski || (mObscured && type == TYPE_KEYGUARD_DIALOG))) { 13314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Allow full screen keyguard presentation dialogs to be seen. 13324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mDisplayHasContent = true; 13334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredRefreshRate == 0 13354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredRefreshRate != 0) { 13364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredRefreshRate = w.mAttrs.preferredRefreshRate; 13374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mPreferredModeId == 0 13394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski && w.mAttrs.preferredDisplayModeId != 0) { 13404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mPreferredModeId = w.mAttrs.preferredDisplayModeId; 13414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void updateAllDrawnLocked(DisplayContent displayContent) { 13474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // See if any windows have been drawn, so they (and others 13484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // associated with them) can now be shown. 13494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski ArrayList<TaskStack> stacks = displayContent.getStacks(); 13504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 13514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final ArrayList<Task> tasks = stacks.get(stackNdx).getTasks(); 13524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 13534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppTokenList tokens = tasks.get(taskNdx).mAppTokens; 13544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) { 13554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = tokens.get(tokenNdx); 13564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (!wtoken.allDrawn) { 13574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int numInteresting = wtoken.numInterestingWindows; 13584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) { 13594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_VISIBILITY) 13604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "allDrawn: " + wtoken 13614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " interesting=" + numInteresting 13624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + " drawn=" + wtoken.numDrawnWindows); 13634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.allDrawn = true; 13644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Force an additional layout pass where WindowStateAnimator# 13654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // commitFinishDrawingLocked() will call performShowLocked(). 13664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayContent.layoutNeeded = true; 13674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, 13684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.token).sendToTarget(); 13694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private static int toBrightnessOverride(float value) { 13774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return (int)(value * PowerManager.BRIGHTNESS_ON); 13784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 13794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void processApplicationsAnimatingInPlace(int transit) { 13814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) { 13824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Find the focused window 13834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final WindowState win = mService.findFocusedWindowLocked( 13844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.getDefaultDisplayContentLocked()); 13854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (win != null) { 13864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowToken wtoken = win.mAppToken; 13874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final AppWindowAnimator appAnimator = wtoken.mAppAnimator; 13884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (DEBUG_APP_TRANSITIONS) 13894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.v(TAG, "Now animating app in place " + wtoken); 13904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.clearThumbnail(); 13914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.animation = null; 13924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.updateTokenInPlaceLocked(wtoken, transit); 13934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski wtoken.updateReportedVisibilityLocked(); 13944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 13954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.clear(); 13964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int N = wtoken.allAppWindows.size(); 13974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski for (int j = 0; j < N; j++) { 13984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator); 13994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating(); 14014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAnimator.mAnimating |= appAnimator.showAllWindowsLocked(); 14024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski private void createThumbnailAppAnimator(int transit, AppWindowToken appToken, 14074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski int openingLayer, int closingLayer) { 14084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator; 14094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (openingAppAnimator == null || openingAppAnimator.animation == null) { 14104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 14114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int taskId = appToken.mTask.mTaskId; 14134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId); 14144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) { 14154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return; 14164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // This thumbnail animation is very special, we need to have 14184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // an extra surface with the thumbnail included with the animation. 14194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight()); 14204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski try { 14214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // TODO(multi-display): support other displays 14224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); 14234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final Display display = displayContent.getDisplay(); 14244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final DisplayInfo displayInfo = displayContent.getDisplayInfo(); 14254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Create a new surface for the thumbnail 14274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession, 14284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski "thumbnail anim", dirty.width(), dirty.height(), 14294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN); 14304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski surfaceControl.setLayerStack(display.getLayerStack()); 14314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (SHOW_TRANSACTIONS) { 14324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE"); 14334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Draw the thumbnail onto the surface 14364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Surface drawSurface = new Surface(); 14374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.copyFrom(surfaceControl); 14384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Canvas c = drawSurface.lockCanvas(dirty); 14394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski c.drawBitmap(thumbnailHeader, 0, 0, null); 14404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.unlockCanvasAndPost(c); 14414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski drawSurface.release(); 14424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // Get the thumbnail animation 14444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Animation anim; 14454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) { 14464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // If this is a multi-window scenario, we use the windows frame as 14474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // destination of the thumbnail header animation. If this is a full screen 14484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // window scenario, we use the whole display as the target. 14494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski WindowState win = appToken.findMainWindow(); 14504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Rect appRect = win != null ? win.getContentFrameLw() : 14514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight); 14524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // For the new aspect-scaled transition, we want it to always show 14534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // above the animating opening/closing window, and we want to 14544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // synchronize its thumbnail surface with the surface for the 14554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski // open/close animation (only on the way down) 14564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect, 14574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski thumbnailHeader, taskId); 14584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer); 14594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.deferThumbnailDestruction = 14604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski !mService.mAppTransition.isNextThumbnailTransitionScaleUp(); 14614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 14624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim = mService.mAppTransition.createThumbnailScaleAnimationLocked( 14634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader); 14644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.restrictDuration(MAX_ANIMATION_DURATION); 14664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked()); 14674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnail = surfaceControl; 14694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailLayer = openingLayer; 14704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailAnimation = anim; 14714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect); 14724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailX = mTmpStartRect.left; 14734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.thumbnailY = mTmpStartRect.top; 14744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } catch (Surface.OutOfResourcesException e) { 14754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w=" 14764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski + dirty.width() + " h=" + dirty.height(), e); 14774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski openingAppAnimator.clearThumbnail(); 14784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean copyAnimToLayoutParamsLocked() { 14824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski boolean doRequest = false; 14834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 14844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams; 14854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) { 14864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mUpdateRotation = true; 14874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 14884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) { 14904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperMayChange = true; 14914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 14924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) { 14944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperForceHidingChanged = true; 14954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 14964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 14974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) { 14984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = false; 14994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } else { 15004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mOrientationChangeComplete = true; 15014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource; 15024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) { 15034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski doRequest = true; 15044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) { 15074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mService.mTurnOnScreen = true; 15084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) { 15104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski mWallpaperActionPending = true; 15114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 15124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski 15134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski return doRequest; 15144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski } 151524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 151624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski void requestTraversal() { 151724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski if (!mTraversalScheduled) { 151824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mTraversalScheduled = true; 151924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski mService.mH.sendEmptyMessage(DO_TRAVERSAL); 152024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 152124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 152224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski 152324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski public void dump(PrintWriter pw, String prefix) { 152424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled); 152524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski } 15264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski} 1527