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
190bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM;
200bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS;
210bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
220bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.SHOW_TRANSACTIONS;
230bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
240bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskiimport static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
258ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwaleimport static com.android.server.wm.WindowManagerService.TYPE_LAYER_OFFSET;
266a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggiimport static com.android.server.wm.WindowStateAnimator.STACK_CLIP_BEFORE_ANIM;
278ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale
28594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.graphics.Matrix;
29594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.util.Slog;
30a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackbornimport android.util.TimeUtils;
31c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggiimport android.view.Choreographer;
32a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautnerimport android.view.Display;
333866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
34594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.WindowManagerPolicy;
35594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Animation;
36594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport android.view.animation.Transformation;
37594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
38594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerimport java.io.PrintWriter;
39322e40315609acd5a608440bc469d873e09559caCraig Mautnerimport java.util.ArrayList;
40594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
41594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautnerpublic class AppWindowAnimator {
420bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski    static final String TAG = TAG_WITH_CLASS_NAME ? "AppWindowAnimator" : TAG_WM;
43594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
441a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski    private static final int PROLONG_ANIMATION_DISABLED = 0;
451a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski    static final int PROLONG_ANIMATION_AT_END = 1;
461a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski    static final int PROLONG_ANIMATION_AT_START = 2;
471a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski
48594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final AppWindowToken mAppToken;
49594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final WindowManagerService mService;
50594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final WindowAnimator mAnimator;
51594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
52594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean animating;
53827e0facfefd0c0033dcfb1747b4fa6f80f9e0e2Jorim Jaggi    boolean wasAnimating;
54594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    Animation animation;
55594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean hasTransformation;
56594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final Transformation transformation = new Transformation();
57594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
58594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Have we been asked to have this token keep the screen frozen?
59594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Protect with mAnimator.
60594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    boolean freezingScreen;
61594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
62a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    /**
63a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn     * How long we last kept the screen frozen.
64a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn     */
65a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn    int lastFreezeDuration;
66a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn
67594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // Offset to the window of all layers in the token, for use by
68594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // AppWindowToken animations.
69594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int animLayerAdjustment;
70594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
716fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    // Propagated from AppWindowToken.allDrawn, to determine when
726fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    // the state changes.
736fbda63e68513ece4409dac845588711ab25c39dCraig Mautner    boolean allDrawn;
746fbda63e68513ece4409dac845588711ab25c39dCraig Mautner
75ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // Special surface for thumbnail animation.  If deferThumbnailDestruction is enabled, then we
76ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // will make sure that the thumbnail is destroyed after the other surface is completed.  This
77ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // requires that the duration of the two animations are the same.
783866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    SurfaceControl thumbnail;
79594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailTransactionSeq;
80594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    int thumbnailLayer;
81a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    int thumbnailForceAboveLayer;
82594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    Animation thumbnailAnimation;
83594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    final Transformation thumbnailTransformation = new Transformation();
84a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    // This flag indicates that the destruction of the thumbnail surface is synchronized with
85ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // another animation, so defer the destruction of this thumbnail surface for a single frame
86ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // after the secondary animation completes.
87a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    boolean deferThumbnailDestruction;
88ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // This flag is set if the animator has deferThumbnailDestruction set and has reached the final
89ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    // frame of animation.  It will extend the animation by one frame and then clean up afterwards.
90ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung    boolean deferFinalFrameCleanup;
9114b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    // If true when the animation hits the last frame, it will keep running on that last frame.
9214b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    // This is used to synchronize animation with Recents and we wait for Recents to tell us to
9314b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    // finish or for a new animation be set as fail-safe mechanism.
941a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski    private int mProlongAnimation;
9514b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    // Whether the prolong animation can be removed when animation is set. The purpose of this is
9614b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    // that if recents doesn't tell us to remove the prolonged animation, we will get rid of it
9714b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    // when new animation is set.
9814b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    private boolean mClearProlongedAnimation;
99594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
100322e40315609acd5a608440bc469d873e09559caCraig Mautner    /** WindowStateAnimator from mAppAnimator.allAppWindows as of last performLayout */
1018ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale    ArrayList<WindowStateAnimator> mAllAppWinAnimators = new ArrayList<>();
1028ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale
1038ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale    /** True if the current animation was transferred from another AppWindowAnimator.
1048ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale     *  See {@link #transferCurrentAnimation}*/
1058ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale    boolean usingTransferredAnimation = false;
106322e40315609acd5a608440bc469d873e09559caCraig Mautner
107c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi    private boolean mSkipFirstFrame = false;
1086a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi    private int mStackClip = STACK_CLIP_BEFORE_ANIM;
109c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi
110fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final Animation sDummyAnimation = new DummyAnimation();
111fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
112322e40315609acd5a608440bc469d873e09559caCraig Mautner    public AppWindowAnimator(final AppWindowToken atoken) {
113594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        mAppToken = atoken;
114322e40315609acd5a608440bc469d873e09559caCraig Mautner        mService = atoken.service;
115a590c99256b197d52a0869d89f8def34796a985dFilip Gruszczynski        mAnimator = mService.mAnimator;
116594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
117594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
1186a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi    public void setAnimation(Animation anim, int width, int height, boolean skipFirstFrame,
1196a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi            int stackClip) {
12072669d18016446d874e4fa1005464e36375124e4Craig Mautner        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting animation in " + mAppToken
12172669d18016446d874e4fa1005464e36375124e4Craig Mautner                + ": " + anim + " wxh=" + width + "x" + height
12272669d18016446d874e4fa1005464e36375124e4Craig Mautner                + " isVisible=" + mAppToken.isVisible());
123594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animation = anim;
124594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animating = false;
1259339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner        if (!anim.isInitialized()) {
1269339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            anim.initialize(width, height, width, height);
1279339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner        }
128594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        anim.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION);
129eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn        anim.scaleCurrentDuration(mService.getTransitionAnimationScaleLocked());
130594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        int zorder = anim.getZAdjustment();
131594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        int adj = 0;
132594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (zorder == Animation.ZORDER_TOP) {
1338ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            adj = TYPE_LAYER_OFFSET;
134594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        } else if (zorder == Animation.ZORDER_BOTTOM) {
1358ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            adj = -TYPE_LAYER_OFFSET;
136594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
137594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
138594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animLayerAdjustment != adj) {
139594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animLayerAdjustment = adj;
140594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            updateLayers();
141594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
142594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // Start out animation gone if window is gone, or visible if window is visible.
143594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
14472669d18016446d874e4fa1005464e36375124e4Craig Mautner        transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
145594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = true;
1466a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi        mStackClip = stackClip;
1471ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner
148c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi        this.mSkipFirstFrame = skipFirstFrame;
149c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi
1501ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner        if (!mAppToken.appFullscreen) {
1511ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner            anim.setBackgroundColor(0);
1521ad99155b37c0cb0b7d95f084a2bff0cbfc8e12dCraig Mautner        }
15314b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski        if (mClearProlongedAnimation) {
1541a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski            mProlongAnimation = PROLONG_ANIMATION_DISABLED;
15514b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski        } else {
15614b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski            mClearProlongedAnimation = true;
15714b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski        }
1585e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi
1595e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi        // Since we are finally starting our animation, we don't need the logic anymore to prevent
1605e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi        // the app from showing again if we just moved between stacks. See
1615e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi        // {@link WindowState#notifyMovedInStack}.
1625e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi        for (int i = mAppToken.allAppWindows.size() - 1; i >= 0; i--) {
1635e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi            mAppToken.allAppWindows.get(i).resetJustMovedInStack();
1645e6968db630d26872306c4b23aa2c600d83ed454Jorim Jaggi        }
165594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
166594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
167594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void setDummyAnimation() {
16872669d18016446d874e4fa1005464e36375124e4Craig Mautner        if (WindowManagerService.localLOGV) Slog.v(TAG, "Setting dummy animation in " + mAppToken
16972669d18016446d874e4fa1005464e36375124e4Craig Mautner                + " isVisible=" + mAppToken.isVisible());
1701d961d46d68eb3134e4bd6c3751f9730e9d32f17Craig Mautner        animation = sDummyAnimation;
17194ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner        hasTransformation = true;
17294ef9df22c5960b74359e1a98e5c210787d382f2Craig Mautner        transformation.clear();
17372669d18016446d874e4fa1005464e36375124e4Craig Mautner        transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
174594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
175594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
17665d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang    void setNullAnimation() {
17765d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang        animation = null;
17865d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang        usingTransferredAnimation = false;
17965d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang    }
18065d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang
181594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void clearAnimation() {
182594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animation != null) {
183594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animating = true;
184594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
185ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        clearThumbnail();
18665d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang        setNullAnimation();
1877636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner        if (mAppToken.deferClearAllDrawn) {
1889214704eac0af4b0d138a195bcea6fecef523ea5Chong Zhang            mAppToken.clearAllDrawn();
1897636dfbc3331dec0cea374a9540a1f31fb7dbf77Craig Mautner        }
1906a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi        mStackClip = STACK_CLIP_BEFORE_ANIM;
191594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
192594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
193378756154fce86b53e91746583bfe15996ef680bJorim Jaggi    public boolean isAnimating() {
194378756154fce86b53e91746583bfe15996ef680bJorim Jaggi        return animation != null || mAppToken.inPendingTransaction;
195378756154fce86b53e91746583bfe15996ef680bJorim Jaggi    }
196378756154fce86b53e91746583bfe15996ef680bJorim Jaggi
197594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    public void clearThumbnail() {
198594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (thumbnail != null) {
1993dac63a18d9115405404561d327010604420b07bJorim Jaggi            thumbnail.hide();
2003dac63a18d9115405404561d327010604420b07bJorim Jaggi            mService.mWindowPlacerLocked.destroyAfterTransaction(thumbnail);
201594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            thumbnail = null;
202594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
203ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        deferThumbnailDestruction = false;
204a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung    }
205a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung
2066a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi    int getStackClip() {
2076a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi        return mStackClip;
2086a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi    }
2096a7c90a12b5e5250e0350d35ca6547b26630653fJorim Jaggi
2108ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale    void transferCurrentAnimation(
2118ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            AppWindowAnimator toAppAnimator, WindowStateAnimator transferWinAnimator) {
2128ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale
2138ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        if (animation != null) {
2148ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            toAppAnimator.animation = animation;
2158ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            toAppAnimator.animating = animating;
2168ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            toAppAnimator.animLayerAdjustment = animLayerAdjustment;
21765d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang            setNullAnimation();
2188ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            animLayerAdjustment = 0;
2198ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            toAppAnimator.updateLayers();
2208ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            updateLayers();
2218ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            toAppAnimator.usingTransferredAnimation = true;
2228ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        }
2238ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        if (transferWinAnimator != null) {
2248ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            mAllAppWinAnimators.remove(transferWinAnimator);
2258ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            toAppAnimator.mAllAppWinAnimators.add(transferWinAnimator);
2268e0626572d44413e77ab73bd859b9d76c16c0d6bChong Zhang            toAppAnimator.hasTransformation = transferWinAnimator.mAppAnimator.hasTransformation;
2278e0626572d44413e77ab73bd859b9d76c16c0d6bChong Zhang            if (toAppAnimator.hasTransformation) {
2288e0626572d44413e77ab73bd859b9d76c16c0d6bChong Zhang                toAppAnimator.transformation.set(transferWinAnimator.mAppAnimator.transformation);
2298e0626572d44413e77ab73bd859b9d76c16c0d6bChong Zhang            } else {
2308e0626572d44413e77ab73bd859b9d76c16c0d6bChong Zhang                toAppAnimator.transformation.clear();
2318e0626572d44413e77ab73bd859b9d76c16c0d6bChong Zhang            }
2328ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            transferWinAnimator.mAppAnimator = toAppAnimator;
2338ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        }
2348ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale    }
2358ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale
236594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    void updateLayers() {
2378ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        final int windowCount = mAppToken.allAppWindows.size();
238594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final int adj = animLayerAdjustment;
239594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailLayer = -1;
240e8069dcfcff15e060fc397b9ed5ea8b915b1cfa7Wale Ogunwale        final WallpaperController wallpaperController = mService.mWallpaperControllerLocked;
2418ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        for (int i = 0; i < windowCount; i++) {
242594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final WindowState w = mAppToken.allAppWindows.get(i);
243594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            final WindowStateAnimator winAnimator = w.mWinAnimator;
244594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            winAnimator.mAnimLayer = w.mLayer + adj;
245594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (winAnimator.mAnimLayer > thumbnailLayer) {
246594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                thumbnailLayer = winAnimator.mAnimLayer;
247594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
2488ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale            if (DEBUG_LAYERS) Slog.v(TAG, "Updating layer " + w + ": " + winAnimator.mAnimLayer);
249594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            if (w == mService.mInputMethodTarget && !mService.mInputMethodTargetWaitingAnim) {
25092e432c30e2304272c2f5b1b33366f32c3d763cfFilip Gruszczynski                mService.mLayersController.setInputMethodAnimLayerAdjustment(adj);
251594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
252e8069dcfcff15e060fc397b9ed5ea8b915b1cfa7Wale Ogunwale            wallpaperController.setAnimLayerAdjustment(w, adj);
253594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
254594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
255594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
256594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    private void stepThumbnailAnimation(long currentTime) {
257594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.clear();
258564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        final long animationFrameTime = getAnimationFrameTime(thumbnailAnimation, currentTime);
259564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        thumbnailAnimation.getTransformation(animationFrameTime, thumbnailTransformation);
260a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner
261a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        ScreenRotationAnimation screenRotationAnimation =
262a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                mAnimator.getScreenRotationAnimationLocked(Display.DEFAULT_DISPLAY);
263a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner        final boolean screenAnimation = screenRotationAnimation != null
264a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner                && screenRotationAnimation.isAnimating();
265594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (screenAnimation) {
266a91f9e2959ee905f97977a88fe45bde6ffb874b0Craig Mautner            thumbnailTransformation.postCompose(screenRotationAnimation.getEnterTransformation());
267594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
268594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        // cache often used attributes locally
269594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        final float tmpFloats[] = mService.mTmpFloats;
270594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnailTransformation.getMatrix().getValues(tmpFloats);
2718ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
272594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                "thumbnail", "POS " + tmpFloats[Matrix.MTRANS_X]
273198dcbf5231761b7b644d9d7fbceb23e1f0f9aecFilip Gruszczynski                + ", " + tmpFloats[Matrix.MTRANS_Y]);
274594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setPosition(tmpFloats[Matrix.MTRANS_X], tmpFloats[Matrix.MTRANS_Y]);
2758ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        if (SHOW_TRANSACTIONS) WindowManagerService.logSurface(thumbnail,
276594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                "thumbnail", "alpha=" + thumbnailTransformation.getAlpha()
277594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + " layer=" + thumbnailLayer
278594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + " matrix=[" + tmpFloats[Matrix.MSCALE_X]
279594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "," + tmpFloats[Matrix.MSKEW_Y]
280594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + "][" + tmpFloats[Matrix.MSKEW_X]
281198dcbf5231761b7b644d9d7fbceb23e1f0f9aecFilip Gruszczynski                + "," + tmpFloats[Matrix.MSCALE_Y] + "]");
282594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setAlpha(thumbnailTransformation.getAlpha());
283a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        if (thumbnailForceAboveLayer > 0) {
284a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            thumbnail.setLayer(thumbnailForceAboveLayer + 1);
285a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        } else {
286a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            // The thumbnail is layered below the window immediately above this
287a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            // token's anim layer.
288a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            thumbnail.setLayer(thumbnailLayer + WindowManagerService.WINDOW_LAYER_MULTIPLIER
289a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung                    - WindowManagerService.LAYER_OFFSET_THUMBNAIL);
290a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung        }
291594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        thumbnail.setMatrix(tmpFloats[Matrix.MSCALE_X], tmpFloats[Matrix.MSKEW_Y],
292594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                tmpFloats[Matrix.MSKEW_X], tmpFloats[Matrix.MSCALE_Y]);
293de63d441d7daf0503bcc6d5fd3f4f7efe06e23d3Jorim Jaggi        thumbnail.setWindowCrop(thumbnailTransformation.getClipRect());
294594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
295594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
296564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski    /**
297564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski     * Sometimes we need to synchronize the first frame of animation with some external event, e.g.
298564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski     * Recents hiding some of its content. To achieve this, we prolong the start of the animaiton
299564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski     * and keep producing the first frame of the animation.
300564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski     */
301564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski    private long getAnimationFrameTime(Animation animation, long currentTime) {
302564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        if (mProlongAnimation == PROLONG_ANIMATION_AT_START) {
303564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski            animation.setStartTime(currentTime);
304564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski            return currentTime + 1;
305564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        }
306564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        return currentTime;
307564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski    }
308564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski
309594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    private boolean stepAnimation(long currentTime) {
310594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animation == null) {
311594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            return false;
312594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
313594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
314564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        final long animationFrameTime = getAnimationFrameTime(animation, currentTime);
315564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski        boolean hasMoreFrames = animation.getTransformation(animationFrameTime, transformation);
316ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        if (!hasMoreFrames) {
317ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung            if (deferThumbnailDestruction && !deferFinalFrameCleanup) {
318ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                // We are deferring the thumbnail destruction, so extend the animation for one more
319ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                // (dummy) frame before we clean up
320ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                deferFinalFrameCleanup = true;
321ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                hasMoreFrames = true;
322ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung            } else {
3238ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale                if (false && DEBUG_ANIM) Slog.v(TAG,
3248ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale                        "Stepped animation in " + mAppToken + ": more=" + hasMoreFrames +
32514b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski                        ", xform=" + transformation + ", mProlongAnimation=" + mProlongAnimation);
326ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung                deferFinalFrameCleanup = false;
3271a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski                if (mProlongAnimation == PROLONG_ANIMATION_AT_END) {
32814b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski                    hasMoreFrames = true;
32914b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski                } else {
33065d15d03326456457039dde69ae37e9ae1db6d6eChong Zhang                    setNullAnimation();
331564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski                    clearThumbnail();
332564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski                    if (DEBUG_ANIM) Slog.v(TAG, "Finished animation in " + mAppToken + " @ "
333564a8f697b3f3a287d9a4cce14ac0fe1a046709eFilip Gruszczynski                            + currentTime);
33414b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski                }
335a4ccb86ddc8f9f486aee25fb836f4aff97bf7679Winson Chung            }
336594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
337ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        hasTransformation = hasMoreFrames;
338ab79fce2e71b6816b2b88b826ca723b3591f1e26Winson Chung        return hasMoreFrames;
339594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
340594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
341c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi    private long getStartTimeCorrection() {
342c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi        if (mSkipFirstFrame) {
343c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi
344c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi            // If the transition is an animation in which the first frame doesn't change the screen
345c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi            // contents at all, we can just skip it and start at the second frame. So we shift the
346c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi            // start time of the animation forward by minus the frame duration.
347c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi            return -Choreographer.getInstance().getFrameIntervalNanos() / TimeUtils.NANOS_PER_MS;
348c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi        } else {
349c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi            return 0;
350c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi        }
351c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi    }
352c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi
353594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    // This must be called while inside a transaction.
354f16a281066ed7b524676698f95642c0a550b0b62Wale Ogunwale    boolean stepAnimationLocked(long currentTime, final int displayId) {
355594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (mService.okToDisplay()) {
356594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // We will run animations as long as the display isn't frozen.
357594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
358fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            if (animation == sDummyAnimation) {
359594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // This guy is going to animate, but not yet.  For now count
360594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // it as not animating for purposes of scheduling transactions;
361594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // when it is really time to animate, this will be set to
362594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                // a real animation and the next call will execute normally.
363594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                return false;
364594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
365594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
366bfc2f8f6c8ac4156e76a50c88a9ac36d864cee36Chong Zhang            if ((mAppToken.allDrawn || animating || mAppToken.startingDisplayed)
367594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    && animation != null) {
368594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (!animating) {
3698ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale                    if (DEBUG_ANIM) Slog.v(TAG,
3708ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale                        "Starting animation in " + mAppToken +
371eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn                        " @ " + currentTime + " scale="
372eb94fa7975b1e8742f3b00cec6bd4f9d6b329e3aDianne Hackborn                        + mService.getTransitionAnimationScaleLocked()
373594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        + " allDrawn=" + mAppToken.allDrawn + " animating=" + animating);
374c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi                    long correction = getStartTimeCorrection();
375c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi                    animation.setStartTime(currentTime + correction);
376594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    animating = true;
377594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (thumbnail != null) {
378594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        thumbnail.show();
379c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi                        thumbnailAnimation.setStartTime(currentTime + correction);
380594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    }
381c554b77b7392b97e0f455d8276b739e16147d6dfJorim Jaggi                    mSkipFirstFrame = false;
382594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                }
383594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                if (stepAnimation(currentTime)) {
384594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    // animation isn't over, step any thumbnail and that's
385594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    // it for now.
386594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    if (thumbnail != null) {
387594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                        stepThumbnailAnimation(currentTime);
388594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    }
389594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    return true;
390594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                }
391594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            }
392594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        } else if (animation != null) {
393594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // If the display is frozen, and there is a pending animation,
394594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            // clear it and make sure we run the cleanup code.
395594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animating = true;
396594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animation = null;
397594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
398594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
399594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        hasTransformation = false;
400594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
4013de422fe4fe903b1370f3f7ee9c7086966e15b28Craig Mautner        if (!animating && animation == null) {
402594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            return false;
403594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
404594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
40576a7165719dc3ccce902953f6244e2c2668aa753Craig Mautner        mAnimator.setAppLayoutChanges(this, WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM,
406f16a281066ed7b524676698f95642c0a550b0b62Wale Ogunwale                "AppWindowToken", displayId);
407594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
408594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        clearAnimation();
409594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        animating = false;
410594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animLayerAdjustment != 0) {
411594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            animLayerAdjustment = 0;
412594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            updateLayers();
413594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
414594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (mService.mInputMethodTarget != null
415594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                && mService.mInputMethodTarget.mAppToken == mAppToken) {
416594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            mService.moveInputMethodWindowsIfNeededLocked(true);
417594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
418594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
4198ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale        if (DEBUG_ANIM) Slog.v(TAG,
4208ebc82a63f7e4818bb615cf980b961757c8d6587Wale Ogunwale                "Animation done in " + mAppToken
421594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                + ": reportedVisible=" + mAppToken.reportedVisible);
422594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
423594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        transformation.clear();
424594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
425ec533f6a55cfe3b3fdc43f2cdd2305d952a2437bWale Ogunwale        final int numAllAppWinAnimators = mAllAppWinAnimators.size();
426ec533f6a55cfe3b3fdc43f2cdd2305d952a2437bWale Ogunwale        for (int i = 0; i < numAllAppWinAnimators; i++) {
427ec533f6a55cfe3b3fdc43f2cdd2305d952a2437bWale Ogunwale            mAllAppWinAnimators.get(i).finishExit();
428bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        }
429a48eadbeb6fa34f27d6db7de51d3c01972ea2ebfWale Ogunwale        mService.mAppTransition.notifyAppTransitionFinishedLocked(mAppToken.token);
430594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        return false;
431594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
432594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner
433974eb3dd60cc5c5a79a400782dee86c94dd87ee9Filip Gruszczynski    // This must be called while inside a transaction.
434bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner    boolean showAllWindowsLocked() {
435bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        boolean isAnimating = false;
436322e40315609acd5a608440bc469d873e09559caCraig Mautner        final int NW = mAllAppWinAnimators.size();
437bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        for (int i=0; i<NW; i++) {
438322e40315609acd5a608440bc469d873e09559caCraig Mautner            WindowStateAnimator winAnimator = mAllAppWinAnimators.get(i);
4390bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            if (DEBUG_VISIBILITY) Slog.v(TAG, "performing show on: " + winAnimator);
440bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner            winAnimator.performShowLocked();
4415c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi            isAnimating |= winAnimator.isAnimationSet();
442bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        }
443bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner        return isAnimating;
444bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner    }
445bec53f7066852c1c5877c51fcd8c55840891d866Craig Mautner
446529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn    void dump(PrintWriter pw, String prefix, boolean dumpAll) {
447529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken);
448529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("mAnimator="); pw.println(mAnimator);
449529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        pw.print(prefix); pw.print("freezingScreen="); pw.print(freezingScreen);
450529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(" allDrawn="); pw.print(allDrawn);
451529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                pw.print(" animLayerAdjustment="); pw.println(animLayerAdjustment);
452a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn        if (lastFreezeDuration != 0) {
453a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn            pw.print(prefix); pw.print("lastFreezeDuration=");
454a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn                    TimeUtils.formatDuration(lastFreezeDuration, pw); pw.println();
455a57c695bf2c0f917517ecac8251043716b34f72dDianne Hackborn        }
456594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (animating || animation != null) {
4579339c401cf1a056a3a1caddc648334069e6bd267Craig Mautner            pw.print(prefix); pw.print("animating="); pw.println(animating);
458529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("animation="); pw.println(animation);
459594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
460594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (hasTransformation) {
461594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("XForm: ");
462594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    transformation.printShortString(pw);
463594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.println();
464594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
465594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        if (thumbnail != null) {
466594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnail="); pw.print(thumbnail);
467594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.print(" layer="); pw.println(thumbnailLayer);
468594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnailAnimation="); pw.println(thumbnailAnimation);
469594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner            pw.print(prefix); pw.print("thumbnailTransformation=");
470594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner                    pw.println(thumbnailTransformation.toShortString());
471594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner        }
472529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        for (int i=0; i<mAllAppWinAnimators.size(); i++) {
473529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            WindowStateAnimator wanim = mAllAppWinAnimators.get(i);
474529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn            pw.print(prefix); pw.print("App Win Anim #"); pw.print(i);
475529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn                    pw.print(": "); pw.println(wanim);
476529e744d3131b9ebeb6b33c8030230c29a44ad12Dianne Hackborn        }
477594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner    }
478fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
4791a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski    void startProlongAnimation(int prolongType) {
4801a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski        mProlongAnimation = prolongType;
48114b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski        mClearProlongedAnimation = false;
48214b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    }
48314b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski
48414b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    void endProlongedAnimation() {
4851a4dfe593aafda057ac9cb3086b84588d88cd09fFilip Gruszczynski        mProlongAnimation = PROLONG_ANIMATION_DISABLED;
48614b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski    }
48714b4e57c1ba427f07186dbff8491242162028c71Filip Gruszczynski
488fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // This is an animation that does nothing: it just immediately finishes
489fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // itself every time it is called.  It is used as a stub animation in cases
490fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    // where we want to synchronize multiple things that may be animating.
491fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    static final class DummyAnimation extends Animation {
492fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        @Override
493fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        public boolean getTransformation(long currentTime, Transformation outTransformation) {
494fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner            return false;
495fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner        }
496fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner    }
497fbf378c736a973b8edaf1fc4c187d11dc0f5e291Craig Mautner
498594316361d38d88b53c85bd5c8d58a92345e8187Craig Mautner}
499