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;
226881a10557acf3b0270de54799d6f19437acf584Craig Mautnerimport android.view.Display;
233866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
24764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.WindowManagerPolicy;
25764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerimport android.view.animation.Animation;
26764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
27529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackbornimport com.android.server.wm.WindowManagerService.LayoutFields;
28764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
29e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautnerimport java.io.PrintWriter;
300c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackbornimport java.util.ArrayList;
31e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner
32764983d16925daeeba3f29fd1f844187655d1386Craig Mautner/**
33764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * Singleton class that carries out the animations and Surface operations in a separate task
34764983d16925daeeba3f29fd1f844187655d1386Craig Mautner * on behalf of WindowManagerService.
35764983d16925daeeba3f29fd1f844187655d1386Craig Mautner */
36764983d16925daeeba3f29fd1f844187655d1386Craig Mautnerpublic class WindowAnimator {
37bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner    private static final String TAG = "WindowAnimator";
38764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
39764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final WindowManagerService mService;
40764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final Context mContext;
41764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    final WindowManagerPolicy mPolicy;
42764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
43764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    boolean mAnimating;
4401cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner
451caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    final Runnable mAnimationRunnable;
461caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
47764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Time of current animation step. Reset on each iteration */
48764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    long mCurrentTime;
49764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
50764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    /** Skip repeated AppWindowTokens initialization. Note that AppWindowsToken's version of this
51764983d16925daeeba3f29fd1f844187655d1386Craig Mautner     * is a long initialized to Long.MIN_VALUE so that it doesn't match this value on startup. */
526fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    private int mAnimTransactionSequence;
53764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
54ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner    /** Window currently running an animation that has requested it be detached
55ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner     * from the wallpaper.  This means we need to ensure the wallpaper is
56ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner     * visible behind it in case it animates in a way that would allow it to be
57ae44659f30ddaba67581fbdf9c9255ac982d45abCraig Mautner     * seen. If multiple windows satisfy this, use the lowest window. */
58e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    WindowState mWindowDetachedWallpaper = null;
5901cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner
60a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    WindowStateAnimator mUniverseBackground = null;
61a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn    int mAboveUniverseLayer = 0;
62a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
63a608b882327fbb393bde3854953cd322a6fea675Craig Mautner    int mBulkUpdateParams = 0;
64a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    Object mLastWindowFreezeSource;
65a608b882327fbb393bde3854953cd322a6fea675Craig Mautner
66a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    SparseArray<DisplayContentsAnimator> mDisplayContentsAnimators =
67f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn            new SparseArray<WindowAnimator.DisplayContentsAnimator>(2);
68d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner
69b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner    boolean mInitialized = false;
70b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner
71178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    // forceHiding states.
72178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_NOT_SHOWN     = 0;
73178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_ANIMATING_IN  = 1;
74178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_SHOWN         = 2;
75178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    static final int KEYGUARD_ANIMATING_OUT = 3;
76178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    int mForceHiding = KEYGUARD_NOT_SHOWN;
77178af5948d71c841278081c712506f7a7fca34b9Craig Mautner
78178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    private String forceHidingToString() {
79178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        switch (mForceHiding) {
80178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_NOT_SHOWN:    return "KEYGUARD_NOT_SHOWN";
81178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_ANIMATING_IN: return "KEYGUARD_ANIMATING_IN";
82178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_SHOWN:        return "KEYGUARD_SHOWN";
83178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            case KEYGUARD_ANIMATING_OUT:return "KEYGUARD_ANIMATING_OUT";
84178af5948d71c841278081c712506f7a7fca34b9Craig Mautner            default: return "KEYGUARD STATE UNKNOWN " + mForceHiding;
85178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        }
86178af5948d71c841278081c712506f7a7fca34b9Craig Mautner    }
87178af5948d71c841278081c712506f7a7fca34b9Craig Mautner
88918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner    WindowAnimator(final WindowManagerService service) {
89764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mService = service;
90918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        mContext = service.mContext;
91918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner        mPolicy = service.mPolicy;
921caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
931caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        mAnimationRunnable = new Runnable() {
941caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            @Override
951caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            public void run() {
96968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                synchronized (mService.mWindowMap) {
97968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    mService.mAnimationScheduled = false;
98968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    animateLocked();
991caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner                }
1001caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner            }
1011caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner        };
102b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner    }
1039e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner
104a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void addDisplayLocked(final int displayId) {
105ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        // Create the DisplayContentsAnimator object by retrieving it.
106ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner        getDisplayContentsAnimatorLocked(displayId);
107a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        if (displayId == Display.DEFAULT_DISPLAY) {
108a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            mInitialized = true;
109a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        }
110a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
111a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
112a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void removeDisplayLocked(final int displayId) {
113d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        final DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
114d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        if (displayAnimator != null) {
115d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            if (displayAnimator.mScreenRotationAnimation != null) {
116d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mScreenRotationAnimation.kill();
117d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner                displayAnimator.mScreenRotationAnimation = null;
118d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner            }
119d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner        }
120d5523dc7b7318f2774109dd30716ff7b74560e61Craig Mautner
121a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        mDisplayContentsAnimators.delete(displayId);
1221caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    }
1231caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner
124968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner    void hideWallpapersLocked(final WindowState w) {
125968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowState wallpaperTarget = mService.mWallpaperTarget;
126968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowState lowerWallpaperTarget = mService.mLowerWallpaperTarget;
127968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final ArrayList<WindowToken> wallpaperTokens = mService.mWallpaperTokens;
12866f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
12998129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn        if ((wallpaperTarget == w && lowerWallpaperTarget == null) || wallpaperTarget == null) {
13098129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn            final int numTokens = wallpaperTokens.size();
131918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner            for (int i = numTokens - 1; i >= 0; i--) {
13298129739afcb3786a6ec9f3efe774d8e01f6d632Dianne Hackborn                final WindowToken token = wallpaperTokens.get(i);
133918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                final int numWindows = token.windows.size();
134918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                for (int j = numWindows - 1; j >= 0; j--) {
135918b53bc531f5bd1ea102e8b827d693bd4d0555bCraig Mautner                    final WindowState wallpaper = token.windows.get(j);
136b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    final WindowStateAnimator winAnimator = wallpaper.mWinAnimator;
137b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    if (!winAnimator.mLastHidden) {
138b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                        winAnimator.hide();
139507a2ee12b6d1d683e4a5806804c472b3fe32e61Craig Mautner                        mService.dispatchWallpaperVisibility(wallpaper, false);
14076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
14176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
142b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                    }
143b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                }
144ef03a7f441cf0cbef5a5f7fafb58a7d5aea7ef52Dianne Hackborn                if (WindowManagerService.DEBUG_WALLPAPER_LIGHT && !token.hidden) Slog.d(TAG,
1452ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        "Hiding wallpaper " + token + " from " + w
1462ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        + " target=" + wallpaperTarget + " lower=" + lowerWallpaperTarget
1472ea9bae7121f1df5461437d7d08fa550cdf6e0b0Dianne Hackborn                        + "\n" + Debug.getCallers(5, "  "));
148b9836b9185132974f6cfa9296bb3c28d1c9b668aCraig Mautner                token.hidden = true;
1490afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner            }
1500afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner        }
1510afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner    }
1520afddcb7f11ddfcaa5d1f5a5db75fce1b5d40253Craig Mautner
153b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner    private void updateAppWindowsLocked(int displayId) {
154b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner        final DisplayContent displayContent = mService.getDisplayContentLocked(displayId);
155d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        final ArrayList<Task> tasks = displayContent.getTasks();
156f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner        final int numTasks = tasks.size();
157f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner        for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) {
158f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner            final AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
159f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner            final int numTokens = tokens.size();
160f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner            for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) {
161f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                final AppWindowAnimator appAnimator = tokens.get(tokenNdx).mAppAnimator;
162f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                final boolean wasAnimating = appAnimator.animation != null
163f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                        && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
164f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                if (appAnimator.stepAnimationLocked(mCurrentTime)) {
165f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                    mAnimating = true;
166f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                } else if (wasAnimating) {
167f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                    // stopped animating, do one more pass through the layout
168f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                    setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
169f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            "appToken " + appAnimator.mAppToken + " done");
170f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                    if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
171f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            "updateWindowsApps...: done animating " + appAnimator.mAppToken);
172f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                }
173bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            }
174bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner        }
175a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner
176b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner        final AppTokenList exitingAppTokens = displayContent.mExitingAppTokens;
177b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner        final int NEAT = exitingAppTokens.size();
17805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        for (int i = 0; i < NEAT; i++) {
179b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner            final AppWindowAnimator appAnimator = exitingAppTokens.get(i).mAppAnimator;
180594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final boolean wasAnimating = appAnimator.animation != null
181fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner                    && appAnimator.animation != AppWindowAnimator.sDummyAnimation;
1829339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            if (appAnimator.stepAnimationLocked(mCurrentTime)) {
183bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                mAnimating = true;
184bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner            } else if (wasAnimating) {
185bb1449b392b4fb14f17fa747c2261d7195405df3Craig Mautner                // stopped animating, do one more pass through the layout
18676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setAppLayoutChanges(appAnimator, WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
18776a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    "exiting appToken " + appAnimator.mAppToken + " done");
18883339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                if (WindowManagerService.DEBUG_ANIM) Slog.v(TAG,
18983339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        "updateWindowsApps...: done animating exiting " + appAnimator.mAppToken);
190764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
191764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
192764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
193764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
194a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateWindowsLocked(final int displayId) {
1956fbda63e68513ece4409dac845588711ab25c39dCraig Mautner        ++mAnimTransactionSequence;
196764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
197968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowList windows = mService.getWindowListLocked(displayId);
1980c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn        ArrayList<WindowStateAnimator> unForceHiding = null;
1990c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn        boolean wallpaperInUnForceHiding = false;
200178af5948d71c841278081c712506f7a7fca34b9Craig Mautner        mForceHiding = KEYGUARD_NOT_SHOWN;
2014bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner
202968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        for (int i = windows.size() - 1; i >= 0; i--) {
203968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            WindowState win = windows.get(i);
204968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            WindowStateAnimator winAnimator = win.mWinAnimator;
205bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            final int flags = winAnimator.mAttrFlags;
206764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
20729479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            if (winAnimator.mSurfaceControl != null) {
208a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                final boolean wasAnimating = winAnimator.mWasAnimating;
209a2c77053b8dfa5f06bdd927bdbab4df2d00bb4e2Craig Mautner                final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime);
210764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
211764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                if (WindowManagerService.DEBUG_WALLPAPER) {
212bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                    Slog.v(TAG, win + ": wasAnimating=" + wasAnimating +
213764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            ", nowAnimating=" + nowAnimating);
214764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
215764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
216968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                if (wasAnimating && !winAnimator.mAnimating && mService.mWallpaperTarget == win) {
217a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                    mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
21876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                    setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
21976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                            WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
220cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
221d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                        mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 2",
22266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
223cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    }
224764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
225764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
226bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                if (mPolicy.doesForceHide(win, win.mAttrs)) {
227764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    if (!wasAnimating && nowAnimating) {
22883339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                        if (WindowManagerService.DEBUG_ANIM ||
22983339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                                WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
23083339b465c3299abc47ced7dffdf470c5b0c0750Craig Mautner                                "Animation started that could impact force hide: " + win);
231d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                        mBulkUpdateParams |= SET_FORCE_HIDING_CHANGED;
23276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(displayId,
23376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
234cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
235d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 3",
23666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                    getPendingLayoutChanges(displayId));
237cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        }
238764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        mService.mFocusMayChange = true;
239ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                    }
2404bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                    if (win.isReadyForDisplay()) {
2414bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        if (nowAnimating) {
2424bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            if (winAnimator.mAnimationIsEntrance) {
243178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                                mForceHiding = KEYGUARD_ANIMATING_IN;
2444bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            } else {
245178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                                mForceHiding = KEYGUARD_ANIMATING_OUT;
2464bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            }
2474bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        } else {
2485c7bd017058ff073b73e96726aa44c4a113f453fCraig Mautner                            mForceHiding = win.isDrawnLw() ? KEYGUARD_SHOWN : KEYGUARD_NOT_SHOWN;
2494bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                        }
250764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
251ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                    if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
252178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            "Force hide " + mForceHiding
253ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " hasSurface=" + win.mHasSurface
254ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " policyVis=" + win.mPolicyVisibility
255ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " destroying=" + win.mDestroying
256ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " attHidden=" + win.mAttachedHidden
257ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " vis=" + win.mViewVisibility
258ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " hidden=" + win.mRootToken.hidden
259ac92087a9a1c464d4b0a58c82dae01cbaa088e89Dianne Hackborn                            + " anim=" + win.mWinAnimator.mAnimation);
260bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
2614bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                    final boolean hideWhenLocked =
2624bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                            (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
263d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                    final boolean changed;
264178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                    if (((mForceHiding == KEYGUARD_ANIMATING_IN)
2654bf18a7c97c0f312ccf12bcd952b420af0c95e5fCraig Mautner                                && (!winAnimator.isAnimating() || hideWhenLocked))
266178af5948d71c841278081c712506f7a7fca34b9Craig Mautner                            || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
267bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                        changed = win.hideLw(false, false);
268764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
269bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                "Now policy hidden: " + win);
270764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    } else {
271bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                        changed = win.showLw(false, false);
272764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
273bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                "Now policy shown: " + win);
274764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        if (changed) {
275d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            if ((mBulkUpdateParams & SET_FORCE_HIDING_CHANGED) != 0
276bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                                    && win.isVisibleNow() /*w.isReadyForDisplay()*/) {
2770c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                if (unForceHiding == null) {
2780c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                    unForceHiding = new ArrayList<WindowStateAnimator>();
2790c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                }
2800c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                unForceHiding.add(winAnimator);
28101cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner                                if ((flags & FLAG_SHOW_WALLPAPER) != 0) {
2820c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn                                    wallpaperInUnForceHiding = true;
283764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                }
284764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            }
28529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            final WindowState currentFocus = mService.mCurrentFocus;
28629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            if (currentFocus == null || currentFocus.mLayer < win.mLayer) {
287764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // We are showing on to of the current
288764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // focus, so re-evaluate focus to make
289764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                // sure it is correct.
2905845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner                                if (WindowManagerService.DEBUG_FOCUS_LIGHT) Slog.v(TAG,
2915845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner                                        "updateWindowsLocked: setting mFocusMayChange true");
292764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                                mService.mFocusMayChange = true;
293764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                            }
294764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        }
295764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
29601cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner                    if (changed && (flags & FLAG_SHOW_WALLPAPER) != 0) {
297a608b882327fbb393bde3854953cd322a6fea675Craig Mautner                        mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
29876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                        setPendingLayoutChanges(Display.DEFAULT_DISPLAY,
29976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER);
300cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
301d09cc4ba247e896cc95a57ed7a3247b55b1b68fcCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 4",
30266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                    getPendingLayoutChanges(Display.DEFAULT_DISPLAY));
303cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                        }
304764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
305764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
306764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
307764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
308bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            final AppWindowToken atoken = win.mAppToken;
3096fbda63e68513ece4409dac845588711ab25c39dCraig Mautner            if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) {
3106fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (atoken == null || atoken.allDrawn) {
3116fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    if (winAnimator.performShowLocked()) {
31266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                        setPendingLayoutChanges(displayId,
31376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                                WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM);
3146fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
3156fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                            mService.debugLayoutRepeats("updateWindowsAndWallpaperLocked 5",
31666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                                    getPendingLayoutChanges(displayId));
317764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                        }
318cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                    }
319cf8cbbe77447d9cca28e789c5ec4e714694ab37dCraig Mautner                }
320764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
321322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
322594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (appAnimator != null && appAnimator.thumbnail != null) {
3236fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                if (appAnimator.thumbnailTransactionSeq != mAnimTransactionSequence) {
3246fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                    appAnimator.thumbnailTransactionSeq = mAnimTransactionSequence;
325594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    appAnimator.thumbnailLayer = 0;
3268078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
327594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (appAnimator.thumbnailLayer < winAnimator.mAnimLayer) {
328594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    appAnimator.thumbnailLayer = winAnimator.mAnimLayer;
3298078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn                }
3308078d8c8a282ca81344febe7256f63b1e805e3aaDianne Hackborn            }
331764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } // end forall windows
3320c2acffec8689f8721a454845b24a830bc37ce92Dianne Hackborn
333078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        // If we have windows that are being show due to them no longer
334078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        // being force-hidden, apply the appropriate animation to them.
335078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        if (unForceHiding != null) {
336078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            for (int i=unForceHiding.size()-1; i>=0; i--) {
337078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                Animation a = mPolicy.createForceHideEnterAnimation(wallpaperInUnForceHiding);
338078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (a != null) {
339078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    final WindowStateAnimator winAnimator = unForceHiding.get(i);
340078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    winAnimator.setAnimation(a);
341078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    winAnimator.mAnimationIsEntrance = true;
342078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
343078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
344078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        }
345078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner    }
346078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
347a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void updateWallpaperLocked(int displayId) {
34805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mService.getDisplayContentLocked(displayId).resetAnimationBackgroundAnimator();
34905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
350968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        final WindowList windows = mService.getWindowListLocked(displayId);
351078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        WindowState detachedWallpaper = null;
352078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
353968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        for (int i = windows.size() - 1; i >= 0; i--) {
354968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final WindowState win = windows.get(i);
355968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            WindowStateAnimator winAnimator = win.mWinAnimator;
35629479ebe1007361222bf6ab4d5e2a27927d4b8e8Mathias Agopian            if (winAnimator.mSurfaceControl == null) {
357078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                continue;
358078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
359078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
360078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            final int flags = winAnimator.mAttrFlags;
361078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
362078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // If this window is animating, make a note that we have
363078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // an animating window and take care of a request to run
364078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // a detached wallpaper animation.
365078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (winAnimator.mAnimating) {
366078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if (winAnimator.mAnimation != null) {
367078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    if ((flags & FLAG_SHOW_WALLPAPER) != 0
368078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                            && winAnimator.mAnimation.getDetachWallpaper()) {
369078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        detachedWallpaper = win;
370078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
37105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    final int color = winAnimator.mAnimation.getBackgroundColor();
37205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    if (color != 0) {
37305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        win.getStack().setAnimationBackground(winAnimator, color);
374078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    }
375078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
376078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                mAnimating = true;
377078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
378078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
379078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // If this window's app token is running a detached wallpaper
380078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // animation, make a note so we can ensure the wallpaper is
381078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            // displayed behind it.
382322e40315609acd5a608440bc469d873e09559caCraig Mautner            final AppWindowAnimator appAnimator = winAnimator.mAppAnimator;
383078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            if (appAnimator != null && appAnimator.animation != null
384078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    && appAnimator.animating) {
385078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                if ((flags & FLAG_SHOW_WALLPAPER) != 0
386078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                        && appAnimator.animation.getDetachWallpaper()) {
387078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                    detachedWallpaper = win;
388078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
389078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
39005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                final int color = appAnimator.animation.getBackgroundColor();
39105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                if (color != 0) {
39205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    win.getStack().setAnimationBackground(winAnimator, color);
393078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner                }
394078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner            }
395078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner        } // end forall windows
396078ea0a6444bfb5c7ab1678b1c8898e590828731Craig Mautner
3979e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        if (mWindowDetachedWallpaper != detachedWallpaper) {
3989e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG,
3999e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    "Detached wallpaper changed from " + mWindowDetachedWallpaper
4009e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner                    + " to " + detachedWallpaper);
4019e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            mWindowDetachedWallpaper = detachedWallpaper;
4029e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner            mBulkUpdateParams |= SET_WALLPAPER_MAY_CHANGE;
4039e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        }
404764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
405764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
4069339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner    /** See if any windows have been drawn, so they (and others associated with them) can now be
4079339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner     *  shown. */
408b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner    private void testTokenMayBeDrawnLocked(int displayId) {
409968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        // See if any windows have been drawn, so they (and others
410968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        // associated with them) can now be shown.
411d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner        final ArrayList<Task> tasks = mService.getDisplayContentLocked(displayId).getTasks();
412f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner        final int numTasks = tasks.size();
413f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner        for (int taskNdx = 0; taskNdx < numTasks; ++taskNdx) {
414f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner            final AppTokenList tokens = tasks.get(taskNdx).mAppTokens;
415f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner            final int numTokens = tokens.size();
416f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner            for (int tokenNdx = 0; tokenNdx < numTokens; ++tokenNdx) {
417f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                final AppWindowToken wtoken = tokens.get(tokenNdx);
418f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                AppWindowAnimator appAnimator = wtoken.mAppAnimator;
419f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                final boolean allDrawn = wtoken.allDrawn;
420f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                if (allDrawn != appAnimator.allDrawn) {
421f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                    appAnimator.allDrawn = allDrawn;
422f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                    if (allDrawn) {
423f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                        // The token has now changed state to having all
424f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                        // windows shown...  what to do, what to do?
425f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                        if (appAnimator.freezingScreen) {
426f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            appAnimator.showAllWindowsLocked();
427f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            mService.unsetAppFreezingScreenLocked(wtoken, false, true);
428f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            if (WindowManagerService.DEBUG_ORIENTATION) Slog.i(TAG,
429f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    "Setting mOrientationChangeComplete=true because wtoken "
430f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    + wtoken + " numInteresting=" + wtoken.numInterestingWindows
431f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    + " numDrawn=" + wtoken.numDrawnWindows);
432f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            // This will set mOrientationChangeComplete and cause a pass through layout.
433f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            setAppLayoutChanges(appAnimator,
434f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER,
435f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    "testTokenMayBeDrawnLocked: freezingScreen");
436f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                        } else {
437f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            setAppLayoutChanges(appAnimator,
438f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
439f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                    "testTokenMayBeDrawnLocked");
440f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner
441f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            // We can now show all of the drawn windows!
442f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            if (!mService.mOpeningApps.contains(wtoken)) {
443f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                                mAnimating |= appAnimator.showAllWindowsLocked();
444f81b908752365fda62a6158bfe7d1559b0d52cddCraig Mautner                            }
4456fbda63e68513ece4409dac845588711ab25c39dCraig Mautner                        }
446764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                    }
447764983d16925daeeba3f29fd1f844187655d1386Craig Mautner                }
448764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
449764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
450764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
451764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
452a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private void performAnimationsLocked(final int displayId) {
453a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        updateWindowsLocked(displayId);
454a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        updateWallpaperLocked(displayId);
455764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
456764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
4571420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner
4581420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner    /** Locked on mService.mWindowMap. */
4591caa399baffe2a5dca018469761db6f77ea31ce8Craig Mautner    private void animateLocked() {
460b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        if (!mInitialized) {
461b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner            return;
462b47bbc3d80badb94229bc4ce7a2d5006faa9ef15Craig Mautner        }
46359c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner
464764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        mCurrentTime = SystemClock.uptimeMillis();
4652639da500e3d53ea3a17d888b1c0001d043c6b98Craig Mautner        mBulkUpdateParams = SET_ORIENTATION_CHANGE_COMPLETE;
466198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase        boolean wasAnimating = mAnimating;
4677d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        mAnimating = false;
4687d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (WindowManagerService.DEBUG_WINDOW_TRACE) {
4697d8df3905d294127cc58100912a57c816bfb2502Craig Mautner            Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
4707d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
471764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
472ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
473ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                TAG, ">>> OPEN TRANSACTION animateLocked");
4743866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        SurfaceControl.openTransaction();
4753866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        SurfaceControl.setAnimationTransaction();
476764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        try {
477a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            final int numDisplays = mDisplayContentsAnimators.size();
478a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
479a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
480b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner                updateAppWindowsLocked(displayId);
481a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
482a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
483a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final ScreenRotationAnimation screenRotationAnimation =
484a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation;
485a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                if (screenRotationAnimation != null && screenRotationAnimation.isAnimating()) {
486a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    if (screenRotationAnimation.stepAnimationLocked(mCurrentTime)) {
487a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        mAnimating = true;
488a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    } else {
489a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        mBulkUpdateParams |= SET_UPDATE_ROTATION;
490a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        screenRotationAnimation.kill();
491a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                        displayAnimator.mScreenRotationAnimation = null;
492a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                    }
493a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                }
494764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
495ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                // Update animations of all applications, including those
496ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                // associated with exiting/removed apps
497a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                performAnimationsLocked(displayId);
498ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
499968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                final WindowList windows = mService.getWindowListLocked(displayId);
500968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                final int N = windows.size();
501ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                for (int j = 0; j < N; j++) {
502968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    windows.get(j).mWinAnimator.prepareSurfaceLocked(true);
503ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                }
504764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
505764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
506a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            for (int i = 0; i < numDisplays; i++) {
507a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                final int displayId = mDisplayContentsAnimators.keyAt(i);
508b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner
509b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner                testTokenMayBeDrawnLocked(displayId);
510b1fd65c0ff5784b90d765edb7e3c3115d767dff0Craig Mautner
51111462cc0b0fd34151968b310833a0b8525457eb4Craig Mautner                final ScreenRotationAnimation screenRotationAnimation =
51211462cc0b0fd34151968b310833a0b8525457eb4Craig Mautner                        mDisplayContentsAnimators.valueAt(i).mScreenRotationAnimation;
51311462cc0b0fd34151968b310833a0b8525457eb4Craig Mautner                if (screenRotationAnimation != null) {
51411462cc0b0fd34151968b310833a0b8525457eb4Craig Mautner                    screenRotationAnimation.updateSurfacesInTransaction();
51511462cc0b0fd34151968b310833a0b8525457eb4Craig Mautner                }
51611462cc0b0fd34151968b310833a0b8525457eb4Craig Mautner
51705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                mAnimating |= mService.getDisplayContentLocked(displayId).animateDimLayers();
5181420b93fa5606979fd67eaf80f50294d4f8c191bCraig Mautner
519545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                //TODO (multidisplay): Magnification is supported only for the default display.
520545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                if (mService.mDisplayMagnifier != null && displayId == Display.DEFAULT_DISPLAY) {
521545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                    mService.mDisplayMagnifier.drawMagnifiedRegionBorderIfNeededLocked();
522545252f4fde6fbb70b07e97a120c7d1405758017Svetoslav Ganov                }
523764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            }
524764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
5259c72281d9799236ace861e151f642fc81f8128d2Mathias Agopian            if (mAnimating) {
5269c72281d9799236ace861e151f642fc81f8128d2Mathias Agopian                mService.scheduleAnimationLocked();
5279c72281d9799236ace861e151f642fc81f8128d2Mathias Agopian            }
5289c72281d9799236ace861e151f642fc81f8128d2Mathias Agopian
529f76664673eed1c7b2fa141ce99e01028bc7a1be0Craig Mautner            mService.setFocusedStackLayer();
530f76664673eed1c7b2fa141ce99e01028bc7a1be0Craig Mautner
5317358fbfeb2febb60085067fcacc192f429b06545Craig Mautner            if (mService.mWatermark != null) {
5327358fbfeb2febb60085067fcacc192f429b06545Craig Mautner                mService.mWatermark.drawIfNeeded();
5337358fbfeb2febb60085067fcacc192f429b06545Craig Mautner            }
534764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } catch (RuntimeException e) {
535764983d16925daeeba3f29fd1f844187655d1386Craig Mautner            Log.wtf(TAG, "Unhandled exception in Window Manager", e);
536764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        } finally {
5373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            SurfaceControl.closeTransaction();
538ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(
539ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner                    TAG, "<<< CLOSE TRANSACTION animateLocked");
540ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner        }
541ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner
54266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        boolean hasPendingLayoutChanges = false;
543f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner        final int numDisplays = mService.mDisplayContents.size();
544f8924150b3fa5a9afef66bcae0affab1e66b3629Craig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
5450f4ab97c230e09256af9b7e232a3fe05b8f759b2Craig Mautner            final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
54666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId());
54766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
548968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;
549ea3a09a5b9c8ae56b0c4975c7a7039a05d4c0b3cCraig Mautner            }
55066f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            if (pendingChanges != 0) {
55166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                hasPendingLayoutChanges = true;
55266f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            }
553764983d16925daeeba3f29fd1f844187655d1386Craig Mautner        }
554c2f9be0b7fe14258e01d73f6bc43dd94c3e711d4Craig Mautner
55566f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        boolean doRequest = false;
55666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        if (mBulkUpdateParams != 0) {
55766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            doRequest = mService.copyAnimToLayoutParamsLocked();
55866f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        }
55966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
56066f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        if (hasPendingLayoutChanges || doRequest) {
56166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner            mService.requestTraversalLocked();
56201cd0e7df040659900e50f83c6b75d1d6fcc5655Craig Mautner        }
5637d8df3905d294127cc58100912a57c816bfb2502Craig Mautner
5649c72281d9799236ace861e151f642fc81f8128d2Mathias Agopian        if (!mAnimating && wasAnimating) {
565198e564c9a66010cfe93e0b1a75f84d696bda494Chet Haase            mService.requestTraversalLocked();
5667d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
5677d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        if (WindowManagerService.DEBUG_WINDOW_TRACE) {
5687d8df3905d294127cc58100912a57c816bfb2502Craig Mautner            Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
5697d8df3905d294127cc58100912a57c816bfb2502Craig Mautner                + " mBulkUpdateParams=" + Integer.toHexString(mBulkUpdateParams)
57076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                + " mPendingLayoutChanges(DEFAULT_DISPLAY)="
57166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                + Integer.toHexString(getPendingLayoutChanges(Display.DEFAULT_DISPLAY)));
5727d8df3905d294127cc58100912a57c816bfb2502Craig Mautner        }
573764983d16925daeeba3f29fd1f844187655d1386Craig Mautner    }
574764983d16925daeeba3f29fd1f844187655d1386Craig Mautner
575529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    static String bulkUpdateParamsToString(int bulkUpdateParams) {
576529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        StringBuilder builder = new StringBuilder(128);
577529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_UPDATE_ROTATION) != 0) {
578529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" UPDATE_ROTATION");
579529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
580529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_WALLPAPER_MAY_CHANGE) != 0) {
581529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" WALLPAPER_MAY_CHANGE");
582529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
583529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_FORCE_HIDING_CHANGED) != 0) {
584529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" FORCE_HIDING_CHANGED");
585529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
586529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_ORIENTATION_CHANGE_COMPLETE) != 0) {
587529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" ORIENTATION_CHANGE_COMPLETE");
588529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
589529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if ((bulkUpdateParams & LayoutFields.SET_TURN_ON_SCREEN) != 0) {
590529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            builder.append(" TURN_ON_SCREEN");
591529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
592529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        return builder.toString();
593529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    }
594529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
595a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    public void dumpLocked(PrintWriter pw, String prefix, boolean dumpAll) {
596529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        final String subPrefix = "  " + prefix;
597529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        final String subSubPrefix = "  " + subPrefix;
598529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
599529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        for (int i = 0; i < mDisplayContentsAnimators.size(); i++) {
600529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("DisplayContentsAnimator #");
601529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mDisplayContentsAnimators.keyAt(i));
602529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(":");
603529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.valueAt(i);
604968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final WindowList windows =
605968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                    mService.getWindowListLocked(mDisplayContentsAnimators.keyAt(i));
606968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final int N = windows.size();
607968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            for (int j = 0; j < N; j++) {
608968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner                WindowStateAnimator wanim = windows.get(j).mWinAnimator;
609529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.print("Window #"); pw.print(j);
610529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                        pw.print(": "); pw.println(wanim);
611529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
612529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            if (displayAnimator.mScreenRotationAnimation != null) {
613529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("mScreenRotationAnimation:");
614529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                displayAnimator.mScreenRotationAnimation.printTo(subSubPrefix, pw);
615529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            } else if (dumpAll) {
616529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(subPrefix); pw.println("no ScreenRotationAnimation ");
617529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            }
618529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
619529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
620529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.println();
621529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn
622529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (dumpAll) {
623529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mAnimTransactionSequence=");
624529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(mAnimTransactionSequence);
625529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mForceHiding="); pw.println(forceHidingToString());
626529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mCurrentTime=");
627529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(TimeUtils.formatUptime(mCurrentTime));
628529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
629529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mBulkUpdateParams != 0) {
630529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mBulkUpdateParams=0x");
631529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(Integer.toHexString(mBulkUpdateParams));
632529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.println(bulkUpdateParamsToString(mBulkUpdateParams));
633529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
634529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mWindowDetachedWallpaper != null) {
635529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mWindowDetachedWallpaper=");
636529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.println(mWindowDetachedWallpaper);
637529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
638529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        if (mUniverseBackground != null) {
639529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("mUniverseBackground="); pw.print(mUniverseBackground);
640529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(" mAboveUniverseLayer="); pw.println(mAboveUniverseLayer);
641529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
642e7ae2505405cf30d9d3140278d5b9a2604d866dfCraig Mautner    }
643bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner
64466f78d7a979775efb148873797bac4584ddb3b83Craig Mautner    int getPendingLayoutChanges(final int displayId) {
64566f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        return mService.getDisplayContentLocked(displayId).pendingLayoutChanges;
64666f78d7a979775efb148873797bac4584ddb3b83Craig Mautner    }
64766f78d7a979775efb148873797bac4584ddb3b83Craig Mautner
64876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void setPendingLayoutChanges(final int displayId, final int changes) {
64966f78d7a979775efb148873797bac4584ddb3b83Craig Mautner        mService.getDisplayContentLocked(displayId).pendingLayoutChanges |= changes;
65076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    }
65176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner
65276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner    void setAppLayoutChanges(final AppWindowAnimator appAnimator, final int changes, String s) {
65376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        // Used to track which displays layout changes have been done.
654f4bf0ae2a7c2d9d92c5c8abdb82baa53b4c9ccdaDianne Hackborn        SparseIntArray displays = new SparseIntArray(2);
655968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        WindowList windows = appAnimator.mAppToken.allAppWindows;
656968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner        for (int i = windows.size() - 1; i >= 0; i--) {
657968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            final int displayId = windows.get(i).getDisplayId();
65876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            if (displays.indexOfKey(displayId) < 0) {
65976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                setPendingLayoutChanges(displayId, changes);
66076a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                if (WindowManagerService.DEBUG_LAYOUT_REPEATS) {
66166f78d7a979775efb148873797bac4584ddb3b83Craig Mautner                    mService.debugLayoutRepeats(s, getPendingLayoutChanges(displayId));
66276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                }
66376a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                // Keep from processing this display again.
66476a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                displays.put(displayId, changes);
66576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner            }
66676a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        }
6674d7349bb6df5a01ba451aa1abd4c9f6349a57016Craig Mautner    }
668a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
669a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
670a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
671a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        if (displayAnimator == null) {
67205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            displayAnimator = new DisplayContentsAnimator();
673a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            mDisplayContentsAnimators.put(displayId, displayAnimator);
674a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        }
675a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return displayAnimator;
676a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
677a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
678a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    void setScreenRotationAnimationLocked(int displayId, ScreenRotationAnimation animation) {
679a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation = animation;
680a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
681a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
682a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    ScreenRotationAnimation getScreenRotationAnimationLocked(int displayId) {
683a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
684a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
685a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
686ac439e57a795d48e287ea51a9bd999244a9b0e65Craig Mautner    private class DisplayContentsAnimator {
687a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        ScreenRotationAnimation mScreenRotationAnimation = null;
688a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner    }
689764983d16925daeeba3f29fd1f844187655d1386Craig Mautner}
690