AppWindowAnimator.java revision ab79fce2e71b6816b2b88b826ca723b3591f1e26
1c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner/*
2c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * Copyright (C) 2014 The Android Open Source Project
3c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner *
4c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
5c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * you may not use this file except in compliance with the License.
6c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * You may obtain a copy of the License at
7c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner *
8c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
9c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner *
10c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * Unless required by applicable law or agreed to in writing, software
11c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
12c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * See the License for the specific language governing permissions and
14c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner * limitations under the License.
15c2c0a61cf5f779b4726f089f28d966c03ccbba54Craig Mautner */
16594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
17594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpackage com.android.server.wm;
18594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
19594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.graphics.Matrix;
20bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautnerimport android.os.RemoteException;
21594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.util.Slog;
22a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackbornimport android.util.TimeUtils;
23a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.view.Display;
243866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
25594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.WindowManagerPolicy;
26594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Animation;
27594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Transformation;
28594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
29594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport java.io.PrintWriter;
30322e40315609acd5a608440bc469d873e09559caCraig Mautnerimport java.util.ArrayList;
31594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
32594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpublic class AppWindowAnimator {
33fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final String TAG = "AppWindowAnimator";
34594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
35594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final AppWindowToken mAppToken;
36594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final WindowManagerService mService;
37594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final WindowAnimator mAnimator;
38594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
39594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean animating;
40594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    Animation animation;
41594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean hasTransformation;
42594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final Transformation transformation = new Transformation();
43594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
44594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Have we been asked to have this token keep the screen frozen?
45594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Protect with mAnimator.
46594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean freezingScreen;
47594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
48a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    /**
49a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn     * How long we last kept the screen frozen.
50a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn     */
51a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    int lastFreezeDuration;
52a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn
53594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Offset to the window of all layers in the token, for use by
54594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // AppWindowToken animations.
55594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int animLayerAdjustment;
56594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
576fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    // Propagated from AppWindowToken.allDrawn, to determine when
586fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    // the state changes.
596fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    boolean allDrawn;
606fbda63e68513ece4409dac845588711ab25c39dCraig Mautner
61ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // Special surface for thumbnail animation.  If deferThumbnailDestruction is enabled, then we
62ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // will make sure that the thumbnail is destroyed after the other surface is completed.  This
63ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // requires that the duration of the two animations are the same.
643866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    SurfaceControl thumbnail;
65594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailTransactionSeq;
66594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailX;
67594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailY;
68594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailLayer;
69a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    int thumbnailForceAboveLayer;
70594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    Animation thumbnailAnimation;
71594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final Transformation thumbnailTransformation = new Transformation();
72a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    // This flag indicates that the destruction of the thumbnail surface is synchronized with
73ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // another animation, so defer the destruction of this thumbnail surface for a single frame
74ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // after the secondary animation completes.
75a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    boolean deferThumbnailDestruction;
76ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // This flag is set if the animator has deferThumbnailDestruction set and has reached the final
77ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // frame of animation.  It will extend the animation by one frame and then clean up afterwards.
78ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    boolean deferFinalFrameCleanup;
79594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
80322e40315609acd5a608440bc469d873e09559caCraig Mautner    /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
81bea12bdc2e6d2b1158c1faa58a8197d5e971a817Craig Mautner    ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<WindowStateAnimator>();
82322e40315609acd5a608440bc469d873e09559caCraig Mautner
83fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final Animation sDummyAnimation = new DummyAnimation();
84fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
85322e40315609acd5a608440bc469d873e09559caCraig Mautner    public AppWindowAnimator(final AppWindowToken atoken) {
86594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        mAppToken = atoken;
87322e40315609acd5a608440bc469d873e09559caCraig Mautner        mService = atoken.service;
88322e40315609acd5a608440bc469d873e09559caCraig Mautner        mAnimator = atoken.mAnimator;
89594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
90594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
919339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner    public void setAnimation(Animation anim, int width, int height) {
9272669d18016446d874e4fa1005464e36375124e4Craig Mautner        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting animation in " + mAppToken
9372669d18016446d874e4fa1005464e36375124e4Craig Mautner                + ": " + anim + " wxh=" + width + "x" + height
9472669d18016446d874e4fa1005464e36375124e4Craig Mautner                + " isVisible=" + mAppToken.isVisible());
95594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animation = anim;
96594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animating = false;
979339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner        if (!anim.isInitialized()) {
989339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            anim.initialize(width, height, width, height);
999339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner        }
100594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        anim.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION);
101eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn        anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());
102594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        int zorder = anim.getZAdjustment();
103594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        int adj = 0;
104594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (zorder == Animation.ZORDER_TOP) {
105594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            adj = WindowManagerService.TYPE_LAYER_OFFSET;
106594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        } else if (zorder == Animation.ZORDER_BOTTOM) {
107594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            adj = -WindowManagerService.TYPE_LAYER_OFFSET;
108594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
109594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
110594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animLayerAdjustment != adj) {
111594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animLayerAdjustment = adj;
112594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            updateLayers();
113594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
114594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // Start out animation gone if window is gone, or visible if window is visible.
115594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
11672669d18016446d874e4fa1005464e36375124e4Craig Mautner        transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
117594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = true;
1181ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner
1191ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner        if (!mAppToken.appFullscreen) {
1201ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner            anim.setBackgroundColor(0);
1211ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner        }
122594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
123594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
124594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void setDummyAnimation() {
12572669d18016446d874e4fa1005464e36375124e4Craig Mautner        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting dummy animation in " + mAppToken
12672669d18016446d874e4fa1005464e36375124e4Craig Mautner                + " isVisible=" + mAppToken.isVisible());
1271d961d46d68eb3134e4bd6c3751f9730e9d32f17Craig Mautner        animation = sDummyAnimation;
12894ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner        hasTransformation = true;
12994ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner        transformation.clear();
13072669d18016446d874e4fa1005464e36375124e4Craig Mautner        transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
131594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
132594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
133594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void clearAnimation() {
134594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animation != null) {
135594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animation = null;
136594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animating = true;
137594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
138ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        clearThumbnail();
1397636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner        if (mAppToken.deferClearAllDrawn) {
1407636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner            mAppToken.allDrawn = false;
1417636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner            mAppToken.deferClearAllDrawn = false;
1427636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner        }
143594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
144594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
145594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void clearThumbnail() {
146594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (thumbnail != null) {
147594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            thumbnail.destroy();
148594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            thumbnail = null;
149594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
150ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        deferThumbnailDestruction = false;
151a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    }
152a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung
153594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    void updateLayers() {
154594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final int N = mAppToken.allAppWindows.size();
155594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final int adj = animLayerAdjustment;
156594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailLayer = -1;
157594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        for (int i=0; i<N; i++) {
158594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final WindowState w = mAppToken.allAppWindows.get(i);
159594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final WindowStateAnimator winAnimator = w.mWinAnimator;
160594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            winAnimator.mAnimLayer = w.mLayer + adj;
161594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (winAnimator.mAnimLayer > thumbnailLayer) {
162594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                thumbnailLayer = winAnimator.mAnimLayer;
163594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
164fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (WindowManagerService.DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": "
165594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    + winAnimator.mAnimLayer);
166594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) {
167594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                mService.setInputMethodAnimLayerAdjustment(adj);
168594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
169968683335e17c06504a11bc2e38a2580f613ea16Craig Mautner            if (w == mService.mWallpaperTarget && mService.mLowerWallpaperTarget == null) {
170594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                mService.setWallpaperAnimLayerAdjustmentLocked(adj);
171594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
172594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
173594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
174594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
175594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    private void stepThumbnailAnimation(long currentTime) {
176594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.clear();
177594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailAnimation.getTransformation(currentTime, thumbnailTransformation);
178594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.getMatrix().preTranslate(thumbnailX, thumbnailY);
179a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
180a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        ScreenRotationAnimation screenRotationAnimation =
181a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY);
182a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final boolean screenAnimation = screenRotationAnimation != null
183a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                && screenRotationAnimation.isAnimating();
184594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (screenAnimation) {
185a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            thumbnailTransformation.postCompose(screenRotationAnimation.getEnterTransformation());
186594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
187594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // cache often used attributes locally
188594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final float tmpFloats[] = mService.mTmpFloats;
189594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.getMatrix().getValues(tmpFloats);
190594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
191594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                "thumbnail", "POS " + tmpFloats[Matrix.MTRANS_X]
192594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + ", " + tmpFloats[Matrix.MTRANS_Y], null);
193594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]);
194594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
195594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                "thumbnail", "alpha=" + thumbnailTransformation.getAlpha()
196594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + " layer=" + thumbnailLayer
197594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + " matrix=[" + tmpFloats[Matrix.MSCALE_X]
198594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "," + tmpFloats[Matrix.MSKEW_Y]
199594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "][" + tmpFloats[Matrix.MSKEW_X]
200594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "," + tmpFloats[Matrix.MSCALE_Y] + "]", null);
201594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setAlpha(thumbnailTransformation.getAlpha());
202a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        if (thumbnailForceAboveLayer > 0) {
203a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            thumbnail.setLayer(thumbnailForceAboveLayer + 1);
204a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        } else {
205a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            // The thumbnail is layered below the window immediately above this
206a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            // token's anim layer.
207a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            thumbnail.setLayer(thumbnailLayer + WindowManagerService.WINDOW_LAYER_MULTIPLIER
208a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung                    - WindowManagerService.LAYER_OFFSET_THUMBNAIL);
209a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        }
210594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y],
211594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]);
212594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
213594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
214594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    private boolean stepAnimation(long currentTime) {
215594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animation == null) {
216594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            return false;
217594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
218594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
219ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        boolean hasMoreFrames = animation.getTransformation(currentTime, transformation);
220ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        if (!hasMoreFrames) {
221ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung            if (deferThumbnailDestruction && !deferFinalFrameCleanup) {
222ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                // We are deferring the thumbnail destruction, so extend the animation for one more
223ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                // (dummy) frame before we clean up
224ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                deferFinalFrameCleanup = true;
225ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                hasMoreFrames = true;
226ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung            } else {
227ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                if (false && WindowManagerService.DEBUG_ANIM) Slog.v(
228ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                        TAG, "Stepped animation in " + mAppToken + ": more=" + hasMoreFrames +
229ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                                ", xform=" + transformation);
230ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                deferFinalFrameCleanup = false;
231ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                animation = null;
232a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung                clearThumbnail();
233ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                if (WindowManagerService.DEBUG_ANIM) Slog.v(
234ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                        TAG, "Finished animation in " + mAppToken + " @ " + currentTime);
235a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            }
236594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
237ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        hasTransformation = hasMoreFrames;
238ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        return hasMoreFrames;
239594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
240594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
241594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // This must be called while inside a transaction.
2429339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner    boolean stepAnimationLocked(long currentTime) {
243594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (mService.okToDisplay()) {
244594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // We will run animations as long as the display isn't frozen.
245594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
246fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (animation == sDummyAnimation) {
247594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // This guy is going to animate, but not yet.  For now count
248594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // it as not animating for purposes of scheduling transactions;
249594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // when it is really time to animate, this will be set to
250594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // a real animation and the next call will execute normally.
251594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                return false;
252594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
253594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
254594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if ((mAppToken.allDrawn || animating || mAppToken.startingDisplayed)
255594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    && animation != null) {
256594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (!animating) {
257594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (WindowManagerService.DEBUG_ANIM) Slog.v(
2588a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner                        TAG, "Starting animation in " + mAppToken +
259eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn                        " @ " + currentTime + " scale="
260eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn                        + mService.getTransitionAnimationScaleLocked()
261594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        + " allDrawn=" + mAppToken.allDrawn + " animating=" + animating);
262594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    animation.setStartTime(currentTime);
263594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    animating = true;
264594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (thumbnail != null) {
265594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        thumbnail.show();
266594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        thumbnailAnimation.setStartTime(currentTime);
267594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    }
268594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                }
269594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (stepAnimation(currentTime)) {
270594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    // animation isn't over, step any thumbnail and that's
271594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    // it for now.
272594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (thumbnail != null) {
273594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        stepThumbnailAnimation(currentTime);
274594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    }
275594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    return true;
276594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                }
277594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
278594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        } else if (animation != null) {
279594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // If the display is frozen, and there is a pending animation,
280594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // clear it and make sure we run the cleanup code.
281594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animating = true;
282594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animation = null;
283594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
284594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
285594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = false;
286594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
2873de422fe4fe903b1370f3f7ee9c7086966e15b28Craig Mautner        if (!animating && animation == null) {
288594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            return false;
289594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
290594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
29176a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        mAnimator.setAppLayoutChanges(this, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
29276a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner                "AppWindowToken");
293594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
294594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        clearAnimation();
295594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animating = false;
296594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animLayerAdjustment != 0) {
297594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animLayerAdjustment = 0;
298594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            updateLayers();
299594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
300594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (mService.mInputMethodTarget != null
301594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && mService.mInputMethodTarget.mAppToken == mAppToken) {
302594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            mService.moveInputMethodWindowsIfNeededLocked(true);
303594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
304594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
305594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (WindowManagerService.DEBUG_ANIM) Slog.v(
3068a197a4e0887000241dfd183d1e83e6e0f9b2268Craig Mautner                TAG, "Animation done in " + mAppToken
307594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + ": reportedVisible=" + mAppToken.reportedVisible);
308594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
309594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
310594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
311322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int N = mAllAppWinAnimators.size();
312594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        for (int i=0; i<N; i++) {
313bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            final WindowStateAnimator winAnim = mAllAppWinAnimators.get(i);
314bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            if (mAppToken.mLaunchTaskBehind) {
315bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                winAnim.mWin.mExiting = true;
316bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            }
317bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            winAnim.finishExit();
318bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        }
319bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        if (mAppToken.mLaunchTaskBehind) {
320bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            try {
321bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                mService.mActivityManager.notifyLaunchTaskBehindComplete(mAppToken.token);
322bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            } catch (RemoteException e) {
323bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            }
324bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            mAppToken.mLaunchTaskBehind = false;
325bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        } else {
326bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            mAppToken.updateReportedVisibilityLocked();
3278746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner            if (mAppToken.mEnteringAnimation) {
3288746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner                mAppToken.mEnteringAnimation = false;
3298746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner                try {
3308746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner                    mService.mActivityManager.notifyEnterAnimationComplete(mAppToken.token);
3318746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner                } catch (RemoteException e) {
3328746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner                }
3338746a478abcfb3b0d73b156232051af1e8d21ce2Craig Mautner            }
334594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
335594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
336594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        return false;
337594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
338594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
339bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner    boolean showAllWindowsLocked() {
340bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        boolean isAnimating = false;
341322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int NW = mAllAppWinAnimators.size();
342bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        for (int i=0; i<NW; i++) {
343322e40315609acd5a608440bc469d873e09559caCraig Mautner            WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i);
344fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
345bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner                    "performing show on: " + winAnimator);
346bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            winAnimator.performShowLocked();
347bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            isAnimating |= winAnimator.isAnimating();
348bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        }
349bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        return isAnimating;
350bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner    }
351bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner
352529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
353529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
354529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mAnimator="); pw.println(mAnimator);
355529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("freezingScreen="); pw.print(freezingScreen);
356529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(" allDrawn="); pw.print(allDrawn);
357529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(" animLayerAdjustment="); pw.println(animLayerAdjustment);
358a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn        if (lastFreezeDuration != 0) {
359a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn            pw.print(prefix); pw.print("lastFreezeDuration=");
360a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn                    TimeUtils.formatDuration(lastFreezeDuration, pw); pw.println();
361a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn        }
362594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animating || animation != null) {
3639339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            pw.print(prefix); pw.print("animating="); pw.println(animating);
364529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("animation="); pw.println(animation);
365594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
366594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (hasTransformation) {
367594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("XForm: ");
368594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    transformation.printShortString(pw);
369594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.println();
370594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
371594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (thumbnail != null) {
372594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnail="); pw.print(thumbnail);
373594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" x="); pw.print(thumbnailX);
374594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" y="); pw.print(thumbnailY);
375594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" layer="); pw.println(thumbnailLayer);
376594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnailAnimation="); pw.println(thumbnailAnimation);
377594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnailTransformation=");
378594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.println(thumbnailTransformation.toShortString());
379594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
380529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        for (int i=0; i<mAllAppWinAnimators.size(); i++) {
381529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            WindowStateAnimator wanim = mAllAppWinAnimators.get(i);
382529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("App Win Anim #"); pw.print(i);
383529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(": "); pw.println(wanim);
384529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
385594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
386fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
387fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // This is an animation that does nothing: it just immediately finishes
388fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // itself every time it is called.  It is used as a stub animation in cases
389fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // where we want to synchronize multiple things that may be animating.
390fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final class DummyAnimation extends Animation {
391fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        @Override
392fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        public boolean getTransformation(long currentTime, Transformation outTransformation) {
393fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            return false;
394fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        }
395fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    }
396fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
397594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner}
398