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