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