1764983d16925daeeba3f29fd1f844187655d1386Craig Mautner// Copyright 2012 Google Inc. All Rights Reserved.
2764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
3764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerpackage com.android.server.wm;
4764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
5764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER;
6f12100e0255c86d0d05dba2e7ba87a745870423dCraig Mautnerimport static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
7764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
8a608b882327fbb393bde3854953cd322a6fea675Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_UPDATE_ROTATION;
9a608b882327fbb393bde3854953cd322a6fea675Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_MAY_CHANGE;
10d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_FORCE_HIDING_CHANGED;
112639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE;
12d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
13711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautnerimport static com.android.server.wm.WindowManagerService.H.UPDATE_ANIM_PARAMETERS;
14a608b882327fbb393bde3854953cd322a6fea675Craig Mautner
15764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.content.Context;
1698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackbornimport android.os.Debug;
17764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.os.SystemClock;
18764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.util.Log;
19764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.util.Slog;
20a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.util.SparseArray;
2176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautnerimport android.util.SparseIntArray;
22529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport android.util.TimeUtils;
236881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display;
24764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.Surface;
25764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.WindowManagerPolicy;
26764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.animation.Animation;
27764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
28322e40315609acd5a608440bc469d873e09559caCraig Mautnerimport com.android.server.wm.WindowManagerService.AppWindowAnimParams;
29529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport com.android.server.wm.WindowManagerService.LayoutFields;
30711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautnerimport com.android.server.wm.WindowManagerService.LayoutToAnimatorParams;
31764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
32e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport java.io.PrintWriter;
330c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackbornimport java.util.ArrayList;
34e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner
35764983d16925daeeba3f29fd1f844187655d1386Craig Mautner/**
36764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * Singleton class that carries out the animations and Surface operations in a separate task
37764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * on behalf of WindowManagerService.
38764983d16925daeeba3f29fd1f844187655d1386Craig Mautner */
39764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerpublic class WindowAnimator {
40bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner    private static final String TAG = "WindowAnimator";
41764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
42764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final WindowManagerService mService;
43764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final Context mContext;
44764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final WindowManagerPolicy mPolicy;
45764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
46764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    boolean mAnimating;
4701cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner
481caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    final Runnable mAnimationRunnable;
491caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
50764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    int mAdjResult;
51764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
5276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    // Layout changes for individual Displays. Indexed by displayId.
5376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    SparseIntArray mPendingLayoutChanges = new SparseIntArray();
54764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
5569b0818179201fadc9d2a384d692d8ae4aecd85cCraig Mautner    // TODO: Assign these from each iteration through DisplayContent. Only valid between loops.
56764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Overall window dimensions */
57764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    int mDw, mDh;
58764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
59764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Interior window dimensions */
60764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    int mInnerDw, mInnerDh;
61764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
62764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Time of current animation step. Reset on each iteration */
63764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    long mCurrentTime;
64764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
65764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
66764983d16925daeeba3f29fd1f844187655d1386Craig Mautner     * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
676fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    private int mAnimTransactionSequence;
68764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
69e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    // Window currently running an animation that has requested it be detached
70e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    // from the wallpaper.  This means we need to ensure the wallpaper is
71e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    // visible behind it in case it animates in a way that would allow it to be
7201cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner    // seen. If multiple windows satisfy this, use the lowest window.
73e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    WindowState mWindowDetachedWallpaper = null;
7401cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner
75a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    WindowStateAnimator mUniverseBackground = null;
76a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    int mAboveUniverseLayer = 0;
77a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
78a608b882327fbb393bde3854953cd322a6fea675Craig Mautner    int mBulkUpdateParams = 0;
79a608b882327fbb393bde3854953cd322a6fea675Craig Mautner
80a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
81a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            new SparseArray<WindowAnimator.DisplayContentsAnimator>();
82d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
834d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner    static final int WALLPAPER_ACTION_PENDING = 1;
844d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner    int mPendingActions;
854d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner
861caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    WindowState mWallpaperTarget = null;
87918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    AppWindowAnimator mWpAppAnimator = null;
88918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    WindowState mLowerWallpaperTarget = null;
89918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    WindowState mUpperWallpaperTarget = null;
90918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner
91322e40315609acd5a608440bc469d873e09559caCraig Mautner    ArrayList<AppWindowAnimator> mAppAnimators = new ArrayList<AppWindowAnimator>();
92322e40315609acd5a608440bc469d873e09559caCraig Mautner
93918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
94918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner
95918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    /** Parameters being passed from this into mService. */
96918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    static class AnimatorToLayoutParams {
97918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        boolean mUpdateQueued;
98918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        int mBulkUpdateParams;
9976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        SparseIntArray mPendingLayoutChanges;
100918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        WindowState mWindowDetachedWallpaper;
101918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    }
102918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    /** Do not modify unless holding mService.mWindowMap or this and mAnimToLayout in that order */
103711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner    final AnimatorToLayoutParams mAnimToLayout = new AnimatorToLayoutParams();
104711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner
105b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner    boolean mInitialized = false;
106b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner
107178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    // forceHiding states.
108178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_NOT_SHOWN     = 0;
109178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_ANIMATING_IN  = 1;
110178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_SHOWN         = 2;
111178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_ANIMATING_OUT = 3;
112178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    int mForceHiding = KEYGUARD_NOT_SHOWN;
113178af5948d71c841278081c712506f7a7fca34b9Craig Mautner
114178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    private String forceHidingToString() {
115178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        switch (mForceHiding) {
116178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_NOT_SHOWN:    return "KEYGUARD_NOT_SHOWN";
117178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
118178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_SHOWN:        return "KEYGUARD_SHOWN";
119178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
120178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
121178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        }
122178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    }
123178af5948d71c841278081c712506f7a7fca34b9Craig Mautner
124918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    WindowAnimator(final WindowManagerService service) {
125764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mService = service;
126918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        mContext = service.mContext;
127918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        mPolicy = service.mPolicy;
1281caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
1291caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        mAnimationRunnable = new Runnable() {
1301caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            @Override
1311caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            public void run() {
1321caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                // TODO(cmautner): When full isolation is achieved for animation, the first lock
1331caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                // goes away and only the WindowAnimator.this remains.
1341caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                synchronized(mService.mWindowMap) {
1351caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                    synchronized(WindowAnimator.this) {
1361caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                        copyLayoutToAnimParamsLocked();
1371caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                        animateLocked();
1381caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                    }
1391caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                }
1401caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            }
1411caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        };
142b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner    }
1439e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
144a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void addDisplayLocked(final int displayId) {
145ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        // Create the DisplayContentsAnimator object by retrieving it.
146ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        getDisplayContentsAnimatorLocked(displayId);
147a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        if (displayId == Display.DEFAULT_DISPLAY) {
148a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            mInitialized = true;
149a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        }
150a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
151a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
152a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void removeDisplayLocked(final int displayId) {
153d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
154d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        if (displayAnimator != null) {
155d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
156d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mWindowAnimationBackgroundSurface.kill();
157d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mWindowAnimationBackgroundSurface = null;
158d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
159d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mScreenRotationAnimation != null) {
160d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mScreenRotationAnimation.kill();
161d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mScreenRotationAnimation = null;
162d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
163d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mDimAnimator != null) {
164d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mDimAnimator.kill();
165d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mDimAnimator = null;
166d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
167d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        }
168d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner
169a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        mDisplayContentsAnimators.delete(displayId);
1701caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    }
1711caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
172711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner    /** Locked on mAnimToLayout */
173711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner    void updateAnimToLayoutLocked() {
174711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner        final AnimatorToLayoutParams animToLayout = mAnimToLayout;
175711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner        synchronized (animToLayout) {
176711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            animToLayout.mBulkUpdateParams = mBulkUpdateParams;
17776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            animToLayout.mPendingLayoutChanges = mPendingLayoutChanges.clone();
178711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            animToLayout.mWindowDetachedWallpaper = mWindowDetachedWallpaper;
179711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner
180711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            if (!animToLayout.mUpdateQueued) {
181711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner                animToLayout.mUpdateQueued = true;
182711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner                mService.mH.sendMessage(mService.mH.obtainMessage(UPDATE_ANIM_PARAMETERS));
183711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            }
184711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner        }
185711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner    }
186711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner
1871caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    /** Copy all WindowManagerService params into local params here. Locked on 'this'. */
1881caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    private void copyLayoutToAnimParamsLocked() {
189711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner        final LayoutToAnimatorParams layoutToAnim = mService.mLayoutToAnim;
1901caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        synchronized(layoutToAnim) {
1911caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            layoutToAnim.mAnimationScheduled = false;
1921caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
193322e40315609acd5a608440bc469d873e09559caCraig Mautner            if (!layoutToAnim.mParamsModified) {
194322e40315609acd5a608440bc469d873e09559caCraig Mautner                return;
195322e40315609acd5a608440bc469d873e09559caCraig Mautner            }
196322e40315609acd5a608440bc469d873e09559caCraig Mautner            layoutToAnim.mParamsModified = false;
197322e40315609acd5a608440bc469d873e09559caCraig Mautner
198918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            if ((layoutToAnim.mChanges & LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED) != 0) {
199918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                layoutToAnim.mChanges &= ~LayoutToAnimatorParams.WALLPAPER_TOKENS_CHANGED;
200918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                mWallpaperTokens = new ArrayList<WindowToken>(layoutToAnim.mWallpaperTokens);
201918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            }
202918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner
203529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (WindowManagerService.DEBUG_WALLPAPER_LIGHT) {
204529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                if (mWallpaperTarget != layoutToAnim.mWallpaperTarget
205529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        || mLowerWallpaperTarget != layoutToAnim.mLowerWallpaperTarget
206529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        || mUpperWallpaperTarget != layoutToAnim.mUpperWallpaperTarget) {
20798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                    Slog.d(TAG, "Pulling anim wallpaper: target=" + layoutToAnim.mWallpaperTarget
20898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                            + " lower=" + layoutToAnim.mLowerWallpaperTarget + " upper="
20998129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                            + layoutToAnim.mUpperWallpaperTarget);
210529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                }
211529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
2121caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            mWallpaperTarget = layoutToAnim.mWallpaperTarget;
213918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            mWpAppAnimator = mWallpaperTarget == null
214918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    ? null : mWallpaperTarget.mAppToken == null
215918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                            ? null : mWallpaperTarget.mAppToken.mAppAnimator;
216918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            mLowerWallpaperTarget = layoutToAnim.mLowerWallpaperTarget;
217918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            mUpperWallpaperTarget = layoutToAnim.mUpperWallpaperTarget;
218a76fdb7713d900763cff090557a10d3942b9b3caCraig Mautner
219a76fdb7713d900763cff090557a10d3942b9b3caCraig Mautner            // Set the new DimAnimator params.
220a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            final int numDisplays = mDisplayContentsAnimators.size();
221a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
222a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
223a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
224a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
225a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                displayAnimator.mWinAnimators.clear();
226a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final WinAnimatorList winAnimators = layoutToAnim.mWinAnimatorLists.get(displayId);
227a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (winAnimators != null) {
228a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    displayAnimator.mWinAnimators.addAll(winAnimators);
229a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
230a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
231a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DimAnimator.Parameters dimParams = layoutToAnim.mDimParams.get(displayId);
232a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (dimParams == null) {
233a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    displayAnimator.mDimParams = null;
234a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                } else {
235a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    final WindowStateAnimator newWinAnimator = dimParams.mDimWinAnimator;
236a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
237a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    // Only set dim params on the highest dimmed layer.
238a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    final WindowStateAnimator existingDimWinAnimator =
239a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                            displayAnimator.mDimParams == null ?
240a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                                    null : displayAnimator.mDimParams.mDimWinAnimator;
241a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    // Don't turn on for an unshown surface, or for any layer but the highest
242a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    // dimmed layer.
243a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
244a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                            || !existingDimWinAnimator.mSurfaceShown
245a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                            || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
246a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mDimParams = new DimAnimator.Parameters(dimParams);
247a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    }
248a76fdb7713d900763cff090557a10d3942b9b3caCraig Mautner                }
249a76fdb7713d900763cff090557a10d3942b9b3caCraig Mautner            }
250322e40315609acd5a608440bc469d873e09559caCraig Mautner
251322e40315609acd5a608440bc469d873e09559caCraig Mautner            mAppAnimators.clear();
252322e40315609acd5a608440bc469d873e09559caCraig Mautner            final int N = layoutToAnim.mAppWindowAnimParams.size();
253322e40315609acd5a608440bc469d873e09559caCraig Mautner            for (int i = 0; i < N; i++) {
254322e40315609acd5a608440bc469d873e09559caCraig Mautner                final AppWindowAnimParams params = layoutToAnim.mAppWindowAnimParams.get(i);
255322e40315609acd5a608440bc469d873e09559caCraig Mautner                AppWindowAnimator appAnimator = params.mAppAnimator;
256bea12bdc2e6d2b1158c1faa58a8197d5e971a817Craig Mautner                appAnimator.mAllAppWinAnimators.clear();
257bea12bdc2e6d2b1158c1faa58a8197d5e971a817Craig Mautner                appAnimator.mAllAppWinAnimators.addAll(params.mWinAnimators);
258322e40315609acd5a608440bc469d873e09559caCraig Mautner                mAppAnimators.add(appAnimator);
259322e40315609acd5a608440bc469d873e09559caCraig Mautner            }
2601caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        }
2611caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    }
2621caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
26398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn    void hideWallpapersLocked(final WindowState w, boolean fromAnimator) {
26498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // There is an issue where this function can be called either from
26598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // the animation or the layout side of the window manager.  The problem
26698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // is that if it is called from the layout side, we may not yet have
26798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // propagated the current layout wallpaper state over into the animation
26898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // state.  If that is the case, we can do bad things like hide the
26998129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // wallpaper when we had just made it shown because the animation side
27098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // doesn't yet see that there is now a wallpaper target.  As a temporary
27198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // work-around, we tell the function here which side of the window manager
27298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        // is calling so it can use the right state.
27398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        if (fromAnimator) {
27498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn            hideWallpapersLocked(w, mWallpaperTarget, mLowerWallpaperTarget, mWallpaperTokens);
27598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        } else {
27698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn            hideWallpapersLocked(w, mService.mWallpaperTarget,
27798129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                    mService.mLowerWallpaperTarget, mService.mWallpaperTokens);
27898129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        }
27998129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn    }
28098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn
28198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn    void hideWallpapersLocked(final WindowState w, final WindowState wallpaperTarget,
28298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn            final WindowState lowerWallpaperTarget, final ArrayList<WindowToken> wallpaperTokens) {
28398129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
28498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn            final int numTokens = wallpaperTokens.size();
285918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            for (int i = numTokens - 1; i >= 0; i--) {
28698129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                final WindowToken token = wallpaperTokens.get(i);
287918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                final int numWindows = token.windows.size();
288918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                for (int j = numWindows - 1; j >= 0; j--) {
289918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    final WindowState wallpaper = token.windows.get(j);
290b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
291b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    if (!winAnimator.mLastHidden) {
292b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                        winAnimator.hide();
293507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner                        mService.dispatchWallpaperVisibility(wallpaper, false);
29476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
29576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
296b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    }
297b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                }
298ef03a7f441cf0cbef5a5f7fafb58a7d5aea7ef52Dianne Hackborn                if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
2992ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        "Hiding wallpaper " + token + " from " + w
3002ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
3012ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        + "\n" + Debug.getCallers(5, "  "));
302b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                token.hidden = true;
3030afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner            }
3040afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner        }
3050afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner    }
3060afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner
307a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateAppWindowsLocked() {
308764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        int i;
309322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int NAT = mAppAnimators.size();
310764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        for (i=0; i<NAT; i++) {
311322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = mAppAnimators.get(i);
312594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final boolean wasAnimating = appAnimator.animation != null
313fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner                    && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
314594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
315764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                mAnimating = true;
316bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            } else if (wasAnimating) {
317bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                // stopped animating, do one more pass through the layout
31876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
31976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        "appToken " + appAnimator.mAppToken + " done");
32083339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
32183339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        "updateWindowsApps...: done animating " + appAnimator.mAppToken);
322bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            }
323bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner        }
324a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
325bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner        final int NEAT = mService.mExitingAppTokens.size();
326bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner        for (i=0; i<NEAT; i++) {
327e4d8a5dd42070d919dbd774f24c6684ecf1e350eCraig Mautner            final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
328594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final boolean wasAnimating = appAnimator.animation != null
329fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner                    && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
330594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (appAnimator.stepAnimationLocked(mCurrentTime, mInnerDw, mInnerDh)) {
331bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                mAnimating = true;
332bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            } else if (wasAnimating) {
333bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                // stopped animating, do one more pass through the layout
33476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
33576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    "exiting appToken " + appAnimator.mAppToken + " done");
33683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
33783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
338764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
339764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
340764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
341764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
342a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateWindowsLocked(final int displayId) {
3436fbda63e68513ece4409dac845588711ab25c39dCraig Mautner        ++mAnimTransactionSequence;
344764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
345a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final WinAnimatorList winAnimatorList =
346a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                getDisplayContentsAnimatorLocked(displayId).mWinAnimators;
3470c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn        ArrayList<WindowStateAnimator> unForceHiding = null;
3480c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn        boolean wallpaperInUnForceHiding = false;
349178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        mForceHiding = KEYGUARD_NOT_SHOWN;
3504bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner
35159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner        for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
35259c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            WindowStateAnimator winAnimator = winAnimatorList.get(i);
35301cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner            WindowState win = winAnimator.mWin;
354bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            final int flags = winAnimator.mAttrFlags;
355764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
356c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner            if (winAnimator.mSurface != null) {
357a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                final boolean wasAnimating = winAnimator.mWasAnimating;
358a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
359764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
360764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                if (WindowManagerService.DEBUG_WALLPAPER) {
361bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                    Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
362764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            ", nowAnimating=" + nowAnimating);
363764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
364764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
365918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                if (wasAnimating && !winAnimator.mAnimating && mWallpaperTarget == win) {
366a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                    mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
36776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
36876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                            WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
369cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
370d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                        mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
37176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                            mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
372cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    }
373764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
374764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
375bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                if (mPolicy.doesForceHide(win, win.mAttrs)) {
376764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    if (!wasAnimating && nowAnimating) {
37783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        if (WindowManagerService.DEBUG_ANIM ||
37883339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                                WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
37983339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                                "Animation started that could impact force hide: " + win);
380d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                        mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
38176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(displayId,
38276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
383cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
384d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
38576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                mPendingLayoutChanges.get(displayId));
386cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        }
387764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        mService.mFocusMayChange = true;
388ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                    }
3894bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                    if (win.isReadyForDisplay()) {
3904bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        if (nowAnimating) {
3914bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            if (winAnimator.mAnimationIsEntrance) {
392178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                                mForceHiding = KEYGUARD_ANIMATING_IN;
3934bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            } else {
394178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                                mForceHiding = KEYGUARD_ANIMATING_OUT;
3954bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            }
3964bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        } else {
397178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            mForceHiding = KEYGUARD_SHOWN;
3984bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        }
399764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
400ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                    if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
401178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            "Force hide " + mForceHiding
402ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " hasSurface=" + win.mHasSurface
403ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " policyVis=" + win.mPolicyVisibility
404ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " destroying=" + win.mDestroying
405ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " attHidden=" + win.mAttachedHidden
406ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " vis=" + win.mViewVisibility
407ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " hidden=" + win.mRootToken.hidden
408ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " anim=" + win.mWinAnimator.mAnimation);
409bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
4104bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                    final boolean hideWhenLocked =
4114bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
412d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                    final boolean changed;
413178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                    if (((mForceHiding == KEYGUARD_ANIMATING_IN)
4144bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                                && (!winAnimator.isAnimating() || hideWhenLocked))
415178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
416bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                        changed = win.hideLw(false, false);
417764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
418bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                "Now policy hidden: " + win);
419764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    } else {
420bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                        changed = win.showLw(false, false);
421764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
422bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                "Now policy shown: " + win);
423764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (changed) {
424d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
425bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                    && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
4260c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                if (unForceHiding == null) {
4270c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                    unForceHiding = new ArrayList<WindowStateAnimator>();
4280c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                }
4290c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                unForceHiding.add(winAnimator);
43001cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner                                if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
4310c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                    wallpaperInUnForceHiding = true;
432764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                }
433764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            }
434bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                            if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
435764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // We are showing on to of the current
436764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // focus, so re-evaluate focus to make
437764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // sure it is correct.
438764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                mService.mFocusMayChange = true;
439764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            }
440764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        }
441764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
44201cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner                    if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
443a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                        mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
44476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
44576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
446cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
447d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
44876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY));
449cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        }
450764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
451764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
452764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
453764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
454bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            final AppWindowToken atoken = win.mAppToken;
4556fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
4566fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (atoken == null || atoken.allDrawn) {
4576fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    if (winAnimator.performShowLocked()) {
45876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        mPendingLayoutChanges.put(displayId,
45976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
4606fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
4616fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
46276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                mPendingLayoutChanges.get(displayId));
463764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        }
464cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    }
465cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                }
466764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
467322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
468594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (appAnimator != null && appAnimator.thumbnail != null) {
4696fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
4706fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
471594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    appAnimator.thumbnailLayer = 0;
4728078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
473594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
474594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
4758078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
4768078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            }
477764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } // end forall windows
4780c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn
479078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        // If we have windows that are being show due to them no longer
480078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        // being force-hidden, apply the appropriate animation to them.
481078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        if (unForceHiding != null) {
482078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            for (int i=unForceHiding.size()-1; i>=0; i--) {
483078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
484078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (a != null) {
485078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    final WindowStateAnimator winAnimator = unForceHiding.get(i);
486078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    winAnimator.setAnimation(a);
487078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    winAnimator.mAnimationIsEntrance = true;
488078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
489078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
490078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        }
491078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner    }
492078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
493a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateWallpaperLocked(int displayId) {
494a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final DisplayContentsAnimator displayAnimator =
495a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                getDisplayContentsAnimatorLocked(displayId);
496a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
497078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        WindowStateAnimator windowAnimationBackground = null;
498078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        int windowAnimationBackgroundColor = 0;
499078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        WindowState detachedWallpaper = null;
500a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final DimSurface windowAnimationBackgroundSurface =
501a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                displayAnimator.mWindowAnimationBackgroundSurface;
502078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
50359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner        for (int i = winAnimatorList.size() - 1; i >= 0; i--) {
50459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            WindowStateAnimator winAnimator = winAnimatorList.get(i);
505078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (winAnimator.mSurface == null) {
506078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                continue;
507078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
508078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
509078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            final int flags = winAnimator.mAttrFlags;
510078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            final WindowState win = winAnimator.mWin;
511078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
512078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // If this window is animating, make a note that we have
513078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // an animating window and take care of a request to run
514078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // a detached wallpaper animation.
515078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (winAnimator.mAnimating) {
516078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (winAnimator.mAnimation != null) {
517078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if ((flags & FLAG_SHOW_WALLPAPER) != 0
518078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            && winAnimator.mAnimation.getDetachWallpaper()) {
519078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        detachedWallpaper = win;
520078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
521078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
522078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if (backgroundColor != 0) {
523078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
524078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                                windowAnimationBackground.mAnimLayer)) {
525078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            windowAnimationBackground = winAnimator;
526078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            windowAnimationBackgroundColor = backgroundColor;
527078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        }
528078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
529078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
530078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                mAnimating = true;
531078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
532078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
533078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // If this window's app token is running a detached wallpaper
534078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // animation, make a note so we can ensure the wallpaper is
535078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // displayed behind it.
536322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
537078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (appAnimator != null && appAnimator.animation != null
538078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    && appAnimator.animating) {
539078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if ((flags & FLAG_SHOW_WALLPAPER) != 0
540078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        && appAnimator.animation.getDetachWallpaper()) {
541078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    detachedWallpaper = win;
542078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
543078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
544078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                final int backgroundColor = appAnimator.animation.getBackgroundColor();
545078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (backgroundColor != 0) {
546078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
547078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            windowAnimationBackground.mAnimLayer)) {
548078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        windowAnimationBackground = winAnimator;
549078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        windowAnimationBackgroundColor = backgroundColor;
550078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
551078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
552078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
553078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        } // end forall windows
554078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
5559e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        if (mWindowDetachedWallpaper != detachedWallpaper) {
5569e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
5579e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    "Detached wallpaper changed from " + mWindowDetachedWallpaper
5589e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    + " to " + detachedWallpaper);
5599e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            mWindowDetachedWallpaper = detachedWallpaper;
5609e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
5619e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        }
5629e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
5639e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        if (windowAnimationBackgroundColor != 0) {
5649e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            // If the window that wants black is the current wallpaper
5659e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            // target, then the black goes *below* the wallpaper so we
5669e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            // don't cause the wallpaper to suddenly disappear.
5679e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            int animLayer = windowAnimationBackground.mAnimLayer;
5689e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            WindowState win = windowAnimationBackground.mWin;
56959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner            if (mWallpaperTarget == win
570918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    || mLowerWallpaperTarget == win || mUpperWallpaperTarget == win) {
57159c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                final int N = winAnimatorList.size();
5729e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                for (int i = 0; i < N; i++) {
57359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner                    WindowStateAnimator winAnimator = winAnimatorList.get(i);
574918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    if (winAnimator.mIsWallpaper) {
5759e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                        animLayer = winAnimator.mAnimLayer;
5769e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                        break;
5779e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    }
5789e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                }
5799e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            }
5809e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
581d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (windowAnimationBackgroundSurface != null) {
582d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                windowAnimationBackgroundSurface.show(mDw, mDh,
583d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                        animLayer - WindowManagerService.LAYER_OFFSET_DIM,
584d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                        windowAnimationBackgroundColor);
585d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
5869e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        } else {
587d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (windowAnimationBackgroundSurface != null) {
588d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                windowAnimationBackgroundSurface.hide();
589d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
5909e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        }
591764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
592764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
593764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    private void testTokenMayBeDrawnLocked() {
594764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        // See if any windows have been drawn, so they (and others
595764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        // associated with them) can now be shown.
596322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int NT = mAppAnimators.size();
597764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        for (int i=0; i<NT; i++) {
598322e40315609acd5a608440bc469d873e09559caCraig Mautner            AppWindowAnimator appAnimator = mAppAnimators.get(i);
599322e40315609acd5a608440bc469d873e09559caCraig Mautner            AppWindowToken wtoken = appAnimator.mAppToken;
6006fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            final boolean allDrawn = wtoken.allDrawn;
601322e40315609acd5a608440bc469d873e09559caCraig Mautner            if (allDrawn != appAnimator.allDrawn) {
602322e40315609acd5a608440bc469d873e09559caCraig Mautner                appAnimator.allDrawn = allDrawn;
6036fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (allDrawn) {
6046fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    // The token has now changed state to having all
6056fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    // windows shown...  what to do, what to do?
606322e40315609acd5a608440bc469d873e09559caCraig Mautner                    if (appAnimator.freezingScreen) {
607322e40315609acd5a608440bc469d873e09559caCraig Mautner                        appAnimator.showAllWindowsLocked();
6086fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        mService.unsetAppFreezingScreenLocked(wtoken, false, true);
6096fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
6106fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                                "Setting mOrientationChangeComplete=true because wtoken "
6116fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                                + wtoken + " numInteresting=" + wtoken.numInterestingWindows
6126fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                                + " numDrawn=" + wtoken.numDrawnWindows);
6136fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        // This will set mOrientationChangeComplete and cause a pass through layout.
61476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setAppLayoutChanges(appAnimator,
61576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
61676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                "testTokenMayBeDrawnLocked: freezingScreen");
6176fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    } else {
61876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setAppLayoutChanges(appAnimator,
61976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
62076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                "testTokenMayBeDrawnLocked");
62176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner
6226fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        // We can now show all of the drawn windows!
6236fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (!mService.mOpeningApps.contains(wtoken)) {
624322e40315609acd5a608440bc469d873e09559caCraig Mautner                            mAnimating |= appAnimator.showAllWindowsLocked();
6256fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        }
626764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
627764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
628764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
629764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
630764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
631764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
632a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void performAnimationsLocked(final int displayId) {
633a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        updateWindowsLocked(displayId);
634a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        updateWallpaperLocked(displayId);
635764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
636764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
6371caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    // TODO(cmautner): Change the following comment when no longer locked on mWindowMap */
6381caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    /** Locked on mService.mWindowMap and this. */
6391caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    private void animateLocked() {
640b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        if (!mInitialized) {
641b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner            return;
642b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        }
64359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
64476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        mPendingLayoutChanges.clear();
645764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mCurrentTime = SystemClock.uptimeMillis();
6462639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner        mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
647198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase        boolean wasAnimating = mAnimating;
6487d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        mAnimating = false;
6497d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (WindowManagerService.DEBUG_WINDOW_TRACE) {
6507d8df3905d294127cc58100912a57c816bfb2502Craig Mautner            Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
6517d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
652764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
653ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
654ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                TAG, ">>> OPEN TRANSACTION animateLocked");
655764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        Surface.openTransaction();
656b6ce6e42cc89864354c7ecb9ae80504a6c9dddcfJamie Gennis        Surface.setAnimationTransaction();
657764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        try {
658a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            updateAppWindowsLocked();
659a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
660a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            final int numDisplays = mDisplayContentsAnimators.size();
661a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
662a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
663a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
664a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
665a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final ScreenRotationAnimation screenRotationAnimation =
666a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation;
667a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
668a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
669a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        mAnimating = true;
670a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    } else {
671a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        mBulkUpdateParams |= SET_UPDATE_ROTATION;
672a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        screenRotationAnimation.kill();
673a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation = null;
674a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    }
675a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
676764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
677ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                // Update animations of all applications, including those
678ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                // associated with exiting/removed apps
679a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                performAnimationsLocked(displayId);
680ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
681a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final WinAnimatorList winAnimatorList = displayAnimator.mWinAnimators;
682ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                final int N = winAnimatorList.size();
683ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                for (int j = 0; j < N; j++) {
684ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                    winAnimatorList.get(j).prepareSurfaceLocked(true);
685ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                }
686764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
687764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
688ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            testTokenMayBeDrawnLocked();
689ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
690a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
691a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
692a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
693764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
694a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final ScreenRotationAnimation screenRotationAnimation =
695a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation;
696a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (screenRotationAnimation != null) {
697a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    screenRotationAnimation.updateSurfacesInTransaction();
698a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
699a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
700a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final DimAnimator.Parameters dimParams = displayAnimator.mDimParams;
701a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final DimAnimator dimAnimator = displayAnimator.mDimAnimator;
702d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                if (dimAnimator != null && dimParams != null) {
703d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                    dimAnimator.updateParameters(mContext.getResources(), dimParams, mCurrentTime);
704a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
705a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (dimAnimator != null && dimAnimator.mDimShown) {
706a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    mAnimating |= dimAnimator.updateSurface(isDimmingLocked(displayId),
707a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                            mCurrentTime, !mService.okToDisplay());
708a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
709764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
710764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
7117358fbfeb2febb60085067fcacc192f429b06545Craig Mautner            if (mService.mWatermark != null) {
7127358fbfeb2febb60085067fcacc192f429b06545Craig Mautner                mService.mWatermark.drawIfNeeded();
7137358fbfeb2febb60085067fcacc192f429b06545Craig Mautner            }
714764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } catch (RuntimeException e) {
715764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            Log.wtf(TAG, "Unhandled exception in Window Manager", e);
716764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } finally {
717764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            Surface.closeTransaction();
718ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
719ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                    TAG, "<<< CLOSE TRANSACTION animateLocked");
720ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        }
721ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
722ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        for (int i = mPendingLayoutChanges.size() - 1; i >= 0; i--) {
723ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            if ((mPendingLayoutChanges.valueAt(i)
724ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                    & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
725ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                mPendingActions |= WALLPAPER_ACTION_PENDING;
726ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            }
727764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
728c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner
72976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        if (mBulkUpdateParams != 0 || mPendingLayoutChanges.size() > 0) {
730711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            updateAnimToLayoutLocked();
73101cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner        }
7327d8df3905d294127cc58100912a57c816bfb2502Craig Mautner
7337d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (mAnimating) {
734711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner            synchronized (mService.mLayoutToAnim) {
735711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner                mService.scheduleAnimationLocked();
7361caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            }
737198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase        } else if (wasAnimating) {
738198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase            mService.requestTraversalLocked();
7397d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
7407d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (WindowManagerService.DEBUG_WINDOW_TRACE) {
7417d8df3905d294127cc58100912a57c816bfb2502Craig Mautner            Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
7427d8df3905d294127cc58100912a57c816bfb2502Craig Mautner                + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
74376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
74476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                + Integer.toHexString(mPendingLayoutChanges.get(Display.DEFAULT_DISPLAY)));
7457d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
746764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
747764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
748764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    WindowState mCurrentFocus;
749d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    void setCurrentFocus(final WindowState currentFocus) {
750764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mCurrentFocus = currentFocus;
751764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
752764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
753764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    void setDisplayDimensions(final int curWidth, final int curHeight,
754764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        final int appWidth, final int appHeight) {
755764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mDw = curWidth;
756764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mDh = curHeight;
757764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mInnerDw = appWidth;
758764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mInnerDh = appHeight;
759764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
760764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
761a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    boolean isDimmingLocked(int displayId) {
762a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return getDisplayContentsAnimatorLocked(displayId).mDimParams != null;
763f8d4fbb9c87201350534861c4d988e63691fe24fCraig Mautner    }
764f8d4fbb9c87201350534861c4d988e63691fe24fCraig Mautner
765a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
766a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        DimAnimator.Parameters dimParams =
767a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                getDisplayContentsAnimatorLocked(winAnimator.mWin.getDisplayId()).mDimParams;
768a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return dimParams != null && dimParams.mDimWinAnimator == winAnimator;
769acafd19c5ea05a8d465f97204f8d63468bdaa2a4Craig Mautner    }
770acafd19c5ea05a8d465f97204f8d63468bdaa2a4Craig Mautner
771529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    static String bulkUpdateParamsToString(int bulkUpdateParams) {
772529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        StringBuilder builder = new StringBuilder(128);
773529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
774529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" UPDATE_ROTATION");
775529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
776529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
777529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" WALLPAPER_MAY_CHANGE");
778529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
779529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
780529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" FORCE_HIDING_CHANGED");
781529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
782529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
783529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" ORIENTATION_CHANGE_COMPLETE");
784529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
785529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
786529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" TURN_ON_SCREEN");
787529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
788529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        return builder.toString();
789529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    }
790529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
791a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
792529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        final String subPrefix = "  " + prefix;
793529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        final String subSubPrefix = "  " + subPrefix;
794529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
795529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        boolean needSep = false;
796529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mAppAnimators.size() > 0) {
797529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            needSep = true;
798529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.println("  App Animators:");
799529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            for (int i=mAppAnimators.size()-1; i>=0; i--) {
800529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                AppWindowAnimator anim = mAppAnimators.get(i);
801529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(prefix); pw.print("App Animator #"); pw.print(i);
802529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        pw.print(' '); pw.print(anim);
803529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                if (dumpAll) {
804529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(':');
805529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    anim.dump(pw, subPrefix, dumpAll);
806a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                } else {
807529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println();
808a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
809529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
810529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
811529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mWallpaperTokens.size() > 0) {
812529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (needSep) {
813529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.println();
814529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
815529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            needSep = true;
816529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.println("Wallpaper tokens:");
817529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            for (int i=mWallpaperTokens.size()-1; i>=0; i--) {
818529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                WindowToken token = mWallpaperTokens.get(i);
819529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(prefix); pw.print("Wallpaper #"); pw.print(i);
820529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        pw.print(' '); pw.print(token);
821529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                if (dumpAll) {
822529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(':');
823529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    token.dump(pw, subPrefix);
824a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                } else {
825529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println();
826a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
8276fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            }
828529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
829529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
830529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (needSep) {
831a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            pw.println();
832d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner        }
833529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
834529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("DisplayContentsAnimator #");
835529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mDisplayContentsAnimators.keyAt(i));
836529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(":");
837529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
838529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            for (int j=0; j<displayAnimator.mWinAnimators.size(); j++) {
839529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                WindowStateAnimator wanim = displayAnimator.mWinAnimators.get(j);
840529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.print("Window #"); pw.print(j);
841529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        pw.print(": "); pw.println(wanim);
842529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
843529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
844529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.mDimShown) {
845529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
846529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
847529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                }
848529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
849529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mDimAnimator != null) {
850529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                if (dumpAll || displayAnimator.mDimAnimator.mDimShown) {
851529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(subPrefix); pw.println("mDimAnimator:");
852529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
853529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                }
854529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            } else if (dumpAll) {
855529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("no DimAnimator ");
856529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
857529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mDimParams != null) {
858529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("mDimParams:");
859529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                displayAnimator.mDimParams.printTo(subSubPrefix, pw);
860529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            } else if (dumpAll) {
861529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("no DimParams ");
862529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
863529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mScreenRotationAnimation != null) {
864529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
865529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
866529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            } else if (dumpAll) {
867529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
868529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
869529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
870529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
871529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.println();
872529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
873529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (dumpAll) {
874529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mAnimTransactionSequence=");
875529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mAnimTransactionSequence);
876529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mForceHiding="); pw.println(forceHidingToString());
877529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mCurrentTime=");
878529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(TimeUtils.formatUptime(mCurrentTime));
879529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mDw=");
880529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mDw); pw.print(" mDh="); pw.print(mDh);
881529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mInnerDw="); pw.print(mInnerDw);
882529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mInnerDh="); pw.println(mInnerDh);
883529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
884529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mBulkUpdateParams != 0) {
885529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mBulkUpdateParams=0x");
886529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(Integer.toHexString(mBulkUpdateParams));
887529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
888529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
889529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mPendingActions != 0) {
890529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mPendingActions=0x");
891529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(Integer.toHexString(mPendingActions));
892529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
893529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mWindowDetachedWallpaper != null) {
894529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
895529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.println(mWindowDetachedWallpaper);
896529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
897529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mWallpaperTarget="); pw.println(mWallpaperTarget);
898529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mWpAppAnimator="); pw.println(mWpAppAnimator);
899529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mLowerWallpaperTarget != null || mUpperWallpaperTarget != null) {
900529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mLowerWallpaperTarget=");
901529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(mLowerWallpaperTarget);
902529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mUpperWallpaperTarget=");
903529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(mUpperWallpaperTarget);
904529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
905529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mUniverseBackground != null) {
906529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
907529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
908529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
909e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    }
910bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner
91176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void clearPendingActions() {
91276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        synchronized (this) {
91376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            mPendingActions = 0;
91476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        }
91576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    }
91676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner
91776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void setPendingLayoutChanges(final int displayId, final int changes) {
91876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        mPendingLayoutChanges.put(displayId, mPendingLayoutChanges.get(displayId) | changes);
91976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    }
92076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner
92176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
92276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        // Used to track which displays layout changes have been done.
92376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        SparseIntArray displays = new SparseIntArray();
92476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        for (int i = appAnimator.mAllAppWinAnimators.size() - 1; i >= 0; i--) {
92576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            WindowStateAnimator winAnimator = appAnimator.mAllAppWinAnimators.get(i);
92676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            final int displayId = winAnimator.mWin.mDisplayContent.getDisplayId();
92776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            if (displays.indexOfKey(displayId) < 0) {
92876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setPendingLayoutChanges(displayId, changes);
92976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
93076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    mService.debugLayoutRepeats(s, mPendingLayoutChanges.get(displayId));
93176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                }
93276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                // Keep from processing this display again.
93376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                displays.put(displayId, changes);
93476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            }
93576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        }
9364d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner    }
937a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
938a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
939a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
940a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        if (displayAnimator == null) {
941ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner            displayAnimator = new DisplayContentsAnimator(displayId);
942a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            mDisplayContentsAnimators.put(displayId, displayAnimator);
943a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        }
944a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return displayAnimator;
945a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
946a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
947a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
948a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
949a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
950a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
951a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
952a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
953a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
954a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
955ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner    private class DisplayContentsAnimator {
956a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        WinAnimatorList mWinAnimators = new WinAnimatorList();
957d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        DimAnimator mDimAnimator = null;
958a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        DimAnimator.Parameters mDimParams = null;
959d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        DimSurface mWindowAnimationBackgroundSurface = null;
960a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        ScreenRotationAnimation mScreenRotationAnimation = null;
961ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner
962ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        public DisplayContentsAnimator(int displayId) {
963ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner            mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
964ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner            mWindowAnimationBackgroundSurface =
965ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner                    new DimSurface(mService.mFxSession, displayId);
966ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        }
967a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
968764983d16925daeeba3f29fd1f844187655d1386Craig Mautner}
969