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;
12968683335e17c06504a11bc2e38a2580f613ea16Craig Mautnerimport static com.android.server.wm.WindowManagerService.LayoutFields.SET_WALLPAPER_ACTION_PENDING;
13a608b882327fbb393bde3854953cd322a6fea675Craig Mautner
14764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.content.Context;
1598129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackbornimport android.os.Debug;
16764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.os.SystemClock;
17764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.util.Log;
18764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.util.Slog;
19a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.util.SparseArray;
2076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautnerimport android.util.SparseIntArray;
21529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport android.util.TimeUtils;
221420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautnerimport android.util.TypedValue;
236881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display;
24764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.Surface;
253866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
26764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.WindowManagerPolicy;
27764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.animation.Animation;
28764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
29529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport com.android.server.wm.WindowManagerService.LayoutFields;
30764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
31e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport java.io.PrintWriter;
320c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackbornimport java.util.ArrayList;
33e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner
34764983d16925daeeba3f29fd1f844187655d1386Craig Mautner/**
35764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * Singleton class that carries out the animations and Surface operations in a separate task
36764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * on behalf of WindowManagerService.
37764983d16925daeeba3f29fd1f844187655d1386Craig Mautner */
38764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerpublic class WindowAnimator {
39bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner    private static final String TAG = "WindowAnimator";
40764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
411420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    /** Amount of time in milliseconds to animate the dim surface from one value to another,
421420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner     * when no window animation is driving it. */
431420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    static final int DEFAULT_DIM_DURATION = 200;
441420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner
45764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final WindowManagerService mService;
46764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final Context mContext;
47764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final WindowManagerPolicy mPolicy;
48764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
49764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    boolean mAnimating;
5001cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner
511caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    final Runnable mAnimationRunnable;
521caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
53764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    int mAdjResult;
54764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
55764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Time of current animation step. Reset on each iteration */
56764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    long mCurrentTime;
57764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
58764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
59764983d16925daeeba3f29fd1f844187655d1386Craig Mautner     * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
606fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    private int mAnimTransactionSequence;
61764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
62ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner    /** Window currently running an animation that has requested it be detached
63ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner     * from the wallpaper.  This means we need to ensure the wallpaper is
64ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner     * visible behind it in case it animates in a way that would allow it to be
65ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner     * seen. If multiple windows satisfy this, use the lowest window. */
66e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    WindowState mWindowDetachedWallpaper = null;
6701cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner
68a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    WindowStateAnimator mUniverseBackground = null;
69a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    int mAboveUniverseLayer = 0;
70a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
71a608b882327fbb393bde3854953cd322a6fea675Craig Mautner    int mBulkUpdateParams = 0;
72a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    Object mLastWindowFreezeSource;
73a608b882327fbb393bde3854953cd322a6fea675Craig Mautner
74a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
75a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            new SparseArray<WindowAnimator.DisplayContentsAnimator>();
76d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
77b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner    boolean mInitialized = false;
78b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner
79178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    // forceHiding states.
80178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_NOT_SHOWN     = 0;
81178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_ANIMATING_IN  = 1;
82178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_SHOWN         = 2;
83178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_ANIMATING_OUT = 3;
84178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    int mForceHiding = KEYGUARD_NOT_SHOWN;
85178af5948d71c841278081c712506f7a7fca34b9Craig Mautner
86178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    private String forceHidingToString() {
87178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        switch (mForceHiding) {
88178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_NOT_SHOWN:    return "KEYGUARD_NOT_SHOWN";
89178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
90178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_SHOWN:        return "KEYGUARD_SHOWN";
91178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
92178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
93178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        }
94178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    }
95178af5948d71c841278081c712506f7a7fca34b9Craig Mautner
96918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    WindowAnimator(final WindowManagerService service) {
97764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mService = service;
98918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        mContext = service.mContext;
99918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        mPolicy = service.mPolicy;
1001caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
1011caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        mAnimationRunnable = new Runnable() {
1021caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            @Override
1031caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            public void run() {
104968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                synchronized (mService.mWindowMap) {
105968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    mService.mAnimationScheduled = false;
106968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    animateLocked();
1071caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                }
1081caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            }
1091caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        };
110b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner    }
1119e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
112a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void addDisplayLocked(final int displayId) {
113ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        // Create the DisplayContentsAnimator object by retrieving it.
114ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        getDisplayContentsAnimatorLocked(displayId);
115a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        if (displayId == Display.DEFAULT_DISPLAY) {
116a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            mInitialized = true;
117a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        }
118a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
119a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
120a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void removeDisplayLocked(final int displayId) {
121d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
122d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        if (displayAnimator != null) {
123d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
1241420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                displayAnimator.mWindowAnimationBackgroundSurface.destroySurface();
125d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mWindowAnimationBackgroundSurface = null;
126d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
127d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mScreenRotationAnimation != null) {
128d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mScreenRotationAnimation.kill();
129d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mScreenRotationAnimation = null;
130d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
131d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mDimAnimator != null) {
1321420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                displayAnimator.mDimAnimator.destroySurface();
133d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mDimAnimator = null;
134d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
135d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        }
136d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner
137a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        mDisplayContentsAnimators.delete(displayId);
1381caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    }
1391caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
140968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner    AppWindowAnimator getWallpaperAppAnimator() {
141968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        return mService.mWallpaperTarget == null
142968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                ? null : mService.mWallpaperTarget.mAppToken == null
143968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                        ? null : mService.mWallpaperTarget.mAppToken.mAppAnimator;
144711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner    }
145711f90a7c1e99a435fa8f5335f13772f0b41270bCraig Mautner
146968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner    void hideWallpapersLocked(final WindowState w) {
147968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowState wallpaperTarget = mService.mWallpaperTarget;
148968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
149968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens;
15066f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
15198129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
15298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn            final int numTokens = wallpaperTokens.size();
153918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            for (int i = numTokens - 1; i >= 0; i--) {
15498129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                final WindowToken token = wallpaperTokens.get(i);
155918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                final int numWindows = token.windows.size();
156918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                for (int j = numWindows - 1; j >= 0; j--) {
157918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    final WindowState wallpaper = token.windows.get(j);
158b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
159b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    if (!winAnimator.mLastHidden) {
160b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                        winAnimator.hide();
161507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner                        mService.dispatchWallpaperVisibility(wallpaper, false);
16276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
16376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
164b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    }
165b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                }
166ef03a7f441cf0cbef5a5f7fafb58a7d5aea7ef52Dianne Hackborn                if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
1672ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        "Hiding wallpaper " + token + " from " + w
1682ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
1692ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        + "\n" + Debug.getCallers(5, "  "));
170b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                token.hidden = true;
1710afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner            }
1720afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner        }
1730afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner    }
1740afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner
1752ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner    private void updateAppWindowsLocked() {
176764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        int i;
1772ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
1782ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        final int NAT = appTokens.size();
1792ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        for (i=0; i<NAT; i++) {
1802ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner            final AppWindowAnimator appAnimator = appTokens.get(i).mAppAnimator;
181594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final boolean wasAnimating = appAnimator.animation != null
182fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner                    && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
1839339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            if (appAnimator.stepAnimationLocked(mCurrentTime)) {
184764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                mAnimating = true;
185bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            } else if (wasAnimating) {
186bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                // stopped animating, do one more pass through the layout
18776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
18876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        "appToken " + appAnimator.mAppToken + " done");
18983339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
19083339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        "updateWindowsApps...: done animating " + appAnimator.mAppToken);
191bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            }
192bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner        }
193a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
1942ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        final int NEAT = mService.mExitingAppTokens.size();
195bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner        for (i=0; i<NEAT; i++) {
1962ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner            final AppWindowAnimator appAnimator = mService.mExitingAppTokens.get(i).mAppAnimator;
197594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final boolean wasAnimating = appAnimator.animation != null
198fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner                    && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
1999339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            if (appAnimator.stepAnimationLocked(mCurrentTime)) {
200bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                mAnimating = true;
201bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            } else if (wasAnimating) {
202bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                // stopped animating, do one more pass through the layout
20376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
20476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    "exiting appToken " + appAnimator.mAppToken + " done");
20583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
20683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
207764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
208764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
209764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
210764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
211a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateWindowsLocked(final int displayId) {
2126fbda63e68513ece4409dac845588711ab25c39dCraig Mautner        ++mAnimTransactionSequence;
213764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
214968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowList windows = mService.getWindowListLocked(displayId);
2150c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn        ArrayList<WindowStateAnimator> unForceHiding = null;
2160c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn        boolean wallpaperInUnForceHiding = false;
217178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        mForceHiding = KEYGUARD_NOT_SHOWN;
2184bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner
219968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        for (int i = windows.size() - 1; i >= 0; i--) {
220968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            WindowState win = windows.get(i);
221968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            WindowStateAnimator winAnimator = win.mWinAnimator;
222bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            final int flags = winAnimator.mAttrFlags;
223764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
22429479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            if (winAnimator.mSurfaceControl != null) {
225a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                final boolean wasAnimating = winAnimator.mWasAnimating;
226a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
227764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
228764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                if (WindowManagerService.DEBUG_WALLPAPER) {
229bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                    Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
230764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            ", nowAnimating=" + nowAnimating);
231764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
232764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
233968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
234a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                    mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
23576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
23676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                            WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
237cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
238d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                        mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
23966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
240cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    }
241764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
242764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
243bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                if (mPolicy.doesForceHide(win, win.mAttrs)) {
244764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    if (!wasAnimating && nowAnimating) {
24583339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        if (WindowManagerService.DEBUG_ANIM ||
24683339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                                WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
24783339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                                "Animation started that could impact force hide: " + win);
248d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                        mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
24976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(displayId,
25076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
251cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
252d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
25366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                    getPendingLayoutChanges(displayId));
254cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        }
255764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        mService.mFocusMayChange = true;
256ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                    }
2574bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                    if (win.isReadyForDisplay()) {
2584bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        if (nowAnimating) {
2594bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            if (winAnimator.mAnimationIsEntrance) {
260178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                                mForceHiding = KEYGUARD_ANIMATING_IN;
2614bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            } else {
262178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                                mForceHiding = KEYGUARD_ANIMATING_OUT;
2634bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            }
2644bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        } else {
265178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            mForceHiding = KEYGUARD_SHOWN;
2664bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        }
267764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
268ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                    if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
269178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            "Force hide " + mForceHiding
270ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " hasSurface=" + win.mHasSurface
271ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " policyVis=" + win.mPolicyVisibility
272ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " destroying=" + win.mDestroying
273ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " attHidden=" + win.mAttachedHidden
274ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " vis=" + win.mViewVisibility
275ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " hidden=" + win.mRootToken.hidden
276ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " anim=" + win.mWinAnimator.mAnimation);
277bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
2784bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                    final boolean hideWhenLocked =
2794bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
280d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                    final boolean changed;
281178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                    if (((mForceHiding == KEYGUARD_ANIMATING_IN)
2824bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                                && (!winAnimator.isAnimating() || hideWhenLocked))
283178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
284bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                        changed = win.hideLw(false, false);
285764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
286bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                "Now policy hidden: " + win);
287764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    } else {
288bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                        changed = win.showLw(false, false);
289764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
290bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                "Now policy shown: " + win);
291764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (changed) {
292d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
293bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                    && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
2940c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                if (unForceHiding == null) {
2950c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                    unForceHiding = new ArrayList<WindowStateAnimator>();
2960c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                }
2970c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                unForceHiding.add(winAnimator);
29801cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner                                if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
2990c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                    wallpaperInUnForceHiding = true;
300764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                }
301764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            }
302bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                            if (mCurrentFocus == null || mCurrentFocus.mLayer < win.mLayer) {
303764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // We are showing on to of the current
304764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // focus, so re-evaluate focus to make
305764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // sure it is correct.
306764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                mService.mFocusMayChange = true;
307764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            }
308764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        }
309764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
31001cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner                    if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
311a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                        mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
31276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
31376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
314cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
315d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
31666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                    getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
317cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        }
318764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
319764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
320764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
321764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
322bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            final AppWindowToken atoken = win.mAppToken;
3236fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
3246fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (atoken == null || atoken.allDrawn) {
3256fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    if (winAnimator.performShowLocked()) {
32666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                        setPendingLayoutChanges(displayId,
32776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
3286fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
3296fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
33066f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                    getPendingLayoutChanges(displayId));
331764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        }
332cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    }
333cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                }
334764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
335322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
336594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (appAnimator != null && appAnimator.thumbnail != null) {
3376fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
3386fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
339594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    appAnimator.thumbnailLayer = 0;
3408078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
341594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
342594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
3438078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
3448078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            }
345764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } // end forall windows
3460c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn
347078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        // If we have windows that are being show due to them no longer
348078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        // being force-hidden, apply the appropriate animation to them.
349078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        if (unForceHiding != null) {
350078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            for (int i=unForceHiding.size()-1; i>=0; i--) {
351078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
352078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (a != null) {
353078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    final WindowStateAnimator winAnimator = unForceHiding.get(i);
354078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    winAnimator.setAnimation(a);
355078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    winAnimator.mAnimationIsEntrance = true;
356078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
357078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
358078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        }
359078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner    }
360078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
361a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateWallpaperLocked(int displayId) {
362a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final DisplayContentsAnimator displayAnimator =
363a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                getDisplayContentsAnimatorLocked(displayId);
364968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowList windows = mService.getWindowListLocked(displayId);
365078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        WindowStateAnimator windowAnimationBackground = null;
366078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        int windowAnimationBackgroundColor = 0;
367078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        WindowState detachedWallpaper = null;
368078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
369968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        for (int i = windows.size() - 1; i >= 0; i--) {
370968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final WindowState win = windows.get(i);
371968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            WindowStateAnimator winAnimator = win.mWinAnimator;
37229479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            if (winAnimator.mSurfaceControl == null) {
373078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                continue;
374078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
375078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
376078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            final int flags = winAnimator.mAttrFlags;
377078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
378078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // If this window is animating, make a note that we have
379078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // an animating window and take care of a request to run
380078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // a detached wallpaper animation.
381078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (winAnimator.mAnimating) {
382078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (winAnimator.mAnimation != null) {
383078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if ((flags & FLAG_SHOW_WALLPAPER) != 0
384078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            && winAnimator.mAnimation.getDetachWallpaper()) {
385078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        detachedWallpaper = win;
386078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
387078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    final int backgroundColor = winAnimator.mAnimation.getBackgroundColor();
388078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if (backgroundColor != 0) {
389078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
390078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                                windowAnimationBackground.mAnimLayer)) {
391078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            windowAnimationBackground = winAnimator;
392078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            windowAnimationBackgroundColor = backgroundColor;
393078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        }
394078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
395078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
396078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                mAnimating = true;
397078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
398078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
399078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // If this window's app token is running a detached wallpaper
400078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // animation, make a note so we can ensure the wallpaper is
401078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // displayed behind it.
402322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
403078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (appAnimator != null && appAnimator.animation != null
404078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    && appAnimator.animating) {
405078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if ((flags & FLAG_SHOW_WALLPAPER) != 0
406078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        && appAnimator.animation.getDetachWallpaper()) {
407078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    detachedWallpaper = win;
408078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
409078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
410078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                final int backgroundColor = appAnimator.animation.getBackgroundColor();
411078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (backgroundColor != 0) {
412078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if (windowAnimationBackground == null || (winAnimator.mAnimLayer <
413078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            windowAnimationBackground.mAnimLayer)) {
414078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        windowAnimationBackground = winAnimator;
415078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        windowAnimationBackgroundColor = backgroundColor;
416078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
417078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
418078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
419078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        } // end forall windows
420078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
4219e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        if (mWindowDetachedWallpaper != detachedWallpaper) {
4229e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
4239e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    "Detached wallpaper changed from " + mWindowDetachedWallpaper
4249e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    + " to " + detachedWallpaper);
4259e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            mWindowDetachedWallpaper = detachedWallpaper;
4269e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
4279e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        }
4289e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
4299e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        if (windowAnimationBackgroundColor != 0) {
4309e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            // If the window that wants black is the current wallpaper
4319e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            // target, then the black goes *below* the wallpaper so we
4329e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            // don't cause the wallpaper to suddenly disappear.
4339e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            int animLayer = windowAnimationBackground.mAnimLayer;
4349e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            WindowState win = windowAnimationBackground.mWin;
435968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            if (mService.mWallpaperTarget == win || mService.mLowerWallpaperTarget == win
436968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    || mService.mUpperWallpaperTarget == win) {
437968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                final int N = windows.size();
4389e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                for (int i = 0; i < N; i++) {
439968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    WindowStateAnimator winAnimator = windows.get(i).mWinAnimator;
440918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    if (winAnimator.mIsWallpaper) {
4419e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                        animLayer = winAnimator.mAnimLayer;
4429e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                        break;
4439e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    }
4449e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                }
4459e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            }
4469e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
4471420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            displayAnimator.mWindowAnimationBackgroundSurface.show(
4481420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    animLayer - WindowManagerService.LAYER_OFFSET_DIM,
4491420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    ((windowAnimationBackgroundColor >> 24) & 0xff) / 255f, 0);
4509e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        } else {
4511420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            displayAnimator.mWindowAnimationBackgroundSurface.hide();
4529e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        }
453764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
454764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
4559339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner    /** See if any windows have been drawn, so they (and others associated with them) can now be
4569339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner     *  shown. */
4572ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner    private void testTokenMayBeDrawnLocked() {
458968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        // See if any windows have been drawn, so they (and others
459968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        // associated with them) can now be shown.
4602ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        final ArrayList<AppWindowToken> appTokens = mService.mAnimatingAppTokens;
4612ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        final int NT = appTokens.size();
4622ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner        for (int i=0; i<NT; i++) {
4632ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner            AppWindowToken wtoken = appTokens.get(i);
464968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            AppWindowAnimator appAnimator = wtoken.mAppAnimator;
4656fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            final boolean allDrawn = wtoken.allDrawn;
466322e40315609acd5a608440bc469d873e09559caCraig Mautner            if (allDrawn != appAnimator.allDrawn) {
467322e40315609acd5a608440bc469d873e09559caCraig Mautner                appAnimator.allDrawn = allDrawn;
4686fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (allDrawn) {
4696fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    // The token has now changed state to having all
4706fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    // windows shown...  what to do, what to do?
471322e40315609acd5a608440bc469d873e09559caCraig Mautner                    if (appAnimator.freezingScreen) {
472322e40315609acd5a608440bc469d873e09559caCraig Mautner                        appAnimator.showAllWindowsLocked();
4736fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        mService.unsetAppFreezingScreenLocked(wtoken, false, true);
4746fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
4756fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                                "Setting mOrientationChangeComplete=true because wtoken "
4766fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                                + wtoken + " numInteresting=" + wtoken.numInterestingWindows
4776fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                                + " numDrawn=" + wtoken.numDrawnWindows);
4786fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        // This will set mOrientationChangeComplete and cause a pass through layout.
47976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setAppLayoutChanges(appAnimator,
48076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
48176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                "testTokenMayBeDrawnLocked: freezingScreen");
4826fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    } else {
48376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setAppLayoutChanges(appAnimator,
48476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
48576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                "testTokenMayBeDrawnLocked");
48666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
4876fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        // We can now show all of the drawn windows!
4886fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (!mService.mOpeningApps.contains(wtoken)) {
489322e40315609acd5a608440bc469d873e09559caCraig Mautner                            mAnimating |= appAnimator.showAllWindowsLocked();
4906fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        }
491764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
492764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
493764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
494764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
495764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
496764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
497a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void performAnimationsLocked(final int displayId) {
498a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        updateWindowsLocked(displayId);
499a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        updateWallpaperLocked(displayId);
500764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
501764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
5021420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    private long getDimBehindFadeDuration(long duration) {
5031420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        TypedValue tv = new TypedValue();
5041420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        mContext.getResources().getValue(
5051420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            com.android.internal.R.fraction.config_dimBehindFadeDuration, tv, true);
5061420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        if (tv.type == TypedValue.TYPE_FRACTION) {
5071420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            duration = (long)tv.getFraction(duration, duration);
5081420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        } else if (tv.type >= TypedValue.TYPE_FIRST_INT && tv.type <= TypedValue.TYPE_LAST_INT) {
5091420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            duration = tv.data;
5101420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        }
5111420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        return duration;
5121420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    }
5131420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner
5141420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    /** Locked on mService.mWindowMap. */
5151caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    private void animateLocked() {
516b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        if (!mInitialized) {
517b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner            return;
518b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        }
51959c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
520764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mCurrentTime = SystemClock.uptimeMillis();
5212639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner        mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
522198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase        boolean wasAnimating = mAnimating;
5237d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        mAnimating = false;
5247d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (WindowManagerService.DEBUG_WINDOW_TRACE) {
5257d8df3905d294127cc58100912a57c816bfb2502Craig Mautner            Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
5267d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
527764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
528ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
529ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                TAG, ">>> OPEN TRANSACTION animateLocked");
5303866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        SurfaceControl.openTransaction();
5313866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        SurfaceControl.setAnimationTransaction();
532764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        try {
5332ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner            updateAppWindowsLocked();
5342ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner
535a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            final int numDisplays = mDisplayContentsAnimators.size();
536a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
537a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
538a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
539a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
540a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final ScreenRotationAnimation screenRotationAnimation =
541a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation;
542a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
543a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
544a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        mAnimating = true;
545a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    } else {
546a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        mBulkUpdateParams |= SET_UPDATE_ROTATION;
547a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        screenRotationAnimation.kill();
548a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation = null;
549a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    }
550a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
551764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
552ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                // Update animations of all applications, including those
553ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                // associated with exiting/removed apps
554a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                performAnimationsLocked(displayId);
555ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
556968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                final WindowList windows = mService.getWindowListLocked(displayId);
557968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                final int N = windows.size();
558ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                for (int j = 0; j < N; j++) {
559968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
560ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                }
561764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
562764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
5632ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner            testTokenMayBeDrawnLocked();
5642ad920759b1981eaf526fd37a314fbc5a3ed90aeCraig Mautner
565a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
566a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
567a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
568764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
569a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final ScreenRotationAnimation screenRotationAnimation =
570a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation;
571a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (screenRotationAnimation != null) {
572a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    screenRotationAnimation.updateSurfacesInTransaction();
573a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
574a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
5751420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                final DimLayer dimAnimator = displayAnimator.mDimAnimator;
5761420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                final WindowStateAnimator winAnimator = displayAnimator.mDimWinAnimator;
57713131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner                final int dimLayer;
5781420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                final float dimAmount;
5791420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                if (winAnimator == null) {
58013131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner                    dimLayer = dimAnimator.getLayer();
5811420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    dimAmount = 0;
5821420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                } else {
58313131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner                    dimLayer = winAnimator.mAnimLayer - WindowManagerService.LAYER_OFFSET_DIM;
5841420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    dimAmount = winAnimator.mWin.mAttrs.dimAmount;
585a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
5861420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                final float targetAlpha = dimAnimator.getTargetAlpha();
5871420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                if (targetAlpha != dimAmount) {
5881420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    if (winAnimator == null) {
5891420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        dimAnimator.hide(DEFAULT_DIM_DURATION);
5901420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    } else {
5911420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        long duration = (winAnimator.mAnimating && winAnimator.mAnimation != null)
5921420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                                ? winAnimator.mAnimation.computeDurationHint()
5931420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                                : DEFAULT_DIM_DURATION;
5941420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        if (targetAlpha > dimAmount) {
5951420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                            duration = getDimBehindFadeDuration(duration);
5961420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        }
59713131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner                        dimAnimator.show(dimLayer, dimAmount, duration);
5981420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    }
59913131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner                } else if (dimAnimator.getLayer() != dimLayer) {
60013131e74ea93d82c004ab1567351eadcedd799a5Craig Mautner                    dimAnimator.setLayer(dimLayer);
6011420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                }
6021420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                if (dimAnimator.isAnimating()) {
6031420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    if (!mService.okToDisplay()) {
6041420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        // Jump to the end of the animation.
6051420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        dimAnimator.show();
6061420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    } else {
6071420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        mAnimating |= dimAnimator.stepAnimation();
6081420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    }
609a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
6101420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner
611545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                //TODO (multidisplay): Magnification is supported only for the default display.
612545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) {
613545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                    mService.mDisplayMagnifier.drawMagnifiedRegionBorderIfNeededLocked();
614545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                }
615764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
616764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
6177358fbfeb2febb60085067fcacc192f429b06545Craig Mautner            if (mService.mWatermark != null) {
6187358fbfeb2febb60085067fcacc192f429b06545Craig Mautner                mService.mWatermark.drawIfNeeded();
6197358fbfeb2febb60085067fcacc192f429b06545Craig Mautner            }
620764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } catch (RuntimeException e) {
621764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            Log.wtf(TAG, "Unhandled exception in Window Manager", e);
622764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } finally {
6233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            SurfaceControl.closeTransaction();
624ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
625ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                    TAG, "<<< CLOSE TRANSACTION animateLocked");
626ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        }
627ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
62866f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        boolean hasPendingLayoutChanges = false;
6295892fc5d8aaf546e605196c3dc48d8f9e193dc2aCraig Mautner        final int numDisplays = mService.mDisplayContents.size();
6305892fc5d8aaf546e605196c3dc48d8f9e193dc2aCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
6315892fc5d8aaf546e605196c3dc48d8f9e193dc2aCraig Mautner            final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
63266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId());
63366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
634968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
635ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            }
63666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            if (pendingChanges != 0) {
63766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                hasPendingLayoutChanges = true;
63866f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            }
639764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
640c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner
64166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        boolean doRequest = false;
64266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        if (mBulkUpdateParams != 0) {
64366f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            doRequest = mService.copyAnimToLayoutParamsLocked();
64466f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        }
64566f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
64666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        if (hasPendingLayoutChanges || doRequest) {
64766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            mService.requestTraversalLocked();
64801cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner        }
6497d8df3905d294127cc58100912a57c816bfb2502Craig Mautner
6507d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (mAnimating) {
651968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            mService.scheduleAnimationLocked();
652198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase        } else if (wasAnimating) {
653198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase            mService.requestTraversalLocked();
6547d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
6557d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (WindowManagerService.DEBUG_WINDOW_TRACE) {
6567d8df3905d294127cc58100912a57c816bfb2502Craig Mautner            Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
6577d8df3905d294127cc58100912a57c816bfb2502Craig Mautner                + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
65876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
65966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                + Integer.toHexString(getPendingLayoutChanges(Display.DEFAULT_DISPLAY)));
6607d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
661764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
662764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
663764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    WindowState mCurrentFocus;
664d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner    void setCurrentFocus(final WindowState currentFocus) {
665764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mCurrentFocus = currentFocus;
666764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
667764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
668a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    boolean isDimmingLocked(int displayId) {
6691420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        return getDisplayContentsAnimatorLocked(displayId).mDimAnimator.isDimming();
670f8d4fbb9c87201350534861c4d988e63691fe24fCraig Mautner    }
671f8d4fbb9c87201350534861c4d988e63691fe24fCraig Mautner
672a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    boolean isDimmingLocked(final WindowStateAnimator winAnimator) {
6731420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        final int displayId = winAnimator.mWin.getDisplayId();
6741420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        DisplayContentsAnimator displayAnimator =
6751420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                getDisplayContentsAnimatorLocked(displayId);
6761420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        if (displayAnimator != null) {
6771420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            return displayAnimator.mDimWinAnimator == winAnimator
6781420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                    && displayAnimator.mDimAnimator.isDimming();
6791420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        }
6801420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        return false;
681acafd19c5ea05a8d465f97204f8d63468bdaa2a4Craig Mautner    }
682acafd19c5ea05a8d465f97204f8d63468bdaa2a4Craig Mautner
683529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    static String bulkUpdateParamsToString(int bulkUpdateParams) {
684529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        StringBuilder builder = new StringBuilder(128);
685529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
686529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" UPDATE_ROTATION");
687529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
688529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
689529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" WALLPAPER_MAY_CHANGE");
690529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
691529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
692529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" FORCE_HIDING_CHANGED");
693529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
694529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
695529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" ORIENTATION_CHANGE_COMPLETE");
696529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
697529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
698529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" TURN_ON_SCREEN");
699529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
700529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        return builder.toString();
701529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    }
702529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
703a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
704529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        final String subPrefix = "  " + prefix;
705529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        final String subSubPrefix = "  " + subPrefix;
706529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
707529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
708529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("DisplayContentsAnimator #");
709529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mDisplayContentsAnimators.keyAt(i));
710529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(":");
711529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
712968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final WindowList windows =
713968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i));
714968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final int N = windows.size();
715968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            for (int j = 0; j < N; j++) {
716968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                WindowStateAnimator wanim = windows.get(j).mWinAnimator;
717529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.print("Window #"); pw.print(j);
718529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        pw.print(": "); pw.println(wanim);
719529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
720529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mWindowAnimationBackgroundSurface != null) {
7211420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                if (dumpAll || displayAnimator.mWindowAnimationBackgroundSurface.isDimming()) {
722529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(subPrefix); pw.println("mWindowAnimationBackgroundSurface:");
723529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    displayAnimator.mWindowAnimationBackgroundSurface.printTo(subSubPrefix, pw);
724529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                }
725529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
7261420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            if (dumpAll || displayAnimator.mDimAnimator.isDimming()) {
7271420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                pw.print(subPrefix); pw.println("mDimAnimator:");
7281420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                displayAnimator.mDimAnimator.printTo(subSubPrefix, pw);
7291420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                pw.print(subPrefix); pw.print("mDimWinAnimator=");
7301420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                        pw.println(displayAnimator.mDimWinAnimator);
731529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
732529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mScreenRotationAnimation != null) {
733529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
734529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
735529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            } else if (dumpAll) {
736529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
737529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
738529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
739529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
740529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.println();
741529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
742529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (dumpAll) {
743529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mAnimTransactionSequence=");
744529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mAnimTransactionSequence);
745529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mForceHiding="); pw.println(forceHidingToString());
746529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mCurrentTime=");
747529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(TimeUtils.formatUptime(mCurrentTime));
748529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
749529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mBulkUpdateParams != 0) {
750529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mBulkUpdateParams=0x");
751529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(Integer.toHexString(mBulkUpdateParams));
752529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
753529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
754529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mWindowDetachedWallpaper != null) {
755529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
756529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.println(mWindowDetachedWallpaper);
757529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
758529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mUniverseBackground != null) {
759529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
760529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
761529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
762e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    }
763bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner
76466f78d7a979775efb148873797bac4584ddb3b83Craig Mautner    int getPendingLayoutChanges(final int displayId) {
76566f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        return mService.getDisplayContentLocked(displayId).pendingLayoutChanges;
76666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner    }
76766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
76876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void setPendingLayoutChanges(final int displayId, final int changes) {
76966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        mService.getDisplayContentLocked(displayId).pendingLayoutChanges |= changes;
77076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    }
77176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner
77276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
77376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        // Used to track which displays layout changes have been done.
77476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        SparseIntArray displays = new SparseIntArray();
775968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        WindowList windows = appAnimator.mAppToken.allAppWindows;
776968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        for (int i = windows.size() - 1; i >= 0; i--) {
777968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final int displayId = windows.get(i).getDisplayId();
77876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            if (displays.indexOfKey(displayId) < 0) {
77976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setPendingLayoutChanges(displayId, changes);
78076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
78166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                    mService.debugLayoutRepeats(s, getPendingLayoutChanges(displayId));
78276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                }
78376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                // Keep from processing this display again.
78476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                displays.put(displayId, changes);
78576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            }
78676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        }
7874d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner    }
788a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
7891420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    void setDimWinAnimatorLocked(int displayId, WindowStateAnimator newWinAnimator) {
790968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
7911420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        if (newWinAnimator == null) {
7921420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            displayAnimator.mDimWinAnimator = null;
793968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        } else {
794968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            // Only set dim params on the highest dimmed layer.
7951420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            final WindowStateAnimator existingDimWinAnimator = displayAnimator.mDimWinAnimator;
7961420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            // Don't turn on for an unshown surface, or for any layer but the highest dimmed layer.
797968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            if (newWinAnimator.mSurfaceShown && (existingDimWinAnimator == null
798968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    || !existingDimWinAnimator.mSurfaceShown
799968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    || existingDimWinAnimator.mAnimLayer < newWinAnimator.mAnimLayer)) {
8001420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner                displayAnimator.mDimWinAnimator = newWinAnimator;
801968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            }
802968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        }
803968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner    }
804968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner
805a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
806a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
807a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        if (displayAnimator == null) {
808ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner            displayAnimator = new DisplayContentsAnimator(displayId);
809a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            mDisplayContentsAnimators.put(displayId, displayAnimator);
810a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        }
811a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return displayAnimator;
812a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
813a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
814a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
815a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
816a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
817a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
818a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
819a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
820a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
821a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
822ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner    private class DisplayContentsAnimator {
8231420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        DimLayer mDimAnimator = null;
8241420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        WindowStateAnimator mDimWinAnimator = null;
8251420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner        DimLayer mWindowAnimationBackgroundSurface = null;
826a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        ScreenRotationAnimation mScreenRotationAnimation = null;
827ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner
828ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        public DisplayContentsAnimator(int displayId) {
8291420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            mDimAnimator = new DimLayer(mService, displayId);
8301420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner            mWindowAnimationBackgroundSurface = new DimLayer(mService, displayId);
831ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        }
832a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
833764983d16925daeeba3f29fd1f844187655d1386Craig Mautner}
834