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