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