AppWindowAnimator.java revision a57c695bf2c0f917517ecac8251043716b34f72d
1594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner// Copyright 2012 Google Inc. All Rights Reserved.
2594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
3594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpackage com.android.server.wm;
4594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
5594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.graphics.Matrix;
6594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.util.Slog;
7a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackbornimport android.util.TimeUtils;
8a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.view.Display;
9594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.Surface;
103866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
11594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.WindowManagerPolicy;
12594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Animation;
13594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Transformation;
14594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
15594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport java.io.PrintWriter;
16322e40315609acd5a608440bc469d873e09559caCraig Mautnerimport java.util.ArrayList;
17594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
18594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpublic class AppWindowAnimator {
19fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final String TAG = "AppWindowAnimator";
20594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
21594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final AppWindowToken mAppToken;
22594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final WindowManagerService mService;
23594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final WindowAnimator mAnimator;
24594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
25594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean animating;
26594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    Animation animation;
27594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean hasTransformation;
28594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final Transformation transformation = new Transformation();
29594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
30594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Have we been asked to have this token keep the screen frozen?
31594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Protect with mAnimator.
32594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean freezingScreen;
33594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
34a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    /**
35a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn     * How long we last kept the screen frozen.
36a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn     */
37a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    int lastFreezeDuration;
38a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn
39594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Offset to the window of all layers in the token, for use by
40594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // AppWindowToken animations.
41594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int animLayerAdjustment;
42594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
436fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    // Propagated from AppWindowToken.allDrawn, to determine when
446fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    // the state changes.
456fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    boolean allDrawn;
466fbda63e68513ece4409dac845588711ab25c39dCraig Mautner
47594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Special surface for thumbnail animation.
483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    SurfaceControl thumbnail;
49594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailTransactionSeq;
50594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailX;
51594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailY;
52594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailLayer;
53594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    Animation thumbnailAnimation;
54594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final Transformation thumbnailTransformation = new Transformation();
55594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
56322e40315609acd5a608440bc469d873e09559caCraig Mautner    /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
57bea12bdc2e6d2b1158c1faa58a8197d5e971a817Craig Mautner    ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<WindowStateAnimator>();
58322e40315609acd5a608440bc469d873e09559caCraig Mautner
59fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final Animation sDummyAnimation = new DummyAnimation();
60fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
61322e40315609acd5a608440bc469d873e09559caCraig Mautner    public AppWindowAnimator(final AppWindowToken atoken) {
62594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        mAppToken = atoken;
63322e40315609acd5a608440bc469d873e09559caCraig Mautner        mService = atoken.service;
64322e40315609acd5a608440bc469d873e09559caCraig Mautner        mAnimator = atoken.mAnimator;
65594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
66594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
679339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner    public void setAnimation(Animation anim, int width, int height) {
6872669d18016446d874e4fa1005464e36375124e4Craig Mautner        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting animation in " + mAppToken
6972669d18016446d874e4fa1005464e36375124e4Craig Mautner                + ": " + anim + " wxh=" + width + "x" + height
7072669d18016446d874e4fa1005464e36375124e4Craig Mautner                + " isVisible=" + mAppToken.isVisible());
71594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animation = anim;
72594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animating = false;
739339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner        if (!anim.isInitialized()) {
749339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            anim.initialize(width, height, width, height);
759339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner        }
76594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        anim.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION);
77594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        anim.scaleCurrentDuration(mService.mTransitionAnimationScale);
78594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        int zorder = anim.getZAdjustment();
79594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        int adj = 0;
80594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (zorder == Animation.ZORDER_TOP) {
81594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            adj = WindowManagerService.TYPE_LAYER_OFFSET;
82594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        } else if (zorder == Animation.ZORDER_BOTTOM) {
83594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            adj = -WindowManagerService.TYPE_LAYER_OFFSET;
84594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
85594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
86594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animLayerAdjustment != adj) {
87594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animLayerAdjustment = adj;
88594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            updateLayers();
89594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
90594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // Start out animation gone if window is gone, or visible if window is visible.
91594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
9272669d18016446d874e4fa1005464e36375124e4Craig Mautner        transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
93594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = true;
94594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
95594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
96594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void setDummyAnimation() {
9772669d18016446d874e4fa1005464e36375124e4Craig Mautner        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting dummy animation in " + mAppToken
9872669d18016446d874e4fa1005464e36375124e4Craig Mautner                + " isVisible=" + mAppToken.isVisible());
991d961d46d68eb3134e4bd6c3751f9730e9d32f17Craig Mautner        animation = sDummyAnimation;
10094ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner        hasTransformation = true;
10194ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner        transformation.clear();
10272669d18016446d874e4fa1005464e36375124e4Craig Mautner        transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
103594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
104594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
105594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void clearAnimation() {
106594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animation != null) {
107594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animation = null;
108594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animating = true;
109594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
110594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        clearThumbnail();
1117636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner        if (mAppToken.deferClearAllDrawn) {
1127636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner            mAppToken.allDrawn = false;
1137636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner            mAppToken.deferClearAllDrawn = false;
1147636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner        }
115594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
116594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
117594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void clearThumbnail() {
118594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (thumbnail != null) {
119594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            thumbnail.destroy();
120594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            thumbnail = null;
121594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
122594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
123594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
124594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    void updateLayers() {
125594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final int N = mAppToken.allAppWindows.size();
126594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final int adj = animLayerAdjustment;
127594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailLayer = -1;
128594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        for (int i=0; i<N; i++) {
129594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final WindowState w = mAppToken.allAppWindows.get(i);
130594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final WindowStateAnimator winAnimator = w.mWinAnimator;
131594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            winAnimator.mAnimLayer = w.mLayer + adj;
132594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (winAnimator.mAnimLayer > thumbnailLayer) {
133594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                thumbnailLayer = winAnimator.mAnimLayer;
134594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
135fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (WindowManagerService.DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": "
136594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    + winAnimator.mAnimLayer);
137594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) {
138594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                mService.setInputMethodAnimLayerAdjustment(adj);
139594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
140968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            if (w == mService.mWallpaperTarget && mService.mLowerWallpaperTarget == null) {
141594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                mService.setWallpaperAnimLayerAdjustmentLocked(adj);
142594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
143594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
144594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
145594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
146594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    private void stepThumbnailAnimation(long currentTime) {
147594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.clear();
148594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailAnimation.getTransformation(currentTime, thumbnailTransformation);
149594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.getMatrix().preTranslate(thumbnailX, thumbnailY);
150a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
151a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        ScreenRotationAnimation screenRotationAnimation =
152a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY);
153a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final boolean screenAnimation = screenRotationAnimation != null
154a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                && screenRotationAnimation.isAnimating();
155594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (screenAnimation) {
156a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            thumbnailTransformation.postCompose(screenRotationAnimation.getEnterTransformation());
157594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
158594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // cache often used attributes locally
159594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final float tmpFloats[] = mService.mTmpFloats;
160594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.getMatrix().getValues(tmpFloats);
161594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
162594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                "thumbnail", "POS " + tmpFloats[Matrix.MTRANS_X]
163594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + ", " + tmpFloats[Matrix.MTRANS_Y], null);
164594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]);
165594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
166594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                "thumbnail", "alpha=" + thumbnailTransformation.getAlpha()
167594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + " layer=" + thumbnailLayer
168594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + " matrix=[" + tmpFloats[Matrix.MSCALE_X]
169594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "," + tmpFloats[Matrix.MSKEW_Y]
170594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "][" + tmpFloats[Matrix.MSKEW_X]
171594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "," + tmpFloats[Matrix.MSCALE_Y] + "]", null);
172594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setAlpha(thumbnailTransformation.getAlpha());
173594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // The thumbnail is layered below the window immediately above this
174594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // token's anim layer.
175594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setLayer(thumbnailLayer + WindowManagerService.WINDOW_LAYER_MULTIPLIER
176594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                - WindowManagerService.LAYER_OFFSET_THUMBNAIL);
177594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y],
178594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]);
179594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
180594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
181594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    private boolean stepAnimation(long currentTime) {
182594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animation == null) {
183594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            return false;
184594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
185594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
186594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final boolean more = animation.getTransformation(currentTime, transformation);
1879e809448761878b72b47c0a0e703de95a3cf9815Craig Mautner        if (false && WindowManagerService.DEBUG_ANIM) Slog.v(
1888a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner            TAG, "Stepped animation in " + mAppToken + ": more=" + more + ", xform=" + transformation);
189594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (!more) {
190594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animation = null;
191594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            clearThumbnail();
192594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (WindowManagerService.DEBUG_ANIM) Slog.v(
1938a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner                TAG, "Finished animation in " + mAppToken + " @ " + currentTime);
194594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
195594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = more;
196594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        return more;
197594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
198594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
199594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // This must be called while inside a transaction.
2009339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner    boolean stepAnimationLocked(long currentTime) {
201594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (mService.okToDisplay()) {
202594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // We will run animations as long as the display isn't frozen.
203594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
204fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (animation == sDummyAnimation) {
205594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // This guy is going to animate, but not yet.  For now count
206594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // it as not animating for purposes of scheduling transactions;
207594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // when it is really time to animate, this will be set to
208594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // a real animation and the next call will execute normally.
209594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                return false;
210594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
211594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
212594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if ((mAppToken.allDrawn || animating || mAppToken.startingDisplayed)
213594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    && animation != null) {
214594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (!animating) {
215594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (WindowManagerService.DEBUG_ANIM) Slog.v(
2168a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner                        TAG, "Starting animation in " + mAppToken +
2179339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner                        " @ " + currentTime + " scale=" + mService.mTransitionAnimationScale
218594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        + " allDrawn=" + mAppToken.allDrawn + " animating=" + animating);
219594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    animation.setStartTime(currentTime);
220594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    animating = true;
221594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (thumbnail != null) {
222594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        thumbnail.show();
223594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        thumbnailAnimation.setStartTime(currentTime);
224594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    }
225594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                }
226594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (stepAnimation(currentTime)) {
227594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    // animation isn't over, step any thumbnail and that's
228594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    // it for now.
229594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (thumbnail != null) {
230594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        stepThumbnailAnimation(currentTime);
231594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    }
232594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    return true;
233594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                }
234594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
235594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        } else if (animation != null) {
236594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // If the display is frozen, and there is a pending animation,
237594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // clear it and make sure we run the cleanup code.
238594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animating = true;
239594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animation = null;
240594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
241594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
242594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = false;
243594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
2443de422fe4fe903b1370f3f7ee9c7086966e15b28Craig Mautner        if (!animating && animation == null) {
245594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            return false;
246594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
247594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
24876a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        mAnimator.setAppLayoutChanges(this, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
24976a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                "AppWindowToken");
250594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
251594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        clearAnimation();
252594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animating = false;
253594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animLayerAdjustment != 0) {
254594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animLayerAdjustment = 0;
255594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            updateLayers();
256594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
257594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (mService.mInputMethodTarget != null
258594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && mService.mInputMethodTarget.mAppToken == mAppToken) {
259594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            mService.moveInputMethodWindowsIfNeededLocked(true);
260594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
261594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
262594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (WindowManagerService.DEBUG_ANIM) Slog.v(
2638a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner                TAG, "Animation done in " + mAppToken
264594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + ": reportedVisible=" + mAppToken.reportedVisible);
265594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
266594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
267594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
268322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int N = mAllAppWinAnimators.size();
269594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        for (int i=0; i<N; i++) {
270322e40315609acd5a608440bc469d873e09559caCraig Mautner            mAllAppWinAnimators.get(i).finishExit();
271594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
272594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        mAppToken.updateReportedVisibilityLocked();
273594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
274594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        return false;
275594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
276594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
277bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner    boolean showAllWindowsLocked() {
278bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        boolean isAnimating = false;
279322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int NW = mAllAppWinAnimators.size();
280bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        for (int i=0; i<NW; i++) {
281322e40315609acd5a608440bc469d873e09559caCraig Mautner            WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i);
282fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
283bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                    "performing show on: " + winAnimator);
284bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            winAnimator.performShowLocked();
285bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            isAnimating |= winAnimator.isAnimating();
286bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        }
287bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        return isAnimating;
288bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner    }
289bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner
290529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
291529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
292529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mAnimator="); pw.println(mAnimator);
293529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("freezingScreen="); pw.print(freezingScreen);
294529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(" allDrawn="); pw.print(allDrawn);
295529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(" animLayerAdjustment="); pw.println(animLayerAdjustment);
296a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn        if (lastFreezeDuration != 0) {
297a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn            pw.print(prefix); pw.print("lastFreezeDuration=");
298a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn                    TimeUtils.formatDuration(lastFreezeDuration, pw); pw.println();
299a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn        }
300594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animating || animation != null) {
3019339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            pw.print(prefix); pw.print("animating="); pw.println(animating);
302529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("animation="); pw.println(animation);
303594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
304594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (hasTransformation) {
305594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("XForm: ");
306594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    transformation.printShortString(pw);
307594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.println();
308594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
309594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (thumbnail != null) {
310594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnail="); pw.print(thumbnail);
311594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" x="); pw.print(thumbnailX);
312594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" y="); pw.print(thumbnailY);
313594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" layer="); pw.println(thumbnailLayer);
314594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnailAnimation="); pw.println(thumbnailAnimation);
315594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnailTransformation=");
316594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.println(thumbnailTransformation.toShortString());
317594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
318529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        for (int i=0; i<mAllAppWinAnimators.size(); i++) {
319529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            WindowStateAnimator wanim = mAllAppWinAnimators.get(i);
320529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("App Win Anim #"); pw.print(i);
321529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(": "); pw.println(wanim);
322529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
323594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
324fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
325fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // This is an animation that does nothing: it just immediately finishes
326fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // itself every time it is called.  It is used as a stub animation in cases
327fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // where we want to synchronize multiple things that may be animating.
328fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final class DummyAnimation extends Animation {
329fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        @Override
330fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        public boolean getTransformation(long currentTime, Transformation outTransformation) {
331fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            return false;
332fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        }
333fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    }
334fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
335594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner}
336