14501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskipackage com.android.server.wm;
24501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_SAVED_SURFACE;
4275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_STARTING_WINDOW;
5275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
6275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggiimport static android.app.ActivityManagerInternal.APP_TRANSITION_WINDOWS_DRAWN;
74501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
84501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
94501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
1143e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE;
124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_DREAM;
144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG;
154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM;
194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_CONFIG;
204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_LAYOUT;
214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
220bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG;
230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE;
240bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS;
250bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT;
260bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS;
270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION;
280bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER;
290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW;
300bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT;
310bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT;
330bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_TRACE;
344ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhangimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_KEEP_SCREEN_ON;
350bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_LIGHT_TRANSACTIONS;
360bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
374ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhangimport static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON;
38192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
390bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
40192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.DO_TRAVERSAL;
41192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN;
42192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_APP_TRANSITION_STARTING;
43192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.NOTIFY_STARTING_WINDOW_DRAWN;
44192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_LOSING_FOCUS;
45192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.REPORT_WINDOWS_CHANGE;
46192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.SEND_NEW_CONFIGURATION;
47192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.UPDATE_DOCKED_STACK_DIVIDER;
48192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.H.WINDOW_FREEZE_TIMEOUT;
49192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.LAYOUT_REPEAT_THRESHOLD;
50192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggiimport static com.android.server.wm.WindowManagerService.MAX_ANIMATION_DURATION;
514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_WILL_PLACE_SURFACES;
534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport static com.android.server.wm.WindowManagerService.WINDOWS_FREEZING_SCREENS_NONE;
544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Bitmap;
564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Canvas;
574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.PixelFormat;
584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.graphics.Rect;
594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Debug;
604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.PowerManager;
614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.RemoteException;
624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.SystemClock;
634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.os.Trace;
644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.provider.Settings;
6549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynskiimport android.util.ArraySet;
664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.util.Slog;
674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Display;
684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.DisplayInfo;
694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.Surface;
704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.SurfaceControl;
714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.View;
724cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynskiimport android.view.WindowManager.LayoutParams;
734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport android.view.animation.Animation;
744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
75d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggiimport com.android.server.wm.WindowManagerService.H;
76d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi
7724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynskiimport java.io.PrintWriter;
784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiimport java.util.ArrayList;
794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski/**
814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * Positions windows and their surfaces.
824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski *
834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * It sets positions of windows by calculating their frames and then applies this by positioning
844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski * surfaces according to these frames. Z layer is still assigned withing WindowManagerService.
854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski */
864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynskiclass WindowSurfacePlacer {
87ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski    private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowSurfacePlacer" : TAG_WM;
884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WindowManagerService mService;
894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final WallpaperController mWallpaperControllerLocked;
904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mInLayout = false;
924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /** Only do a maximum of 6 repeated layouts. After that quit */
944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int mLayoutRepeatCount;
954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_UPDATE_ROTATION                = 1 << 0;
974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_MAY_CHANGE           = 1 << 1;
984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_FORCE_HIDING_CHANGED           = 1 << 2;
994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_ORIENTATION_CHANGE_COMPLETE    = 1 << 3;
1004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_TURN_ON_SCREEN                 = 1 << 4;
1014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    static final int SET_WALLPAPER_ACTION_PENDING       = 1 << 5;
1024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean mWallpaperMayChange = false;
1044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean mOrientationChangeComplete = true;
1054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean mWallpaperActionPending = false;
1064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mWallpaperForceHidingChanged = false;
1084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private Object mLastWindowFreezeSource = null;
1094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private Session mHoldScreen = null;
1104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mObscured = false;
1114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mSyswin = false;
1124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private float mScreenBrightness = -1;
1134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private float mButtonBrightness = -1;
1144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private long mUserActivityTimeout = -1;
1154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mUpdateRotation = false;
1164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private final Rect mTmpStartRect = new Rect();
117b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale    private final Rect mTmpContentRect = new Rect();
1184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    // Set to true when the display contains content to show the user.
1204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    // When false, the display manager may choose to mirror or blank the display.
1214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mDisplayHasContent = false;
1224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    // Only set while traversing the default display based on its content.
1244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    // Affects the behavior of mirroring on secondary displays.
1254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean mObscureApplicationContentOnSecondaryDisplays = false;
1264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private float mPreferredRefreshRate = 0;
1284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int mPreferredModeId = 0;
1304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
13124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    private boolean mTraversalScheduled;
132c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    private int mDeferDepth = 0;
13324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
13443e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi    private boolean mSustainedPerformanceModeEnabled = false;
13543e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi    private boolean mSustainedPerformanceModeCurrent = false;
13643e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi
1374ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang    // Following variables are for debugging screen wakelock only.
1384ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang    // Last window that requires screen wakelock
1394ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang    WindowState mHoldScreenWindow = null;
1404ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang    // Last window that obscures all windows below
1414ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang    WindowState mObsuringWindow = null;
1424ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang
1434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private static final class LayerAndToken {
1444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public int layer;
1454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        public AppWindowToken token;
1464cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
1474cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private final LayerAndToken mTmpLayerAndToken = new LayerAndToken();
1484cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
1493dac63a18d9115405404561d327010604420b07bJorim Jaggi    private final ArrayList<SurfaceControl> mPendingDestroyingSurfaces = new ArrayList<>();
1503dac63a18d9115405404561d327010604420b07bJorim Jaggi
1514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    public WindowSurfacePlacer(WindowManagerService service) {
1524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService = service;
1534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mWallpaperControllerLocked = mService.mWallpaperControllerLocked;
1544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
156c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
157c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#deferSurfaceLayout()}
158c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
159c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void deferLayout() {
160c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth++;
161c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
162c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
163c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    /**
164c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     * See {@link WindowManagerService#continueSurfaceLayout()}
165c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi     */
166c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    void continueLayout() {
167c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        mDeferDepth--;
168c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        if (mDeferDepth <= 0) {
169c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            performSurfacePlacement();
170c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
171c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi    }
172c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi
1734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    final void performSurfacePlacement() {
174c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        if (mDeferDepth > 0) {
175c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi            return;
176c402520fe0fe8e85e2f905343ce2a2a740c48d9aJorim Jaggi        }
1774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int loopCount = 6;
1784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        do {
17924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = false;
1804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            performSurfacePlacementLoop();
1814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mH.removeMessages(DO_TRAVERSAL);
1824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            loopCount--;
18324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        } while (mTraversalScheduled && loopCount > 0);
1844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mWallpaperActionPending = false;
1854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
1864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void performSurfacePlacementLoop() {
1884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mInLayout) {
1894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG) {
1904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                throw new RuntimeException("Recursive call!");
1914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
192ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "performLayoutAndPlaceSurfacesLocked called while in layout. Callers="
1934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + Debug.getCallers(3));
1944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
1954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mWaitingForConfig) {
1984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Our configuration has changed (most likely rotation), but we
1994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // don't yet have the complete configuration to report to
2004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // applications.  Don't do any window layout until we have it.
2014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
2024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mDisplayReady) {
2054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Not yet initialized, nothing to do.
2064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
2074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "wmLayout");
2104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mInLayout = true;
2114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean recoveringMemory = false;
2134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mForceRemoves.isEmpty()) {
2144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            recoveringMemory = true;
2154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Wait a little bit for things to settle down, and off we go.
2164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            while (!mService.mForceRemoves.isEmpty()) {
2174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState ws = mService.mForceRemoves.remove(0);
218ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "Force removing: " + ws);
2194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.removeWindowInnerLocked(ws);
2204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
221ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.w(TAG, "Due to memory failure, waiting a bit for next layout");
2224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Object tmp = new Object();
2234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            synchronized (tmp) {
2244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                try {
2254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    tmp.wait(250);
2264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } catch (InterruptedException e) {
2274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
2324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            performSurfacePlacementInner(recoveringMemory);
2334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
2354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.needsLayout()) {
2374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (++mLayoutRepeatCount < 6) {
23824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    requestTraversal();
2394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } else {
240ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.e(TAG, "Performed 6 layouts in a row. Skipping");
2414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mLayoutRepeatCount = 0;
2424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
2434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
2444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mLayoutRepeatCount = 0;
2454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mWindowsChanged && !mService.mWindowChangeListeners.isEmpty()) {
2484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.removeMessages(REPORT_WINDOWS_CHANGE);
2494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.sendEmptyMessage(REPORT_WINDOWS_CHANGE);
2504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (RuntimeException e) {
2524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mInLayout = false;
253ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.wtf(TAG, "Unhandled exception while laying out windows", e);
2544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);
2574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    void debugLayoutRepeats(final String msg, int pendingLayoutChanges) {
2604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mLayoutRepeatCount >= LAYOUT_REPEAT_THRESHOLD) {
261ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.v(TAG, "Layouts looping: " + msg +
2624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    ", mPendingLayoutChanges = 0x" + Integer.toHexString(pendingLayoutChanges));
2634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
2654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    // "Something has changed!  Let's make it correct now."
2674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void performSurfacePlacementInner(boolean recoveringMemory) {
268ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_WINDOW_TRACE) Slog.v(TAG, "performSurfacePlacementInner: entry. Called by "
269ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                + Debug.getCallers(3));
2704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int i;
2724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean updateInputWindowsNeeded = false;
2734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mFocusMayChange) {
2754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mFocusMayChange = false;
2764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            updateInputWindowsNeeded = mService.updateFocusedWindowLocked(
2774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/);
2784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Initialize state of exiting tokens.
2814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int numDisplays = mService.mDisplayContents.size();
2824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
2834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
2844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (i=displayContent.mExitingTokens.size()-1; i>=0; i--) {
2854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                displayContent.mExitingTokens.get(i).hasVisible = false;
2864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) {
2904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Initialize state of exiting applications.
2914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppTokenList exitingAppTokens =
2924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens;
2934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int tokenNdx = exitingAppTokens.size() - 1; tokenNdx >= 0; --tokenNdx) {
2944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                exitingAppTokens.get(tokenNdx).hasVisible = false;
2954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
2964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
2974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
2984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mHoldScreen = null;
2994ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang        mHoldScreenWindow = null;
3004ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang        mObsuringWindow = null;
3014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mScreenBrightness = -1;
3024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mButtonBrightness = -1;
3034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mUserActivityTimeout = -1;
3044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mObscureApplicationContentOnSecondaryDisplays = false;
30543e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi        mSustainedPerformanceModeCurrent = false;
3064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mTransactionSequence++;
3074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final DisplayContent defaultDisplay = mService.getDefaultDisplayContentLocked();
3094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final DisplayInfo defaultInfo = defaultDisplay.getDisplayInfo();
3104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int defaultDw = defaultInfo.logicalWidth;
3114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int defaultDh = defaultInfo.logicalHeight;
3124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
313ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
3144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                ">>> OPEN TRANSACTION performLayoutAndPlaceSurfaces");
3154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        SurfaceControl.openTransaction();
3164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
31724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            applySurfaceChangesTransaction(recoveringMemory, numDisplays, defaultDw, defaultDh);
3184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (RuntimeException e) {
319ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.wtf(TAG, "Unhandled exception in Window Manager", e);
3204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } finally {
3214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            SurfaceControl.closeTransaction();
322ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
3234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces");
3244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowList defaultWindows = defaultDisplay.getWindowList();
3274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // If we are ready to perform an app transition, check through
3294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // all of the app tokens to be shown and see if they are ready
3304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // to go.
3314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mAppTransition.isReady()) {
3324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked(defaultWindows);
3334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_LAYOUT_REPEATS)
3344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                debugLayoutRepeats("after handleAppTransitionReadyLocked",
3354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        defaultDisplay.pendingLayoutChanges);
3364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mAnimator.mAppWindowAnimating && mService.mAppTransition.isRunning()) {
3394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // We have finished the animation of an app transition.  To do
3404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // this, we have delayed a lot of operations like showing and
3414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // hiding apps, moving apps in Z-order, etc.  The app token list
3424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // reflects the correct Z-order, but the window list may now
3434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // be out of sync with it.  So here we will just rebuild the
3444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // entire app window list.  Fun!
3454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.pendingLayoutChanges |=
3464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mService.handleAnimatingStoppedAndTransitionLocked();
3474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_LAYOUT_REPEATS)
3484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                debugLayoutRepeats("after handleAnimStopAndXitionLock",
3494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        defaultDisplay.pendingLayoutChanges);
3504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0
3534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                && !mService.mAppTransition.isReady()) {
3544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // At this point, there was a window with a wallpaper that
3554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // was force hiding other windows behind it, but now it
3564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // is going away.  This may be simple -- just animate
3574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // away the wallpaper and its window -- or it may be
3584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // hard -- the wallpaper now needs to be shown behind
3594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // something that was hidden.
3604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
3614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_LAYOUT_REPEATS)
3624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                debugLayoutRepeats("after animateAwayWallpaperLocked",
3634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        defaultDisplay.pendingLayoutChanges);
3644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mWallpaperForceHidingChanged = false;
3664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mWallpaperMayChange) {
3684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_WALLPAPER_LIGHT)
369ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.v(TAG, "Wallpaper may change!  Adjusting");
3704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
3714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange",
3724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    defaultDisplay.pendingLayoutChanges);
3734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mFocusMayChange) {
3764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mFocusMayChange = false;
3774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
3784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    false /*updateInputWindows*/)) {
3794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                updateInputWindowsNeeded = true;
3804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM;
3814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
3824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.needsLayout()) {
3854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_LAYOUT;
3864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("mLayoutNeeded",
3874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    defaultDisplay.pendingLayoutChanges);
3884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
3894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
3904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (i = mService.mResizingWindows.size() - 1; i >= 0; i--) {
3914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            WindowState win = mService.mResizingWindows.get(i);
3924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (win.mAppFreezing) {
3934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // Don't remove this window until rotation has completed.
3944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                continue;
3954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
396db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang            // Discard the saved surface if window size is changed, it can't be reused.
397bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang            if (win.mAppToken != null) {
398bef461f6129044bc092f0c3693bfc122d1acb6d1Chong Zhang                win.mAppToken.destroySavedSurfaces();
399db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang            }
4004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            win.reportResized();
4014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mResizingWindows.remove(i);
4024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
404ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_ORIENTATION && mService.mDisplayFrozen) Slog.v(TAG,
405ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                "With display frozen, orientationChangeComplete=" + mOrientationChangeComplete);
4064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mOrientationChangeComplete) {
4074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
4084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_NONE;
4094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mLastFinishedFreezeSource = mLastWindowFreezeSource;
4104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.removeMessages(WINDOW_FREEZE_TIMEOUT);
4114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.stopFreezingDisplayLocked();
4134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Destroy the surface of any windows that are no longer visible.
41619723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski        boolean wallpaperDestroyed = false;
41719723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski        i = mService.mDestroySurface.size();
41819723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski        if (i > 0) {
41919723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski            do {
42019723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                i--;
42119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                WindowState win = mService.mDestroySurface.get(i);
42219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                win.mDestroying = false;
42319723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                if (mService.mInputMethodWindow == win) {
42419723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                    mService.mInputMethodWindow = null;
42519723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                }
42619723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                if (mWallpaperControllerLocked.isWallpaperTarget(win)) {
42719723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                    wallpaperDestroyed = true;
42819723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski                }
42913f7be9e0424266be4bf3b5c8c7fdc161e4fe091Robert Carr                win.destroyOrSaveSurface();
43019723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski            } while (i > 0);
43119723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski            mService.mDestroySurface.clear();
43219723a4a2bca0660f7ee7c29926af285d94ab5a2Filip Gruszczynski        }
4334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Time to remove any exiting tokens?
4354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
4364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
4374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            ArrayList<WindowToken> exitingTokens = displayContent.mExitingTokens;
4384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (i = exitingTokens.size() - 1; i >= 0; i--) {
4394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowToken token = exitingTokens.get(i);
4404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (!token.hasVisible) {
4414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    exitingTokens.remove(i);
4424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (token.windowType == TYPE_WALLPAPER) {
4434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        mWallpaperControllerLocked.removeWallpaperToken(token);
4444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
4454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
4464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Time to remove any exiting applications?
4504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int stackNdx = mService.mStackIdToStack.size() - 1; stackNdx >= 0; --stackNdx) {
4514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Initialize state of exiting applications.
4524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppTokenList exitingAppTokens =
4534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mService.mStackIdToStack.valueAt(stackNdx).mExitingAppTokens;
4544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (i = exitingAppTokens.size() - 1; i >= 0; i--) {
4554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                AppWindowToken token = exitingAppTokens.get(i);
4564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (!token.hasVisible && !mService.mClosingApps.contains(token) &&
4574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        (!token.mIsExiting || token.allAppWindows.isEmpty())) {
4584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // Make sure there is no animation running on this token,
4594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // so any windows associated with it will be removed as
4604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // soon as their animations are complete
4614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    token.mAppAnimator.clearAnimation();
4624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    token.mAppAnimator.animating = false;
463ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
464ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                            "performLayout: App token exiting now removed" + token);
4654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    token.removeAppFromTaskLocked();
4664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
4674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (wallpaperDestroyed) {
4714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
4724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            defaultDisplay.layoutNeeded = true;
4734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
4764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
4774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (displayContent.pendingLayoutChanges != 0) {
4784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                displayContent.layoutNeeded = true;
4794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
4814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Finally update all input windows now that the window changes have stabilized.
4834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
4844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
4854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.setHoldScreenLocked(mHoldScreen);
4864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mDisplayFrozen) {
4874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mScreenBrightness < 0 || mScreenBrightness > 1.0f) {
4884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(-1);
4894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
4904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(
4914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        toBrightnessOverride(mScreenBrightness));
4924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
4934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mButtonBrightness < 0
4944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    || mButtonBrightness > 1.0f) {
4954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(-1);
4964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
4974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(
4984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        toBrightnessOverride(mButtonBrightness));
4994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager(
5014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mUserActivityTimeout);
5024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
50443e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi        if (mSustainedPerformanceModeCurrent != mSustainedPerformanceModeEnabled) {
50543e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi            mSustainedPerformanceModeEnabled = mSustainedPerformanceModeCurrent;
50643e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi            mService.mPowerManagerInternal.powerHint(
50743e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi                    mService.mPowerManagerInternal.POWER_HINT_SUSTAINED_PERFORMANCE_MODE,
50843e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi                    (mSustainedPerformanceModeEnabled ? 1 : 0));
50943e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi        }
51043e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi
5114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mTurnOnScreen) {
5124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mAllowTheaterModeWakeFromLayout
5134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    || Settings.Global.getInt(mService.mContext.getContentResolver(),
5144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        Settings.Global.THEATER_MODE_ON, 0) == 0) {
5154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (DEBUG_VISIBILITY || DEBUG_POWER) {
516ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.v(TAG, "Turning screen on after layout!");
5174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
5184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mPowerManager.wakeUp(SystemClock.uptimeMillis(),
5194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        "android.server.wm:TURN_ON");
5204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mTurnOnScreen = false;
5224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mUpdateRotation) {
525ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_ORIENTATION) Slog.d(TAG, "Performing post-rotate rotation");
5264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.updateRotationUncheckedLocked(false)) {
5274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION);
5284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
5294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mUpdateRotation = false;
5304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mWaitingForDrawnCallback != null ||
5344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                (mOrientationChangeComplete && !defaultDisplay.layoutNeeded &&
5354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        !mUpdateRotation)) {
5364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.checkDrawnWindowsLocked();
5374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int N = mService.mPendingRemove.size();
5404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (N > 0) {
5414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mPendingRemoveTmp.length < N) {
5424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mPendingRemoveTmp = new WindowState[N+10];
5434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mPendingRemove.toArray(mService.mPendingRemoveTmp);
5454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mPendingRemove.clear();
5464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            DisplayContentList displayList = new DisplayContentList();
5474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (i = 0; i < N; i++) {
5484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState w = mService.mPendingRemoveTmp[i];
5494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.removeWindowInnerLocked(w);
5504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final DisplayContent displayContent = w.getDisplayContent();
5514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (displayContent != null && !displayList.contains(displayContent)) {
5524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    displayList.add(displayContent);
5534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
5544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (DisplayContent displayContent : displayList) {
55792e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski                mService.mLayersController.assignLayersLocked(displayContent.getWindowList());
5584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                displayContent.layoutNeeded = true;
5594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
5604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Remove all deferred displays stacks, tasks, and activities.
5634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int displayNdx = mService.mDisplayContents.size() - 1; displayNdx >= 0; --displayNdx) {
5644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mDisplayContents.valueAt(displayNdx).checkForDeferredActions();
5654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
5664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (updateInputWindowsNeeded) {
5684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
5694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
570b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang        mService.setFocusTaskRegionLocked();
5714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Check to see if we are now in a state where the screen should
5734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // be enabled, because the window obscured flags have changed.
5744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.enableScreenIfNeededLocked();
5754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
5764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.scheduleAnimationLocked();
5773dac63a18d9115405404561d327010604420b07bJorim Jaggi        mService.mWindowPlacerLocked.destroyPendingSurfaces();
5784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
579ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_WINDOW_TRACE) Slog.e(TAG,
58069cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                "performSurfacePlacementInner exit: animating=" + mService.mAnimator.isAnimating());
5814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
5824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
58324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    private void applySurfaceChangesTransaction(boolean recoveringMemory, int numDisplays,
58424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            int defaultDw, int defaultDh) {
58524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (mService.mWatermark != null) {
58624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mWatermark.positionSurface(defaultDw, defaultDh);
58724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
58824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (mService.mStrictModeFlash != null) {
58924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mStrictModeFlash.positionSurface(defaultDw, defaultDh);
59024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
59124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (mService.mCircularDisplayMask != null) {
59224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mCircularDisplayMask.positionSurface(defaultDw, defaultDh,
59324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mService.mRotation);
59424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
59524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (mService.mEmulatorDisplayOverlay != null) {
59624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mEmulatorDisplayOverlay.positionSurface(defaultDw, defaultDh,
59724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mService.mRotation);
59824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
59924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
60024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        boolean focusDisplayed = false;
60124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
60224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
60324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
60424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            boolean updateAllDrawn = false;
60524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            WindowList windows = displayContent.getWindowList();
60624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            DisplayInfo displayInfo = displayContent.getDisplayInfo();
60724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final int displayId = displayContent.getDisplayId();
60824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final int dw = displayInfo.logicalWidth;
60924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final int dh = displayInfo.logicalHeight;
61024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final int innerDw = displayInfo.appWidth;
61124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final int innerDh = displayInfo.appHeight;
61224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY);
61324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
61424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            // Reset for each display.
61524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mDisplayHasContent = false;
61624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mPreferredRefreshRate = 0;
61724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mPreferredModeId = 0;
61824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
61924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            int repeats = 0;
62024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            do {
62124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                repeats++;
62224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (repeats > 6) {
623ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.w(TAG, "Animation repeat aborted after too many iterations");
62424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    displayContent.layoutNeeded = false;
62524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    break;
62624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
62724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
62824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats(
62924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        "On entry to LockedInner", displayContent.pendingLayoutChanges);
63024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
63124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 &&
63224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        mWallpaperControllerLocked.adjustWallpaperWindows()) {
63392e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski                    mService.mLayersController.assignLayersLocked(windows);
63424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    displayContent.layoutNeeded = true;
63524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
63624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
63724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (isDefaultDisplay
63824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        && (displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_CONFIG) != 0) {
639ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    if (DEBUG_LAYOUT) Slog.v(TAG, "Computing new config from layout");
64024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    if (mService.updateOrientationFromAppTokensLocked(true)) {
64124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        displayContent.layoutNeeded = true;
64224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        mService.mH.sendEmptyMessage(SEND_NEW_CONFIGURATION);
64324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
64424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
64524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
64624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_LAYOUT) != 0) {
64724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    displayContent.layoutNeeded = true;
64824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
64924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
65024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                // FIRST LOOP: Perform a layout, if needed.
65124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (repeats < LAYOUT_REPEAT_THRESHOLD) {
65224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    performLayoutLockedInner(displayContent, repeats == 1,
65324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            false /* updateInputWindows */);
65424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                } else {
655ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.w(TAG, "Layout repeat skipped after too many iterations");
65624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
65724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
65824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                // FIRST AND ONE HALF LOOP: Make WindowManagerPolicy think
65924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                // it is animating.
66024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                displayContent.pendingLayoutChanges = 0;
66124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
66224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (isDefaultDisplay) {
66324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mService.mPolicy.beginPostLayoutPolicyLw(dw, dh);
66424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    for (int i = windows.size() - 1; i >= 0; i--) {
66524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        WindowState w = windows.get(i);
66624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        if (w.mHasSurface) {
66724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            mService.mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs,
66824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                    w.mAttachedWindow);
66924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        }
67024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
67124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    displayContent.pendingLayoutChanges |=
67224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            mService.mPolicy.finishPostLayoutPolicyLw();
67324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("after finishPostLayoutPolicyLw",
67424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            displayContent.pendingLayoutChanges);
67524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
67624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            } while (displayContent.pendingLayoutChanges != 0);
67724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
67824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mObscured = false;
67924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mSyswin = false;
68024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            displayContent.resetDimming();
68124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
68224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            // Only used if default window
68324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            final boolean someoneLosingFocus = !mService.mLosingFocus.isEmpty();
68424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
68524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            for (int i = windows.size() - 1; i >= 0; i--) {
68624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                WindowState w = windows.get(i);
6870d00c2e25bf8816dbd99f4fcd5c8221e80826a95Robert Carr                final Task task = w.getTask();
68824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                final boolean obscuredChanged = w.mObscured != mObscured;
68924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
69024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                // Update effect.
69124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                w.mObscured = mObscured;
69224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (!mObscured) {
6930abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang                    handleNotObscuredLocked(w, displayInfo);
69424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
69524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
696112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang                w.applyDimLayerIfNeeded();
69724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
69824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (isDefaultDisplay && obscuredChanged
69924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        && mWallpaperControllerLocked.isWallpaperTarget(w) && w.isVisibleLw()) {
70024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    // This is the wallpaper target and its obscured state
70124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    // changed... make sure the current wallaper's visibility
70224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    // has been updated accordingly.
70324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mWallpaperControllerLocked.updateWallpaperVisibility();
70424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
70524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
70624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                final WindowStateAnimator winAnimator = w.mWinAnimator;
70724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
70824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                // If the window has moved due to its containing content frame changing, then
709f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski                // notify the listeners and optionally animate it. Simply checking a change of
710f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski                // position is not enough, because being move due to dock divider is not a trigger
711f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski                // for animation.
71224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (w.hasMoved()) {
71324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    // Frame has moved, containing content frame has also moved, and we're not
71424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    // currently animating... let's do something.
71524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    final int left = w.mFrame.left;
71624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    final int top = w.mFrame.top;
717baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang                    final boolean adjustedForMinimizedDockOrIme = task != null
718baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang                                && (task.mStack.isAdjustedForMinimizedDockedStack()
719baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang                                    || task.mStack.isAdjustedForIme());
720f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski                    if ((w.mAttrs.privateFlags & PRIVATE_FLAG_NO_MOVE_ANIMATION) == 0
721baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang                            && !w.isDragResizing() && !adjustedForMinimizedDockOrIme
722c7294607fc0debc54e92abac18bec2601a21ce27Robert Carr                            && (task == null || w.getTask().mStack.hasMovementAnimations())
723192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggi                            && !w.mWinAnimator.mLastHidden) {
724f52dd205b9d31e0edcfdfff4ed98259c07ca38b7Filip Gruszczynski                        winAnimator.setMoveAnimation(left, top);
72524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
72624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
72724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    //TODO (multidisplay): Accessibility supported only for the default display.
72824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    if (mService.mAccessibilityController != null
72924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            && displayId == Display.DEFAULT_DISPLAY) {
73024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        mService.mAccessibilityController.onSomeWindowResizedOrMovedLocked();
73124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
73224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
73324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    try {
7347774bd554c28e33b732e449d029137537eb917daWale Ogunwale                        w.mClient.moved(left, top);
73524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    } catch (RemoteException e) {
73624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
737192086eb8aff3fb873a7e03ade0b81652aacf25fJorim Jaggi                    w.mMovedByResize = false;
73824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
73924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
740ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing");
74124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                w.mContentChanged = false;
74224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
74324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                // Moved from updateWindowsAndWallpaperLocked().
74424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (w.mHasSurface) {
745679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr                    // If we have recently synchronized a previous transaction for this
746679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr                    // window ensure we don't push through an unsynchronized one now.
747679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr                    winAnimator.deferToPendingTransaction();
748679c807210e4d741b4c65ac67d298d1d56abf3eeRobert Carr
74924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    // Take care of the window being ready to display.
75024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    final boolean committed = winAnimator.commitFinishDrawingLocked();
75124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    if (isDefaultDisplay && committed) {
75224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        if (w.mAttrs.type == TYPE_DREAM) {
75324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            // HACK: When a dream is shown, it may at that
75424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            // point hide the lock screen.  So we need to
75524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            // redo the layout to let the phone window manager
75624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            // make this happen.
75724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            displayContent.pendingLayoutChanges |=
75824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                    FINISH_LAYOUT_REDO_LAYOUT;
75924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            if (DEBUG_LAYOUT_REPEATS) {
76024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                debugLayoutRepeats("dream and commitFinishDrawingLocked true",
76124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        displayContent.pendingLayoutChanges);
76224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            }
76324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        }
76424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        if ((w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0) {
76524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            if (DEBUG_WALLPAPER_LIGHT)
766ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                                Slog.v(TAG, "First draw done in potential wallpaper target " + w);
76724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            mWallpaperMayChange = true;
76824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
76924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            if (DEBUG_LAYOUT_REPEATS) {
77024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                debugLayoutRepeats("wallpaper and commitFinishDrawingLocked true",
77124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        displayContent.pendingLayoutChanges);
77224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            }
77324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        }
77424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
775e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                    if (!winAnimator.isAnimationStarting() && !winAnimator.isWaitingForOpening()) {
776c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski                        // Updates the shown frame before we set up the surface. This is needed
777c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski                        // because the resizing could change the top-left position (in addition to
778c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski                        // size) of the window. setSurfaceBoundariesLocked uses mShownPosition to
7795c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                        // position the surface.
7805c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                        //
7815c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                        // If an animation is being started, we can't call this method because the
7825c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                        // animation hasn't processed its initial transformation yet, but in general
7835c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                        // we do want to update the position if the window is animating.
784c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski                        winAnimator.computeShownFrameLocked();
785c46f41c5b5ea5b626ed729030de100223493948dFilip Gruszczynski                    }
78624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    winAnimator.setSurfaceBoundariesLocked(recoveringMemory);
78724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
78824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
78924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                final AppWindowToken atoken = w.mAppToken;
79024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (DEBUG_STARTING_WINDOW && atoken != null && w == atoken.startingWindow) {
791ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.d(TAG, "updateWindows: starting " + w
79224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + atoken.allDrawn
79324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            + " freezingScreen=" + atoken.mAppAnimator.freezingScreen);
79424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
7958e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                if (atoken != null && (!atoken.allDrawn || !atoken.allDrawnExcludingSaved
7968e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        || atoken.mAppAnimator.freezingScreen)) {
79724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    if (atoken.lastTransactionSequence != mService.mTransactionSequence) {
79824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        atoken.lastTransactionSequence = mService.mTransactionSequence;
79924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        atoken.numInterestingWindows = atoken.numDrawnWindows = 0;
8008e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        atoken.numInterestingWindowsExcludingSaved = 0;
8018e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        atoken.numDrawnWindowsExclusingSaved = 0;
80224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        atoken.startingDisplayed = false;
80324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
8048e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                    if (!atoken.allDrawn && w.mightAffectAllDrawn(false /* visibleOnly */)) {
80524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        if (DEBUG_VISIBILITY || DEBUG_ORIENTATION) {
806ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                            Slog.v(TAG, "Eval win " + w + ": isDrawn="
80724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                    + w.isDrawnLw()
8085c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                                    + ", isAnimationSet=" + winAnimator.isAnimationSet());
80924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            if (!w.isDrawnLw()) {
810ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                                Slog.v(TAG, "Not displayed: s="
811e6a8351bc715999d1e42dcc1003a6eda6c318dd9Robert Carr                                        + winAnimator.mSurfaceController
81224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        + " pv=" + w.mPolicyVisibility
81324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        + " mDrawState=" + winAnimator.drawStateToString()
81424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        + " ah=" + w.mAttachedHidden
81524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        + " th=" + atoken.hiddenRequested
81624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                        + " a=" + winAnimator.mAnimating);
81724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            }
81824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        }
819bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang                        if (w != atoken.startingWindow) {
8208e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            if (w.isInteresting()) {
82124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                atoken.numInterestingWindows++;
82224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                if (w.isDrawnLw()) {
82324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                    atoken.numDrawnWindows++;
82424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                    if (DEBUG_VISIBILITY || DEBUG_ORIENTATION)
825ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                                        Slog.v(TAG, "tokenMayBeDrawn: " + atoken
8268e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                                + " w=" + w + " numInteresting="
8278e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                                + atoken.numInterestingWindows
82824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                                + " freezingScreen="
82924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                                + atoken.mAppAnimator.freezingScreen
83024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                                + " mAppFreezing=" + w.mAppFreezing);
83124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                    updateAllDrawn = true;
83224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                                }
83324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            }
83424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        } else if (w.isDrawnLw()) {
835275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                            mService.mH.sendEmptyMessage(NOTIFY_STARTING_WINDOW_DRAWN);
83624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                            atoken.startingDisplayed = true;
83724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        }
83824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    }
8398e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                    if (!atoken.allDrawnExcludingSaved
8408e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            && w.mightAffectAllDrawn(true /* visibleOnly */)) {
8418e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        if (w != atoken.startingWindow && w.isInteresting()) {
8428e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            atoken.numInterestingWindowsExcludingSaved++;
8438e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            if (w.isDrawnLw() && !w.isAnimatingWithSavedSurface()) {
8448e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                atoken.numDrawnWindowsExclusingSaved++;
8458e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                if (DEBUG_VISIBILITY || DEBUG_ORIENTATION)
8468e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                    Slog.v(TAG, "tokenMayBeDrawnExcludingSaved: " + atoken
8478e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                            + " w=" + w + " numInteresting="
8488e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                            + atoken.numInterestingWindowsExcludingSaved
8498e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                            + " freezingScreen="
8508e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                            + atoken.mAppAnimator.freezingScreen
8518e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                            + " mAppFreezing=" + w.mAppFreezing);
8528e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                updateAllDrawn = true;
8538e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            }
8548e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        }
8558e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                    }
85624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
85724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
85824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                if (isDefaultDisplay && someoneLosingFocus && w == mService.mCurrentFocus
85924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                        && w.isDisplayedLw()) {
86024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    focusDisplayed = true;
86124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                }
86224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
86324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                mService.updateResizingWindows(w);
86424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            }
86524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
86624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mDisplayManagerInternal.setDisplayProperties(displayId,
86724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mDisplayHasContent,
86824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mPreferredRefreshRate,
86924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    mPreferredModeId,
87024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                    true /* inTraversal, must call performTraversalInTrans... below */);
87124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
87224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.getDisplayContentLocked(displayId).stopDimmingIfNeeded();
87324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
87424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            if (updateAllDrawn) {
87524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski                updateAllDrawnLocked(displayContent);
87624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            }
87724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
87824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
87924966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (focusDisplayed) {
88024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mH.sendEmptyMessage(REPORT_LOSING_FOCUS);
88124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
88224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
88324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        // Give the display manager a chance to adjust properties
88424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        // like display rotation if it needs to.
88524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        mService.mDisplayManagerInternal.performTraversalInTransactionFromWindowManager();
88624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
88724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
8884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean isInLayout() {
8894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return mInLayout;
8904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
8914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
8924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    final void performLayoutLockedInner(final DisplayContent displayContent,
8934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            boolean initial, boolean updateInputWindows) {
8944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!displayContent.layoutNeeded) {
8954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
8964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
8974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        displayContent.layoutNeeded = false;
8984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        WindowList windows = displayContent.getWindowList();
8994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean isDefaultDisplay = displayContent.isDefaultDisplay;
9004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        DisplayInfo displayInfo = displayContent.getDisplayInfo();
9024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int dw = displayInfo.logicalWidth;
9034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int dh = displayInfo.logicalHeight;
9044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mInputConsumer != null) {
9064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mInputConsumer.layout(dw, dh);
9074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
9084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9090d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev        if (mService.mWallpaperInputConsumer != null) {
9100d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev            mService.mWallpaperInputConsumer.layout(dw, dh);
9110d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev        }
9120d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev
9134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int N = windows.size();
9144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int i;
9154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (DEBUG_LAYOUT) {
917ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.v(TAG, "-------------------------------------");
918ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.v(TAG, "performLayout: needed="
9194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + displayContent.layoutNeeded + " dw=" + dw + " dh=" + dh);
9204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
9214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9229ebbe6afe7a433f78ca3d30c9f215c53212c34acSriram Viswanathan        mService.mPolicy.beginLayoutLw(isDefaultDisplay, dw, dh, mService.mRotation,
9239ebbe6afe7a433f78ca3d30c9f215c53212c34acSriram Viswanathan                mService.mCurConfiguration.uiMode);
9244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (isDefaultDisplay) {
9254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Not needed on non-default displays.
9264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mSystemDecorLayer = mService.mPolicy.getSystemDecorLayerLw();
9274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mScreenRect.set(0, 0, dw, dh);
9284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
9294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
930b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale        mService.mPolicy.getContentRectLw(mTmpContentRect);
931b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale        displayContent.resize(mTmpContentRect);
9324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int seq = mService.mLayoutSeq+1;
9344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (seq < 0) seq = 0;
9354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mLayoutSeq = seq;
9364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean behindDream = false;
9384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // First perform layout of any root windows (not attached
9404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // to another window).
9414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int topAttached = -1;
9424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (i = N-1; i >= 0; i--) {
9434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final WindowState win = windows.get(i);
9444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Don't do layout of a window if it is not visible, or
9464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // soon won't be visible, to avoid wasting time and funky
9474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // changes while a window is animating away.
9484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final boolean gone = (behindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs))
9494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    || win.isGoneForLayoutLw();
9504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_LAYOUT && !win.mLayoutAttached) {
952ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.v(TAG, "1ST PASS " + win
9534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame
9544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + " mLayoutAttached=" + win.mLayoutAttached
9554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + " screen changed=" + win.isConfigChanged());
9564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowToken atoken = win.mAppToken;
957ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (gone) Slog.v(TAG, "  GONE: mViewVisibility="
9584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mViewVisibility + " mRelayoutCalled="
9594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mRelayoutCalled + " hidden="
9604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mRootToken.hidden + " hiddenRequested="
9614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + (atoken != null && atoken.hiddenRequested)
9624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + " mAttachedHidden=" + win.mAttachedHidden);
963ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                else Slog.v(TAG, "  VIS: mViewVisibility="
9644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mViewVisibility + " mRelayoutCalled="
9654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mRelayoutCalled + " hidden="
9664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mRootToken.hidden + " hiddenRequested="
9674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + (atoken != null && atoken.hiddenRequested)
9684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + " mAttachedHidden=" + win.mAttachedHidden);
9694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
9704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
9714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // If this view is GONE, then skip it -- keep the current
9724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // frame, and let the caller know so they can ignore it
9734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // if they want.  (We do the normal layout for INVISIBLE
9744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // windows, since that means "perform layout as normal,
9754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // just don't display").
9764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!gone || !win.mHaveFrame || win.mLayoutNeeded
9775c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                    || ((win.isConfigChanged() || win.setInsetsChanged())
9785c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi                            && !win.isGoneForLayoutLw() &&
9794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            ((win.mAttrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 ||
9804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            (win.mHasSurface && win.mAppToken != null &&
9814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            win.mAppToken.layoutConfigChanges)))) {
9824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (!win.mLayoutAttached) {
9834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (initial) {
984ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
9854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        win.mContentChanged = false;
9864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
9874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (win.mAttrs.type == TYPE_DREAM) {
9884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        // Don't layout windows behind a dream, so that if it
9894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        // does stuff like hide the status bar we won't get a
9904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        // bad transition when it goes away.
9914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        behindDream = true;
9924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
9934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    win.mLayoutNeeded = false;
9944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    win.prelayout();
9954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mService.mPolicy.layoutWindowLw(win, null);
9964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    win.mLayoutSeq = seq;
9974c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
9984c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                    // Window frames may have changed. Update dim layer with the new bounds.
9994c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                    final Task task = win.getTask();
10004c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                    if (task != null) {
10014c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                        displayContent.mDimLayerController.updateDimLayer(task);
10024c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang                    }
10034c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang
1004ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    if (DEBUG_LAYOUT) Slog.v(TAG,
10054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            "  LAYOUT: mFrame="
10064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            + win.mFrame + " mContainingFrame="
10074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            + win.mContainingFrame + " mDisplayFrame="
10084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            + win.mDisplayFrame);
10094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } else {
10104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (topAttached < 0) topAttached = i;
10114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
10124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
10134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
10144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean attachedBehindDream = false;
10164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Now perform layout of attached windows, which usually
10184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // depend on the position of the window they are attached to.
10194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // XXX does not deal with windows that are attached to windows
10204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // that are themselves attached.
10214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (i = topAttached; i >= 0; i--) {
10224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final WindowState win = windows.get(i);
10234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (win.mLayoutAttached) {
1025ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_LAYOUT) Slog.v(TAG,
10264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility="
10274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled);
10284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // If this view is GONE, then skip it -- keep the current
10294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // frame, and let the caller know so they can ignore it
10304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // if they want.  (We do the normal layout for INVISIBLE
10314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // windows, since that means "perform layout as normal,
10324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // just don't display").
10334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (attachedBehindDream && mService.mPolicy.canBeForceHidden(win, win.mAttrs)) {
10344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    continue;
10354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
10364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
10374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        || !win.mHaveFrame || win.mLayoutNeeded) {
10384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (initial) {
1039ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                        //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");
10404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        win.mContentChanged = false;
10414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
10424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    win.mLayoutNeeded = false;
10434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    win.prelayout();
10444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mService.mPolicy.layoutWindowLw(win, win.mAttachedWindow);
10454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    win.mLayoutSeq = seq;
1046ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    if (DEBUG_LAYOUT) Slog.v(TAG,
10474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            "  LAYOUT: mFrame=" + win.mFrame + " mContainingFrame="
10484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame);
10494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
10504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else if (win.mAttrs.type == TYPE_DREAM) {
10514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // Don't layout windows behind a dream, so that if it
10524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // does stuff like hide the status bar we won't get a
10534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // bad transition when it goes away.
10544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                attachedBehindDream = behindDream;
10554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
10564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
10574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10584c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang        // Window frames may have changed. Tell the input dispatcher about it.
10594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mInputMonitor.setUpdateInputWindowsNeededLw();
10604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (updateInputWindows) {
10614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mInputMonitor.updateInputWindowsLw(false /*force*/);
10624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
10634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mPolicy.finishLayoutLw();
106561f39a7b988f6a22681a3f9e0bf8121f72ff88c4Jorim Jaggi        mService.mH.sendEmptyMessage(UPDATE_DOCKED_STACK_DIVIDER);
10664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
10674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /**
10694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     * @param windows List of windows on default display.
10704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     * @return bitmap indicating if another pass through layout must be made.
10714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     */
10724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int handleAppTransitionReadyLocked(WindowList windows) {
10734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int appsCount = mService.mOpeningApps.size();
10744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!transitionGoodToGo(appsCount)) {
10754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return 0;
10764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1077ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "**** GOOD TO GO");
10784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int transit = mService.mAppTransition.getAppTransition();
10794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (mService.mSkipAppTransitionAnimation) {
10804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            transit = AppTransition.TRANSIT_UNSET;
10814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
10824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mSkipAppTransitionAnimation = false;
10834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mNoAnimationNotifyOnTransitionFinished.clear();
10844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
1085d75962eb8377e0d5e500e4cf36f2abce9bbadfccJorim Jaggi        mService.mH.removeMessages(H.APP_TRANSITION_TIMEOUT);
10864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.rebuildAppWindowListLocked();
10884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mWallpaperMayChange = false;
10904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // The top-most window will supply the layout params,
10924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // and we will determine it below.
10934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        LayoutParams animLp = null;
10944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int bestAnimLayer = -1;
10954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean fullscreenAnim = false;
10964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean voiceInteraction = false;
10974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
10984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState lowerWallpaperTarget =
10994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mWallpaperControllerLocked.getLowerWallpaperTarget();
11004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState upperWallpaperTarget =
11014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mWallpaperControllerLocked.getUpperWallpaperTarget();
11024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean openingAppHasWallpaper = false;
11044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean closingAppHasWallpaper = false;
11054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final AppWindowToken lowerWallpaperAppToken;
11064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final AppWindowToken upperWallpaperAppToken;
11074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (lowerWallpaperTarget == null) {
11084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            lowerWallpaperAppToken = upperWallpaperAppToken = null;
11094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } else {
11104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            lowerWallpaperAppToken = lowerWallpaperTarget.mAppToken;
11114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            upperWallpaperAppToken = upperWallpaperTarget.mAppToken;
11124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
11134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        int i;
11154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // Do a first pass through the tokens for two
11164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // things:
11174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // (1) Determine if both the closing and opening
11184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // app token sets are wallpaper targets, in which
11194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // case special animations are needed
11204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // (since the wallpaper needs to stay static
11214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // behind them).
11224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // (2) Find the layout params of the top-most
11234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // application window in the tokens, which is
11244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // what will control the animation theme.
11254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int closingAppsCount = mService.mClosingApps.size();
11264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        appsCount = closingAppsCount + mService.mOpeningApps.size();
11274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (i = 0; i < appsCount; i++) {
11284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppWindowToken wtoken;
11294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (i < closingAppsCount) {
11304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken = mService.mClosingApps.valueAt(i);
11314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) {
11324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    closingAppHasWallpaper = true;
11334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
11344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
11354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken = mService.mOpeningApps.valueAt(i - closingAppsCount);
11364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) {
11374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    openingAppHasWallpaper = true;
11384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
11394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
11404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            voiceInteraction |= wtoken.voiceInteraction;
11424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (wtoken.appFullscreen) {
11444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState ws = wtoken.findMainWindow();
11454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (ws != null) {
11464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    animLp = ws.mAttrs;
11474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    bestAnimLayer = ws.mLayer;
11484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    fullscreenAnim = true;
11494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
11504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else if (!fullscreenAnim) {
11514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState ws = wtoken.findMainWindow();
11524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (ws != null) {
11534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (ws.mLayer > bestAnimLayer) {
11544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        animLp = ws.mAttrs;
11554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        bestAnimLayer = ws.mLayer;
11564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
11574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
11584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
11594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
11604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        transit = maybeUpdateTransitToWallpaper(transit, openingAppHasWallpaper,
11624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                closingAppHasWallpaper, lowerWallpaperTarget, upperWallpaperTarget);
11634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // If all closing windows are obscured, then there is
11654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // no need to do an animation.  This is the case, for
11664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // example, when this transition is being done behind
11674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // the lock screen.
11684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mPolicy.allowAppAnimationsLw()) {
1169ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
11704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "Animations disallowed by keyguard or dream.");
11714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            animLp = null;
11724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
11734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        processApplicationsAnimatingInPlace(transit);
11754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
117642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi        mTmpLayerAndToken.token = null;
11774cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        handleClosingApps(transit, animLp, voiceInteraction, mTmpLayerAndToken);
11784cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowToken topClosingApp = mTmpLayerAndToken.token;
11794cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int topClosingLayer = mTmpLayerAndToken.layer;
11804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
11814cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowToken topOpeningApp = handleOpeningApps(transit,
11824cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                animLp, voiceInteraction, topClosingLayer);
11834cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
11844cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ?  null :
11854cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                topOpeningApp.mAppAnimator;
11864cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null :
11874cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                topClosingApp.mAppAnimator;
11884cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
118942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi        mService.mAppTransition.goodToGo(openingAppAnimator, closingAppAnimator,
119042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi                mService.mOpeningApps, mService.mClosingApps);
11914cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mAppTransition.postAnimationCallback();
11924cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mAppTransition.clear();
11934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
11944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mOpeningApps.clear();
11954cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mClosingApps.clear();
11964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
11974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // This has changed the visibility of windows, so perform
11984cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // a new layout to get them all up-to-date.
11994cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.getDefaultDisplayContentLocked().layoutNeeded = true;
12004cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski
12014cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        // TODO(multidisplay): IMEs are only supported on the default display.
12024cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        if (windows == mService.getDefaultWindowListLocked()
12034cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                && !mService.moveInputMethodWindowsIfNeededLocked(true)) {
120492e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski            mService.mLayersController.assignLayersLocked(windows);
12054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
12064cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES,
12074cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                true /*updateInputWindows*/);
12084cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.mFocusMayChange = false;
12094cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        mService.notifyActivityDrawnForKeyguard();
12104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        return FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG;
12114cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
12124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
12134cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private AppWindowToken handleOpeningApps(int transit, LayoutParams animLp,
12144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            boolean voiceInteraction, int topClosingLayer) {
12154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowToken topOpeningApp = null;
12164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount = mService.mOpeningApps.size();
12174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
12184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
12194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
1220ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now opening app" + wtoken);
12214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
12224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!appAnimator.usingTransferredAnimation) {
12234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.clearThumbnail();
122465d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                appAnimator.setNullAnimation();
12254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
12264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.inPendingTransaction = false;
1227eb22e8ed42bb146060e8ffc94444f70ea47fda04Chong Zhang
12284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!mService.setTokenVisibilityLocked(
12294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    wtoken, animLp, true, transit, false, voiceInteraction)){
12304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // This token isn't going to be animating. Add it to the list of tokens to
12314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // be notified of app transition complete since the notification will not be
12324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // sent be the app window animator.
12334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mNoAnimationNotifyOnTransitionFinished.add(wtoken.token);
12344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
12354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.updateReportedVisibilityLocked();
12364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            wtoken.waitingToShow = false;
12374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
12384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            appAnimator.mAllAppWinAnimators.clear();
12394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final int windowsCount = wtoken.allAppWindows.size();
12404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int j = 0; j < windowsCount; j++) {
12414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator);
12424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
1243ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
1244974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                    ">>> OPEN TRANSACTION handleAppTransitionReadyLocked()");
1245974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            SurfaceControl.openTransaction();
1246974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            try {
124769cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
1248974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            } finally {
1249974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                SurfaceControl.closeTransaction();
1250ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG,
1251974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski                        "<<< CLOSE TRANSACTION handleAppTransitionReadyLocked()");
1252974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski            }
12534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
12544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
12554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            int topOpeningLayer = 0;
12564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (animLp != null) {
12574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                int layer = -1;
1258e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                for (int j = 0; j < wtoken.allAppWindows.size(); j++) {
1259e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                    final WindowState win = wtoken.allAppWindows.get(j);
1260c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale                    // Clearing the mAnimatingExit flag before entering animation. It will be set to true
126178a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski                    // if app window is removed, or window relayout to invisible. We don't want to
126278a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski                    // clear it out for windows that get replaced, because the animation depends on
126378a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski                    // the flag to remove the replaced window.
12647fed68d116f037847f298b7d52f537998c315298Robert Carr                    //
1265c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale                    // We also don't clear the mAnimatingExit flag for windows which have the
12667fed68d116f037847f298b7d52f537998c315298Robert Carr                    // mRemoveOnExit flag. This indicates an explicit remove request has been issued
12677fed68d116f037847f298b7d52f537998c315298Robert Carr                    // by the client. We should let animation proceed and not clear this flag or
12687fed68d116f037847f298b7d52f537998c315298Robert Carr                    // they won't eventually be removed by WindowStateAnimator#finishExit.
12697fed68d116f037847f298b7d52f537998c315298Robert Carr                    if (!win.mWillReplaceWindow && !win.mRemoveOnExit) {
1270c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale                        win.mAnimatingExit = false;
1271e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // Clear mAnimating flag together with mAnimatingExit. When animation
1272e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // changes from exiting to entering, we need to clear this flag until the
1273e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // new animation gets applied, so that isAnimationStarting() becomes true
1274e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // until then.
1275e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // Otherwise applySurfaceChangesTransaction will faill to skip surface
1276e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // placement for this window during this period, one or more frame will
1277e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        // show up with wrong position or scale.
1278e22006d936e0928b4a335646f19a8ca18a7fb1e2Chong Zhang                        win.mWinAnimator.mAnimating = false;
127978a08ee876794586e1d429e67d4b94209415ea5aFilip Gruszczynski                    }
12804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (win.mWinAnimator.mAnimLayer > layer) {
12814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        layer = win.mWinAnimator.mAnimLayer;
12824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
12834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
12844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (topOpeningApp == null || layer > topOpeningLayer) {
12854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningApp = wtoken;
12864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    topOpeningLayer = layer;
12874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
12884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
12894cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailUp()) {
12904cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                createThumbnailAppAnimator(transit, wtoken, topOpeningLayer, topClosingLayer);
12914cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
12924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
12934cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        return topOpeningApp;
12944cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    }
12954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
12964cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski    private void handleClosingApps(int transit, LayoutParams animLp, boolean voiceInteraction,
12974cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            LayerAndToken layerAndToken) {
12984cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final int appsCount;
12994cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        appsCount = mService.mClosingApps.size();
13004cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        for (int i = 0; i < appsCount; i++) {
13014cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            AppWindowToken wtoken = mService.mClosingApps.valueAt(i);
1302f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
1303f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // If we still have some windows animating with saved surfaces that's
1304f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // either invisible or already removed, mark them exiting so that they
1305f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // are disposed of after the exit animation. These are not supposed to
1306f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // be shown, or are delayed removal until app is actually drawn (in which
1307f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            // case the window will be removed after the animation).
1308f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang            wtoken.markSavedSurfaceExiting();
1309f58631a6a265a12a64a5c697178e0f4784f562acChong Zhang
13104cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
1311ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
13124cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            appAnimator.clearThumbnail();
131365d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang            appAnimator.setNullAnimation();
13144cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.inPendingTransaction = false;
13154cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false,
13164cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    voiceInteraction);
13174cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.updateReportedVisibilityLocked();
13184cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Force the allDrawn flag, because we want to start
13194cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // this guy's animations regardless of whether it's
13204cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // gotten drawn.
13214cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.allDrawn = true;
13224cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            wtoken.deferClearAllDrawn = false;
13234cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // Ensure that apps that are mid-starting are also scheduled to have their
13244cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            // starting windows removed after the animation is complete
1325c48a354733ff150e4a07f6b0743009001aa4f48dWale Ogunwale            if (wtoken.startingWindow != null && !wtoken.startingWindow.mAnimatingExit) {
13264cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                mService.scheduleRemoveStartingWindowLocked(wtoken);
13274cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
13284cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
13294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
13304cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (animLp != null) {
13314cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                int layer = -1;
13324cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                for (int j = 0; j < wtoken.windows.size(); j++) {
13334cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    WindowState win = wtoken.windows.get(j);
13344cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    if (win.mWinAnimator.mAnimLayer > layer) {
13354cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                        layer = win.mWinAnimator.mAnimLayer;
13364cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    }
13374cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                }
13384cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                if (layerAndToken.token == null || layer > layerAndToken.layer) {
13394cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.token = wtoken;
13404cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                    layerAndToken.layer = layer;
13414cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                }
13424cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
13434cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            if (mService.mAppTransition.isNextAppTransitionThumbnailDown()) {
13444cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski                createThumbnailAppAnimator(transit, wtoken, 0, layerAndToken.layer);
13454cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski            }
13464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
13474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
13484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
13494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private boolean transitionGoodToGo(int appsCount) {
1350ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
13514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "Checking " + appsCount + " opening apps (frozen="
13524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mDisplayFrozen + " timeout="
13534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + mService.mAppTransition.isTimeout() + ")...");
1354275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi        int reason = APP_TRANSITION_TIMEOUT;
13554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (!mService.mAppTransition.isTimeout()) {
13564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int i = 0; i < appsCount; i++) {
13574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                AppWindowToken wtoken = mService.mOpeningApps.valueAt(i);
1358ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
13594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        "Check opening app=" + wtoken + ": allDrawn="
13604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.allDrawn + " startingDisplayed="
13614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + wtoken.startingDisplayed + " startingMoved="
1362d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.startingMoved + " isRelaunching()="
1363d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                        + wtoken.isRelaunching());
1364d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang
1365d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                if (wtoken.isRelaunching()) {
1366d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                    return false;
1367d78ddb409a8499c391322dd1e2b2a97446f9603dChong Zhang                }
1368db20b5f7a1fdb847f2266df0fbae6046dc95c757Chong Zhang
1369275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                final boolean drawnBeforeRestoring = wtoken.allDrawn;
1370bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang                wtoken.restoreSavedSurfaces();
1371bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang
13724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (!wtoken.allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
13734501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    return false;
13744501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
1375275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                if (wtoken.allDrawn) {
1376275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                    reason = drawnBeforeRestoring ? APP_TRANSITION_WINDOWS_DRAWN
1377275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                            : APP_TRANSITION_SAVED_SURFACE;
1378275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                } else {
1379275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                    reason = APP_TRANSITION_STARTING_WINDOW;
1380275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                }
13814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
13824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
13832f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            // We also need to wait for the specs to be fetched, if needed.
13842f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            if (mService.mAppTransition.isFetchingAppTransitionsSpecs()) {
1385ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "isFetchingAppTransitionSpecs=true");
13862f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi                return false;
13872f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi            }
13882f7d292596bdba15e441046e3a2e047f37d6ea59Jorim Jaggi
13894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // If the wallpaper is visible, we need to check it's ready too.
1390275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            boolean wallpaperReady = !mWallpaperControllerLocked.isWallpaperVisible() ||
13914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mWallpaperControllerLocked.wallpaperTransitionReady();
1392275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            if (wallpaperReady) {
1393275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reason, 0).sendToTarget();
1394275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi                return true;
1395275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            }
1396275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi            return false;
13974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
1398275561a74677f9d6c8f3f2cebc3cfea416ca586dJorim Jaggi        mService.mH.obtainMessage(NOTIFY_APP_TRANSITION_STARTING, reason, 0).sendToTarget();
13994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return true;
14004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
14014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
14024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
14034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            boolean closingAppHasWallpaper, WindowState lowerWallpaperTarget,
14044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            WindowState upperWallpaperTarget) {
14054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper
14064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
14074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final WindowState oldWallpaper =
14084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mWallpaperControllerLocked.isWallpaperTargetAnimating()
14094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        ? null : wallpaperTarget;
141049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> openingApps = mService.mOpeningApps;
141149b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        final ArraySet<AppWindowToken> closingApps = mService.mClosingApps;
1412ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski        if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
14134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                "New wallpaper target=" + wallpaperTarget
14144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + ", oldWallpaper=" + oldWallpaper
14154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        + ", lower target=" + lowerWallpaperTarget
141649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", upper target=" + upperWallpaperTarget
141749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", openingApps=" + openingApps
141849b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                        + ", closingApps=" + closingApps);
14194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        mService.mAnimateWallpaperWithTarget = false;
14204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (closingAppHasWallpaper && openingAppHasWallpaper) {
14214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS)
1422ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.v(TAG, "Wallpaper animation!");
14234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            switch (transit) {
14244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                case AppTransition.TRANSIT_ACTIVITY_OPEN:
14254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                case AppTransition.TRANSIT_TASK_OPEN:
14264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                case AppTransition.TRANSIT_TASK_TO_FRONT:
14274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    transit = AppTransition.TRANSIT_WALLPAPER_INTRA_OPEN;
14284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    break;
14294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                case AppTransition.TRANSIT_ACTIVITY_CLOSE:
14304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                case AppTransition.TRANSIT_TASK_CLOSE:
14314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                case AppTransition.TRANSIT_TASK_TO_BACK:
14324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    transit = AppTransition.TRANSIT_WALLPAPER_INTRA_CLOSE;
14334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    break;
14344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
1435ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
14364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "New transit: " + AppTransition.appTransitionToString(transit));
143749b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        } else if (oldWallpaper != null && !mService.mOpeningApps.isEmpty()
143849b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                && !openingApps.contains(oldWallpaper.mAppToken)
143949b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                && closingApps.contains(oldWallpaper.mAppToken)) {
144049b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski            // We are transitioning from an activity with a wallpaper to one without.
14414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            transit = AppTransition.TRANSIT_WALLPAPER_CLOSE;
1442ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
14434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "New transit away from wallpaper: "
14444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + AppTransition.appTransitionToString(transit));
144549b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski        } else if (wallpaperTarget != null && wallpaperTarget.isVisibleLw() &&
144649b80afaf9e71d6b5d4cab26f1459d84d1070f19Filip Gruszczynski                openingApps.contains(wallpaperTarget.mAppToken)) {
14474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // We are transitioning from an activity without
14484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // a wallpaper to now showing the wallpaper
14494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            transit = AppTransition.TRANSIT_WALLPAPER_OPEN;
1450ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.v(TAG,
14514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "New transit into wallpaper: "
14524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + AppTransition.appTransitionToString(transit));
14534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } else {
14544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAnimateWallpaperWithTarget = true;
14554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
14564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return transit;
14574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
14584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
14594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    /**
14604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     * @param w WindowState this method is applied to.
14610abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang     * @param dispInfo info of the display that the window's obscuring state is checked against.
14624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski     */
14630abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang    private void handleNotObscuredLocked(final WindowState w, final DisplayInfo dispInfo) {
14644cbc315305379b0892cc4fb347d7050f3058f81eFilip Gruszczynski        final LayoutParams attrs = w.mAttrs;
14654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int attrFlags = attrs.flags;
14664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final boolean canBeSeen = w.isDisplayedLw();
146743e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi        final int privateflags = attrs.privateFlags;
14684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
14690abb20f37425fcde40f56e8dcaf7f191db820415Chong Zhang        if (canBeSeen && w.isObscuringFullscreen(dispInfo)) {
14704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // This window completely covers everything behind it,
14714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // so we want to leave all of them as undimmed (for
14724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // performance reasons).
14734ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang            if (!mObscured) {
14744ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang                mObsuringWindow = w;
14754ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang            }
14764ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang
14774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mObscured = true;
14784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
14794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
14804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (w.mHasSurface) {
14814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) {
14824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mHoldScreen = w.mSession;
14834ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang                mHoldScreenWindow = w;
14844ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang            } else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
14854ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang                Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
14864ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang                        + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
14874ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang                        + Debug.getCallers(10));
14884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
14894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!mSyswin && w.mAttrs.screenBrightness >= 0
14904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    && mScreenBrightness < 0) {
14914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mScreenBrightness = w.mAttrs.screenBrightness;
14924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
14934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!mSyswin && w.mAttrs.buttonBrightness >= 0
14944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    && mButtonBrightness < 0) {
14954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mButtonBrightness = w.mAttrs.buttonBrightness;
14964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
14974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (!mSyswin && w.mAttrs.userActivityTimeout >= 0
14984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    && mUserActivityTimeout < 0) {
14994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mUserActivityTimeout = w.mAttrs.userActivityTimeout;
15004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
15014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
15024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final int type = attrs.type;
15034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (canBeSeen
15044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    && (type == TYPE_SYSTEM_DIALOG
15054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                     || type == TYPE_SYSTEM_ERROR
15064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                     || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) {
15074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mSyswin = true;
15084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
15094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
15104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (canBeSeen) {
15114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // This function assumes that the contents of the default display are
15124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // processed first before secondary displays.
15134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final DisplayContent displayContent = w.getDisplayContent();
15144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (displayContent != null && displayContent.isDefaultDisplay) {
15154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // While a dream or keyguard is showing, obscure ordinary application
15164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // content on secondary displays (by forcibly enabling mirroring unless
15174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // there is other content we want to show) but still allow opaque
15184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // keyguard dialogs to be shown.
15194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) {
15204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        mObscureApplicationContentOnSecondaryDisplays = true;
15214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
15224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mDisplayHasContent = true;
15234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                } else if (displayContent != null &&
15244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        (!mObscureApplicationContentOnSecondaryDisplays
15254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        || (mObscured && type == TYPE_KEYGUARD_DIALOG))) {
15264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    // Allow full screen keyguard presentation dialogs to be seen.
15274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mDisplayHasContent = true;
15284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
15294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (mPreferredRefreshRate == 0
15304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        && w.mAttrs.preferredRefreshRate != 0) {
15314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mPreferredRefreshRate = w.mAttrs.preferredRefreshRate;
15324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
15334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (mPreferredModeId == 0
15344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        && w.mAttrs.preferredDisplayModeId != 0) {
15354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mPreferredModeId = w.mAttrs.preferredDisplayModeId;
15364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
153743e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi                if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) {
153843e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi                    mSustainedPerformanceModeCurrent = true;
153943e38de2530fecbbdea81c52d0fde90333432356Ruchi Kandoi                }
15404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
15414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
15424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
15434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
15444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void updateAllDrawnLocked(DisplayContent displayContent) {
15454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // See if any windows have been drawn, so they (and others
15464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // associated with them) can now be shown.
15474501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        ArrayList<TaskStack> stacks = displayContent.getStacks();
15484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
15494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final ArrayList<Task> tasks = stacks.get(stackNdx).getTasks();
15504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
15514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
15524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                for (int tokenNdx = tokens.size() - 1; tokenNdx >= 0; --tokenNdx) {
15534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    final AppWindowToken wtoken = tokens.get(tokenNdx);
15544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    if (!wtoken.allDrawn) {
15554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        int numInteresting = wtoken.numInterestingWindows;
15564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        if (numInteresting > 0 && wtoken.numDrawnWindows >= numInteresting) {
15574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            if (DEBUG_VISIBILITY)
1558ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                                Slog.v(TAG, "allDrawn: " + wtoken
15594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                                    + " interesting=" + numInteresting
15604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                                    + " drawn=" + wtoken.numDrawnWindows);
15614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            wtoken.allDrawn = true;
15624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            // Force an additional layout pass where WindowStateAnimator#
15634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            // commitFinishDrawingLocked() will call performShowLocked().
15644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            displayContent.layoutNeeded = true;
15654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                            mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN,
15664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                                    wtoken.token).sendToTarget();
15674501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        }
15684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    }
15698e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                    if (!wtoken.allDrawnExcludingSaved) {
15708e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        int numInteresting = wtoken.numInterestingWindowsExcludingSaved;
15718e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        if (numInteresting > 0
15728e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                && wtoken.numDrawnWindowsExclusingSaved >= numInteresting) {
15738e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            if (DEBUG_VISIBILITY)
15748e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                Slog.v(TAG, "allDrawnExcludingSaved: " + wtoken
15758e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                    + " interesting=" + numInteresting
15768e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                    + " drawn=" + wtoken.numDrawnWindowsExclusingSaved);
15778e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            wtoken.allDrawnExcludingSaved = true;
15788e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            displayContent.layoutNeeded = true;
15798e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            if (wtoken.isAnimatingInvisibleWithSavedSurface()
15808e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                    && !mService.mFinishedEarlyAnim.contains(wtoken)) {
15818e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                                mService.mFinishedEarlyAnim.add(wtoken);
15828e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                            }
15838e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                        }
15848e4bda9e0f7411a3bfad0c625177f67248ff8a12Chong Zhang                    }
15854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
15864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
15874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
15884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
15894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
15904501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private static int toBrightnessOverride(float value) {
15914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return (int)(value * PowerManager.BRIGHTNESS_ON);
15924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
15934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
15944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void processApplicationsAnimatingInPlace(int transit) {
15954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (transit == AppTransition.TRANSIT_TASK_IN_PLACE) {
15964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Find the focused window
15974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final WindowState win = mService.findFocusedWindowLocked(
15984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    mService.getDefaultDisplayContentLocked());
15994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (win != null) {
16004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowToken wtoken = win.mAppToken;
16014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
16024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                if (DEBUG_APP_TRANSITIONS)
1603ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                    Slog.v(TAG, "Now animating app in place " + wtoken);
16044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.clearThumbnail();
160565d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                appAnimator.setNullAnimation();
16064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.updateTokenInPlaceLocked(wtoken, transit);
16074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                wtoken.updateReportedVisibilityLocked();
16084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                appAnimator.mAllAppWinAnimators.clear();
16104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                final int N = wtoken.allAppWindows.size();
16114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                for (int j = 0; j < N; j++) {
16124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    appAnimator.mAllAppWinAnimators.add(wtoken.allAppWindows.get(j).mWinAnimator);
16134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                }
16144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                mService.mAnimator.mAppWindowAnimating |= appAnimator.isAnimating();
161569cf50f759e264aea0fc7d389ae85cd3121e4cb9Wale Ogunwale                mService.mAnimator.orAnimating(appAnimator.showAllWindowsLocked());
16164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
16174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
16184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
16194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    private void createThumbnailAppAnimator(int transit, AppWindowToken appToken,
16214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            int openingLayer, int closingLayer) {
16224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        AppWindowAnimator openingAppAnimator = (appToken == null) ? null : appToken.mAppAnimator;
16234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (openingAppAnimator == null || openingAppAnimator.animation == null) {
16244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
16254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
16264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int taskId = appToken.mTask.mTaskId;
16274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
16284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) {
1629ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId);
16304501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            return;
16314501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
16324501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // This thumbnail animation is very special, we need to have
16334501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        // an extra surface with the thumbnail included with the animation.
16344501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        Rect dirty = new Rect(0, 0, thumbnailHeader.getWidth(), thumbnailHeader.getHeight());
16354501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        try {
16364501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // TODO(multi-display): support other displays
16374501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayContent displayContent = mService.getDefaultDisplayContentLocked();
16384501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final Display display = displayContent.getDisplay();
16394501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            final DisplayInfo displayInfo = displayContent.getDisplayInfo();
16404501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16414501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Create a new surface for the thumbnail
16424501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession,
16434501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    "thumbnail anim", dirty.width(), dirty.height(),
16444501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN);
16454501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            surfaceControl.setLayerStack(display.getLayerStack());
16464501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (SHOW_TRANSACTIONS) {
1647ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski                Slog.i(TAG, "  THUMBNAIL " + surfaceControl + ": CREATE");
16484501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
16494501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16504501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Draw the thumbnail onto the surface
16514501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Surface drawSurface = new Surface();
16524501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.copyFrom(surfaceControl);
16534501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Canvas c = drawSurface.lockCanvas(dirty);
16544501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            c.drawBitmap(thumbnailHeader, 0, 0, null);
16554501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.unlockCanvasAndPost(c);
16564501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            drawSurface.release();
16574501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16584501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            // Get the thumbnail animation
16594501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            Animation anim;
16604501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mAppTransition.isNextThumbnailTransitionAspectScaled()) {
16614501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // If this is a multi-window scenario, we use the windows frame as
16624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // destination of the thumbnail header animation. If this is a full screen
16634501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // window scenario, we use the whole display as the target.
16644501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                WindowState win = appToken.findMainWindow();
16654501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                Rect appRect = win != null ? win.getContentFrameLw() :
16664501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        new Rect(0, 0, displayInfo.appWidth, displayInfo.appHeight);
1667de63d441d7daf0503bcc6d5fd3f4f7efe06e23d3Jorim Jaggi                Rect insets = win != null ? win.mContentInsets : null;
16684501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // For the new aspect-scaled transition, we want it to always show
16694501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // above the animating opening/closing window, and we want to
16704501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // synchronize its thumbnail surface with the surface for the
16714501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                // open/close animation (only on the way down)
16724501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                anim = mService.mAppTransition.createThumbnailAspectScaleAnimationLocked(appRect,
1673b20247636b0e0a75edcd327a047b9ea7a9d21b77Winson                        insets, thumbnailHeader, taskId, mService.mCurConfiguration.uiMode,
1674b20247636b0e0a75edcd327a047b9ea7a9d21b77Winson                        mService.mCurConfiguration.orientation);
16754501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                openingAppAnimator.thumbnailForceAboveLayer = Math.max(openingLayer, closingLayer);
16764501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                openingAppAnimator.deferThumbnailDestruction =
16774501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        !mService.mAppTransition.isNextThumbnailTransitionScaleUp();
16784501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            } else {
16794501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                anim = mService.mAppTransition.createThumbnailScaleAnimationLocked(
16804501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                        displayInfo.appWidth, displayInfo.appHeight, transit, thumbnailHeader);
16814501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
16824501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            anim.restrictDuration(MAX_ANIMATION_DURATION);
16834501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());
16844501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16854501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnail = surfaceControl;
16864501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnailLayer = openingLayer;
16874501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.thumbnailAnimation = anim;
16884501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mAppTransition.getNextAppTransitionStartRect(taskId, mTmpStartRect);
16894501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } catch (Surface.OutOfResourcesException e) {
1690ce4ec406acce28395686234e04e8aa4c7f0e8cc9Filip Gruszczynski            Slog.e(TAG, "Can't allocate thumbnail/Canvas surface w="
16914501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                    + dirty.width() + " h=" + dirty.height(), e);
16924501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            openingAppAnimator.clearThumbnail();
16934501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
16944501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
16954501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16964501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    boolean copyAnimToLayoutParamsLocked() {
16974501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        boolean doRequest = false;
16984501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
16994501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        final int bulkUpdateParams = mService.mAnimator.mBulkUpdateParams;
17004501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if ((bulkUpdateParams & SET_UPDATE_ROTATION) != 0) {
17014501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mUpdateRotation = true;
17024501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            doRequest = true;
17034501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
17044501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if ((bulkUpdateParams & SET_WALLPAPER_MAY_CHANGE) != 0) {
17054501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mWallpaperMayChange = true;
17064501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            doRequest = true;
17074501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
17084501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if ((bulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0) {
17094501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mWallpaperForceHidingChanged = true;
17104501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            doRequest = true;
17114501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
17124501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if ((bulkUpdateParams & SET_ORIENTATION_CHANGE_COMPLETE) == 0) {
17134501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mOrientationChangeComplete = false;
17144501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        } else {
17154501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mOrientationChangeComplete = true;
17164501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mLastWindowFreezeSource = mService.mAnimator.mLastWindowFreezeSource;
17174501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            if (mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_NONE) {
17184501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski                doRequest = true;
17194501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            }
17204501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
17214501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if ((bulkUpdateParams & SET_TURN_ON_SCREEN) != 0) {
17224501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mService.mTurnOnScreen = true;
17234501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
17244501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        if ((bulkUpdateParams & SET_WALLPAPER_ACTION_PENDING) != 0) {
17254501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski            mWallpaperActionPending = true;
17264501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        }
17274501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski
17284501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski        return doRequest;
17294501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski    }
173024966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
173124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    void requestTraversal() {
173224966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        if (!mTraversalScheduled) {
173324966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mTraversalScheduled = true;
173424966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski            mService.mH.sendEmptyMessage(DO_TRAVERSAL);
173524966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        }
173624966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
173724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski
17383dac63a18d9115405404561d327010604420b07bJorim Jaggi    /**
17393dac63a18d9115405404561d327010604420b07bJorim Jaggi     * Puts the {@param surface} into a pending list to be destroyed after the current transaction
17403dac63a18d9115405404561d327010604420b07bJorim Jaggi     * has been committed.
17413dac63a18d9115405404561d327010604420b07bJorim Jaggi     */
17423dac63a18d9115405404561d327010604420b07bJorim Jaggi    void destroyAfterTransaction(SurfaceControl surface) {
17433dac63a18d9115405404561d327010604420b07bJorim Jaggi        mPendingDestroyingSurfaces.add(surface);
17443dac63a18d9115405404561d327010604420b07bJorim Jaggi    }
17453dac63a18d9115405404561d327010604420b07bJorim Jaggi
17463dac63a18d9115405404561d327010604420b07bJorim Jaggi    /**
17473dac63a18d9115405404561d327010604420b07bJorim Jaggi     * Destroys any surfaces that have been put into the pending list with
17483dac63a18d9115405404561d327010604420b07bJorim Jaggi     * {@link #destroyAfterTransaction}.
17493dac63a18d9115405404561d327010604420b07bJorim Jaggi     */
17503dac63a18d9115405404561d327010604420b07bJorim Jaggi    void destroyPendingSurfaces() {
17513dac63a18d9115405404561d327010604420b07bJorim Jaggi        for (int i = mPendingDestroyingSurfaces.size() - 1; i >= 0; i--) {
17523dac63a18d9115405404561d327010604420b07bJorim Jaggi            mPendingDestroyingSurfaces.get(i).destroy();
17533dac63a18d9115405404561d327010604420b07bJorim Jaggi        }
17543dac63a18d9115405404561d327010604420b07bJorim Jaggi        mPendingDestroyingSurfaces.clear();
17553dac63a18d9115405404561d327010604420b07bJorim Jaggi    }
17563dac63a18d9115405404561d327010604420b07bJorim Jaggi
175724966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    public void dump(PrintWriter pw, String prefix) {
175824966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski        pw.print(prefix); pw.print("mTraversalScheduled="); pw.println(mTraversalScheduled);
17594ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang        pw.print(prefix); pw.print("mHoldScreenWindow="); pw.println(mHoldScreenWindow);
17604ffc3180121b36eec2577b3c311ad4da44c3af56Chong Zhang        pw.print(prefix); pw.print("mObsuringWindow="); pw.println(mObsuringWindow);
176124966d4789c7a2054650ec1a5ed7450f0d691224Filip Gruszczynski    }
17624501d23cedbaaa33a7a28a76af61e7b097dc2d66Filip Gruszczynski}
1763